From 76dd48d64f1e5ea8155dcada4240c2257b134988 Mon Sep 17 00:00:00 2001 From: Giuseppe Barbieri Date: Sun, 17 Dec 2017 18:43:23 +0100 Subject: [PATCH 001/106] Update FBXDocumentUtil.h --- code/FBXDocumentUtil.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBXDocumentUtil.h b/code/FBXDocumentUtil.h index 98fae75ca..acc8c4a5c 100644 --- a/code/FBXDocumentUtil.h +++ b/code/FBXDocumentUtil.h @@ -105,7 +105,7 @@ inline const T* ProcessSimpleConnection(const Connection& con, const Object* const ob = con.SourceObject(); if(!ob) { - DOMWarning("failed to read source object for incoming" + std::string(name) + + DOMWarning("failed to read source object for incoming " + std::string(name) + " link, ignoring", &element); return NULL; From 0f4189c77e6f28ae0423ea617747ad33c617a92d Mon Sep 17 00:00:00 2001 From: Alexis Breust Date: Tue, 16 Jan 2018 09:26:00 +0100 Subject: [PATCH 002/106] Forced 4-bits alignment for glTF buffers --- code/glTF2Asset.inl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/glTF2Asset.inl b/code/glTF2Asset.inl index 549df747e..53e1aeed1 100644 --- a/code/glTF2Asset.inl +++ b/code/glTF2Asset.inl @@ -485,7 +485,8 @@ uint8_t* new_data; inline size_t Buffer::AppendData(uint8_t* data, size_t length) { size_t offset = this->byteLength; - Grow(length); + // Force alignment to 4 bits + Grow((length + 3) & ~3); memcpy(mData.get() + offset, data, length); return offset; } From 5e6cae3094fee7212eff7e27e65f287a4b778243 Mon Sep 17 00:00:00 2001 From: Alexis Breust Date: Tue, 16 Jan 2018 09:56:44 +0100 Subject: [PATCH 003/106] Force normalized normals --- code/glTF2Exporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/glTF2Exporter.cpp b/code/glTF2Exporter.cpp index 221a3bf9f..7d420f462 100644 --- a/code/glTF2Exporter.cpp +++ b/code/glTF2Exporter.cpp @@ -708,8 +708,13 @@ void glTF2Exporter::ExportMeshes() if (v) p.attributes.position.push_back(v); /******************** Normals ********************/ + // Normalize all normals as the validator can emit a warning otherwise + for (auto i = 0u; i < aim->mNumVertices; ++i) { + aim->mNormals[i].Normalize(); + } + Ref n = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mNormals, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); - if (n) p.attributes.normal.push_back(n); + if (n) p.attributes.normal.push_back(n); /************** Texture coordinates **************/ for (int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) { From f0d03ec6b8400cfde29bc460ad8dd69d6623be9c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 22 Jan 2018 14:35:06 +0100 Subject: [PATCH 004/106] closes https://github.com/assimp/assimp/issues/1722: use a const reference to fix issue with ppc. --- code/Bitmap.cpp | 3 +- code/ObjFileMtlImporter.cpp | 1 - test/models/OBJ/spider_test.mtl | 68 - test/models/OBJ/spider_test.obj | 3226 ----------------- test/models/OBJ/test.mtl | 13 - test/models/OBJ/test.obj | 40 - .../BoxTextured-glTF/BoxTextured_out.bin | Bin 840 -> 0 bytes .../BoxTextured-glTF/BoxTextured_out.gltf | 184 - 8 files changed, 2 insertions(+), 3533 deletions(-) delete mode 100644 test/models/OBJ/spider_test.mtl delete mode 100644 test/models/OBJ/spider_test.obj delete mode 100644 test/models/OBJ/test.mtl delete mode 100644 test/models/OBJ/test.obj delete mode 100644 test/models/glTF2/BoxTextured-glTF/BoxTextured_out.bin delete mode 100644 test/models/glTF2/BoxTextured-glTF/BoxTextured_out.gltf diff --git a/code/Bitmap.cpp b/code/Bitmap.cpp index c0ab65728..ae248f62e 100644 --- a/code/Bitmap.cpp +++ b/code/Bitmap.cpp @@ -84,7 +84,8 @@ namespace Assimp { } template - inline std::size_t Copy(uint8_t* data, T& field) { + inline + std::size_t Copy(uint8_t* data, const T &field) { #ifdef AI_BUILD_BIG_ENDIAN T field_swapped=AI_BE(field); std::memcpy(data, &field_swapped, sizeof(field)); return sizeof(field); diff --git a/code/ObjFileMtlImporter.cpp b/code/ObjFileMtlImporter.cpp index 5986b4c4e..1d20c99cb 100644 --- a/code/ObjFileMtlImporter.cpp +++ b/code/ObjFileMtlImporter.cpp @@ -52,7 +52,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include - namespace Assimp { // Material specific token (case insensitive compare) diff --git a/test/models/OBJ/spider_test.mtl b/test/models/OBJ/spider_test.mtl deleted file mode 100644 index 4d2a6862e..000000000 --- a/test/models/OBJ/spider_test.mtl +++ /dev/null @@ -1,68 +0,0 @@ -# File produced by Open Asset Import Library (http://www.assimp.sf.net) -# (assimp v4.1.1712791017) - -newmtl DefaultMaterial -Kd 0.6000000238418579 0.6000000238418579 0.6000000238418579 -Ka 0 0 0 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 - -newmtl Skin -Kd 0.8274509906768799 0.792156994342804 0.7725489735603333 -Ka 0.2000000029802322 0.2000000029802322 0.2000000029802322 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 -map_Kd .\wal67ar_small.jpg - -newmtl Brusttex -Kd 0.800000011920929 0.800000011920929 0.800000011920929 -Ka 0.2000000029802322 0.2000000029802322 0.2000000029802322 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 -map_Kd .\wal69ar_small.jpg - -newmtl HLeibTex -Kd 0.6901959776878357 0.6392160058021545 0.6156859993934631 -Ka 0.2000000029802322 0.2000000029802322 0.2000000029802322 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 -map_Kd .\SpiderTex.jpg - -newmtl BeinTex -Kd 0.800000011920929 0.800000011920929 0.800000011920929 -Ka 0.2000000029802322 0.2000000029802322 0.2000000029802322 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 -map_Kd .\drkwood2.jpg - -newmtl Augentex -Kd 0.800000011920929 0.800000011920929 0.800000011920929 -Ka 0.2000000029802322 0.2000000029802322 0.2000000029802322 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 -map_Kd .\engineflare1.jpg - diff --git a/test/models/OBJ/spider_test.obj b/test/models/OBJ/spider_test.obj deleted file mode 100644 index f8239bb6b..000000000 --- a/test/models/OBJ/spider_test.obj +++ /dev/null @@ -1,3226 +0,0 @@ -# File produced by Open Asset Import Library (http://www.assimp.sf.net) -# (assimp v4.1.1712791017) - -mtllib spider_test.mtl - -# 722 vertex positions -v 1.160378932952881 4.512683868408203 6.449167251586914 -v 22.65617179870605 10.21453857421875 16.86968994140625 -v 4.568314075469971 16.85711288452148 5.619616985321045 -v 14.40229797363281 32.89186859130859 3.414829015731812 -v 27.52080917358398 27.08032608032227 11.45156478881836 -v 39.18625640869141 16.23099708557129 12.6327018737793 -v -6.442715167999268 10.77740478515625 -0.5375289916992188 -v -8.120363235473633 15.6844596862793 -10.5 -v -0.8867700099945068 23.4237174987793 -4.342854022979736 -v -0.8867700099945068 23.4237174987793 -16.65714454650879 -v 14.40229797363281 32.89186859130859 -26.41482543945312 -v 12.95316505432129 36.87333679199219 -11.5 -v 30.52731704711914 37.50395202636719 -2.733282089233398 -v 30.52731704711914 37.50395202636719 -20.26671600341797 -v 44.30125045776367 33.96472930908203 -11.5 -v 45.09496688842773 27.71094512939453 2.684845924377441 -v 57.93621826171875 30.27653312683105 -11.5 -v 54.50359344482422 5.934020042419434 -11.5 -v 51.09176254272461 11.23489952087402 2.684845924377441 -v 45.09496688842773 27.71094512939453 -25.68484497070312 -v 39.18625640869141 16.23099708557129 -35.63270568847656 -v 51.09176254272461 11.23489952087402 -25.68484497070312 -v 27.52080917358398 27.08032608032227 -34.45156478881836 -v 4.568314075469971 16.85711288452148 -26.6196174621582 -v 1.160378932952881 4.512683868408203 -27.44916915893555 -v 22.65617179870605 10.21453857421875 -39.86968994140625 -v 7.838881015777588 -6.414187908172607 -26.6196174621582 -v 30.91004180908203 -12.4627857208252 -26.41482543945312 -v 37.22381591796875 0.4215309917926788 -34.45156478881836 -v 46.22711181640625 -5.630886077880859 -20.26671600341797 -v 32.35918426513672 -16.44425201416016 -11.5 -v 30.91004180908203 -12.4627857208252 3.414829015731812 -v 46.22711181640625 -5.630886077880859 -2.733282089233398 -v 4.405118942260742 -14.23004245758057 -16.65714454650879 -v -4.681486129760742 -8.784435272216797 -10.5 -v 4.405118942260742 -14.23004245758057 -4.342854022979736 -v -4.421391010284424 -3.605049133300781 -0.5375289916992188 -v 7.838881015777588 -6.414187908172607 5.619616985321045 -v 37.22381591796875 0.4215309917926788 11.45156478881836 -v -9.876476287841797 2.961555004119873 -10.5 -v -6.442715167999268 10.77740478515625 -20.46247100830078 -v -4.421391010284424 -3.605049133300781 -20.46247100830078 -v -41.85661315917969 -0.7548459768295288 9.430771827697754 -v -27.9502124786377 1.303017020225525 3.0814208984375 -v -32.62586212158203 10.86018753051758 8.47976016998291 -v -24.40152359008789 12.2247486114502 -3.122689962387085 -v -18.8264045715332 5.435883045196533 0.5830910205841064 -v -11.22126770019531 -4.132546901702881 1.127722024917603 -v -44.88201522827148 11.88719749450684 1.421121001243591 -v -44.84470367431641 15.22849273681641 -10 -v -35.57024002075195 16.59859085083008 -2.941359043121338 -v -35.57024002075195 16.59859085083008 -17.05864334106445 -v -24.40152359008789 12.2247486114502 -16.87730979919434 -v -23.77848243713379 14.14228057861328 -10 -v -8.432302474975586 6.445052146911621 -5.95761775970459 -v -8.432302474975586 6.445052146911621 -14.04238128662109 -v -1.337092995643616 1.108109951019287 -10 -v -3.30927300453186 -1.735224008560181 -0.5947030186653137 -v -0.4196679890155792 -7.642198085784912 -10 -v -6.305181980133057 -14.18209838867188 -10 -v -6.229438781738281 -10.72257518768311 -0.5947030186653137 -v -3.30927300453186 -1.735224008560181 -19.40529632568359 -v -11.22126770019531 -4.132546901702881 -21.12771987915039 -v -6.229438781738281 -10.72257518768311 -19.40529632568359 -v -18.8264045715332 5.435883045196533 -20.58309173583984 -v -32.62586212158203 10.86018753051758 -28.47975921630859 -v -41.85661315917969 -0.7548459768295288 -29.43077087402344 -v -27.9502124786377 1.303017020225525 -23.0814208984375 -v -39.19473266601562 -9.356718063354492 -28.47975921630859 -v -31.49889755249023 -9.618716239929199 -16.87730979919434 -v -22.99813652038574 -7.403382778167725 -20.58309173583984 -v -49.71383666992188 -2.983590126037598 1.421121001243591 -v -39.19473266601562 -9.356718063354492 8.47976016998291 -v -22.99813652038574 -7.403382778167725 0.5830910205841064 -v -31.49889755249023 -9.618716239929199 -3.122689962387085 -v -50.63702392578125 8.975393295288086 -10 -v -51.64759063720703 -5.708693981170654 -10 -v -44.88201522827148 11.88719749450684 -21.42111587524414 -v -49.71383666992188 -2.983590126037598 -21.42111587524414 -v -40.67147827148438 -3.47288703918457 -21.36916732788086 -v -41.96333312988281 -2.246160984039307 -18.48523330688477 -v -44.64511871337891 -3.443838119506836 -21.08979034423828 -v -87.6058349609375 -39.9835319519043 -104.3517227172852 -v -87.87104797363281 -40.01747512817383 -103.8583068847656 -v -87.9501953125 -39.45514678955078 -104.2601852416992 -v -47.09840393066406 7.389261245727539 -39.58503341674805 -v -47.14669799804688 8.704387664794922 -37.68162155151367 -v -55.4437255859375 28.01696014404297 -51.02064895629883 -v -55.80507659912109 29.50034332275391 -50.36057662963867 -v -56.41304779052734 27.51875305175781 -54.60213470458984 -v -57.93299102783203 29.20790100097656 -55.03944778442383 -v -67.98501586914062 13.43557167053223 -79.02035522460938 -v -69.89360046386719 14.10584259033203 -80.14413452148438 -v -81.67832183837891 -31.37918090820312 -101.2915573120117 -v -82.77850341796875 -29.84352111816406 -101.2665863037109 -v -45.27461242675781 -1.921316027641296 -17.56256103515625 -v -88.2349853515625 -39.3502311706543 -103.8660430908203 -v -48.86238861083984 8.964324951171875 -36.15071487426758 -v -56.92498016357422 29.82746124267578 -49.55580902099609 -v -60.01216888427734 29.56021118164062 -54.08668899536133 -v -72.06874084472656 14.20652008056641 -79.36090087890625 -v -83.47474670410156 -29.51860809326172 -100.4707794189453 -v -48.11187744140625 -2.742969989776611 -19.29600143432617 -v -88.2457275390625 -39.74774169921875 -103.4660797119141 -v -50.95351028442383 7.973351955413818 -36.14510726928711 -v -57.96013641357422 28.75201416015625 -49.21238708496094 -v -61.08487701416016 28.31040191650391 -52.46125793457031 -v -72.87251281738281 13.66179847717285 -77.26039123535156 -v -83.24275207519531 -30.64902877807617 -99.50344848632812 -v -48.33858871459961 -4.09240198135376 -22.38015365600586 -v -87.97438049316406 -40.34838485717773 -103.3615341186523 -v -51.84541320800781 6.477696895599365 -37.66901397705078 -v -58.13103866577148 27.08382415771484 -49.58887100219727 -v -60.34334564208984 26.39956665039062 -51.38712310791016 -v -71.69966125488281 12.8818302154541 -75.42439270019531 -v -82.25722503662109 -32.38360595703125 -99.09293365478516 -v -45.78402709960938 -4.953472137451172 -24.49265670776367 -v -87.62525177001953 -40.69983673095703 -103.6310958862305 -v -50.86646270751953 5.603586196899414 -39.57491683959961 -v -57.30899810791016 26.07907104492188 -50.40177917480469 -v -58.34596252441406 25.26664733886719 -51.67315673828125 -v -69.433349609375 12.45395088195801 -75.23539733886719 -v -81.26026153564453 -33.41617965698242 -99.54843139648438 -v -42.37185668945312 -4.677759170532227 -24.04270935058594 -v -87.46121978759766 -40.53748321533203 -104.0717544555664 -v -48.75384521484375 6.009276866912842 -40.42763137817383 -v -56.11302947998047 26.49437713623047 -51.03896713256836 -v -56.59683609008789 25.76473236083984 -53.10398483276367 -v -67.78019714355469 12.70041084289551 -76.83576965332031 -v -81.00263214111328 -32.96916198730469 -100.5268630981445 -v -45.856201171875 -3.096683979034424 0.9894610047340393 -v -42.83802795410156 -1.822747945785522 -1.17337703704834 -v -41.96012115478516 -3.15467095375061 1.817621946334839 -v -92.29042816162109 -39.21158981323242 57.38248825073242 -v -92.26210784912109 -39.83740234375 57.07994079589844 -v -91.95950317382812 -39.73274230957031 57.5407600402832 -v -49.36812591552734 8.476757049560547 19.08589744567871 -v -49.19630432128906 7.804555892944336 21.29348754882812 -v -54.25469207763672 27.27288055419922 30.44888496398926 -v -54.92575836181641 28.34239959716797 29.36605453491211 -v -57.45500946044922 28.70623016357422 33.83551406860352 -v -55.48647308349609 27.49809265136719 33.97690582275391 -v -67.46834564208984 9.109057426452637 43.49641799926758 -v -69.61196136474609 9.454971313476562 44.29645156860352 -v -87.01417541503906 -30.51413726806641 52.42203521728516 -v -85.97149658203125 -32.07468414306641 52.63847351074219 -v -45.98867797851562 -1.450130939483643 -2.535742998123169 -v -92.60006713867188 -39.16170501708984 56.99636840820312 -v -50.88497161865234 7.785149097442627 17.48099899291992 -v -55.98342132568359 28.08773803710938 28.45757293701172 -v -59.41564178466797 28.14698791503906 32.74097061157227 -v -71.61580657958984 8.682785987854004 43.43437957763672 -v -87.75607299804688 -30.29622077941895 51.63100051879883 -v -49.03958129882812 -2.317409992218018 -1.243530988693237 -v -92.65523529052734 -39.6205940246582 56.67316055297852 -v -52.60464477539062 6.250553131103516 17.68733215332031 -v -56.63124847412109 26.70069122314453 28.40756416320801 -v -59.89194488525391 26.24149322509766 31.51743125915527 -v -71.97093963623047 7.37397575378418 41.55935287475586 -v -87.63851928710938 -31.58496475219727 50.86106491088867 -v -49.69331359863281 -3.771508932113647 1.730138063430786 -v -92.41441345214844 -40.24274826049805 56.65629577636719 -v -53.23219299316406 5.028540134429932 19.54948425292969 -v -56.38141632080078 25.22571563720703 29.25366592407227 -v -58.52523040771484 24.42458915710449 31.08627510070801 -v -70.40996551513672 6.514069080352783 40.08333206176758 -v -86.75009155273438 -33.40998077392578 50.69198608398438 -v -47.45761871337891 -4.717469215393066 4.146055221557617 -v -92.05893707275391 -40.55963134765625 56.95841217041016 -v -52.29503631591797 5.039290904998779 21.6652717590332 -v -55.42203521728516 24.77352905273438 30.3587532043457 -v -56.34468841552734 24.06446647644043 31.77214431762695 -v -68.10823822021484 6.750600814819336 40.11775207519531 -v -85.75971984863281 -34.3969612121582 51.2510871887207 -v -44.01602935791016 -4.442947864532471 4.184988975524902 -v -91.85649871826172 -40.33267974853516 57.35205459594727 -v -50.4989013671875 6.274747848510742 22.44142532348633 -v -54.47554779052734 25.68461608886719 30.89064788818359 -v -54.99231719970703 25.43232727050781 33.05861282348633 -v -66.79914093017578 7.905498027801514 41.6367301940918 -v -85.4132080078125 -33.80271530151367 52.11734008789062 -v -32.53578186035156 -3.15467095375061 -19.16253662109375 -v -34.38373184204102 -1.822747945785522 -16.65216445922852 -v -36.48015213012695 -3.096683979034424 -19.71685028076172 -v -43.38578033447266 -41.58316040039062 -95.21874237060547 -v -43.91326141357422 -41.58873748779297 -95.02735137939453 -v -43.69423675537109 -41.06890106201172 -95.43450164794922 -v -35.0989875793457 7.804555892944336 -38.97930526733398 -v -36.35158920288086 8.476757049560547 -37.15337371826172 -v -37.55405807495117 27.27288055419922 -51.63281631469727 -v -38.67663192749023 28.34239959716797 -51.03059768676758 -v -36.8568000793457 27.49809265136719 -55.3040657043457 -v -38.63229751586914 28.70623016357422 -56.16587829589844 -v -39.32158660888672 4.109056949615479 -79.20964813232422 -v -40.77798843383789 4.454970836639404 -80.97431182861328 -v -40.8770866394043 -32.42660522460938 -89.88973236083984 -v -41.6864128112793 -30.95858383178711 -90.76108551025391 -v -37.81033325195312 -1.450130939483643 -16.44955062866211 -v -44.16765594482422 -40.94609069824219 -95.34366607666016 -v -38.46767044067383 7.785149097442627 -36.52191925048828 -v -40.04683303833008 28.08773803710938 -50.77265167236328 -v -40.87752914428711 28.14698791503906 -56.19830703735352 -v -42.94440460205078 3.682785987854004 -81.22965240478516 -v -42.73056793212891 -30.60493469238281 -90.66996002197266 -v -40.23527908325195 -2.317409992218018 -18.70730972290039 -v -44.44951629638672 -41.30718231201172 -95.01465606689453 -v -39.85378265380859 6.250553131103516 -37.56044387817383 -v -40.63287734985352 26.70069122314453 -51.05325317382812 -v -41.90177536010742 26.24149322509766 -55.37683486938477 -v -44.18946838378906 2.373975992202759 -79.78339385986328 -v -43.2232666015625 -31.63191223144531 -89.68506622314453 -v -39.8325309753418 -3.771508932113647 -21.72522735595703 -v -44.32761383056641 -41.88030242919922 -94.69525909423828 -v -39.4661750793457 5.028540134429932 -39.48690414428711 -v -39.99345779418945 25.22571563720703 -51.66109085083008 -v -40.93375778198242 24.42458915710449 -54.3200798034668 -v -43.57563781738281 1.514069080352783 -77.72464752197266 -v -42.79354858398438 -33.2662239074707 -88.54798126220703 -v -36.90536880493164 -4.717469215393066 -23.23079490661621 -v -43.89371490478516 -42.23382568359375 -94.62592315673828 -v -37.59667587280273 5.039290904998779 -40.85063934326172 -v -38.61006164550781 24.77352905273438 -52.13843154907227 -v -38.70241546630859 24.06446647644043 -53.82379531860352 -v -41.56508255004883 1.750601053237915 -76.60358428955078 -v -41.76493453979492 -34.27718353271484 -88.11498260498047 -v -33.65802383422852 -4.442947864532471 -22.09029006958008 -v -43.47456359863281 -42.10161590576172 -94.85892486572266 -v -35.65310668945312 6.274747848510742 -40.62473678588867 -v -37.52444076538086 25.68461608886719 -52.12581634521484 -v -36.88800048828125 25.43232727050781 -54.26172637939453 -v -39.6718864440918 2.905498027801514 -77.26450347900391 -v -40.91205215454102 -33.90352249145508 -88.71208953857422 -v -36.01900863647461 -3.216418027877808 -1.765162944793701 -v -34.50244522094727 -1.655421018600464 -5.032196044921875 -v -32.20283126831055 -2.602406978607178 -2.728740930557251 -v -28.69635772705078 -38.61240768432617 75.69805145263672 -v -28.86252021789551 -39.28370666503906 75.62229156494141 -v -28.3271656036377 -39.13187408447266 75.69469451904297 -v -36.10787582397461 8.519889831542969 15.56240081787109 -v -34.57637023925781 8.107364654541016 17.24739646911621 -v -39.05897903442383 27.08562469482422 30.08821868896484 -v -40.40615463256836 27.93409729003906 29.60663604736328 -v -39.89728164672852 28.39327239990234 34.70915603637695 -v -38.03726577758789 27.49446105957031 33.66647720336914 -v -34.5403938293457 17.31492233276367 46.75900650024414 -v -35.8452262878418 17.43609428405762 48.66624069213867 -v -28.96659469604492 -31.87043952941895 66.61157989501953 -v -28.00870513916016 -33.48403930664062 66.39229583740234 -v -37.94406127929688 -1.883904933929443 -4.875525951385498 -v -29.19070816040039 -38.59844589233398 75.64435577392578 -v -38.12530136108398 7.461886882781982 15.15559387207031 -v -41.7304801940918 27.44197845458984 29.49332809448242 -v -41.99584579467773 27.45536041259766 34.97609710693359 -v -37.80666732788086 16.30614280700684 49.14663314819336 -v -30.06003952026367 -31.71491622924805 66.54987335205078 -v -39.93606948852539 -3.115807056427002 -2.376658916473389 -v -29.43793296813965 -39.1004524230957 75.57405853271484 -v -39.1094856262207 5.730080127716064 16.33332061767578 -v -42.03471374511719 25.97990417480469 29.83365058898926 -v -42.752685546875 25.38702392578125 34.26618957519531 -v -38.94770431518555 14.77594661712646 47.83845138549805 -v -30.46564483642578 -33.13447570800781 66.25366973876953 -v -38.97844314575195 -4.423483848571777 0.5826259851455688 -v -29.25189590454102 -39.74045181274414 75.54013824462891 -v -38.3193473815918 4.6285400390625 18.20871162414551 -v -41.08975601196289 24.6487865447998 30.3713264465332 -v -41.59787368774414 23.74571800231934 33.11403656005859 -v -38.40911865234375 13.99774074554443 45.72681045532227 -v -29.87803268432617 -35.06025695800781 65.94594573974609 -v -35.79229736328125 -4.822233200073242 1.77397894859314 -v -28.77267646789551 -40.03646850585938 75.56807708740234 -v -36.34981918334961 4.986735820770264 19.36955642700195 -v -39.6071891784668 24.45104026794434 30.70144844055176 -v -39.40102005004883 23.76740074157715 32.38723373413086 -v -36.59642791748047 14.5575475692749 44.40173721313477 -v -28.7396183013916 -36.04206466674805 65.85849761962891 -v -32.77687454223633 -4.011776924133301 0.3002820014953613 -v -28.36112785339355 -39.7656364440918 75.63690948486328 -v -34.68405532836914 6.534968852996826 18.94173622131348 -v -38.70342254638672 25.53554534912109 30.5754222869873 -v -37.81640243530273 25.43576812744141 32.63310623168945 -v -34.87471389770508 16.03384399414062 44.86114120483398 -v -27.90771293640137 -35.34060668945312 66.05712127685547 -v -26.45577621459961 -3.443838119506836 -2.149142980575562 -v -26.46640014648438 -2.246160984039307 -5.887526988983154 -v -23.49448394775391 -3.47288703918457 -4.813465118408203 -v 5.039107799530029 -39.45514678955078 86.51023101806641 -v 4.668338775634766 -40.01747512817383 86.33621978759766 -v 5.211228847503662 -39.9835319519043 86.19824981689453 -v -16.25835037231445 8.704387664794922 11.1760082244873 -v -14.85560417175293 7.389261245727539 12.46347618103027 -v -12.42665863037109 28.01696014404297 26.41044998168945 -v -13.15249061584473 29.50034332275391 26.21185684204102 -v -11.26496505737305 29.20790100097656 30.99277114868164 -v -10.52369499206543 27.51875305175781 29.59563827514648 -v -0.9972569942474365 13.43557167053223 54.88214111328125 -v -1.514698028564453 14.10584259033203 57.03571319580078 -v 3.385565996170044 -29.84352111816406 80.76795196533203 -v 3.675970077514648 -31.37918090820312 79.70648956298828 -v -29.43033599853516 -1.921316027641296 -4.146553039550781 -v 4.587766170501709 -39.3502311706543 86.69120025634766 -v -18.55141067504883 8.964324951171875 11.34670639038086 -v -14.50934600830078 29.82746124267578 26.45841026306152 -v -13.3946418762207 29.56021118164062 31.82656478881836 -v -3.589093923568726 14.20652008056641 58.0562744140625 -v 2.445001125335693 -29.51860809326172 81.25101470947266 -v -30.15432739257812 -2.742969989776611 -0.9014430046081543 -v 4.197091102600098 -39.74774169921875 86.60486602783203 -v -20.00806045532227 7.973351955413818 12.8470344543457 -v -15.4754638671875 28.75201416015625 26.9644775390625 -v -15.30904579162598 28.31040191650391 31.46907806396484 -v -5.658416748046875 13.66179847717285 57.17532348632812 -v 1.562493085861206 -30.64902877807617 80.79186248779297 -v -28.0932731628418 -4.09240198135376 1.404078960418701 -v 4.161306858062744 -40.34838485717773 86.31630706787109 -v -19.53142166137695 6.477696895599365 14.54720878601074 -v -15.32335662841797 27.08382415771484 27.34894752502441 -v -15.56659698486328 26.39956665039062 30.18951416015625 -v -6.164387226104736 12.8818302154541 55.05625915527344 -v 1.402615070343018 -32.38360595703125 79.73628997802734 -v -24.79911041259766 -4.953472137451172 1.033954977989197 -v 4.507323265075684 -40.69983673095703 86.04276275634766 -v -17.48039627075195 5.603586196899414 15.16696166992188 -v -14.16756820678711 26.07907104492188 27.32230758666992 -v -13.97334671020508 25.26664733886719 28.95141792297363 -v -4.726027011871338 12.45395088195801 53.29472351074219 -v 2.08576488494873 -33.41617965698242 78.87914276123047 -v -22.75246810913086 -4.677759170532227 -1.733124017715454 -v 4.974565982818604 -40.53748321533203 85.99021148681641 -v -15.39944839477539 6.009276866912842 14.2396240234375 -v -12.87841987609863 26.49437713623047 26.90462684631348 -v -11.72904586791992 25.76473236083984 28.68713760375977 -v -2.426440954208374 12.70041084289551 53.21726226806641 -v 3.097472906112671 -32.96916198730469 78.86588287353516 -v -23.49448394775391 -3.47288703918457 -15.18653869628906 -v -26.46640014648438 -2.246160984039307 -14.11247634887695 -v -26.45577621459961 -3.443838119506836 -17.85086059570312 -v 5.211228847503662 -39.9835319519043 -106.1982498168945 -v 4.668338775634766 -40.01747512817383 -106.3362197875977 -v 5.039107799530029 -39.45514678955078 -106.5102310180664 -v -14.85560417175293 7.389261245727539 -32.46347808837891 -v -16.25835037231445 8.704387664794922 -31.17601013183594 -v -12.42665863037109 28.01696014404297 -46.41044616699219 -v -13.15249061584473 29.50034332275391 -46.21185302734375 -v -10.52369499206543 27.51875305175781 -49.59563446044922 -v -11.26496505737305 29.20790100097656 -50.99276733398438 -v -0.9972569942474365 13.43557167053223 -74.88213348388672 -v -1.514698028564453 14.10584259033203 -77.03571319580078 -v 3.675970077514648 -31.37918090820312 -99.70648956298828 -v 3.38556694984436 -29.84352111816406 -100.767951965332 -v -29.43033599853516 -1.921316027641296 -15.85345077514648 -v 4.587764739990234 -39.3502311706543 -106.6912002563477 -v -18.55141067504883 8.964324951171875 -31.34671020507812 -v -14.50934600830078 29.82746124267578 -46.45841217041016 -v -13.3946418762207 29.56021118164062 -51.82656097412109 -v -3.589093923568726 14.20652008056641 -78.05626678466797 -v 2.445001125335693 -29.51860809326172 -101.2510147094727 -v -30.15432739257812 -2.742969989776611 -19.09856033325195 -v 4.197090148925781 -39.74774169921875 -106.604866027832 -v -20.00806045532227 7.973351955413818 -32.8470344543457 -v -15.4754638671875 28.75201416015625 -46.9644775390625 -v -15.30904579162598 28.31040191650391 -51.46907806396484 -v -5.658416748046875 13.66179847717285 -77.17531585693359 -v 1.562493085861206 -30.64902877807617 -100.791862487793 -v -28.0932731628418 -4.09240198135376 -21.40408325195312 -v 4.161307811737061 -40.34838485717773 -106.3163070678711 -v -19.53142166137695 6.477696895599365 -34.54721069335938 -v -15.32335662841797 27.08382415771484 -47.34894561767578 -v -15.56659698486328 26.39956665039062 -50.18951416015625 -v -6.164387226104736 12.8818302154541 -75.05625152587891 -v 1.402615070343018 -32.38360595703125 -99.73628997802734 -v -24.79911041259766 -4.953472137451172 -21.03395843505859 -v 4.50732421875 -40.69983673095703 -106.0427627563477 -v -17.48039627075195 5.603586196899414 -35.16696166992188 -v -14.16756820678711 26.07907104492188 -47.32230377197266 -v -13.97334671020508 25.26664733886719 -48.951416015625 -v -4.726027011871338 12.45395088195801 -73.29471588134766 -v 2.08576488494873 -33.41617965698242 -98.87914276123047 -v -22.75246810913086 -4.677759170532227 -18.26688003540039 -v 4.974565982818604 -40.53748321533203 -105.9902114868164 -v -15.39944839477539 6.009276866912842 -34.2396240234375 -v -12.87841987609863 26.49437713623047 -46.90462493896484 -v -11.72904586791992 25.76473236083984 -48.6871337890625 -v -2.426440954208374 12.70041084289551 -73.21726226806641 -v 3.097472906112671 -32.96916198730469 -98.86588287353516 -v -14.25648880004883 -6.954940795898438 -3.301691055297852 -v -14.10265731811523 -6.075778961181641 -7.124460220336914 -v -11.2052116394043 -7.280231952667236 -5.841878890991211 -v 19.74986457824707 -37.60753631591797 68.32992553710938 -v 19.34836387634277 -38.14849472045898 68.15628051757812 -v 19.89711761474609 -38.15519714355469 68.03912353515625 -v -4.907510757446289 6.093640804290771 10.12681770324707 -v -2.877649068832397 5.517601013183594 11.07694053649902 -v 1.745674014091492 26.13694000244141 21.00781440734863 -v 0.4745520055294037 27.20939636230469 20.97971534729004 -v 3.233434915542603 28.02400207519531 25.24942970275879 -v 4.282450199127197 26.64773559570312 23.71314430236816 -v 14.8602180480957 5.642467975616455 47.61897277832031 -v 14.56025314331055 6.223588943481445 49.83868408203125 -v 18.9760627746582 -28.07810020446777 62.27335357666016 -v 19.20066070556641 -29.66015243530273 61.26537322998047 -v -17.11595153808594 -5.533359050750732 -5.528418064117432 -v 19.30024719238281 -37.46723175048828 68.48995971679688 -v -7.036674976348877 5.467060089111328 10.78174591064453 -v -0.8241369724273682 27.00916290283203 21.51090049743652 -v 1.346554040908813 27.59506225585938 26.51851081848145 -v 12.85833549499512 5.598269939422607 51.27650451660156 -v 18.04227828979492 -27.67663192749023 62.70982360839844 -v -17.97599411010742 -6.06142520904541 -2.255570888519287 -v 18.88686752319336 -37.83989715576172 68.39877319335938 -v -7.661820888519287 4.109711170196533 12.54856109619141 -v -1.172435998916626 25.68704986572266 22.20140266418457 -v 0.0426269993185997 25.68392181396484 26.56466102600098 -v 11.03606128692627 4.237391948699951 50.84969329833984 -v 17.10253143310547 -28.75799560546875 62.24617767333984 -v -16.03519439697266 -7.262344837188721 0.2294789999723434 -v 18.82099342346191 -38.44494247436523 68.12506103515625 -v -6.312249183654785 3.043694019317627 14.09679794311523 -v -0.3080709874629974 24.23861885070801 22.53124809265137 -v 0.3035619854927063 23.72967147827148 25.3531436920166 -v 10.46565055847168 3.165694952011108 48.87973022460938 -v 16.8643856048584 -30.50795555114746 61.23151397705078 -v -12.75498580932617 -8.23180103302002 0.05550599843263626 -v 19.15221405029297 -38.82671737670898 67.87483215332031 -v -4.004155158996582 3.07171893119812 14.26059532165527 -v 1.118067026138306 23.75459671020508 22.25203132629395 -v 1.932853937149048 23.20393180847168 23.79626274108887 -v 11.57662582397461 3.190187931060791 46.84990692138672 -v 17.50724792480469 -31.60873603820801 60.42989349365234 -v -10.6054573059082 -8.239757537841797 -2.646497964859009 -v 19.63114547729492 -38.69778442382812 67.83663940429688 -v -2.475620031356812 4.172726154327393 12.91663932800293 -v 2.032040119171143 24.59943771362305 21.57402229309082 -v 3.703634023666382 24.50261497497559 23.06640815734863 -v 13.53237915039062 4.292479038238525 46.28885650634766 -v 18.54694938659668 -31.23143768310547 60.44495391845703 -v -12.53854370117188 -7.280231952667236 -13.491455078125 -v -15.43598937988281 -6.075778961181641 -12.2088737487793 -v -15.58982086181641 -6.954940795898438 -16.03164291381836 -v 18.56378555297852 -38.15519714355469 -87.37246704101562 -v 18.0150318145752 -38.14849472045898 -87.4896240234375 -v 18.41653251647949 -37.60753631591797 -87.66326904296875 -v -4.210980892181396 5.517601013183594 -30.41027450561523 -v -6.240842819213867 6.093640804290771 -29.46015167236328 -v 0.4123420119285583 26.13694000244141 -40.34114837646484 -v -0.8587800264358521 27.20939636230469 -40.31304931640625 -v 2.949118137359619 26.64773559570312 -43.04647827148438 -v 1.900102972984314 28.02400207519531 -44.582763671875 -v 13.52688598632812 5.642467975616455 -66.95231628417969 -v 13.22692108154297 6.223588943481445 -69.17202758789062 -v 17.86732864379883 -29.66015243530273 -80.59872436523438 -v 17.64273071289062 -28.07810020446777 -81.60670471191406 -v -18.44928359985352 -5.533359050750732 -13.80491638183594 -v 17.96691513061523 -37.46723175048828 -87.82330322265625 -v -8.370006561279297 5.467060089111328 -30.11508178710938 -v -2.157469034194946 27.00916290283203 -40.84423828125 -v 0.01322199963033199 27.59506225585938 -45.85184478759766 -v 11.52500343322754 5.598269939422607 -70.60984802246094 -v 16.70894622802734 -27.67663192749023 -82.04316711425781 -v -19.309326171875 -6.06142520904541 -17.07776260375977 -v 17.55353546142578 -37.83989715576172 -87.73211669921875 -v -8.995153427124023 4.109711170196533 -31.88189697265625 -v -2.505768060684204 25.68704986572266 -41.53473663330078 -v -1.290704965591431 25.68392181396484 -45.89799499511719 -v 9.702729225158691 4.237391948699951 -70.18302917480469 -v 15.76919937133789 -28.75799560546875 -81.57952880859375 -v -17.36852645874023 -7.262344837188721 -19.56281280517578 -v 17.48766136169434 -38.44494247436523 -87.45840454101562 -v -7.645581245422363 3.043694019317627 -33.43013000488281 -v -1.641402959823608 24.23861885070801 -41.86458587646484 -v -1.029770016670227 23.72967147827148 -44.68647766113281 -v 9.132317543029785 3.165694952011108 -68.21307373046875 -v 15.53105354309082 -30.50795555114746 -80.56486511230469 -v -14.08831787109375 -8.23180103302002 -19.38883972167969 -v 17.81888198852539 -38.82671737670898 -87.20817565917969 -v -5.33748722076416 3.07171893119812 -33.59392929077148 -v -0.2152650058269501 23.75459671020508 -41.58536529541016 -v 0.5995219945907593 23.20393180847168 -43.12960052490234 -v 10.24329376220703 3.190187931060791 -66.18324279785156 -v 16.17391586303711 -31.60873603820801 -79.76324462890625 -v -11.93878936767578 -8.239757537841797 -16.68683624267578 -v 18.29781341552734 -38.69778442382812 -87.16998291015625 -v -3.808951854705811 4.172726154327393 -32.24997329711914 -v 0.6987079977989197 24.59943771362305 -40.90735626220703 -v 2.370301961898804 24.50261497497559 -42.39974212646484 -v 12.19904708862305 4.292479038238525 -65.6221923828125 -v 17.2136173248291 -31.23143768310547 -79.77830505371094 -v -66.77298736572266 -11.88561820983887 -0.2029989957809448 -v -61.49651336669922 6.340155124664307 -5.812275886535645 -v -62.98685073852539 9.870844841003418 -6.308485984802246 -v -61.44757843017578 8.190096855163574 -3.647036075592041 -v -63.97118377685547 3.661695003509521 -3.830467939376831 -v -64.84598541259766 4.368710994720459 -2.075659990310669 -v -62.55780410766602 11.30561256408691 -3.485913991928101 -v -67.13710784912109 4.622090816497803 -1.531195998191833 -v -63.99109649658203 13.34076976776123 -5.450253009796143 -v -69.11919403076172 4.231084823608398 -2.607095956802368 -v -64.66820526123047 12.76302528381348 -8.06086254119873 -v -69.29987335205078 3.490133047103882 -4.493171215057373 -v -64.07926177978516 10.00739574432373 -9.351896286010742 -v -67.54299163818359 2.957120895385742 -5.769162178039551 -v -62.66775894165039 7.148978233337402 -8.351184844970703 -v -65.17147064208984 3.033509969711304 -5.474239826202393 -v -66.72484588623047 1.179926037788391 10.02946090698242 -v -58.21265029907227 12.08680152893066 -3.032124042510986 -v -55.28428649902344 12.61780071258545 -0.7646610140800476 -v -55.50985717773438 10.27971935272217 -2.97612190246582 -v -59.68946075439453 8.144949913024902 1.861809968948364 -v -57.9158821105957 6.628377914428711 1.958868980407715 -v -52.63722610473633 10.23327159881592 -1.25485098361969 -v -56.29685974121094 6.188433170318604 3.356508016586304 -v -51.75783920288086 11.98240089416504 0.8355600237846375 -v -56.05172729492188 7.156466007232666 5.002277851104736 -v -53.53396987915039 14.21004676818848 1.72101902961731 -v -57.36484146118164 8.803488731384277 5.656900882720947 -v -56.62808227539062 15.23869514465332 0.7346760034561157 -v -59.24757766723633 9.889246940612793 4.827473163604736 -v -58.71025466918945 14.29374885559082 -1.380638957023621 -v -60.28214263916016 9.596194267272949 3.138458967208862 -v -53.9999885559082 26.33333778381348 -9.944446563720703 -v -44.00383377075195 24.25179481506348 -7.336516857147217 -v -43.19998550415039 24.25179481506348 -9.944446563720703 -v -46.64442825317383 24.25179481506348 -0.7607110142707825 -v -53.9999885559082 2.333333969116211 -9.944446563720703 -v -50.9999885559082 3.941030979156494 -4.748294830322266 -v -53.9999885559082 3.941030979156494 -3.944447040557861 -v -53.9999885559082 24.72564125061035 -3.944446086883545 -v -55.80000305175781 6.941027164459229 -4.748294830322266 -v -56.99998474121094 24.72564125061035 -4.748292922973633 -v -57.99615859985352 5.774363040924072 -6.944447040557861 -v -59.19614028930664 24.72564125061035 -6.944447040557861 -v -58.80000686645508 5.774363040924072 -9.944446563720703 -v -59.99999237060547 24.72564125061035 -9.944446563720703 -v -45.44443130493164 8.333334922790527 -0.08162699639797211 -v -48.80383682250977 8.333334922790527 -0.9444469809532166 -v -53.9999885559082 10.66667366027832 1.822437047958374 -v -59.19614028930664 8.333334922790527 -0.9444469809532166 -v -62.9999885559082 8.333334922790527 -4.748293876647949 -v -64.19229888916016 7.533350944519043 -9.944446563720703 -v -43.60768508911133 8.333334922790527 -9.944446563720703 -v -37.19998550415039 18.65442848205566 -9.944446563720703 -v -39.25212478637695 18.65442848205566 -0.06191999837756157 -v -43.64442825317383 18.65442848205566 3.756353855133057 -v -53.9999885559082 14.33333778381348 2.055552959442139 -v -61.41007232666016 13.47619915008545 -1.042665958404541 -v -64.60929870605469 13.47619915008545 -6.367094039916992 -v -66.39998626708984 12.33334636688232 -9.944446563720703 -v -38.80768203735352 21.88604164123535 -9.944446563720703 -v -40.64442825317383 21.88604164123535 -0.7607129812240601 -v -44.44827651977539 21.88604164123535 2.546009063720703 -v -53.9999885559082 20.33333778381348 0.4478580057621002 -v -60.29326629638672 19.47619819641113 -2.199142932891846 -v -63.06387329101562 19.47619819641113 -6.810235023498535 -v -64.39229583740234 20.33333778381348 -9.944446563720703 -v -63.32090759277344 15.14286994934082 -6.139256000518799 -v -62.36603164672852 15.39914894104004 -5.604844093322754 -v -62.33220672607422 15.06181526184082 -5.486823081970215 -v -62.95563125610352 14.64286994934082 -5.390261173248291 -v -62.37112808227539 14.47619819641113 -4.191868782043457 -v -62.07738494873047 15.07085609436035 -4.598177909851074 -v -61.73810577392578 15.73718452453613 -3.414914131164551 -v -61.64052581787109 15.30952644348145 -2.693876981735229 -v -61.55341339111328 16.74508094787598 -2.770823001861572 -v -61.42134857177734 16.64286994934082 -2.244477033615112 -v -61.58245086669922 17.63445472717285 -2.87214994430542 -v -61.56745147705078 17.80952644348145 -2.544080018997192 -v -61.72498321533203 18.15569496154785 -3.369262933731079 -v -61.85970306396484 18.47619819641113 -3.143272876739502 -v -62.29808807373047 18.64286994934082 -4.042075157165527 -v -61.89406585693359 18.04158973693848 -3.958856105804443 -v -62.73646926879883 18.14286994934082 -4.940859794616699 -v -62.07035064697266 17.69966316223145 -4.573657035827637 -v -62.11862945556641 16.98106575012207 -4.741918087005615 -v -62.95563125610352 16.97619819641113 -5.390261173248291 -v -62.20188140869141 16.16166877746582 -5.032281875610352 -v -63.24786376953125 16.30952644348145 -5.989458084106445 -v -15.18229866027832 -14.32931900024414 -14.04238128662109 -v -32.1219482421875 -11.5362491607666 -10 -v -15.18229866027832 -14.32931900024414 -5.95761775970459 -v -44.94972991943359 -12.26852130889893 -17.05864334106445 -v -44.94972991943359 -12.26852130889893 -2.941359043121338 -v -43.19998550415039 24.25179481506348 -9.988886833190918 -v -44.00383377075195 24.25179481506348 -12.59681606292725 -v -53.9999885559082 26.33333778381348 -9.988886833190918 -v -46.64442825317383 24.25179481506348 -19.17262077331543 -v -53.9999885559082 3.941030979156494 -15.9888858795166 -v -50.9999885559082 3.941030979156494 -15.18503856658936 -v -53.9999885559082 2.333333969116211 -9.988886833190918 -v -53.9999885559082 24.72564125061035 -15.9888858795166 -v -55.80000305175781 6.941027164459229 -15.18503856658936 -v -56.99998474121094 24.72564125061035 -15.18503952026367 -v -57.99615859985352 5.774363040924072 -12.98888683319092 -v -59.19614028930664 24.72564125061035 -12.98888683319092 -v -58.80000686645508 5.774363040924072 -9.988886833190918 -v -59.99999237060547 24.72564125061035 -9.988886833190918 -v -48.80383682250977 8.333334922790527 -18.9888858795166 -v -45.44443130493164 8.333334922790527 -19.85170555114746 -v -53.9999885559082 10.66667366027832 -21.75576972961426 -v -59.19614028930664 8.333334922790527 -18.9888858795166 -v -62.9999885559082 8.333334922790527 -15.18503856658936 -v -64.19229888916016 7.533350944519043 -9.988886833190918 -v -37.19998550415039 18.65442848205566 -9.988886833190918 -v -43.60768508911133 8.333334922790527 -9.988886833190918 -v -39.25212478637695 18.65442848205566 -19.87141227722168 -v -43.64442825317383 18.65442848205566 -23.68968772888184 -v -53.9999885559082 14.33333778381348 -21.9888858795166 -v -61.41007232666016 13.47619915008545 -18.89066886901855 -v -64.60929870605469 13.47619915008545 -13.56623935699463 -v -66.39998626708984 12.33334636688232 -9.988886833190918 -v -40.64442825317383 21.88604164123535 -19.17262077331543 -v -38.80768203735352 21.88604164123535 -9.988886833190918 -v -44.44827651977539 21.88604164123535 -22.47934150695801 -v -53.9999885559082 20.33333778381348 -20.38118934631348 -v -60.29326629638672 19.47619819641113 -17.73418998718262 -v -63.06387329101562 19.47619819641113 -13.12309837341309 -v -64.39229583740234 20.33333778381348 -9.988886833190918 -v -62.33220672607422 15.06181526184082 -14.44650936126709 -v -62.36603164672852 15.39914894104004 -14.32849025726318 -v -63.32090759277344 15.14286994934082 -13.79407787322998 -v -62.95563125610352 14.64286994934082 -14.54307270050049 -v -62.37112808227539 14.47619819641113 -15.74146461486816 -v -62.07738494873047 15.07085609436035 -15.33515357971191 -v -61.73810577392578 15.73718452453613 -16.51841926574707 -v -61.64052581787109 15.30952644348145 -17.23945426940918 -v -61.42134857177734 16.64286994934082 -17.68885612487793 -v -61.55341339111328 16.74508094787598 -17.16251182556152 -v -61.56745147705078 17.80952644348145 -17.38925361633301 -v -61.58245086669922 17.63445472717285 -17.06118202209473 -v -61.72498321533203 18.15569496154785 -16.5640697479248 -v -61.85970306396484 18.47619819641113 -16.79006004333496 -v -62.29808807373047 18.64286994934082 -15.89125633239746 -v -61.89406585693359 18.04158973693848 -15.97447776794434 -v -62.73646926879883 18.14286994934082 -14.99247264862061 -v -62.07035064697266 17.69966316223145 -15.35967445373535 -v -62.11862945556641 16.98106575012207 -15.19141483306885 -v -62.95563125610352 16.97619819641113 -14.54307270050049 -v -62.20188140869141 16.16166877746582 -14.90105247497559 -v -63.24786376953125 16.30952644348145 -13.94387531280518 -v -66.59115600585938 -11.97652816772461 -20.11215209960938 -v -61.26576614379883 8.099187850952148 -16.66811561584473 -v -62.80503845214844 9.779933929443359 -14.00666618347168 -v -61.31470108032227 6.249245166778564 -14.50287628173828 -v -64.66415405273438 4.277801990509033 -18.2394905090332 -v -63.78934860229492 3.570785999298096 -16.48468399047852 -v -62.37599182128906 11.21470260620117 -16.82923698425293 -v -66.95527648925781 4.531181812286377 -18.78395462036133 -v -63.80926132202148 13.24985885620117 -14.86489868164062 -v -68.93736267089844 4.140174865722656 -17.70805549621582 -v -64.48637390136719 12.67211532592773 -12.25428771972656 -v -69.1180419921875 3.399224042892456 -15.82198143005371 -v -63.89742660522461 9.916484832763672 -10.96325492858887 -v -67.36116027832031 2.8662109375 -14.54598999023438 -v -62.48594665527344 7.058069229125977 -11.96396636962891 -v -64.98963928222656 2.942600965499878 -14.84091186523438 -v -66.72484588623047 1.234470963478088 -28.69612312316895 -v -55.50985717773438 10.33426475524902 -15.69054412841797 -v -55.28428649902344 12.6723461151123 -17.90200424194336 -v -58.21265029907227 12.14134788513184 -15.63454246520996 -v -57.9158821105957 6.682922840118408 -20.62553215026855 -v -59.68946075439453 8.199495315551758 -20.52847480773926 -v -52.63722610473633 10.28781700134277 -17.41181564331055 -v -56.29685974121094 6.242978096008301 -22.02317237854004 -v -51.75783920288086 12.03694534301758 -19.50222587585449 -v -56.05172729492188 7.211010932922363 -23.66894340515137 -v -53.53396987915039 14.26459121704102 -20.38768196105957 -v -57.36484146118164 8.858034133911133 -24.32356452941895 -v -56.62808227539062 15.29323959350586 -19.40134239196777 -v -59.24757766723633 9.943792343139648 -23.49413871765137 -v -58.71025466918945 14.34829330444336 -17.28602600097656 -v -60.28214263916016 9.650739669799805 -21.80512428283691 -v -59.67054748535156 17.67085647583008 -1.853034973144531 -v -58.74361419677734 17.51846694946289 -2.271703958511353 -v -59.46704864501953 18.40674209594727 -2.53897500038147 -v -60.63759613037109 18.10347366333008 -2.337920904159546 -v -61.55588531494141 18.15423965454102 -3.37207293510437 -v -60.57522583007812 18.69086074829102 -3.431842088699341 -v -61.64485168457031 18.26233291625977 -4.609260082244873 -v -61.38417816162109 17.94110488891602 -5.717274188995361 -v -61.48154449462891 16.98392105102539 -6.448155879974365 -v -62.26735687255859 17.28479385375977 -5.621510982513428 -v -62.61495971679688 16.49116897583008 -5.094202995300293 -v -62.20498657226562 16.13167190551758 -6.081917762756348 -v -61.27806091308594 15.97928333282471 -6.500585079193115 -v -62.26735687255859 15.54427146911621 -4.988009929656982 -v -61.38417816162109 14.97993564605713 -4.639497756958008 -v -61.48154449462891 15.24338626861572 -5.814656257629395 -v -60.47430419921875 15.08453464508057 -3.54331111907959 -v -61.64485168457031 15.44609451293945 -3.584233999252319 -v -61.55588531494141 16.32414627075195 -2.705970048904419 -v -60.57522583007812 15.87463855743408 -2.406815052032471 -v -59.56442260742188 15.70901966094971 -2.636348009109497 -v -60.63759613037109 17.02777481079102 -1.946398019790649 -v -59.46704864501953 16.66621780395508 -1.905473947525024 -v -61.74577331542969 17.31189346313477 -2.839264869689941 -v -62.3682861328125 17.41006851196289 -4.243031024932861 -v -62.3682861328125 16.33436965942383 -3.851508140563965 -v -59.46704864501953 18.14007568359375 -17.19435882568359 -v -58.74361419677734 17.25180053710938 -17.46162986755371 -v -59.67054748535156 17.40419006347656 -17.88029861450195 -v -60.63759613037109 17.83680725097656 -17.39541244506836 -v -60.57522583007812 18.4241943359375 -16.30149078369141 -v -61.55588531494141 17.8875732421875 -16.36125946044922 -v -61.64485168457031 17.99566650390625 -15.12407302856445 -v -62.26735687255859 17.01812744140625 -14.1118221282959 -v -61.48154449462891 16.71725463867188 -13.28517723083496 -v -61.38417816162109 17.6744384765625 -14.01605987548828 -v -62.20498657226562 15.86500549316406 -13.65141487121582 -v -62.61495971679688 16.22450256347656 -14.63912963867188 -v -61.27806091308594 15.71261596679688 -13.23274803161621 -v -62.26735687255859 15.27760314941406 -14.74532318115234 -v -61.48154449462891 14.97671890258789 -13.91867828369141 -v -61.38417816162109 14.7132682800293 -15.09383583068848 -v -61.64485168457031 15.17942810058594 -16.14909934997559 -v -60.47430419921875 14.81786727905273 -16.19002342224121 -v -60.57522583007812 15.60797119140625 -17.32651901245117 -v -61.55588531494141 16.05747985839844 -17.02736282348633 -v -59.56442260742188 15.44235229492188 -17.09698486328125 -v -60.63759613037109 16.7611083984375 -17.78693389892578 -v -59.46704864501953 16.39955139160156 -17.82785987854004 -v -61.74577331542969 17.04522705078125 -16.89406776428223 -v -62.3682861328125 17.14340209960938 -15.49030303955078 -v -62.3682861328125 16.06770324707031 -15.8818244934082 - -# 302 UV coordinates -vt 0.1861920058727264 0.2227180004119873 0 -vt 0.5031800270080566 0.03906299918889999 0 -vt 0.2364480048418045 0.2373390048742294 0 -vt 0.3814640045166016 0.2761969864368439 0 -vt 0.5749170184135437 0.134553998708725 0 -vt 0.7469409704208374 0.1137370020151138 0 -vt 0.07407300174236298 0.3458549976348877 0 -vt 0.04933400079607964 0.5214380025863647 0 -vt 0.1560039967298508 0.4129219949245453 0 -vt 0.1560039967298508 0.6299539804458618 0 -vt 0.3814640045166016 0.8019279837608337 0 -vt 0.3600949943065643 0.5390629768371582 0 -vt 0.6192520260810852 0.384553998708725 0 -vt 0.6192520260810852 0.6935709714889526 0 -vt 0.8223689794540405 0.5390629768371582 0 -vt 0.8340740203857422 0.2890630066394806 0 -vt 1.023437976837158 0.5390629768371582 0 -vt 0.9728180170059204 0.5390629768371582 0 -vt 0.9225059747695923 0.2890630066394806 0 -vt 0.8340740203857422 0.7890629768371582 0 -vt 0.7469409704208374 0.9643880128860474 0 -vt 0.9225059747695923 0.7890629768371582 0 -vt 0.5749170184135437 0.9435709714889526 0 -vt 0.2364480048418045 0.8055369853973389 0 -vt 0.1861920058727264 0.8201580047607422 0 -vt 0.5031800270080566 1.039062976837158 0 -vt 0.2846769988536835 0.8055369853973389 0 -vt 0.6248959898948669 0.8019279837608337 0 -vt 0.7180020213127136 0.9435709714889526 0 -vt 0.8507689833641052 0.6935709714889526 0 -vt 0.646265983581543 0.5390629768371582 0 -vt 0.6248959898948669 0.2761969864368439 0 -vt 0.8507689833641052 0.384553998708725 0 -vt 0.2340410053730011 0.6299539804458618 0 -vt 0.1000450029969215 0.5214380025863647 0 -vt 0.2340410053730011 0.4129219949245453 0 -vt 0.1038810014724731 0.3458549976348877 0 -vt 0.2846769988536835 0.2373390048742294 0 -vt 0.7180020213127136 0.134553998708725 0 -vt 0.02343799918889999 0.5214380025863647 0 -vt 0.07407300174236298 0.6970210075378418 0 -vt 0.1038810014724731 0.6970210075378418 0 -vt -0.06587100028991699 -0.4100160002708435 0 -vt 0.4030880033969879 -0.109436996281147 0 -vt 0.1274410039186478 -0.364995002746582 0 -vt 0.4030880033969879 0.1842669993638992 0 -vt 0.6787350177764893 0.008834999985992908 0 -vt 1.058290958404541 -0.01694799959659576 0 -vt -0.3185659945011139 -0.03083699941635132 0 -vt -0.3557040095329285 0.5098400115966797 0 -vt -0.04291899874806404 0.175683006644249 0 -vt -0.04291899874806404 0.8439980149269104 0 -vt 0.4030880033969879 0.8354139924049377 0 -vt 0.4030880033969879 0.5098400115966797 0 -vt 1.035338997840881 0.3184730112552643 0 -vt 1.035338997840881 0.7012069821357727 0 -vt 1.348124027252197 0.5098400115966797 0 -vt 1.310984969139099 0.06459199637174606 0 -vt 1.481344938278198 0.5098400115966797 0 -vt 1.310984969139099 0.9550889730453491 0 -vt 1.058290958404541 1.03662896156311 0 -vt 0.6787350177764893 1.010846018791199 0 -vt 0.1274410039186478 1.384675025939941 0 -vt -0.06587100028991699 1.429695963859558 0 -vt 0.4030880033969879 1.129117012023926 0 -vt -0.4889250099658966 0.5098400115966797 0 -vt -0.3185659945011139 1.050518035888672 0 -vt 0 1 0 -vt 0 0 0 -vt 0 0.1666669994592667 0 -vt 0.1428570002317429 0.1666669994592667 0 -vt 0.1428570002317429 0 0 -vt 0 0.3333329856395721 0 -vt 0.1428570002317429 0.3333329856395721 0 -vt 0 0.5 0 -vt 0.1428570002317429 0.5 0 -vt 0 0.6666669845581055 0 -vt 0.1428570002317429 0.6666669845581055 0 -vt 0 0.8333330154418945 0 -vt 0.1428570002317429 0.8333330154418945 0 -vt 0.1428570002317429 1 0 -vt 0.2857140004634857 0 0 -vt 0.2857140004634857 0.1666669994592667 0 -vt 0.2857140004634857 0.3333329856395721 0 -vt 0.2857140004634857 0.5 0 -vt 0.2857140004634857 0.6666669845581055 0 -vt 0.2857140004634857 0.8333330154418945 0 -vt 0.2857140004634857 1 0 -vt 0.4285709857940674 0.1666669994592667 0 -vt 0.4285709857940674 0 0 -vt 0.4285709857940674 0.3333329856395721 0 -vt 0.4285709857940674 0.5 0 -vt 0.4285709857940674 0.6666669845581055 0 -vt 0.4285709857940674 0.8333330154418945 0 -vt 0.4285709857940674 1 0 -vt 0.5714290142059326 0 0 -vt 0.5714290142059326 0.1666669994592667 0 -vt 0.5714290142059326 0.3333329856395721 0 -vt 0.5714290142059326 0.5 0 -vt 0.5714290142059326 0.6666669845581055 0 -vt 0.5714290142059326 0.8333330154418945 0 -vt 0.5714290142059326 1 0 -vt 0.7142860293388367 0.1666669994592667 0 -vt 0.7142860293388367 0 0 -vt 0.7142860293388367 0.3333329856395721 0 -vt 0.7142860293388367 0.5 0 -vt 0.7142860293388367 0.6666669845581055 0 -vt 0.7142860293388367 0.8333330154418945 0 -vt 0.7142860293388367 1 0 -vt 0.8571429848670959 0 0 -vt 0.8571429848670959 0.1666669994592667 0 -vt 0.8571429848670959 0.3333329856395721 0 -vt 0.8571429848670959 0.5 0 -vt 0.8571429848670959 0.6666669845581055 0 -vt 0.8571429848670959 0.8333330154418945 0 -vt 0.8571429848670959 1 0 -vt 1 0.1666669994592667 0 -vt 1 0 0 -vt 1 0.3333329856395721 0 -vt 1 0.5 0 -vt 1 0.6666669845581055 0 -vt 1 0.8333330154418945 0 -vt 1 1 0 -vt 0.3329190015792847 0.2726939916610718 0 -vt 0.4468950033187866 0.3977729976177216 0 -vt 0.4569770097732544 0.4220040142536163 0 -vt 0.4028989970684052 0.4104689955711365 0 -vt 0.4066259860992432 0.379391998052597 0 -vt 0.3709700107574463 0.3842439949512482 0 -vt 0.3996250033378601 0.4318499863147736 0 -vt 0.3599070012569427 0.3859829902648926 0 -vt 0.439538985490799 0.4458169937133789 0 -vt 0.3817679882049561 0.3832989931106567 0 -vt 0.4925839900970459 0.4418520033359528 0 -vt 0.420091986656189 0.3782140016555786 0 -vt 0.5188159942626953 0.4229409992694855 0 -vt 0.4460189938545227 0.3745560050010681 0 -vt 0.4984830021858215 0.4033240079879761 0 -vt 0.4400259852409363 0.3750799894332886 0 -vt 0.3448100090026855 0.3380840122699738 0 -vt 0.4880180060863495 0.4240910112857819 0 -vt 0.4631580114364624 0.428277999162674 0 -vt 0.487405002117157 0.409841001033783 0 -vt 0.4343610107898712 0.3930070102214813 0 -vt 0.4332970082759857 0.3810479938983917 0 -vt 0.468531996011734 0.4094749987125397 0 -vt 0.4179730117321014 0.377579003572464 0 -vt 0.4456129968166351 0.4232679903507233 0 -vt 0.3999280035495758 0.3852129876613617 0 -vt 0.4359039962291718 0.4408339858055115 0 -vt 0.392751008272171 0.3982000052928925 0 -vt 0.4467189908027649 0.4489449858665466 0 -vt 0.4018450081348419 0.4067620038986206 0 -vt 0.4699110090732574 0.4414939880371094 0 -vt 0.4203630089759827 0.4044510126113892 0 -vt 0.1903489977121353 0.9132689833641052 0 -vt 0 0.9132689833641052 0 -vt 0.6703060269355774 0.9132689833641052 0 -vt 0.3792589902877808 0.06698700040578842 0 -vt 0.4379310011863708 0.06698700040578842 0 -vt 0.4379310011863708 0.9330130219459534 0 -vt 0.3792589902877808 0.1919869929552078 0 -vt 0.3792589902877808 0.9330130219459534 0 -vt 0.2189649939537048 0.1433759927749634 0 -vt 0.2189649939537048 0.9330130219459534 0 -vt 0 0.1433759927749634 0 -vt 0 0.9330130219459534 0 -vt 0.719871997833252 0.25 0 -vt 0.6568959951400757 0.25 0 -vt 0.8588460087776184 0.3472220003604889 0 -vt 0.3792589902877808 0.25 0 -vt 0 0.2166669964790344 0 -vt 0 0.25 0 -vt 0 0.6800450086593628 0 -vt 0.721310019493103 0.6800450086593628 0 -vt 1 0.6800450086593628 0 -vt 0.8758609890937805 0.5 0 -vt 0.6497269868850708 0.4642859995365143 0 -vt 0.2611050009727478 0.4642859995365143 0 -vt 0 0.4166670143604279 0 -vt 0 0.8146960139274597 0 -vt 0.6703060269355774 0.8146960139274597 0 -vt 0.9116590023040771 0.8146960139274597 0 -vt 0.7585179805755615 0.75 0 -vt 0.5653179883956909 0.7142860293388367 0 -vt 0.2287610024213791 0.7142860293388367 0 -vt 0 0.75 0 -vt 0.2777349948883057 0.5337309837341309 0 -vt 0.3167409896850586 0.5444089770317078 0 -vt 0.3253549933433533 0.5303530097007751 0 -vt 0.3324030041694641 0.5128970146179199 0 -vt 0.419871985912323 0.5059530138969421 0 -vt 0.3902159929275513 0.5307300090789795 0 -vt 0.4765799939632416 0.558493971824646 0 -vt 0.5292080044746399 0.5406749844551086 0 -vt 0.5235919952392578 0.6004890203475952 0 -vt 0.5620089769363403 0.5962309837341309 0 -vt 0.5161960124969482 0.6375470161437988 0 -vt 0.5401409864425659 0.6448410153388977 0 -vt 0.4799120128154755 0.6592649817466736 0 -vt 0.4964070022106171 0.6726189851760864 0 -vt 0.4308049976825714 0.6795639991760254 0 -vt 0.4368790090084076 0.6545109748840332 0 -vt 0.3652040064334869 0.6587309837341309 0 -vt 0.3920060098171234 0.6402639746665955 0 -vt 0.379723995923996 0.6103219985961914 0 -vt 0.3324030041694641 0.6101189851760864 0 -vt 0.3585309982299805 0.5761809945106506 0 -vt 0.2886680066585541 0.5823410153388977 0 -vt 0.445345014333725 0.6860769987106323 0 -vt 0.607125997543335 0.786342978477478 0 -vt 0.8164219856262207 0.6093729734420776 0 -vt 0.9782029986381531 0.754476010799408 0 -vt 0.445345014333725 0.5 0 -vt 0.445345014333725 0.3139230012893677 0 -vt 0.8164219856262207 0.3906269967556 0 -vt 0.1835779994726181 0.69098299741745 0 -vt 0.1835779994726181 0.30901700258255 0 -vt 0.02179699949920177 0.19098299741745 0 -vt 0.2835640013217926 0 0 -vt 0.607125997543335 0.2136570066213608 0 -vt 0.9782029986381531 0.2455240041017532 0 -vt 0.2835640013217926 1 0 -vt 0.02179699949920177 0.80901700258255 0 -vt 1 0.9132689833641052 0 -vt 0.8096510171890259 0.9132689833641052 0 -vt 0.329694002866745 0.9132689833641052 0 -vt 0.5620689988136292 0.06698700040578842 0 -vt 0.6207410097122192 0.06698700040578842 0 -vt 0.5620689988136292 0.9330130219459534 0 -vt 0.6207410097122192 0.1919869929552078 0 -vt 0.6207410097122192 0.9330130219459534 0 -vt 0.7810350060462952 0.1433759927749634 0 -vt 0.7810350060462952 0.9330130219459534 0 -vt 1 0.1433759927749634 0 -vt 1 0.9330130219459534 0 -vt 0.3431040048599243 0.25 0 -vt 0.280128002166748 0.25 0 -vt 0.1411540061235428 0.3472220003604889 0 -vt 0.6207410097122192 0.25 0 -vt 1 0.2166669964790344 0 -vt 1 0.25 0 -vt 0.2786900103092194 0.6800450086593628 0 -vt 0.1241390034556389 0.5 0 -vt 0.3502730131149292 0.4642859995365143 0 -vt 0.7388949990272522 0.4642859995365143 0 -vt 1 0.4166670143604279 0 -vt 0.329694002866745 0.8146960139274597 0 -vt 1 0.8146960139274597 0 -vt 0.08834099769592285 0.8146960139274597 0 -vt 0.2414820045232773 0.75 0 -vt 0.4346820116043091 0.7142860293388367 0 -vt 0.7712389826774597 0.7142860293388367 0 -vt 1 0.75 0 -vt 0.6746450066566467 0.5303530097007751 0 -vt 0.6832590103149414 0.5444089770317078 0 -vt 0.7222650051116943 0.5337309837341309 0 -vt 0.6675969958305359 0.5128970146179199 0 -vt 0.580128014087677 0.5059530138969421 0 -vt 0.6097840070724487 0.5307300090789795 0 -vt 0.523419976234436 0.558493971824646 0 -vt 0.4707919955253601 0.5406749844551086 0 -vt 0.4379909932613373 0.5962309837341309 0 -vt 0.4764080047607422 0.6004890203475952 0 -vt 0.4598590135574341 0.6448410153388977 0 -vt 0.4838039875030518 0.6375470161437988 0 -vt 0.5200880169868469 0.6592649817466736 0 -vt 0.5035930275917053 0.6726189851760864 0 -vt 0.5691949725151062 0.6795639991760254 0 -vt 0.5631210207939148 0.6545109748840332 0 -vt 0.6347960233688354 0.6587309837341309 0 -vt 0.6079949736595154 0.6402639746665955 0 -vt 0.6202759742736816 0.6103219985961914 0 -vt 0.6675969958305359 0.6101189851760864 0 -vt 0.6414690017700195 0.5761809945106506 0 -vt 0.7113320231437683 0.5823410153388977 0 -vt 1.046875 0.7720100283622742 0 -vt 0.9567909836769104 0.7309449911117554 0 -vt 0.8992829918861389 0.9703119993209839 0 -vt 0.9425439834594727 0.8885890245437622 0 -vt 0.7200279831886292 0.9022690057754517 0 -vt 0.7071679830551147 1.046875 0 -vt 0.4538260102272034 0.9313979744911194 0 -vt 0.2154179960489273 0.8448349833488464 0 -vt 0.05815599858760834 0.5868980288505554 0 -vt 0.2360229939222336 0.6679760217666626 0 -vt 0.349481999874115 0.4541139900684357 0 -vt 0.1369580030441284 0.3572390079498291 0 -vt 0.046875 0.3161740005016327 0 -vt 0.3723309934139252 0.1989489942789078 0 -vt 0.4473200142383575 0.046875 0 -vt 0.1944639980792999 0.11786799877882 0 -vt 0.6831830143928528 0.07506199926137924 0 -vt 0.674377977848053 0.1724929958581924 0 -vt 0.8633509874343872 0.4091059863567352 0 -vt 0.9277200102806091 0.287975013256073 0 -vt 0.8783320188522339 0.2433450073003769 0 -vt 1.026785969734192 0.5987160205841064 0 -vt 1.035591959953308 0.5012850165367126 0 -vt 0.8346710205078125 0.6752780079841614 0 -vt 0.5326259732246399 0.7017340064048767 0 -vt 0.6168689727783203 0.4118610024452209 0 - -# 747 vertex normals -vn -0.5375880002975464 -0.07179799675941467 0.840146005153656 -vn -0.1515550017356873 -0.01711099967360497 0.9883009791374207 -vn -0.510263979434967 0.3471930027008057 0.7868220210075378 -vn -0.383882999420166 0.7247530221939087 0.572160005569458 -vn 0.006790999788790941 0.5470830202102661 0.8370509743690491 -vn 0.4419640004634857 0.160861998796463 0.8824920058250427 -vn -0.8104130029678345 0.1847179979085922 0.5559759736061096 -vn -0.9155340194702148 0.4022400081157684 0 -vn -0.710112988948822 0.6201850175857544 0.3333309888839722 -vn -0.7216730117797852 0.6078910231590271 -0.3311449885368347 -vn -0.4136289954185486 0.7018579840660095 -0.5799199938774109 -vn -0.4094110131263733 0.9123499989509583 0.0004339999868534505 -vn 0.1323229968547821 0.9380099773406982 0.3203549981117249 -vn 0.1323229968547821 0.9380099773406982 -0.3203549981117249 -vn 0.3397679924964905 0.940509021282196 0 -vn 0.4818519949913025 0.6178590059280396 0.6213449835777283 -vn 0.8813369870185852 0.4724879860877991 0 -vn 0.9429519772529602 -0.3329299986362457 0 -vn 0.7952039837837219 -0.09252200275659561 0.5992419719696045 -vn 0.4818519949913025 0.6178590059280396 -0.6213449835777283 -vn 0.4419640004634857 0.160861998796463 -0.8824920058250427 -vn 0.7952039837837219 -0.09252200275659561 -0.5992419719696045 -vn -0.01252099964767694 0.539700984954834 -0.841763973236084 -vn -0.5448579788208008 0.3272939920425415 -0.7720159888267517 -vn -0.5613030195236206 -0.07517900317907333 -0.8241890072822571 -vn -0.1957750022411346 -0.0270760003477335 -0.9802749752998352 -vn -0.2998470067977905 -0.5292649865150452 -0.793707013130188 -vn 0.1448850035667419 -0.802478015422821 -0.578823983669281 -vn 0.343163013458252 -0.4203700125217438 -0.8399569988250732 -vn 0.7043060064315796 -0.6335020065307617 -0.3203549981117249 -vn 0.2609860002994537 -0.9653429985046387 0.0003220000071451068 -vn 0.173225998878479 -0.8032519817352295 0.569894015789032 -vn 0.7043060064315796 -0.6335020065307617 0.3203549981117249 -vn -0.3462300002574921 -0.8729979991912842 -0.3435100018978119 -vn -0.769195020198822 -0.6390140056610107 0 -vn -0.334289014339447 -0.8776149749755859 0.3435750007629395 -vn -0.7281039953231812 -0.4009419977664948 0.5559759736061096 -vn -0.2649039924144745 -0.5273450016975403 0.8072999715805054 -vn 0.3593209981918335 -0.4139899909496307 0.8363620042800903 -vn -0.9902679920196533 -0.1391730010509491 -0 -vn -0.8104130029678345 0.1847179979085922 -0.5559759736061096 -vn -0.7281039953231812 -0.4009419977664948 -0.5559759736061096 -vn -0.2362789958715439 0.02918500080704689 0.9712470173835754 -vn 0.3209069967269897 -0.1081760004162788 0.9409130215644836 -vn 0.2328509986400604 0.4920690059661865 0.8388379812240601 -vn 0.4011589884757996 0.816008985042572 0.4161730110645294 -vn 0.3620760142803192 0.3835749924182892 0.8495709896087646 -vn 0.1260980069637299 -0.04097200185060501 0.9911710023880005 -vn -0.604686975479126 0.6148959994316101 0.5062180161476135 -vn -0.4789099991321564 0.8778640031814575 0 -vn 0.03857599943876266 0.9693480134010315 0.2426449954509735 -vn 0.03857599943876266 0.9693480134010315 -0.2426449954509735 -vn 0.4011589884757996 0.816008985042572 -0.4161730110645294 -vn 0.3609150052070618 0.9325990080833435 0 -vn 0.4944109916687012 0.798675000667572 0.3430379927158356 -vn 0.4944109916687012 0.798675000667572 -0.3430379927158356 -vn 0.8612650036811829 0.5081560015678406 0 -vn 0.6479099988937378 0.2460869997739792 0.7208700180053711 -vn 0.9510570168495178 -0.30901700258255 0 -vn 0.7433170080184937 -0.668940007686615 0 -vn 0.5354629755020142 -0.3628270030021667 0.7626510262489319 -vn 0.6479099988937378 0.2460860013961792 -0.7208700180053711 -vn 0.1260980069637299 -0.04097200185060501 -0.9911710023880005 -vn 0.5354629755020142 -0.3628270030021667 -0.7626510262489319 -vn 0.3620760142803192 0.3835749924182892 -0.8495709896087646 -vn 0.2328509986400604 0.4920690059661865 -0.8388379812240601 -vn -0.2362789958715439 0.02918500080704689 -0.9712470173835754 -vn 0.3209069967269897 -0.1081760004162788 -0.9409130215644836 -vn 0.1329340040683746 -0.4152190089225769 -0.8999559879302979 -vn 0.1888570040464401 -0.9709110260009766 -0.1471920013427734 -vn 0.1993210017681122 -0.4351809918880463 -0.8780030012130737 -vn -0.8620179891586304 0.08302299678325653 0.5000320076942444 -vn 0.1329340040683746 -0.4152190089225769 0.8999559879302979 -vn 0.1993210017681122 -0.4351809918880463 0.8780019879341125 -vn 0.1888570040464401 -0.9709110260009766 0.1471920013427734 -vn -0.9302049875259399 0.3670400083065033 0 -vn -0.9976400136947632 0.0686580017209053 0 -vn -0.604686975479126 0.6148959994316101 -0.5062180161476135 -vn -0.8620179891586304 0.08302299678325653 -0.5000320076942444 -vn 0.02138300053775311 -0.9165120124816895 0.3994359970092773 -vn -0.7818620204925537 -0.4315609931945801 -0.4499419927597046 -vn 0.9563360214233398 0.2284609973430634 -0.1822829991579056 -vn 0.8339009881019592 -0.1045610010623932 -0.5419189929962158 -vn 0.767799973487854 0.6018419861793518 0.2197020053863525 -vn 0.5461239814758301 0.7825490236282349 0.2989400029182434 -vn 0.9109249711036682 0.174918994307518 -0.3736560046672821 -vn 0.7487580180168152 0.6616759896278381 -0.03931299969553947 -vn 0.949258029460907 -0.04748500138521194 -0.3108929991722107 -vn 0.4068360030651093 0.8022599816322327 -0.4368790090084076 -vn 0.7691559791564941 0.182668998837471 -0.6123980283737183 -vn 0.1995120048522949 0.6090829968452454 -0.7676020264625549 -vn 0.6676030158996582 0.001959000015631318 -0.7445150017738342 -vn -0.0993880033493042 0.4149369895458221 -0.9044049978256226 -vn 0.3527739942073822 0.07949899882078171 -0.932325005531311 -vn -0.2833180129528046 0.4208430051803589 -0.8617550134658813 -vn -0.05747900158166885 0.8575270175933838 0.5112180113792419 -vn 0.1317239999771118 0.7430220246315002 0.6561769843101501 -vn -0.005809000227600336 0.8595520257949829 0.5110160112380981 -vn -0.3505710065364838 0.931430995464325 -0.09765499830245972 -vn -0.6476929783821106 0.6648160219192505 -0.372173011302948 -vn -0.8983089923858643 0.4048080146312714 -0.1707939952611923 -vn -0.8662490248680115 0.4800429940223694 -0.1384589970111847 -vn -0.7151209712028503 0.3602499961853027 0.5990179777145386 -vn -0.8666250109672546 0.3417699933052063 0.3635300099849701 -vn -0.6623769998550415 0.2970130145549774 0.6877800226211548 -vn -0.8117250204086304 0.3888390064239502 0.4357819855213165 -vn -0.9508990049362183 0.2433879971504211 0.1911900043487549 -vn -0.8467730283737183 0.07804299890995026 0.5261989831924438 -vn -0.7594159841537476 0.1409499943256378 0.6351540088653564 -vn -0.9400110244750977 -0.3405149877071381 -0.02069300040602684 -vn -0.9724000096321106 -0.2049909979104996 0.1114299967885017 -vn -0.8170300126075745 -0.3317660093307495 0.4715850055217743 -vn -0.6166999936103821 -0.3858979940414429 0.6861220002174377 -vn -0.5654150247573853 -0.4132109880447388 0.7138370275497437 -vn -0.3424369990825653 -0.3165769875049591 0.884598970413208 -vn -0.2633169889450073 -0.3102239966392517 0.9134690165519714 -vn -0.4920729994773865 -0.6772800087928772 -0.5469520092010498 -vn -0.2165350019931793 -0.8325880169868469 -0.5098140239715576 -vn -0.336313009262085 -0.9366880059242249 -0.09751000255346298 -vn 0.08508399873971939 -0.8829479813575745 0.4616970121860504 -vn 0.1960570067167282 -0.7339509725570679 0.6502910256385803 -vn 0.454815000295639 -0.6157029867172241 0.6434699892997742 -vn 0.4893380105495453 -0.7108240127563477 0.5052499771118164 -vn 0.4581849873065948 -0.6546030044555664 -0.6013000011444092 -vn 0.2736169993877411 -0.5752760171890259 -0.7708380222320557 -vn 0.5572580099105835 -0.6418589949607849 -0.526764988899231 -vn 0.7707909941673279 -0.6368250250816345 0.01830600015819073 -vn 0.8732380270957947 -0.4872829914093018 0.003169999923557043 -vn 0.8787599802017212 -0.285726010799408 -0.3822849988937378 -vn 0.7752519845962524 -0.4531359970569611 -0.4400599896907806 -vn 0.07676800340414047 -0.9022539854049683 -0.4243170022964478 -vn -0.7608579993247986 -0.310029000043869 0.5700669884681702 -vn 0.6989830136299133 0.6327279806137085 -0.333285003900528 -vn 0.9189450144767761 -0.0186110008507967 0.3939450085163116 -vn 0.9469230175018311 0.2427060008049011 0.2107869982719421 -vn 0.5977060198783875 0.7759019732475281 -0.2018010020256042 -vn 0.8984569907188416 0.3959749937057495 0.1896820068359375 -vn 0.5849769711494446 0.7775779962539673 -0.2305970042943954 -vn 0.06112100183963776 0.8655030131340027 0.4971610009670258 -vn 0.81489098072052 0.173455998301506 0.5530520081520081 -vn 0.488323986530304 0.05219599977135658 0.8711000084877014 -vn -0.07333800196647644 0.3724580109119415 0.9251469969749451 -vn -0.1685570031404495 0.420635998249054 0.8914330005645752 -vn 0.5626059770584106 0.01164999976754189 0.8266429901123047 -vn 0.424549013376236 0.2200690060853958 0.8782529830932617 -vn -0.2022739946842194 0.5748890042304993 0.792834997177124 -vn -0.2014950066804886 0.8707110285758972 -0.4486219882965088 -vn -0.1475190073251724 0.7000659704208374 -0.6986740231513977 -vn -0.247406005859375 0.6800289750099182 -0.6901819705963135 -vn -0.6592289805412292 0.7426900267601013 -0.1175960004329681 -vn -0.8238279819488525 0.5144019722938538 0.2381149977445602 -vn -0.8807550072669983 0.462224006652832 0.1030530035495758 -vn -0.8354460000991821 0.5381479859352112 0.1114759966731071 -vn -0.8354330062866211 0.2911489903926849 -0.4661380052566528 -vn -0.7990170121192932 0.4768629968166351 -0.3662959933280945 -vn -0.7965649962425232 -0.008375000208616257 -0.6044949889183044 -vn -0.7460759878158569 0.1244580000638962 -0.654125988483429 -vn -0.8470270037651062 0.2575120031833649 -0.4650079905986786 -vn -0.7743350267410278 0.09411299973726273 -0.6257380247116089 -vn -0.7994340062141418 0.06731099635362625 -0.5969709753990173 -vn -0.914825975894928 -0.4032889902591705 0.0212399996817112 -vn -0.9607080221176147 -0.2765470147132874 0.02371999993920326 -vn -0.7760940194129944 -0.562736988067627 -0.2846130132675171 -vn -0.2481050044298172 -0.5148569941520691 -0.820589005947113 -vn -0.2315990030765533 -0.2342070043087006 -0.9441980123519897 -vn -0.2359499931335449 -0.3241190016269684 -0.9161189794540405 -vn -0.3423370122909546 -0.4482719898223877 -0.825747013092041 -vn -0.3890469968318939 -0.6779909729957581 0.6236749887466431 -vn -0.2865490019321442 -0.8684669733047485 0.4045419991016388 -vn -0.05829200148582458 -0.911346971988678 0.407490998506546 -vn 0.4559510052204132 -0.7950720191001892 -0.3999620079994202 -vn 0.4897150099277496 -0.5246649980545044 -0.6963520050048828 -vn 0.5158429741859436 -0.6365799903869629 -0.5733000040054321 -vn 0.423911988735199 -0.8095009922981262 -0.4062100052833557 -vn 0.5356029868125916 -0.6355810165405273 0.5560269951820374 -vn 0.4908620119094849 -0.4675160050392151 0.7351760268211365 -vn 0.7313770055770874 -0.3685759902000427 0.5737929940223694 -vn 0.8901190161705017 -0.3876970112323761 0.2395379990339279 -vn 0.8836299777030945 -0.404119998216629 0.2363989949226379 -vn 0.8226990103721619 -0.324539989233017 0.4667330086231232 -vn 0.7892469763755798 -0.4085890054702759 0.4584139883518219 -vn -0.07298800349235535 -0.9022539854049683 0.4249840080738068 -vn -0.2881479859352112 -0.512224018573761 -0.8090720176696777 -vn 0.9188060164451599 0.3839870095252991 0.09137199819087982 -vn 0.993162989616394 0.114096000790596 -0.02468799985945225 -vn 0.4343830049037933 0.7090979814529419 0.5554199814796448 -vn 0.4718630015850067 0.8051769733428955 0.3592160046100616 -vn 0.8680509924888611 0.4418930113315582 0.2263129949569702 -vn 0.3869659900665283 0.8111780285835266 0.4384610056877136 -vn 0.9717289805412292 0.2360440045595169 0.005162999965250492 -vn 0.2779389917850494 0.90385901927948 -0.3252519965171814 -vn 0.9075610041618347 0.1839890033006668 -0.377467006444931 -vn 0.3897979855537415 0.4576799869537354 -0.7991160154342651 -vn 0.9741809964179993 -0.04597700014710426 -0.2210370004177094 -vn 0.4417490065097809 0.2665829956531525 -0.8566160202026367 -vn 0.8866739869117737 0.01747499965131283 -0.4620650112628937 -vn 0.3720920085906982 0.3275539875030518 -0.8684790134429932 -vn -0.3850800096988678 0.8340460062026978 0.3950709998607635 -vn -0.4761059880256653 0.6599609851837158 0.581184983253479 -vn -0.5561609864234924 0.6855729818344116 0.4697610139846802 -vn -0.6268590092658997 0.7454360127449036 -0.2266560047864914 -vn -0.5542709827423096 0.4361459910869598 -0.7089149951934814 -vn -0.5615590214729309 0.3103019893169403 -0.7670490145683289 -vn -0.5438100099563599 0.4169149994850159 -0.7283220291137695 -vn -0.9747139811515808 0.1763579994440079 0.1372230052947998 -vn -0.9172520041465759 0.3692820072174072 0.1492629945278168 -vn -0.9827640056610107 -0.03630400076508522 0.1812669932842255 -vn -0.9872050285339355 0.07037699967622757 0.1430840045213699 -vn -0.9887080192565918 0.09066099673509598 -0.119318999350071 -vn -0.9954649806022644 0.06980500370264053 -0.0646279975771904 -vn -0.9868990182876587 0.1531080007553101 -0.0508820004761219 -vn -0.7857019901275635 -0.5462189912796021 -0.2903740108013153 -vn -0.8021669983863831 -0.4474230110645294 -0.3953999876976013 -vn -0.7882999777793884 -0.6091880202293396 -0.08644299954175949 -vn -0.6353080272674561 -0.5868319869041443 0.5020080208778381 -vn -0.7489200234413147 -0.3426479995250702 0.5671960115432739 -vn -0.8290749788284302 -0.1998199969530106 0.5222129821777344 -vn -0.8114089965820312 -0.2435930073261261 0.5312989950180054 -vn -0.02972600050270557 -0.7129759788513184 -0.7005580067634583 -vn -0.1212550029158592 -0.8703849911689758 -0.4772070050239563 -vn 0.1511760056018829 -0.9298509955406189 -0.3354449868202209 -vn 0.2028409987688065 -0.8257309794425964 0.5263310074806213 -vn 0.08091399818658829 -0.5281829833984375 0.8452659845352173 -vn 0.01067500002682209 -0.4742409884929657 0.8803300261497498 -vn 0.0144889997318387 -0.6355460286140442 0.7719269990921021 -vn 0.7427240014076233 -0.5451459884643555 -0.3888140022754669 -vn 0.7865099906921387 -0.3833020031452179 -0.4842329919338226 -vn 0.9205939769744873 -0.3581419885158539 -0.1556950062513351 -vn 0.8897669911384583 -0.3594259917736053 0.2812969982624054 -vn 0.8730049729347229 -0.2942259907722473 0.3889650106430054 -vn 0.9076560139656067 -0.2917299866676331 0.3017520010471344 -vn 0.8630970120429993 -0.4457089900970459 0.2375019937753677 -vn 0.04144300147891045 -0.9088649749755859 -0.415026992559433 -vn -0.1099570021033287 -0.08454799652099609 0.9903339743614197 -vn 0.2451310008764267 0.7632600069046021 -0.5977830290794373 -vn 0.9554449915885925 0.2843270003795624 -0.07926099747419357 -vn 0.8238049745559692 0.5351709723472595 -0.1869129985570908 -vn 0.2853530049324036 0.8679130077362061 -0.4065710008144379 -vn 0.7501500248908997 0.5809810161590576 -0.3158090114593506 -vn 0.193001002073288 0.8577240109443665 -0.4765090048313141 -vn 0.1220619976520538 0.9612579941749573 0.2471510022878647 -vn 0.8907639980316162 0.4299469888210297 -0.147257000207901 -vn 0.8693600296974182 0.404801994562149 0.2834579944610596 -vn 0.3425579965114594 0.6023179888725281 0.7210180163383484 -vn 0.4495930075645447 0.5570510029792786 0.6982550024986267 -vn 0.9799709916114807 0.1605979949235916 0.1177510023117065 -vn 0.9129520058631897 0.3300270140171051 0.2400040030479431 -vn 0.3969599902629852 0.7427070140838623 0.5392670035362244 -vn -0.5626519918441772 0.7477009892463684 -0.3526549935340881 -vn -0.640733003616333 0.5571630001068115 -0.5282340049743652 -vn -0.7121180295944214 0.5705819725990295 -0.4090529978275299 -vn -0.7194139957427979 0.6329879760742188 0.2859529852867126 -vn -0.5416349768638611 0.3929080069065094 0.7431390285491943 -vn -0.5068719983100891 0.4453279972076416 0.7380809783935547 -vn -0.5300359725952148 0.6580139994621277 0.5348640084266663 -vn -0.9993979930877686 0.002857000101357698 -0.03458600118756294 -vn -0.9778590202331543 0.2025559991598129 -0.05256599932909012 -vn -0.9748870134353638 -0.2087630033493042 -0.07754799723625183 -vn -0.9908090233802795 -0.1349709928035736 -0.00891099963337183 -vn -0.9714679718017578 -0.08408299833536148 0.2217649966478348 -vn -0.9839869737625122 -0.0358319990336895 0.1746020019054413 -vn -0.9879299998283386 0.05565499886870384 0.1445589959621429 -vn -0.6447849869728088 -0.6683390140533447 0.3709119856357574 -vn -0.6672559976577759 -0.5719799995422363 0.4770840108394623 -vn -0.6573889851570129 -0.7345010042190552 0.1683689951896667 -vn -0.5605350136756897 -0.7363070249557495 -0.3790149986743927 -vn -0.692903995513916 -0.5403270125389099 -0.4774209856987 -vn -0.805446982383728 -0.4507080018520355 -0.3848600089550018 -vn -0.8070970177650452 -0.5522969961166382 -0.2087150067090988 -vn 0.1668089926242828 -0.6945620179176331 0.699828028678894 -vn 0.08150500059127808 -0.8694409728050232 0.4872680008411407 -vn 0.3440600037574768 -0.8835279941558838 0.3178069889545441 -vn 0.3032650053501129 -0.806547999382019 -0.5074549913406372 -vn 0.1325059980154037 -0.5874869823455811 -0.7983120083808899 -vn 0.02260999940335751 -0.6936299800872803 -0.719976007938385 -vn 0.04509999975562096 -0.9239140152931213 -0.3799329996109009 -vn 0.8621219992637634 -0.401540994644165 0.3090479969978333 -vn 0.8867239952087402 -0.2328619956970215 0.3993679881095886 -vn 0.9798589944839478 -0.1908919960260391 0.05861499905586243 -vn 0.9012619853019714 -0.1982769966125488 -0.3852449953556061 -vn 0.8543739914894104 -0.1819390058517456 -0.4867680072784424 -vn 0.9012380242347717 -0.2525070011615753 -0.3521510064601898 -vn 0.8982779979705811 -0.4129990041255951 -0.1500930041074753 -vn -0.272473007440567 -0.9165120124816895 -0.2928540110588074 -vn 0.2474620044231415 -0.4315969944000244 0.8674600124359131 -vn 0.3753190040588379 0.6018419861793518 -0.7049270272254944 -vn 0.9690999984741211 -0.1045589968562126 -0.2234120070934296 -vn 0.7954490184783936 0.2284629940986633 -0.5613070130348206 -vn 0.1643320024013519 0.7825480103492737 -0.6005110144615173 -vn 0.9015669822692871 0.174918994307518 -0.395700991153717 -vn 0.5484110116958618 0.6616759896278381 -0.5113030076026917 -vn 0.596875011920929 0.8022609949111938 0.01082899980247021 -vn 0.8830479979515076 -0.04748399928212166 -0.4668749868869781 -vn 0.9758470058441162 0.1404889971017838 -0.1672890037298203 -vn 0.6950060129165649 0.6005629897117615 0.3953349888324738 -vn 0.8043910264968872 0.3754850029945374 0.4603970050811768 -vn 0.9504550099372864 -0.06233000010251999 -0.3045510053634644 -vn 0.9899749755859375 0.07949800044298172 -0.1167469993233681 -vn 0.7676119804382324 0.4208459854125977 0.4833849966526031 -vn -0.4076670110225677 0.8575270175933838 -0.3137750029563904 -vn -0.3805089890956879 0.7430220246315002 -0.550574004650116 -vn -0.371628999710083 0.8595520257949829 -0.3508029878139496 -vn -0.1732809990644455 0.931430995464325 0.320017009973526 -vn -0.08834400027990341 0.681833028793335 0.7261540293693542 -vn -0.09786199778318405 0.460783988237381 0.882099986076355 -vn -0.07521700114011765 0.4800420105457306 0.8740149736404419 -vn -0.9276620149612427 0.3602499961853027 0.09830199927091599 -vn -0.8635100126266479 0.3417719900608063 0.3708679974079132 -vn -0.9548730254173279 0.2970120012760162 -0.001296999980695546 -vn -0.877348005771637 0.388837993144989 0.2811869978904724 -vn -0.7982050180435181 0.2586430013179779 0.5440329909324646 -vn -0.8309450149536133 0.1299329996109009 0.5409700274467468 -vn -0.80000901222229 0.1409460008144379 0.5831969976425171 -vn -0.6381030082702637 -0.3405129909515381 0.6905620098114014 -vn -0.7556419968605042 -0.2049909979104996 0.6220800280570984 -vn -0.9067860245704651 -0.3317669928073883 0.2601329982280731 -vn -0.9219499826431274 -0.3858990073204041 -0.03300400078296661 -vn -0.9323030114173889 -0.3608480095863342 -0.02450799942016602 -vn -0.9716429710388184 -0.2363799959421158 0.005919000133872032 -vn -0.9500359892845154 -0.3102270066738129 0.03450300171971321 -vn 0.05162100121378899 -0.6772800087928772 0.7339119911193848 -vn 0.2163099944591522 -0.8325870037078857 0.509909987449646 -vn -0.1634809970855713 -0.9366880059242249 0.3096620142459869 -vn -0.2730129957199097 -0.8829479813575745 -0.3819249868392944 -vn -0.3344889879226685 -0.7286760210990906 -0.5976189970970154 -vn -0.4082350134849548 -0.6025800108909607 -0.6857410073280334 -vn -0.3718569874763489 -0.7108250260353088 -0.5970349907875061 -vn 0.7508220076560974 -0.6546019911766052 0.08810699731111526 -vn 0.7445650100708008 -0.5752760171890259 0.3386459946632385 -vn 0.7660269737243652 -0.6418589949607849 -0.03493599966168404 -vn 0.5222679972648621 -0.6368250250816345 -0.5671759843826294 -vn 0.5276669859886169 -0.5274670124053955 -0.6658419966697693 -vn 0.6410369873046875 -0.3752210140228271 -0.6695380210876465 -vn 0.6145420074462891 -0.4531340003013611 -0.6457610130310059 -vn -0.2724759876728058 -0.9165120124816895 0.2928540110588074 -vn 0.2474450021982193 -0.4315490126609802 -0.8674880266189575 -vn 0.7954490184783936 0.2284629940986633 0.5613070130348206 -vn 0.9690999984741211 -0.1045589968562126 0.2234120070934296 -vn 0.3753179907798767 0.6018419861793518 0.7049270272254944 -vn 0.1643320024013519 0.7825480103492737 0.6005110144615173 -vn 0.9015669822692871 0.174918994307518 0.395700991153717 -vn 0.5484099984169006 0.6616759896278381 0.5113030076026917 -vn 0.8830469846725464 -0.04748500138521194 0.4668749868869781 -vn 0.596875011920929 0.8022609949111938 -0.01082899980247021 -vn 0.9758470058441162 0.1404889971017838 0.1672890037298203 -vn 0.6950060129165649 0.6005640029907227 -0.3953360021114349 -vn 0.9504539966583252 -0.06233000010251999 0.3045510053634644 -vn 0.8043910264968872 0.3754850029945374 -0.4603970050811768 -vn 0.9899749755859375 0.07949800044298172 0.1167469993233681 -vn 0.767611026763916 0.4208459854125977 -0.4833849966526031 -vn -0.4076670110225677 0.8575270175933838 0.3137750029563904 -vn -0.3805089890956879 0.7430220246315002 0.550574004650116 -vn -0.371628999710083 0.8595520257949829 0.3508029878139496 -vn -0.1732809990644455 0.931430995464325 -0.320017009973526 -vn -0.0883449986577034 0.681833028793335 -0.7261540293693542 -vn -0.09786199778318405 0.460783988237381 -0.882099986076355 -vn -0.07521700114011765 0.4800420105457306 -0.8740149736404419 -vn -0.9276620149612427 0.3602499961853027 -0.09830199927091599 -vn -0.8635100126266479 0.3417719900608063 -0.3708679974079132 -vn -0.9548730254173279 0.2970120012760162 0.001296999980695546 -vn -0.877348005771637 0.388837993144989 -0.2811869978904724 -vn -0.7982050180435181 0.2586430013179779 -0.5440329909324646 -vn -0.8309450149536133 0.1299329996109009 -0.5409700274467468 -vn -0.8000100255012512 0.1409450024366379 -0.5831959843635559 -vn -0.6381030082702637 -0.3405129909515381 -0.6905620098114014 -vn -0.7556419968605042 -0.2049909979104996 -0.6220809817314148 -vn -0.9067860245704651 -0.3317669928073883 -0.2601329982280731 -vn -0.9219499826431274 -0.3858990073204041 0.03300400078296661 -vn -0.9323030114173889 -0.3608480095863342 0.02450799942016602 -vn -0.9716429710388184 -0.2363799959421158 -0.005919000133872032 -vn -0.9500359892845154 -0.3102270066738129 -0.03450300171971321 -vn 0.05162100121378899 -0.6772800087928772 -0.7339119911193848 -vn 0.2163099944591522 -0.8325870037078857 -0.509909987449646 -vn -0.1634809970855713 -0.9366869926452637 -0.3096620142459869 -vn -0.2730129957199097 -0.8829479813575745 0.3819249868392944 -vn -0.3344880044460297 -0.7286760210990906 0.5976200103759766 -vn -0.4082350134849548 -0.6025800108909607 0.6857410073280334 -vn -0.3718569874763489 -0.7108250260353088 0.5970349907875061 -vn 0.7508220076560974 -0.6546019911766052 -0.08810699731111526 -vn 0.7445650100708008 -0.5752760171890259 -0.3386459946632385 -vn 0.7660269737243652 -0.6418589949607849 0.03493599966168404 -vn 0.5222679972648621 -0.6368250250816345 0.5671769976615906 -vn 0.5276669859886169 -0.5274670124053955 0.6658419966697693 -vn 0.6410369873046875 -0.3752210140228271 0.6695380210876465 -vn 0.6145420074462891 -0.4531340003013611 0.6457610130310059 -vn -0.287102997303009 -0.9309409856796265 -0.2256560027599335 -vn 0.1843679994344711 -0.4218010008335114 0.8877459764480591 -vn 0.07405100017786026 0.6319169998168945 -0.7714899778366089 -vn 0.8553329706192017 0.06064699962735176 -0.5145170092582703 -vn 0.7307729721069336 0.3228900134563446 -0.6014260053634644 -vn 0.2098069936037064 0.7427859902381897 -0.6358069777488708 -vn 0.6162220239639282 0.3713270127773285 -0.6945400238037109 -vn 0.09581899642944336 0.7464309930801392 -0.6585279703140259 -vn 0.4080640077590942 0.9123439788818359 0.03336000069975853 -vn 0.8213359713554382 0.1804669946432114 -0.5411459803581238 -vn 0.969681978225708 0.1661700010299683 -0.17917600274086 -vn 0.7540370225906372 0.5044180154800415 0.4207040071487427 -vn 0.828561007976532 0.3165900111198425 0.4617980122566223 -vn 0.9432830214500427 -0.08009400218725204 -0.3221819996833801 -vn 0.9967989921569824 0.009220999665558338 -0.07941699773073196 -vn 0.775767982006073 0.3821409940719604 0.5021479725837708 -vn -0.5359219908714294 0.8157860040664673 -0.2174420058727264 -vn -0.7117419838905334 0.631197988986969 -0.3082410097122192 -vn -0.7205860018730164 0.6709820032119751 -0.1747539937496185 -vn -0.4114960134029388 0.7961680293083191 0.4436070024967194 -vn -0.0943790003657341 0.527301013469696 0.8444210290908813 -vn -0.06975200027227402 0.4077039957046509 0.9104459881782532 -vn -0.07522699981927872 0.5093169808387756 0.8572840094566345 -vn -0.899321973323822 0.2172179967164993 0.3795219957828522 -vn -0.8569710254669189 0.4048359990119934 0.318917989730835 -vn -0.9294880032539368 0.002263000002130866 0.3688459992408752 -vn -0.9130200147628784 0.1119910031557083 0.3922390043735504 -vn -0.7752439975738525 0.1555069983005524 0.6122210025787354 -vn -0.809952974319458 0.130293995141983 0.5718389749526978 -vn -0.8099700212478638 0.21145099401474 0.5470259785652161 -vn -0.5124379992485046 -0.4739649891853333 0.7160750031471252 -vn -0.4707460105419159 -0.3654879927635193 0.8030049800872803 -vn -0.6227080225944519 -0.5545240044593811 0.5520300269126892 -vn -0.8047950267791748 -0.5929269790649414 -0.02723599970340729 -vn -0.9356880187988281 -0.3495660126209259 -0.04786499962210655 -vn -0.9798259735107422 -0.1990929991006851 0.01738799922168255 -vn -0.9696599841117859 -0.2444050014019012 0.004995000082999468 -vn 0.3460299968719482 -0.6453220248222351 0.6810449957847595 -vn 0.1500509977340698 -0.8165979981422424 0.5573610067367554 -vn 0.305963009595871 -0.9033949971199036 0.3004390001296997 -vn -0.1068940013647079 -0.8791000247001648 -0.4644969999790192 -vn -0.3793039917945862 -0.6047009825706482 -0.70033198595047 -vn -0.4574509859085083 -0.5502709746360779 -0.6985269784927368 -vn -0.3967710137367249 -0.701295018196106 -0.5922489762306213 -vn 0.8359060287475586 -0.5488340258598328 -0.006517999805510044 -vn 0.9236019849777222 -0.3818440139293671 0.03396600112318993 -vn 0.8632140159606934 -0.3933719992637634 -0.3164179921150208 -vn 0.6054999828338623 -0.4316779971122742 -0.6685979962348938 -vn 0.5342289805412292 -0.3754520118236542 -0.7573869824409485 -vn 0.6098309755325317 -0.3671579957008362 -0.7023540139198303 -vn 0.6060940027236938 -0.5121269822120667 -0.6085860133171082 -vn -0.2871040105819702 -0.9309409856796265 0.2256550043821335 -vn 0.1843840032815933 -0.4217509925365448 -0.8877660036087036 -vn 0.7307729721069336 0.3228900134563446 0.6014260053634644 -vn 0.8553329706192017 0.06064699962735176 0.5145170092582703 -vn 0.07405100017786026 0.6319169998168945 0.7714899778366089 -vn 0.2098069936037064 0.7427859902381897 0.6358069777488708 -vn 0.6162220239639282 0.3713270127773285 0.6945400238037109 -vn 0.09581799805164337 0.7464309930801392 0.6585279703140259 -vn 0.8213359713554382 0.1804669946432114 0.5411450266838074 -vn 0.4080640077590942 0.9123439788818359 -0.03336000069975853 -vn 0.969681978225708 0.1661700010299683 0.17917500436306 -vn 0.7540370225906372 0.5044180154800415 -0.4207040071487427 -vn 0.9432830214500427 -0.08009400218725204 0.3221819996833801 -vn 0.8285599946975708 0.3165900111198425 -0.4617989957332611 -vn 0.9967989921569824 0.009220999665558338 0.07941699773073196 -vn 0.775767982006073 0.3821409940719604 -0.5021479725837708 -vn -0.5359219908714294 0.8157860040664673 0.2174420058727264 -vn -0.7117419838905334 0.631197988986969 0.3082410097122192 -vn -0.7205860018730164 0.6709820032119751 0.1747539937496185 -vn -0.4114960134029388 0.7961680293083191 -0.4436070024967194 -vn -0.09437999874353409 0.527301013469696 -0.8444210290908813 -vn -0.06975200027227402 0.4077039957046509 -0.9104459881782532 -vn -0.07522699981927872 0.5093169808387756 -0.8572850227355957 -vn -0.899321973323822 0.2172179967164993 -0.3795219957828522 -vn -0.8569710254669189 0.4048359990119934 -0.318917989730835 -vn -0.9294880032539368 0.002263000002130866 -0.3688449859619141 -vn -0.9130200147628784 0.1119910031557083 -0.3922390043735504 -vn -0.7752439975738525 0.1555059999227524 -0.6122210025787354 -vn -0.8099520206451416 0.130293995141983 -0.5718389749526978 -vn -0.8099690079689026 0.21144999563694 -0.5470269918441772 -vn -0.5124379992485046 -0.4739649891853333 -0.7160750031471252 -vn -0.4707460105419159 -0.3654879927635193 -0.8030049800872803 -vn -0.6227080225944519 -0.5545240044593811 -0.5520300269126892 -vn -0.8047950267791748 -0.5929279923439026 0.02723599970340729 -vn -0.9356880187988281 -0.3495660126209259 0.04786499962210655 -vn -0.9798259735107422 -0.1990929991006851 -0.01738799922168255 -vn -0.9696599841117859 -0.2444050014019012 -0.004995000082999468 -vn 0.3460299968719482 -0.6453220248222351 -0.6810449957847595 -vn 0.1500509977340698 -0.8165979981422424 -0.5573610067367554 -vn 0.3059639930725098 -0.9033949971199036 -0.3004390001296997 -vn -0.1068949997425079 -0.8791000247001648 0.464495986700058 -vn -0.3793050050735474 -0.6047009825706482 0.70033198595047 -vn -0.4574509859085083 -0.5502709746360779 0.6985269784927368 -vn -0.3967710137367249 -0.7012940049171448 0.5922489762306213 -vn 0.8359060287475586 -0.5488340258598328 0.006517999805510044 -vn 0.9236019849777222 -0.3818440139293671 -0.03396600112318993 -vn 0.8632140159606934 -0.3933730125427246 0.3164179921150208 -vn 0.6054999828338623 -0.4316790103912354 0.6685979962348938 -vn 0.5342299938201904 -0.3754520118236542 0.7573869824409485 -vn 0.6098309755325317 -0.3671579957008362 0.7023540139198303 -vn 0.6060940027236938 -0.5121260285377502 0.6085860133171082 -vn 0 0 0 -vn 0.8919450044631958 0.3336060047149658 -0.3051899969577789 -vn 0.8852859735488892 -0.05170800164341927 0.4621630012989044 -vn 0.8717010021209717 -0.4864040017127991 -0.05957400053739548 -vn 0.6025350093841553 -0.1140230000019073 0.7899060249328613 -vn 0.7673320174217224 -0.6138780117034912 0.1853529959917068 -vn 0.6157039999961853 -0.2387659996747971 0.750931978225708 -vn -0.1322280019521713 0.07659800350666046 0.9882550239562988 -vn -0.1344829946756363 0.2189230024814606 0.9664300084114075 -vn -0.08265399932861328 0.3330360054969788 0.9392849802970886 -vn -0.7942630052566528 0.3628509938716888 0.4873250126838684 -vn -0.686972975730896 0.5388749837875366 0.4875270128250122 -vn -0.9116560220718384 -0.2424139976501465 -0.3318400084972382 -vn -0.903469979763031 -0.005853999871760607 -0.4286110103130341 -vn -0.8802070021629333 0.2844929993152618 -0.3798680007457733 -vn -0.3590719997882843 -0.2934069931507111 -0.8859909772872925 -vn -0.5312150120735168 -0.1616500020027161 -0.8316730260848999 -vn 0.5217099785804749 -0.3334519863128662 -0.7852569818496704 -vn 0.4982230067253113 -0.5182129740715027 -0.6951469779014587 -vn 0.3192520141601562 -0.6669300198554993 -0.6732630133628845 -vn 0.4172089993953705 0.6029300093650818 -0.6800090074539185 -vn -0.3909519910812378 -0.5063930153846741 -0.7685850262641907 -vn -0.785847008228302 -0.2199160009622574 -0.5779989957809448 -vn -0.1128029972314835 -0.7670649886131287 -0.6315749883651733 -vn -0.6768519878387451 -0.4520730078220367 -0.5809479951858521 -vn -0.07061299681663513 -0.7851089835166931 -0.6153200268745422 -vn 0.4044640064239502 -0.913004994392395 -0.05320600047707558 -vn 0.5100409984588623 -0.8511109948158264 -0.1243719980120659 -vn 0.600862979888916 -0.7767530083656311 -0.188727006316185 -vn 0.7341600060462952 -0.2982490062713623 0.6099640130996704 -vn 0.8028550148010254 -0.2451270073652267 0.5434489846229553 -vn 0.2039200067520142 0.286547988653183 0.9361129999160767 -vn 0.2590579986572266 0.3469229936599731 0.90140700340271 -vn 0.3050769865512848 0.4136070013046265 0.857820987701416 -vn -0.3951399922370911 0.6723129749298096 0.6259869933128357 -vn -0.3882040083408356 0.6723269820213318 0.6302970051765442 -vn -0.8444070219993591 0.5085629820823669 -0.1683440059423447 -vn -0.9073770046234131 0.4102010130882263 -0.09166599810123444 -vn -0.9431279897689819 0.3317759931087494 0.02084000036120415 -vn -0.03268500044941902 0.9875209927558899 0.1540600061416626 -vn 0.2856169939041138 0.9530180096626282 0.1008900031447411 -vn 0.3564079999923706 0.9297230243682861 0.092678003013134 -vn 0.05804499983787537 0.9152950048446655 0.3985790014266968 -vn -0.4380980134010315 -0.8398249745368958 0.3205699920654297 -vn 0.0398080013692379 -0.7493849992752075 0.6609370112419128 -vn -0.4364219903945923 -0.7586889863014221 0.4836600124835968 -vn -0.1446219980716705 0.8584669828414917 0.4920569956302643 -vn -0.3905079960823059 -0.8025469779968262 0.4510230123996735 -vn -0.3789550065994263 0.7686259746551514 0.5153710246086121 -vn -0.3518399894237518 -0.8554270267486572 0.3800710141658783 -vn -0.5039129853248596 0.8112840056419373 0.2964630126953125 -vn -0.4345029890537262 -0.8862379789352417 0.1605930030345917 -vn -0.5895540118217468 0.7668499946594238 0.2537069916725159 -vn 0.4611240029335022 -0.5667420029640198 0.682765007019043 -vn -0.03327900171279907 -0.5302489995956421 0.8471890091896057 -vn -0.1550759971141815 -0.4793860018253326 0.8637940287590027 -vn -0.3325540125370026 -0.6754969954490662 0.6581119894981384 -vn -0.6243529915809631 -0.6490340232849121 0.434671014547348 -vn -0.6404299736022949 -0.7232750058174133 0.258307009935379 -vn 0.8391460180282593 -0.5209720134735107 0.1562740057706833 -vn 0.9793859720230103 -0.04739199951291084 0.1963589936494827 -vn 0.8591970205307007 -0.01306600030511618 0.5114780068397522 -vn 0.1697809994220734 0.01797799952328205 0.9853180050849915 -vn -0.2981239855289459 0.09316399693489075 0.949970006942749 -vn -0.6025810241699219 0.1407950073480606 0.785539984703064 -vn -0.7606229782104492 0.3568800091743469 0.5422999858856201 -vn -0.9164419770240784 -0.01278399955481291 0.3999640047550201 -vn 0.7099589705467224 0.6897799968719482 0.1419920027256012 -vn 0.6163280010223389 0.7111549973487854 0.3382270038127899 -vn 0.1215279996395111 0.6381019949913025 0.7602999806404114 -vn -0.3081580102443695 0.474483996629715 0.8245630264282227 -vn -0.5849490165710449 0.4978660047054291 0.64028400182724 -vn -0.8313949704170227 0.3698750138282776 0.414698988199234 -vn -0.7773889899253845 0.439754992723465 0.4497570097446442 -vn -0.7120980024337769 0.07437500357627869 0.6981300115585327 -vn -0.5221620202064514 -0.5821250081062317 0.6232789754867554 -vn -0.5362930297851562 0.8426250219345093 0.04870999976992607 -vn -0.6278550028800964 0.7403159737586975 0.2402739971876144 -vn -0.817995011806488 0.4767960011959076 0.3217920064926147 -vn -0.7291709780693054 0.6557949781417847 0.1955550014972687 -vn -0.9585440158843994 0.2151080071926117 0.1868750005960464 -vn -0.9505919814109802 0.1639280021190643 0.2636339962482452 -vn -0.9833920001983643 -0.02283000014722347 0.1800519973039627 -vn -0.8917449712753296 0.1107539981603622 0.4387759864330292 -vn -0.9918580055236816 -0.08782999962568283 0.09221799671649933 -vn -0.8591039776802063 0.04482100158929825 0.5098350048065186 -vn -0.8949519991874695 -0.4028989970684052 0.1916580051183701 -vn -0.9036110043525696 0.009092999622225761 0.4282569885253906 -vn -0.8893200159072876 0.01745700091123581 0.4569520056247711 -vn -0.7315409779548645 -0.4924210011959076 0.4715610146522522 -vn -0.7941030263900757 -0.1783780008554459 0.581017017364502 -vn -0.6259329915046692 -0.3735530078411102 0.6845920085906982 -vn -0.5845080018043518 -0.1848309934139252 0.7900559902191162 -vn -0.8015180230140686 -0.1042689979076385 0.5888090133666992 -vn -0.6420310139656067 -0.2967270016670227 0.7069290280342102 -vn -0.8202810287475586 -0.1234560012817383 0.5584779977798462 -vn 0.01690500043332577 -0.9364719986915588 -0.3503330051898956 -vn -0.09879499673843384 -0.7398999929428101 -0.6654229760169983 -vn -0.06946200132369995 -0.9367489814758301 -0.3430390059947968 -vn 0.123930998146534 -0.9922909736633301 0 -vn 0.03589100018143654 -0.8559809923171997 -0.5157600045204163 -vn -0.0289510004222393 -0.999580979347229 0 -vn 0.01690500043332577 -0.9364719986915588 0.3503330051898956 -vn -0.06946200132369995 -0.9367489814758301 0.3430390059947968 -vn -0.3344019949436188 -0.9161610007286072 -0.2209639996290207 -vn -0.7904769778251648 -0.6124920248985291 -0 -vn -0.3344019949436188 -0.9161610007286072 0.2209639996290207 -vn -0.7410100102424622 -0.556659996509552 0.375544011592865 -vn -0.2743130028247833 -0.8896610140800476 0.3650420010089874 -vn -0.09879499673843384 -0.7398999929428101 0.6654229760169983 -vn 0.03589100018143654 -0.8559809923171997 0.5157600045204163 -vn -0.2743130028247833 -0.8896610140800476 -0.3650420010089874 -vn -0.7410100102424622 -0.556659996509552 -0.375544011592865 -vn 0.3564079999923706 0.9297230243682861 -0.092678003013134 -vn 0.2856169939041138 0.9530180096626282 -0.1008900031447411 -vn -0.03268500044941902 0.9875209927558899 -0.1540600061416626 -vn 0.05804499983787537 0.9152950048446655 -0.3985790014266968 -vn -0.4364219903945923 -0.7586889863014221 -0.4836600124835968 -vn 0.0398080013692379 -0.7493849992752075 -0.6609370112419128 -vn -0.4380980134010315 -0.8398249745368958 -0.3205699920654297 -vn -0.1446219980716705 0.8584669828414917 -0.4920569956302643 -vn -0.3905079960823059 -0.8025469779968262 -0.4510230123996735 -vn -0.3789550065994263 0.7686259746551514 -0.5153710246086121 -vn -0.3518399894237518 -0.8554270267486572 -0.3800710141658783 -vn -0.5039129853248596 0.8112840056419373 -0.2964630126953125 -vn -0.4345029890537262 -0.8862379789352417 -0.1605930030345917 -vn -0.5895540118217468 0.7668499946594238 -0.2537069916725159 -vn -0.03327900171279907 -0.5302489995956421 -0.8471890091896057 -vn 0.4611240029335022 -0.5667420029640198 -0.682765007019043 -vn -0.1550759971141815 -0.4793860018253326 -0.8637940287590027 -vn -0.3325540125370026 -0.6754969954490662 -0.6581119894981384 -vn -0.624351978302002 -0.6490340232849121 -0.434671014547348 -vn -0.6404299736022949 -0.7232750058174133 -0.258307009935379 -vn 0.9793859720230103 -0.04739199951291084 -0.1963589936494827 -vn 0.8391469717025757 -0.5209720134735107 -0.1562740057706833 -vn 0.8591970205307007 -0.01306699961423874 -0.5114780068397522 -vn 0.1697809994220734 0.01797799952328205 -0.9853180050849915 -vn -0.2981239855289459 0.09316399693489075 -0.949970006942749 -vn -0.6025800108909607 0.1407950073480606 -0.785539984703064 -vn -0.7606229782104492 0.3568800091743469 -0.5422999858856201 -vn -0.9164419770240784 -0.01278399955481291 -0.3999640047550201 -vn 0.6163280010223389 0.7111549973487854 -0.3382270038127899 -vn 0.7099589705467224 0.6897799968719482 -0.1419920027256012 -vn 0.1215270012617111 0.6381019949913025 -0.7602999806404114 -vn -0.3081580102443695 0.474483996629715 -0.8245630264282227 -vn -0.5849490165710449 0.4978669881820679 -0.64028400182724 -vn -0.8313949704170227 0.3698750138282776 -0.414698988199234 -vn -0.7773889899253845 0.439754992723465 -0.4497570097446442 -vn -0.5362920165061951 0.8426259756088257 -0.04870999976992607 -vn -0.522163987159729 -0.5821229815483093 -0.6232799887657166 -vn -0.7120980024337769 0.07437700033187866 -0.6981289982795715 -vn -0.6278539896011353 0.7403159737586975 -0.2402739971876144 -vn -0.817995011806488 0.4767970144748688 -0.3217920064926147 -vn -0.7291709780693054 0.6557959914207458 -0.1955550014972687 -vn -0.9585440158843994 0.2151080071926117 -0.1868750005960464 -vn -0.9505919814109802 0.1639280021190643 -0.2636339962482452 -vn -0.8917449712753296 0.1107529997825623 -0.4387759864330292 -vn -0.9833920001983643 -0.02283000014722347 -0.1800529956817627 -vn -0.8591039776802063 0.04482100158929825 -0.5098339915275574 -vn -0.9918580055236816 -0.08783099800348282 -0.09221699833869934 -vn -0.8949530124664307 -0.4028989970684052 -0.1916570067405701 -vn -0.9036110043525696 0.009092999622225761 -0.4282569885253906 -vn -0.8893200159072876 0.0174579992890358 -0.4569520056247711 -vn -0.7315409779548645 -0.4924199879169464 -0.4715610146522522 -vn -0.7941030263900757 -0.1783780008554459 -0.5810179710388184 -vn -0.625931978225708 -0.3735530078411102 -0.6845930218696594 -vn -0.5845069885253906 -0.1848299950361252 -0.7900559902191162 -vn -0.8015180230140686 -0.1042689979076385 -0.5888090133666992 -vn -0.6420310139656067 -0.2967270016670227 -0.7069299817085266 -vn -0.8202810287475586 -0.1234560012817383 -0.5584779977798462 -vn 0.8919439911842346 0.3336179852485657 0.3051789999008179 -vn 0.6025350093841553 -0.1140210032463074 -0.7899050116539001 -vn 0.8717020153999329 -0.4864020049571991 0.05957499891519547 -vn 0.8852850198745728 -0.05170699954032898 -0.4621649980545044 -vn 0.7673349976539612 -0.6138749718666077 -0.1853519976139069 -vn 0.6157060265541077 -0.2387650012969971 -0.7509310245513916 -vn -0.1322280019521713 0.07659800350666046 -0.9882550239562988 -vn -0.1344819962978363 0.2189230024814606 -0.9664300084114075 -vn -0.08265399932861328 0.3330360054969788 -0.9392840266227722 -vn -0.7942630052566528 0.3628509938716888 -0.4873250126838684 -vn -0.686972975730896 0.5388749837875366 -0.487525999546051 -vn -0.9116560220718384 -0.2424139976501465 0.3318400084972382 -vn -0.903469979763031 -0.005853999871760607 0.4286110103130341 -vn -0.8802070021629333 0.2844929993152618 0.3798680007457733 -vn -0.3590719997882843 -0.2934069931507111 0.8859909772872925 -vn -0.5312150120735168 -0.1616500020027161 0.8316730260848999 -vn 0.5217090249061584 -0.3334519863128662 0.7852579951286316 -vn 0.4982230067253113 -0.5182120203971863 0.6951479911804199 -vn 0.319252997636795 -0.6669290065765381 0.6732640266418457 -vn 0.4172079861164093 0.602931022644043 0.6800090074539185 -vn -0.1128029972314835 -0.7670649886131287 0.6315749883651733 -vn -0.785847008228302 -0.2199160009622574 0.5779979825019836 -vn -0.3909519910812378 -0.5063920021057129 0.7685850262641907 -vn -0.6768519878387451 -0.4520730078220367 0.5809479951858521 -vn -0.07061299681663513 -0.7851079702377319 0.6153200268745422 -vn 0.4044640064239502 -0.913004994392395 0.05320600047707558 -vn 0.5100420117378235 -0.8511109948158264 0.1243719980120659 -vn 0.600862979888916 -0.7767530083656311 0.188727006316185 -vn 0.7341600060462952 -0.2982490062713623 -0.6099640130996704 -vn 0.8028540015220642 -0.2451270073652267 -0.5434499979019165 -vn 0.2039200067520142 0.286547988653183 -0.9361129999160767 -vn 0.2590579986572266 0.3469229936599731 -0.90140700340271 -vn 0.3050769865512848 0.4136070013046265 -0.857820987701416 -vn -0.3951399922370911 0.6723120212554932 -0.6259880065917969 -vn -0.3882040083408356 0.6723269820213318 -0.6302970051765442 -vn -0.8444070219993591 0.5085629820823669 0.1683440059423447 -vn -0.9073770046234131 0.4102010130882263 0.09166599810123444 -vn -0.9431279897689819 0.3317759931087494 -0.02084000036120415 -vn 0.09283199906349182 0.3405439853668213 0.9356340169906616 -vn 0.4332149922847748 0.3082599937915802 0.8469359874725342 -vn 0.07513599842786789 0.7418090105056763 0.666388988494873 -vn -0.3755930066108704 0.6224439740180969 0.6866539716720581 -vn -0.6413879990577698 0.6895880103111267 0.3362880051136017 -vn -0.3539179861545563 0.8731229901313782 0.3352580070495605 -vn -0.6627640128135681 0.7462409734725952 -0.06218799948692322 -vn -0.5455629825592041 0.6585090160369873 -0.5183889865875244 -vn -0.5422859787940979 0.2685939967632294 -0.7961050271987915 -vn -0.7763820290565491 0.4680269956588745 -0.4221160113811493 -vn -0.9955589771270752 -0.03219699859619141 -0.08845899999141693 -vn -0.7381539940834045 -0.2307370007038116 -0.633948028087616 -vn -0.433216005563736 -0.3082579970359802 -0.8469359874725342 -vn -0.7763850092887878 -0.6298570036888123 -0.02251699939370155 -vn -0.4675639867782593 -0.8743969798088074 0.1296679973602295 -vn -0.5422919988632202 -0.7174760103225708 -0.4372040033340454 -vn -0.1898339986801147 -0.8541020154953003 0.4842230081558228 -vn -0.5458049774169922 -0.7113950252532959 0.4427349865436554 -vn -0.6413909792900085 -0.3120909929275513 0.7008680105209351 -vn -0.2153560072183609 -0.6237800121307373 0.7513459920883179 -vn 0.03750099986791611 -0.724698007106781 0.6880459785461426 -vn -0.3755939900875092 -0.03544300049543381 0.9261069893836975 -vn 0.07813700288534164 -0.2686049938201904 0.9600759744644165 -vn -0.7573850154876709 0.2233279943466187 0.6135900020599365 -vn -0.902417004108429 0.4006629884243011 0.1584679931402206 -vn -0.902417004108429 -0.2050659954547882 0.3789339959621429 -vn 0.07513599842786789 0.7418090105056763 -0.666388988494873 -vn 0.4332149922847748 0.3082599937915802 -0.8469359874725342 -vn 0.09283199906349182 0.3405439853668213 -0.935634970664978 -vn -0.3755930066108704 0.6224439740180969 -0.6866539716720581 -vn -0.3539179861545563 0.8731229901313782 -0.3352569937705994 -vn -0.6413879990577698 0.6895880103111267 -0.3362880051136017 -vn -0.6627640128135681 0.7462409734725952 0.06218799948692322 -vn -0.7763820290565491 0.4680269956588745 0.4221160113811493 -vn -0.5422859787940979 0.2685939967632294 0.7961050271987915 -vn -0.5455620288848877 0.6585100293159485 0.5183889865875244 -vn -0.7381539940834045 -0.2307370007038116 0.633948028087616 -vn -0.9955589771270752 -0.03219600021839142 0.08845899999141693 -vn -0.433216005563736 -0.3082579970359802 0.8469359874725342 -vn -0.7763850092887878 -0.6298559904098511 0.02251699939370155 -vn -0.5422919988632202 -0.717477023601532 0.4372040033340454 -vn -0.4675650000572205 -0.8743969798088074 -0.1296679973602295 -vn -0.5458049774169922 -0.7113940119743347 -0.4427359998226166 -vn -0.1898339986801147 -0.8541020154953003 -0.4842230081558228 -vn -0.2153560072183609 -0.6237789988517761 -0.7513459920883179 -vn -0.6413909792900085 -0.3120909929275513 -0.7008690237998962 -vn 0.03750099986791611 -0.724698007106781 -0.6880459785461426 -vn -0.3755939900875092 -0.03544300049543381 -0.9261059761047363 -vn 0.07813599705696106 -0.2686049938201904 -0.9600759744644165 -vn -0.7573840022087097 0.2233279943466187 -0.6135900020599365 -vn -0.902417004108429 0.4006629884243011 -0.1584679931402206 -vn -0.902417004108429 -0.2050659954547882 -0.3789339959621429 - -# Mesh 'HLeib01' with 80 faces -g HLeib01 -usemtl HLeibTex -f 1/1/1 2/2/2 3/3/3 -f 4/4/4 3/3/3 5/5/5 -f 6/6/6 5/5/5 2/2/2 -f 3/3/3 2/2/2 5/5/5 -f 1/1/1 3/3/3 7/7/7 -f 8/8/8 7/7/7 9/9/9 -f 4/4/4 9/9/9 3/3/3 -f 7/7/7 3/3/3 9/9/9 -f 8/8/8 9/9/9 10/10/10 -f 11/11/11 10/10/10 12/12/12 -f 4/4/4 12/12/12 9/9/9 -f 10/10/10 9/9/9 12/12/12 -f 4/4/4 13/13/13 12/12/12 -f 11/11/11 12/12/12 14/14/14 -f 15/15/15 14/14/14 13/13/13 -f 12/12/12 13/13/13 14/14/14 -f 4/4/4 5/5/5 13/13/13 -f 15/15/15 13/13/13 16/16/16 -f 6/6/6 16/16/16 5/5/5 -f 13/13/13 5/5/5 16/16/16 -f 15/15/15 16/16/16 17/17/17 -f 18/18/18 17/17/17 19/19/19 -f 6/6/6 19/19/19 16/16/16 -f 17/17/17 16/16/16 19/19/19 -f 15/15/15 17/17/17 20/20/20 -f 21/21/21 20/20/20 22/22/22 -f 18/18/18 22/22/22 17/17/17 -f 20/20/20 17/17/17 22/22/22 -f 11/11/11 14/14/14 23/23/23 -f 21/21/21 23/23/23 20/20/20 -f 15/15/15 20/20/20 14/14/14 -f 23/23/23 14/14/14 20/20/20 -f 11/11/11 23/23/23 24/24/24 -f 25/25/25 24/24/24 26/26/26 -f 21/21/21 26/26/26 23/23/23 -f 24/24/24 23/23/23 26/26/26 -f 25/25/25 26/26/26 27/27/27 -f 28/28/28 27/27/27 29/29/29 -f 21/21/21 29/29/29 26/26/26 -f 27/27/27 26/26/26 29/29/29 -f 28/28/28 29/29/29 30/30/30 -f 18/18/18 30/30/30 22/22/22 -f 21/21/21 22/22/22 29/29/29 -f 30/30/30 29/29/29 22/22/22 -f 28/28/28 30/30/30 31/31/31 -f 32/32/32 31/31/31 33/33/33 -f 18/18/18 33/33/33 30/30/30 -f 31/31/31 30/30/30 33/33/33 -f 28/28/28 31/31/31 34/34/34 -f 35/35/35 34/34/34 36/36/36 -f 32/32/32 36/36/36 31/31/31 -f 34/34/34 31/31/31 36/36/36 -f 35/35/35 36/36/36 37/37/37 -f 1/1/1 37/37/37 38/38/38 -f 32/32/32 38/38/38 36/36/36 -f 37/37/37 36/36/36 38/38/38 -f 1/1/1 38/38/38 2/2/2 -f 6/6/6 2/2/2 39/39/39 -f 32/32/32 39/39/39 38/38/38 -f 2/2/2 38/38/38 39/39/39 -f 32/32/32 33/33/33 39/39/39 -f 6/6/6 39/39/39 19/19/19 -f 18/18/18 19/19/19 33/33/33 -f 39/39/39 33/33/33 19/19/19 -f 8/8/8 40/40/40 7/7/7 -f 1/1/1 7/7/7 37/37/37 -f 35/35/35 37/37/37 40/40/40 -f 7/7/7 40/40/40 37/37/37 -f 8/8/8 41/41/41 40/40/40 -f 35/35/35 40/40/40 42/42/42 -f 25/25/25 42/42/42 41/41/41 -f 40/40/40 41/41/41 42/42/42 -f 8/8/8 10/10/10 41/41/41 -f 25/25/25 41/41/41 24/24/24 -f 11/11/11 24/24/24 10/10/10 -f 41/41/41 10/10/10 24/24/24 -f 28/28/28 34/34/34 27/27/27 -f 25/25/25 27/27/27 42/42/42 -f 35/35/35 42/42/42 34/34/34 -f 27/27/27 34/34/34 42/42/42 - -# Mesh 'OK' with 60 faces -g OK -usemtl Skin -f 43/43/43 44/44/44 45/45/45 -f 46/46/46 45/45/45 47/47/47 -f 48/48/48 47/47/47 44/44/44 -f 45/45/45 44/44/44 47/47/47 -f 43/43/43 45/45/45 49/49/49 -f 50/50/50 49/49/49 51/51/51 -f 46/46/46 51/51/51 45/45/45 -f 49/49/49 45/45/45 51/51/51 -f 50/50/50 51/51/51 52/52/52 -f 53/53/53 52/52/52 54/54/54 -f 46/46/46 54/54/54 51/51/51 -f 52/52/52 51/51/51 54/54/54 -f 46/46/46 55/55/55 54/54/54 -f 53/53/53 54/54/54 56/56/56 -f 57/57/57 56/56/56 55/55/55 -f 54/54/54 55/55/55 56/56/56 -f 46/46/46 47/47/47 55/55/55 -f 57/57/57 55/55/55 58/58/58 -f 48/48/48 58/58/58 47/47/47 -f 55/55/55 47/47/47 58/58/58 -f 57/57/57 58/58/58 59/59/59 -f 60/57/60 59/59/59 61/58/61 -f 48/48/48 61/58/61 58/58/58 -f 59/59/59 58/58/58 61/58/61 -f 57/57/57 59/59/59 62/60/62 -f 63/61/63 62/60/62 64/60/64 -f 60/57/60 64/60/64 59/59/59 -f 62/60/62 59/59/59 64/60/64 -f 53/53/53 56/56/56 65/62/65 -f 63/61/63 65/62/65 62/60/62 -f 57/57/57 62/60/62 56/56/56 -f 65/62/65 56/56/56 62/60/62 -f 53/53/53 65/62/65 66/63/66 -f 67/64/67 66/63/66 68/65/68 -f 63/61/63 68/65/68 65/62/65 -f 66/63/66 65/62/65 68/65/68 -f 67/64/67 68/65/68 69/63/69 -f 70/53/70 69/63/69 71/62/71 -f 63/61/63 71/62/71 68/65/68 -f 69/63/69 68/65/68 71/62/71 -f 63/61/63 64/60/64 71/62/71 -f 43/43/43 72/49/72 73/45/73 -f 43/43/43 73/45/73 44/44/44 -f 48/48/48 44/44/44 74/47/74 -f 75/46/75 74/47/74 73/45/73 -f 44/44/44 73/45/73 74/47/74 -f 48/48/48 74/47/74 61/58/61 -f 50/50/50 76/66/76 49/49/49 -f 43/43/43 49/49/49 72/49/72 -f 77/50/77 72/49/72 76/66/76 -f 49/49/49 76/66/76 72/49/72 -f 50/50/50 78/67/78 76/66/76 -f 77/50/77 76/66/76 79/67/79 -f 67/64/67 79/67/79 78/67/78 -f 76/66/76 78/67/78 79/67/79 -f 50/50/50 52/52/52 78/67/78 -f 67/64/67 78/67/78 66/63/66 -f 53/53/53 66/63/66 52/52/52 -f 78/67/78 52/52/52 66/63/66 -f 67/64/67 69/63/69 79/67/79 - -# Mesh 'Bein1Li' with 98 faces -g Bein1Li -usemtl BeinTex -f 80/68/80 81/68/80 82/68/80 -f 83/68/81 84/68/81 85/68/81 -f 80/69/82 86/70/83 87/71/84 -f 80/69/82 87/71/84 81/72/85 -f 86/70/83 88/73/86 87/71/84 -f 88/73/86 89/74/87 87/71/84 -f 88/73/86 90/75/88 91/76/89 -f 88/73/86 91/76/89 89/74/87 -f 90/75/88 92/77/90 91/76/89 -f 92/77/90 93/78/91 91/76/89 -f 92/77/90 94/79/92 95/80/93 -f 92/77/90 95/80/93 93/78/91 -f 94/79/92 83/68/94 95/80/93 -f 83/68/94 85/81/95 95/80/93 -f 81/68/80 96/68/80 82/68/80 -f 85/68/81 84/68/81 97/68/81 -f 81/72/85 87/71/84 96/82/96 -f 87/71/84 98/83/97 96/82/96 -f 87/71/84 89/74/87 99/84/98 -f 87/71/84 99/84/98 98/83/97 -f 89/74/87 91/76/89 99/84/98 -f 91/76/89 100/85/99 99/84/98 -f 91/76/89 93/78/91 101/86/100 -f 91/76/89 101/86/100 100/85/99 -f 93/78/91 95/80/93 101/86/100 -f 95/80/93 102/87/101 101/86/100 -f 95/80/93 85/81/95 97/88/102 -f 95/80/93 97/88/102 102/87/101 -f 96/68/80 103/68/80 82/68/80 -f 97/68/81 84/68/81 104/68/81 -f 96/82/96 98/83/97 105/89/103 -f 96/82/96 105/89/103 103/90/104 -f 98/83/97 99/84/98 105/89/103 -f 99/84/98 106/91/105 105/89/103 -f 99/84/98 100/85/99 107/92/106 -f 99/84/98 107/92/106 106/91/105 -f 100/85/99 101/86/100 107/92/106 -f 101/86/100 108/93/107 107/92/106 -f 101/86/100 102/87/101 109/94/108 -f 101/86/100 109/94/108 108/93/107 -f 102/87/101 97/88/102 109/94/108 -f 97/88/102 104/95/109 109/94/108 -f 103/68/80 110/68/80 82/68/80 -f 104/68/81 84/68/81 111/68/81 -f 103/90/104 105/89/103 110/96/110 -f 105/89/103 112/97/111 110/96/110 -f 105/89/103 106/91/105 113/98/112 -f 105/89/103 113/98/112 112/97/111 -f 106/91/105 107/92/106 113/98/112 -f 107/92/106 114/99/113 113/98/112 -f 107/92/106 108/93/107 115/100/114 -f 107/92/106 115/100/114 114/99/113 -f 108/93/107 109/94/108 115/100/114 -f 109/94/108 116/101/115 115/100/114 -f 109/94/108 104/95/109 111/102/116 -f 109/94/108 111/102/116 116/101/115 -f 110/68/80 117/68/80 82/68/80 -f 111/68/81 84/68/81 118/68/81 -f 110/96/110 112/97/111 119/103/117 -f 110/96/110 119/103/117 117/104/118 -f 112/97/111 113/98/112 119/103/117 -f 113/98/112 120/105/119 119/103/117 -f 113/98/112 114/99/113 121/106/120 -f 113/98/112 121/106/120 120/105/119 -f 114/99/113 115/100/114 121/106/120 -f 115/100/114 122/107/121 121/106/120 -f 115/100/114 116/101/115 123/108/122 -f 115/100/114 123/108/122 122/107/121 -f 116/101/115 111/102/116 123/108/122 -f 111/102/116 118/109/123 123/108/122 -f 117/68/80 124/68/80 82/68/80 -f 118/68/81 84/68/81 125/68/81 -f 117/104/118 119/103/117 124/110/124 -f 119/103/117 126/111/125 124/110/124 -f 119/103/117 120/105/119 127/112/126 -f 119/103/117 127/112/126 126/111/125 -f 120/105/119 121/106/120 127/112/126 -f 121/106/120 128/113/127 127/112/126 -f 121/106/120 122/107/121 129/114/128 -f 121/106/120 129/114/128 128/113/127 -f 122/107/121 123/108/122 129/114/128 -f 123/108/122 130/115/129 129/114/128 -f 123/108/122 118/109/123 125/116/130 -f 123/108/122 125/116/130 130/115/129 -f 124/68/80 80/68/80 82/68/80 -f 125/68/81 84/68/81 83/68/81 -f 124/110/124 126/111/125 86/117/83 -f 124/110/124 86/117/83 80/118/82 -f 126/111/125 127/112/126 86/117/83 -f 127/112/126 88/119/86 86/117/83 -f 127/112/126 128/113/127 90/120/88 -f 127/112/126 90/120/88 88/119/86 -f 128/113/127 129/114/128 90/120/88 -f 129/114/128 92/121/90 90/120/88 -f 129/114/128 130/115/129 94/122/92 -f 129/114/128 94/122/92 92/121/90 -f 130/115/129 125/116/130 94/122/92 -f 125/116/130 83/123/94 94/122/92 - -# Mesh 'Bein1Re' with 98 faces -g Bein1Re -usemtl BeinTex -f 131/68/131 132/68/131 133/68/131 -f 134/68/132 135/68/132 136/68/132 -f 137/71/133 138/70/134 133/69/135 -f 132/72/136 137/71/133 133/69/135 -f 137/71/133 139/73/137 138/70/134 -f 137/71/133 140/74/138 139/73/137 -f 141/76/139 142/75/140 139/73/137 -f 140/74/138 141/76/139 139/73/137 -f 141/76/139 143/77/141 142/75/140 -f 141/76/139 144/78/142 143/77/141 -f 145/80/143 146/79/144 143/77/141 -f 144/78/142 145/80/143 143/77/141 -f 145/80/143 136/68/145 146/79/144 -f 145/80/143 134/81/146 136/68/145 -f 131/68/131 147/68/131 132/68/131 -f 148/68/132 135/68/132 134/68/132 -f 147/82/147 137/71/133 132/72/136 -f 147/82/147 149/83/148 137/71/133 -f 150/84/149 140/74/138 137/71/133 -f 149/83/148 150/84/149 137/71/133 -f 150/84/149 141/76/139 140/74/138 -f 150/84/149 151/85/150 141/76/139 -f 152/86/151 144/78/142 141/76/139 -f 151/85/150 152/86/151 141/76/139 -f 152/86/151 145/80/143 144/78/142 -f 152/86/151 153/87/152 145/80/143 -f 148/88/153 134/81/146 145/80/143 -f 153/87/152 148/88/153 145/80/143 -f 131/68/131 154/68/131 147/68/131 -f 155/68/132 135/68/132 148/68/132 -f 156/89/154 149/83/148 147/82/147 -f 154/90/155 156/89/154 147/82/147 -f 156/89/154 150/84/149 149/83/148 -f 156/89/154 157/91/156 150/84/149 -f 158/92/157 151/85/150 150/84/149 -f 157/91/156 158/92/157 150/84/149 -f 158/92/157 152/86/151 151/85/150 -f 158/92/157 159/93/158 152/86/151 -f 160/94/159 153/87/152 152/86/151 -f 159/93/158 160/94/159 152/86/151 -f 160/94/159 148/88/153 153/87/152 -f 160/94/159 155/95/160 148/88/153 -f 131/68/131 161/68/131 154/68/131 -f 162/68/132 135/68/132 155/68/132 -f 161/96/161 156/89/154 154/90/155 -f 161/96/161 163/97/162 156/89/154 -f 164/98/163 157/91/156 156/89/154 -f 163/97/162 164/98/163 156/89/154 -f 164/98/163 158/92/157 157/91/156 -f 164/98/163 165/99/164 158/92/157 -f 166/100/165 159/93/158 158/92/157 -f 165/99/164 166/100/165 158/92/157 -f 166/100/165 160/94/159 159/93/158 -f 166/100/165 167/101/166 160/94/159 -f 162/102/167 155/95/160 160/94/159 -f 167/101/166 162/102/167 160/94/159 -f 131/68/131 168/68/131 161/68/131 -f 169/68/132 135/68/132 162/68/132 -f 170/103/168 163/97/162 161/96/161 -f 168/104/169 170/103/168 161/96/161 -f 170/103/168 164/98/163 163/97/162 -f 170/103/168 171/105/170 164/98/163 -f 172/106/171 165/99/164 164/98/163 -f 171/105/170 172/106/171 164/98/163 -f 172/106/171 166/100/165 165/99/164 -f 172/106/171 173/107/172 166/100/165 -f 174/108/173 167/101/166 166/100/165 -f 173/107/172 174/108/173 166/100/165 -f 174/108/173 162/102/167 167/101/166 -f 174/108/173 169/109/174 162/102/167 -f 131/68/131 175/68/131 168/68/131 -f 176/68/132 135/68/132 169/68/132 -f 175/110/175 170/103/168 168/104/169 -f 175/110/175 177/111/176 170/103/168 -f 178/112/177 171/105/170 170/103/168 -f 177/111/176 178/112/177 170/103/168 -f 178/112/177 172/106/171 171/105/170 -f 178/112/177 179/113/178 172/106/171 -f 180/114/179 173/107/172 172/106/171 -f 179/113/178 180/114/179 172/106/171 -f 180/114/179 174/108/173 173/107/172 -f 180/114/179 181/115/180 174/108/173 -f 176/116/181 169/109/174 174/108/173 -f 181/115/180 176/116/181 174/108/173 -f 131/68/131 133/68/131 175/68/131 -f 136/68/132 135/68/132 176/68/132 -f 138/117/134 177/111/176 175/110/175 -f 133/118/135 138/117/134 175/110/175 -f 138/117/134 178/112/177 177/111/176 -f 138/117/134 139/119/137 178/112/177 -f 142/120/140 179/113/178 178/112/177 -f 139/119/137 142/120/140 178/112/177 -f 142/120/140 180/114/179 179/113/178 -f 142/120/140 143/121/141 180/114/179 -f 146/122/144 181/115/180 180/114/179 -f 143/121/141 146/122/144 180/114/179 -f 146/122/144 176/116/181 181/115/180 -f 146/122/144 136/123/145 176/116/181 - -# Mesh 'Bein2Li' with 98 faces -g Bein2Li -usemtl BeinTex -f 182/68/182 183/68/182 184/68/182 -f 185/68/183 186/68/183 187/68/183 -f 182/69/184 188/70/185 189/71/186 -f 182/69/184 189/71/186 183/72/187 -f 188/70/185 190/73/188 189/71/186 -f 190/73/188 191/74/189 189/71/186 -f 190/73/188 192/75/190 193/76/191 -f 190/73/188 193/76/191 191/74/189 -f 192/75/190 194/77/192 193/76/191 -f 194/77/192 195/78/193 193/76/191 -f 194/77/192 196/79/194 197/80/195 -f 194/77/192 197/80/195 195/78/193 -f 196/79/194 185/68/196 197/80/195 -f 185/68/196 187/81/197 197/80/195 -f 183/68/182 198/68/182 184/68/182 -f 187/68/183 186/68/183 199/68/183 -f 183/72/187 189/71/186 198/82/198 -f 189/71/186 200/83/199 198/82/198 -f 189/71/186 191/74/189 201/84/200 -f 189/71/186 201/84/200 200/83/199 -f 191/74/189 193/76/191 201/84/200 -f 193/76/191 202/85/201 201/84/200 -f 193/76/191 195/78/193 203/86/202 -f 193/76/191 203/86/202 202/85/201 -f 195/78/193 197/80/195 203/86/202 -f 197/80/195 204/87/203 203/86/202 -f 197/80/195 187/81/197 199/88/204 -f 197/80/195 199/88/204 204/87/203 -f 198/68/182 205/68/182 184/68/182 -f 199/68/183 186/68/183 206/68/183 -f 198/82/198 200/83/199 207/89/205 -f 198/82/198 207/89/205 205/90/206 -f 200/83/199 201/84/200 207/89/205 -f 201/84/200 208/91/207 207/89/205 -f 201/84/200 202/85/201 209/92/208 -f 201/84/200 209/92/208 208/91/207 -f 202/85/201 203/86/202 209/92/208 -f 203/86/202 210/93/209 209/92/208 -f 203/86/202 204/87/203 211/94/210 -f 203/86/202 211/94/210 210/93/209 -f 204/87/203 199/88/204 211/94/210 -f 199/88/204 206/95/211 211/94/210 -f 205/68/182 212/68/182 184/68/182 -f 206/68/183 186/68/183 213/68/183 -f 205/90/206 207/89/205 212/96/212 -f 207/89/205 214/97/213 212/96/212 -f 207/89/205 208/91/207 215/98/214 -f 207/89/205 215/98/214 214/97/213 -f 208/91/207 209/92/208 215/98/214 -f 209/92/208 216/99/215 215/98/214 -f 209/92/208 210/93/209 217/100/216 -f 209/92/208 217/100/216 216/99/215 -f 210/93/209 211/94/210 217/100/216 -f 211/94/210 218/101/217 217/100/216 -f 211/94/210 206/95/211 213/102/218 -f 211/94/210 213/102/218 218/101/217 -f 212/68/182 219/68/182 184/68/182 -f 213/68/183 186/68/183 220/68/183 -f 212/96/212 214/97/213 221/103/219 -f 212/96/212 221/103/219 219/104/220 -f 214/97/213 215/98/214 221/103/219 -f 215/98/214 222/105/221 221/103/219 -f 215/98/214 216/99/215 223/106/222 -f 215/98/214 223/106/222 222/105/221 -f 216/99/215 217/100/216 223/106/222 -f 217/100/216 224/107/223 223/106/222 -f 217/100/216 218/101/217 225/108/224 -f 217/100/216 225/108/224 224/107/223 -f 218/101/217 213/102/218 225/108/224 -f 213/102/218 220/109/225 225/108/224 -f 219/68/182 226/68/182 184/68/182 -f 220/68/183 186/68/183 227/68/183 -f 219/104/220 221/103/219 226/110/226 -f 221/103/219 228/111/227 226/110/226 -f 221/103/219 222/105/221 229/112/228 -f 221/103/219 229/112/228 228/111/227 -f 222/105/221 223/106/222 229/112/228 -f 223/106/222 230/113/229 229/112/228 -f 223/106/222 224/107/223 231/114/230 -f 223/106/222 231/114/230 230/113/229 -f 224/107/223 225/108/224 231/114/230 -f 225/108/224 232/115/231 231/114/230 -f 225/108/224 220/109/225 227/116/232 -f 225/108/224 227/116/232 232/115/231 -f 226/68/182 182/68/182 184/68/182 -f 227/68/183 186/68/183 185/68/183 -f 226/110/226 228/111/227 188/117/185 -f 226/110/226 188/117/185 182/118/184 -f 228/111/227 229/112/228 188/117/185 -f 229/112/228 190/119/188 188/117/185 -f 229/112/228 230/113/229 192/120/190 -f 229/112/228 192/120/190 190/119/188 -f 230/113/229 231/114/230 192/120/190 -f 231/114/230 194/121/192 192/120/190 -f 231/114/230 232/115/231 196/122/194 -f 231/114/230 196/122/194 194/121/192 -f 232/115/231 227/116/232 196/122/194 -f 227/116/232 185/123/196 196/122/194 - -# Mesh 'Bein2Re' with 98 faces -g Bein2Re -usemtl BeinTex -f 233/68/233 234/68/233 235/68/233 -f 236/68/234 237/68/234 238/68/234 -f 239/71/235 240/70/236 235/69/237 -f 234/72/238 239/71/235 235/69/237 -f 239/71/235 241/73/239 240/70/236 -f 239/71/235 242/74/240 241/73/239 -f 243/76/241 244/75/242 241/73/239 -f 242/74/240 243/76/241 241/73/239 -f 243/76/241 245/77/243 244/75/242 -f 243/76/241 246/78/244 245/77/243 -f 247/80/245 248/79/246 245/77/243 -f 246/78/244 247/80/245 245/77/243 -f 247/80/245 238/68/247 248/79/246 -f 247/80/245 236/81/248 238/68/247 -f 233/68/233 249/68/233 234/68/233 -f 250/68/234 237/68/234 236/68/234 -f 249/82/249 239/71/235 234/72/238 -f 249/82/249 251/83/250 239/71/235 -f 252/84/251 242/74/240 239/71/235 -f 251/83/250 252/84/251 239/71/235 -f 252/84/251 243/76/241 242/74/240 -f 252/84/251 253/85/252 243/76/241 -f 254/86/253 246/78/244 243/76/241 -f 253/85/252 254/86/253 243/76/241 -f 254/86/253 247/80/245 246/78/244 -f 254/86/253 255/87/254 247/80/245 -f 250/88/255 236/81/248 247/80/245 -f 255/87/254 250/88/255 247/80/245 -f 233/68/233 256/68/233 249/68/233 -f 257/68/234 237/68/234 250/68/234 -f 258/89/256 251/83/250 249/82/249 -f 256/90/257 258/89/256 249/82/249 -f 258/89/256 252/84/251 251/83/250 -f 258/89/256 259/91/258 252/84/251 -f 260/92/259 253/85/252 252/84/251 -f 259/91/258 260/92/259 252/84/251 -f 260/92/259 254/86/253 253/85/252 -f 260/92/259 261/93/260 254/86/253 -f 262/94/261 255/87/254 254/86/253 -f 261/93/260 262/94/261 254/86/253 -f 262/94/261 250/88/255 255/87/254 -f 262/94/261 257/95/262 250/88/255 -f 233/68/233 263/68/233 256/68/233 -f 264/68/234 237/68/234 257/68/234 -f 263/96/263 258/89/256 256/90/257 -f 263/96/263 265/97/264 258/89/256 -f 266/98/265 259/91/258 258/89/256 -f 265/97/264 266/98/265 258/89/256 -f 266/98/265 260/92/259 259/91/258 -f 266/98/265 267/99/266 260/92/259 -f 268/100/267 261/93/260 260/92/259 -f 267/99/266 268/100/267 260/92/259 -f 268/100/267 262/94/261 261/93/260 -f 268/100/267 269/101/268 262/94/261 -f 264/102/269 257/95/262 262/94/261 -f 269/101/268 264/102/269 262/94/261 -f 233/68/233 270/68/233 263/68/233 -f 271/68/234 237/68/234 264/68/234 -f 272/103/270 265/97/264 263/96/263 -f 270/104/271 272/103/270 263/96/263 -f 272/103/270 266/98/265 265/97/264 -f 272/103/270 273/105/272 266/98/265 -f 274/106/273 267/99/266 266/98/265 -f 273/105/272 274/106/273 266/98/265 -f 274/106/273 268/100/267 267/99/266 -f 274/106/273 275/107/274 268/100/267 -f 276/108/275 269/101/268 268/100/267 -f 275/107/274 276/108/275 268/100/267 -f 276/108/275 264/102/269 269/101/268 -f 276/108/275 271/109/276 264/102/269 -f 233/68/233 277/68/233 270/68/233 -f 278/68/234 237/68/234 271/68/234 -f 277/110/277 272/103/270 270/104/271 -f 277/110/277 279/111/278 272/103/270 -f 280/112/279 273/105/272 272/103/270 -f 279/111/278 280/112/279 272/103/270 -f 280/112/279 274/106/273 273/105/272 -f 280/112/279 281/113/280 274/106/273 -f 282/114/281 275/107/274 274/106/273 -f 281/113/280 282/114/281 274/106/273 -f 282/114/281 276/108/275 275/107/274 -f 282/114/281 283/115/282 276/108/275 -f 278/116/283 271/109/276 276/108/275 -f 283/115/282 278/116/283 276/108/275 -f 233/68/233 235/68/233 277/68/233 -f 238/68/234 237/68/234 278/68/234 -f 240/117/236 279/111/278 277/110/277 -f 235/118/237 240/117/236 277/110/277 -f 240/117/236 280/112/279 279/111/278 -f 240/117/236 241/119/239 280/112/279 -f 244/120/242 281/113/280 280/112/279 -f 241/119/239 244/120/242 280/112/279 -f 244/120/242 282/114/281 281/113/280 -f 244/120/242 245/121/243 282/114/281 -f 248/122/246 283/115/282 282/114/281 -f 245/121/243 248/122/246 282/114/281 -f 248/122/246 278/116/283 283/115/282 -f 248/122/246 238/123/247 278/116/283 - -# Mesh 'Bein3Re' with 98 faces -g Bein3Re -usemtl BeinTex -f 284/68/284 285/68/284 286/68/284 -f 287/68/285 288/68/285 289/68/285 -f 290/71/286 291/70/287 286/69/288 -f 285/72/289 290/71/286 286/69/288 -f 290/71/286 292/73/290 291/70/287 -f 290/71/286 293/74/291 292/73/290 -f 294/76/292 295/75/293 292/73/290 -f 293/74/291 294/76/292 292/73/290 -f 294/76/292 296/77/294 295/75/293 -f 294/76/292 297/78/295 296/77/294 -f 298/80/296 299/79/297 296/77/294 -f 297/78/295 298/80/296 296/77/294 -f 298/80/296 289/68/298 299/79/297 -f 298/80/296 287/81/299 289/68/298 -f 284/68/284 300/68/284 285/68/284 -f 301/68/285 288/68/285 287/68/285 -f 300/82/300 290/71/286 285/72/289 -f 300/82/300 302/83/301 290/71/286 -f 303/84/302 293/74/291 290/71/286 -f 302/83/301 303/84/302 290/71/286 -f 303/84/302 294/76/292 293/74/291 -f 303/84/302 304/85/303 294/76/292 -f 305/86/304 297/78/295 294/76/292 -f 304/85/303 305/86/304 294/76/292 -f 305/86/304 298/80/296 297/78/295 -f 305/86/304 306/87/305 298/80/296 -f 301/88/306 287/81/299 298/80/296 -f 306/87/305 301/88/306 298/80/296 -f 284/68/284 307/68/284 300/68/284 -f 308/68/285 288/68/285 301/68/285 -f 309/89/307 302/83/301 300/82/300 -f 307/90/308 309/89/307 300/82/300 -f 309/89/307 303/84/302 302/83/301 -f 309/89/307 310/91/309 303/84/302 -f 311/92/310 304/85/303 303/84/302 -f 310/91/309 311/92/310 303/84/302 -f 311/92/310 305/86/304 304/85/303 -f 311/92/310 312/93/311 305/86/304 -f 313/94/312 306/87/305 305/86/304 -f 312/93/311 313/94/312 305/86/304 -f 313/94/312 301/88/306 306/87/305 -f 313/94/312 308/95/313 301/88/306 -f 284/68/284 314/68/284 307/68/284 -f 315/68/285 288/68/285 308/68/285 -f 314/96/314 309/89/307 307/90/308 -f 314/96/314 316/97/315 309/89/307 -f 317/98/316 310/91/309 309/89/307 -f 316/97/315 317/98/316 309/89/307 -f 317/98/316 311/92/310 310/91/309 -f 317/98/316 318/99/317 311/92/310 -f 319/100/318 312/93/311 311/92/310 -f 318/99/317 319/100/318 311/92/310 -f 319/100/318 313/94/312 312/93/311 -f 319/100/318 320/101/319 313/94/312 -f 315/102/320 308/95/313 313/94/312 -f 320/101/319 315/102/320 313/94/312 -f 284/68/284 321/68/284 314/68/284 -f 322/68/285 288/68/285 315/68/285 -f 323/103/321 316/97/315 314/96/314 -f 321/104/322 323/103/321 314/96/314 -f 323/103/321 317/98/316 316/97/315 -f 323/103/321 324/105/323 317/98/316 -f 325/106/324 318/99/317 317/98/316 -f 324/105/323 325/106/324 317/98/316 -f 325/106/324 319/100/318 318/99/317 -f 325/106/324 326/107/325 319/100/318 -f 327/108/326 320/101/319 319/100/318 -f 326/107/325 327/108/326 319/100/318 -f 327/108/326 315/102/320 320/101/319 -f 327/108/326 322/109/327 315/102/320 -f 284/68/284 328/68/284 321/68/284 -f 329/68/285 288/68/285 322/68/285 -f 328/110/328 323/103/321 321/104/322 -f 328/110/328 330/111/329 323/103/321 -f 331/112/330 324/105/323 323/103/321 -f 330/111/329 331/112/330 323/103/321 -f 331/112/330 325/106/324 324/105/323 -f 331/112/330 332/113/331 325/106/324 -f 333/114/332 326/107/325 325/106/324 -f 332/113/331 333/114/332 325/106/324 -f 333/114/332 327/108/326 326/107/325 -f 333/114/332 334/115/333 327/108/326 -f 329/116/334 322/109/327 327/108/326 -f 334/115/333 329/116/334 327/108/326 -f 284/68/284 286/68/284 328/68/284 -f 289/68/285 288/68/285 329/68/285 -f 291/117/287 330/111/329 328/110/328 -f 286/118/288 291/117/287 328/110/328 -f 291/117/287 331/112/330 330/111/329 -f 291/117/287 292/119/290 331/112/330 -f 295/120/293 332/113/331 331/112/330 -f 292/119/290 295/120/293 331/112/330 -f 295/120/293 333/114/332 332/113/331 -f 295/120/293 296/121/294 333/114/332 -f 299/122/297 334/115/333 333/114/332 -f 296/121/294 299/122/297 333/114/332 -f 299/122/297 329/116/334 334/115/333 -f 299/122/297 289/123/298 329/116/334 - -# Mesh 'Bein3Li' with 98 faces -g Bein3Li -usemtl BeinTex -f 335/68/335 336/68/335 337/68/335 -f 338/68/336 339/68/336 340/68/336 -f 335/69/337 341/70/338 342/71/339 -f 335/69/337 342/71/339 336/72/340 -f 341/70/338 343/73/341 342/71/339 -f 343/73/341 344/74/342 342/71/339 -f 343/73/341 345/75/343 346/76/344 -f 343/73/341 346/76/344 344/74/342 -f 345/75/343 347/77/345 346/76/344 -f 347/77/345 348/78/346 346/76/344 -f 347/77/345 349/79/347 350/80/348 -f 347/77/345 350/80/348 348/78/346 -f 349/79/347 338/68/349 350/80/348 -f 338/68/349 340/81/350 350/80/348 -f 336/68/335 351/68/335 337/68/335 -f 340/68/336 339/68/336 352/68/336 -f 336/72/340 342/71/339 351/82/351 -f 342/71/339 353/83/352 351/82/351 -f 342/71/339 344/74/342 354/84/353 -f 342/71/339 354/84/353 353/83/352 -f 344/74/342 346/76/344 354/84/353 -f 346/76/344 355/85/354 354/84/353 -f 346/76/344 348/78/346 356/86/355 -f 346/76/344 356/86/355 355/85/354 -f 348/78/346 350/80/348 356/86/355 -f 350/80/348 357/87/356 356/86/355 -f 350/80/348 340/81/350 352/88/357 -f 350/80/348 352/88/357 357/87/356 -f 351/68/335 358/68/335 337/68/335 -f 352/68/336 339/68/336 359/68/336 -f 351/82/351 353/83/352 360/89/358 -f 351/82/351 360/89/358 358/90/359 -f 353/83/352 354/84/353 360/89/358 -f 354/84/353 361/91/360 360/89/358 -f 354/84/353 355/85/354 362/92/361 -f 354/84/353 362/92/361 361/91/360 -f 355/85/354 356/86/355 362/92/361 -f 356/86/355 363/93/362 362/92/361 -f 356/86/355 357/87/356 364/94/363 -f 356/86/355 364/94/363 363/93/362 -f 357/87/356 352/88/357 364/94/363 -f 352/88/357 359/95/364 364/94/363 -f 358/68/335 365/68/335 337/68/335 -f 359/68/336 339/68/336 366/68/336 -f 358/90/359 360/89/358 365/96/365 -f 360/89/358 367/97/366 365/96/365 -f 360/89/358 361/91/360 368/98/367 -f 360/89/358 368/98/367 367/97/366 -f 361/91/360 362/92/361 368/98/367 -f 362/92/361 369/99/368 368/98/367 -f 362/92/361 363/93/362 370/100/369 -f 362/92/361 370/100/369 369/99/368 -f 363/93/362 364/94/363 370/100/369 -f 364/94/363 371/101/370 370/100/369 -f 364/94/363 359/95/364 366/102/371 -f 364/94/363 366/102/371 371/101/370 -f 365/68/335 372/68/335 337/68/335 -f 366/68/336 339/68/336 373/68/336 -f 365/96/365 367/97/366 374/103/372 -f 365/96/365 374/103/372 372/104/373 -f 367/97/366 368/98/367 374/103/372 -f 368/98/367 375/105/374 374/103/372 -f 368/98/367 369/99/368 376/106/375 -f 368/98/367 376/106/375 375/105/374 -f 369/99/368 370/100/369 376/106/375 -f 370/100/369 377/107/376 376/106/375 -f 370/100/369 371/101/370 378/108/377 -f 370/100/369 378/108/377 377/107/376 -f 371/101/370 366/102/371 378/108/377 -f 366/102/371 373/109/378 378/108/377 -f 372/68/335 379/68/335 337/68/335 -f 373/68/336 339/68/336 380/68/336 -f 372/104/373 374/103/372 379/110/379 -f 374/103/372 381/111/380 379/110/379 -f 374/103/372 375/105/374 382/112/381 -f 374/103/372 382/112/381 381/111/380 -f 375/105/374 376/106/375 382/112/381 -f 376/106/375 383/113/382 382/112/381 -f 376/106/375 377/107/376 384/114/383 -f 376/106/375 384/114/383 383/113/382 -f 377/107/376 378/108/377 384/114/383 -f 378/108/377 385/115/384 384/114/383 -f 378/108/377 373/109/378 380/116/385 -f 378/108/377 380/116/385 385/115/384 -f 379/68/335 335/68/335 337/68/335 -f 380/68/336 339/68/336 338/68/336 -f 379/110/379 381/111/380 341/117/338 -f 379/110/379 341/117/338 335/118/337 -f 381/111/380 382/112/381 341/117/338 -f 382/112/381 343/119/341 341/117/338 -f 382/112/381 383/113/382 345/120/343 -f 382/112/381 345/120/343 343/119/341 -f 383/113/382 384/114/383 345/120/343 -f 384/114/383 347/121/345 345/120/343 -f 384/114/383 385/115/384 349/122/347 -f 384/114/383 349/122/347 347/121/345 -f 385/115/384 380/116/385 349/122/347 -f 380/116/385 338/123/349 349/122/347 - -# Mesh 'Bein4Re' with 98 faces -g Bein4Re -usemtl BeinTex -f 386/68/386 387/68/386 388/68/386 -f 389/68/387 390/68/387 391/68/387 -f 392/71/388 393/70/389 388/69/390 -f 387/72/391 392/71/388 388/69/390 -f 392/71/388 394/73/392 393/70/389 -f 392/71/388 395/74/393 394/73/392 -f 396/76/394 397/75/395 394/73/392 -f 395/74/393 396/76/394 394/73/392 -f 396/76/394 398/77/396 397/75/395 -f 396/76/394 399/78/397 398/77/396 -f 400/80/398 401/79/399 398/77/396 -f 399/78/397 400/80/398 398/77/396 -f 400/80/398 391/68/400 401/79/399 -f 400/80/398 389/81/401 391/68/400 -f 386/68/386 402/68/386 387/68/386 -f 403/68/387 390/68/387 389/68/387 -f 402/82/402 392/71/388 387/72/391 -f 402/82/402 404/83/403 392/71/388 -f 405/84/404 395/74/393 392/71/388 -f 404/83/403 405/84/404 392/71/388 -f 405/84/404 396/76/394 395/74/393 -f 405/84/404 406/85/405 396/76/394 -f 407/86/406 399/78/397 396/76/394 -f 406/85/405 407/86/406 396/76/394 -f 407/86/406 400/80/398 399/78/397 -f 407/86/406 408/87/407 400/80/398 -f 403/88/408 389/81/401 400/80/398 -f 408/87/407 403/88/408 400/80/398 -f 386/68/386 409/68/386 402/68/386 -f 410/68/387 390/68/387 403/68/387 -f 411/89/409 404/83/403 402/82/402 -f 409/90/410 411/89/409 402/82/402 -f 411/89/409 405/84/404 404/83/403 -f 411/89/409 412/91/411 405/84/404 -f 413/92/412 406/85/405 405/84/404 -f 412/91/411 413/92/412 405/84/404 -f 413/92/412 407/86/406 406/85/405 -f 413/92/412 414/93/413 407/86/406 -f 415/94/414 408/87/407 407/86/406 -f 414/93/413 415/94/414 407/86/406 -f 415/94/414 403/88/408 408/87/407 -f 415/94/414 410/95/415 403/88/408 -f 386/68/386 416/68/386 409/68/386 -f 417/68/387 390/68/387 410/68/387 -f 416/96/416 411/89/409 409/90/410 -f 416/96/416 418/97/417 411/89/409 -f 419/98/418 412/91/411 411/89/409 -f 418/97/417 419/98/418 411/89/409 -f 419/98/418 413/92/412 412/91/411 -f 419/98/418 420/99/419 413/92/412 -f 421/100/420 414/93/413 413/92/412 -f 420/99/419 421/100/420 413/92/412 -f 421/100/420 415/94/414 414/93/413 -f 421/100/420 422/101/421 415/94/414 -f 417/102/422 410/95/415 415/94/414 -f 422/101/421 417/102/422 415/94/414 -f 386/68/386 423/68/386 416/68/386 -f 424/68/387 390/68/387 417/68/387 -f 425/103/423 418/97/417 416/96/416 -f 423/104/424 425/103/423 416/96/416 -f 425/103/423 419/98/418 418/97/417 -f 425/103/423 426/105/425 419/98/418 -f 427/106/426 420/99/419 419/98/418 -f 426/105/425 427/106/426 419/98/418 -f 427/106/426 421/100/420 420/99/419 -f 427/106/426 428/107/427 421/100/420 -f 429/108/428 422/101/421 421/100/420 -f 428/107/427 429/108/428 421/100/420 -f 429/108/428 417/102/422 422/101/421 -f 429/108/428 424/109/429 417/102/422 -f 386/68/386 430/68/386 423/68/386 -f 431/68/387 390/68/387 424/68/387 -f 430/110/430 425/103/423 423/104/424 -f 430/110/430 432/111/431 425/103/423 -f 433/112/432 426/105/425 425/103/423 -f 432/111/431 433/112/432 425/103/423 -f 433/112/432 427/106/426 426/105/425 -f 433/112/432 434/113/433 427/106/426 -f 435/114/434 428/107/427 427/106/426 -f 434/113/433 435/114/434 427/106/426 -f 435/114/434 429/108/428 428/107/427 -f 435/114/434 436/115/435 429/108/428 -f 431/116/436 424/109/429 429/108/428 -f 436/115/435 431/116/436 429/108/428 -f 386/68/386 388/68/386 430/68/386 -f 391/68/387 390/68/387 431/68/387 -f 393/117/389 432/111/431 430/110/430 -f 388/118/390 393/117/389 430/110/430 -f 393/117/389 433/112/432 432/111/431 -f 393/117/389 394/119/392 433/112/432 -f 397/120/395 434/113/433 433/112/432 -f 394/119/392 397/120/395 433/112/432 -f 397/120/395 435/114/434 434/113/433 -f 397/120/395 398/121/396 435/114/434 -f 401/122/399 436/115/435 435/114/434 -f 398/121/396 401/122/399 435/114/434 -f 401/122/399 431/116/436 436/115/435 -f 401/122/399 391/123/400 431/116/436 - -# Mesh 'Bein4Li' with 98 faces -g Bein4Li -usemtl BeinTex -f 437/68/437 438/68/437 439/68/437 -f 440/68/438 441/68/438 442/68/438 -f 437/69/439 443/70/440 444/71/441 -f 437/69/439 444/71/441 438/72/442 -f 443/70/440 445/73/443 444/71/441 -f 445/73/443 446/74/444 444/71/441 -f 445/73/443 447/75/445 448/76/446 -f 445/73/443 448/76/446 446/74/444 -f 447/75/445 449/77/447 448/76/446 -f 449/77/447 450/78/448 448/76/446 -f 449/77/447 451/79/449 452/80/450 -f 449/77/447 452/80/450 450/78/448 -f 451/79/449 440/68/451 452/80/450 -f 440/68/451 442/81/452 452/80/450 -f 438/68/437 453/68/437 439/68/437 -f 442/68/438 441/68/438 454/68/438 -f 438/72/442 444/71/441 453/82/453 -f 444/71/441 455/83/454 453/82/453 -f 444/71/441 446/74/444 456/84/455 -f 444/71/441 456/84/455 455/83/454 -f 446/74/444 448/76/446 456/84/455 -f 448/76/446 457/85/456 456/84/455 -f 448/76/446 450/78/448 458/86/457 -f 448/76/446 458/86/457 457/85/456 -f 450/78/448 452/80/450 458/86/457 -f 452/80/450 459/87/458 458/86/457 -f 452/80/450 442/81/452 454/88/459 -f 452/80/450 454/88/459 459/87/458 -f 453/68/437 460/68/437 439/68/437 -f 454/68/438 441/68/438 461/68/438 -f 453/82/453 455/83/454 462/89/460 -f 453/82/453 462/89/460 460/90/461 -f 455/83/454 456/84/455 462/89/460 -f 456/84/455 463/91/462 462/89/460 -f 456/84/455 457/85/456 464/92/463 -f 456/84/455 464/92/463 463/91/462 -f 457/85/456 458/86/457 464/92/463 -f 458/86/457 465/93/464 464/92/463 -f 458/86/457 459/87/458 466/94/465 -f 458/86/457 466/94/465 465/93/464 -f 459/87/458 454/88/459 466/94/465 -f 454/88/459 461/95/466 466/94/465 -f 460/68/437 467/68/437 439/68/437 -f 461/68/438 441/68/438 468/68/438 -f 460/90/461 462/89/460 467/96/467 -f 462/89/460 469/97/468 467/96/467 -f 462/89/460 463/91/462 470/98/469 -f 462/89/460 470/98/469 469/97/468 -f 463/91/462 464/92/463 470/98/469 -f 464/92/463 471/99/470 470/98/469 -f 464/92/463 465/93/464 472/100/471 -f 464/92/463 472/100/471 471/99/470 -f 465/93/464 466/94/465 472/100/471 -f 466/94/465 473/101/472 472/100/471 -f 466/94/465 461/95/466 468/102/473 -f 466/94/465 468/102/473 473/101/472 -f 467/68/437 474/68/437 439/68/437 -f 468/68/438 441/68/438 475/68/438 -f 467/96/467 469/97/468 476/103/474 -f 467/96/467 476/103/474 474/104/475 -f 469/97/468 470/98/469 476/103/474 -f 470/98/469 477/105/476 476/103/474 -f 470/98/469 471/99/470 478/106/477 -f 470/98/469 478/106/477 477/105/476 -f 471/99/470 472/100/471 478/106/477 -f 472/100/471 479/107/478 478/106/477 -f 472/100/471 473/101/472 480/108/479 -f 472/100/471 480/108/479 479/107/478 -f 473/101/472 468/102/473 480/108/479 -f 468/102/473 475/109/480 480/108/479 -f 474/68/437 481/68/437 439/68/437 -f 475/68/438 441/68/438 482/68/438 -f 474/104/475 476/103/474 481/110/481 -f 476/103/474 483/111/482 481/110/481 -f 476/103/474 477/105/476 484/112/483 -f 476/103/474 484/112/483 483/111/482 -f 477/105/476 478/106/477 484/112/483 -f 478/106/477 485/113/484 484/112/483 -f 478/106/477 479/107/478 486/114/485 -f 478/106/477 486/114/485 485/113/484 -f 479/107/478 480/108/479 486/114/485 -f 480/108/479 487/115/486 486/114/485 -f 480/108/479 475/109/480 482/116/487 -f 480/108/479 482/116/487 487/115/486 -f 481/68/437 437/68/437 439/68/437 -f 482/68/438 441/68/438 440/68/438 -f 481/110/481 483/111/482 443/117/440 -f 481/110/481 443/117/440 437/118/439 -f 483/111/482 484/112/483 443/117/440 -f 484/112/483 445/119/443 443/117/440 -f 484/112/483 485/113/484 447/120/445 -f 484/112/483 447/120/445 445/119/443 -f 485/113/484 486/114/485 447/120/445 -f 486/114/485 449/121/447 447/120/445 -f 486/114/485 487/115/486 451/122/449 -f 486/114/485 451/122/449 449/121/447 -f 487/115/486 482/116/487 451/122/449 -f 482/116/487 440/123/451 451/122/449 - -# Mesh 'Zahn' with 42 faces -g Zahn -usemtl BeinTex -f 488/124/488 488/124/488 488/124/488 -f 489/125/489 490/126/489 491/127/489 -f 488/124/490 492/128/491 493/129/492 -f 488/124/490 493/129/492 488/124/488 -f 492/128/491 489/125/493 493/129/492 -f 489/125/493 491/127/494 493/129/492 -f 488/124/488 488/124/488 488/124/488 -f 491/127/489 490/126/489 494/130/489 -f 488/124/488 493/129/492 488/124/495 -f 493/129/492 495/131/496 488/124/495 -f 493/129/492 491/127/494 494/130/497 -f 493/129/492 494/130/497 495/131/496 -f 488/124/488 488/124/488 488/124/488 -f 494/130/489 490/126/489 496/132/489 -f 488/124/495 495/131/496 497/133/498 -f 488/124/495 497/133/498 488/124/488 -f 495/131/496 494/130/497 497/133/498 -f 494/130/497 496/132/499 497/133/498 -f 488/124/488 488/124/488 488/124/488 -f 496/132/489 490/126/489 498/134/489 -f 488/124/488 497/133/498 488/124/500 -f 497/133/498 499/135/501 488/124/500 -f 497/133/498 496/132/499 498/134/502 -f 497/133/498 498/134/502 499/135/501 -f 488/124/488 488/124/488 488/124/488 -f 498/134/489 490/126/489 500/136/489 -f 488/124/500 499/135/501 501/137/503 -f 488/124/500 501/137/503 488/124/488 -f 499/135/501 498/134/502 501/137/503 -f 498/134/502 500/136/504 501/137/503 -f 488/124/488 488/124/488 488/124/488 -f 500/136/489 490/126/489 502/138/489 -f 488/124/488 501/137/503 488/124/505 -f 501/137/503 503/139/506 488/124/505 -f 501/137/503 500/136/504 502/138/507 -f 501/137/503 502/138/507 503/139/506 -f 488/124/488 488/124/488 488/124/488 -f 502/138/489 490/126/489 489/125/489 -f 488/124/505 503/139/506 492/128/491 -f 488/124/505 492/128/491 488/124/490 -f 503/139/506 502/138/507 492/128/491 -f 502/138/507 489/125/493 492/128/491 - -# Mesh 'klZahn' with 42 faces -g klZahn -usemtl BeinTex -f 504/140/488 504/140/488 504/140/488 -f 505/141/508 506/142/508 507/143/508 -f 504/140/509 508/144/510 509/145/511 -f 504/140/509 509/145/511 504/140/488 -f 508/144/510 505/141/512 509/145/511 -f 505/141/512 507/143/513 509/145/511 -f 504/140/488 504/140/488 504/140/488 -f 507/143/508 506/142/508 510/146/508 -f 504/140/488 509/145/511 504/140/514 -f 509/145/511 511/147/515 504/140/514 -f 509/145/511 507/143/513 510/146/516 -f 509/145/511 510/146/516 511/147/515 -f 504/140/488 504/140/488 504/140/488 -f 510/146/508 506/142/508 512/148/508 -f 504/140/514 511/147/515 513/149/517 -f 504/140/514 513/149/517 504/140/488 -f 511/147/515 510/146/516 513/149/517 -f 510/146/516 512/148/518 513/149/517 -f 504/140/488 504/140/488 504/140/488 -f 512/148/508 506/142/508 514/150/508 -f 504/140/488 513/149/517 504/140/519 -f 513/149/517 515/151/520 504/140/519 -f 513/149/517 512/148/518 514/150/521 -f 513/149/517 514/150/521 515/151/520 -f 504/140/488 504/140/488 504/140/488 -f 514/150/508 506/142/508 516/152/508 -f 504/140/519 515/151/520 517/153/522 -f 504/140/519 517/153/522 504/140/488 -f 515/151/520 514/150/521 517/153/522 -f 514/150/521 516/152/523 517/153/522 -f 504/140/488 504/140/488 504/140/488 -f 516/152/508 506/142/508 518/154/508 -f 504/140/488 517/153/522 504/140/524 -f 517/153/522 519/155/525 504/140/524 -f 517/153/522 516/152/523 518/154/526 -f 517/153/522 518/154/526 519/155/525 -f 504/140/488 504/140/488 504/140/488 -f 518/154/508 506/142/508 505/141/508 -f 504/140/524 519/155/525 508/144/510 -f 504/140/524 508/144/510 504/140/509 -f 519/155/525 518/154/526 508/144/510 -f 518/154/526 505/141/512 508/144/510 - -# Mesh 'Kopf' with 90 faces -g Kopf -usemtl Skin -f 520/68/527 521/156/528 522/157/529 -f 520/68/527 523/158/530 521/156/528 -f 524/69/531 525/159/532 526/160/533 -f 520/68/527 527/161/534 523/158/530 -f 524/69/531 526/160/533 528/162/535 -f 520/68/527 529/163/536 527/161/534 -f 524/69/531 528/162/535 530/164/537 -f 520/68/527 531/165/538 529/163/536 -f 524/69/531 530/164/537 532/166/539 -f 520/68/527 533/167/540 531/165/538 -f 534/168/541 535/169/542 525/159/532 -f 525/159/532 535/169/542 536/170/543 -f 525/159/532 536/170/543 526/160/533 -f 526/160/533 536/170/543 528/162/535 -f 536/170/543 537/169/544 528/162/535 -f 528/162/535 537/169/544 538/171/545 -f 528/162/535 538/171/545 530/164/537 -f 530/164/537 538/171/545 532/166/539 -f 538/171/545 539/172/546 532/166/539 -f 540/173/547 541/174/548 534/168/541 -f 541/174/548 542/175/549 534/168/541 -f 534/168/541 542/175/549 543/176/550 -f 534/168/541 543/176/550 535/169/542 -f 535/169/542 543/176/550 536/170/543 -f 543/176/550 544/177/551 536/170/543 -f 536/170/543 544/177/551 545/178/552 -f 536/170/543 545/178/552 537/169/544 -f 537/169/544 545/178/552 538/171/545 -f 545/178/552 546/179/553 538/171/545 -f 538/171/545 546/179/553 547/180/554 -f 538/171/545 547/180/554 539/172/546 -f 541/174/548 548/181/555 549/182/556 -f 541/174/548 549/182/556 542/175/549 -f 542/175/549 549/182/556 543/176/550 -f 549/182/556 550/183/557 543/176/550 -f 543/176/550 550/183/557 551/184/558 -f 543/176/550 551/184/558 544/177/551 -f 544/177/551 551/184/558 545/178/552 -f 551/184/558 552/185/559 545/178/552 -f 546/179/553 553/186/560 547/180/554 -f 553/186/560 554/187/561 547/180/554 -f 548/181/555 522/157/529 549/182/556 -f 522/157/529 521/156/528 549/182/556 -f 549/182/556 521/156/528 523/158/530 -f 549/182/556 523/158/530 550/183/557 -f 550/183/557 523/158/530 551/184/558 -f 523/158/530 527/161/534 551/184/558 -f 551/184/558 527/161/534 529/163/536 -f 551/184/558 529/163/536 552/185/559 -f 552/185/559 529/163/536 553/186/560 -f 529/163/536 531/165/538 553/186/560 -f 553/186/560 531/165/538 533/167/540 -f 553/186/560 533/167/540 554/187/561 -f 555/188/562 556/189/563 557/190/564 -f 546/179/553 558/191/565 557/190/564 -f 557/190/564 555/188/562 546/179/553 -f 559/192/566 558/191/565 546/179/553 -f 558/191/565 559/192/566 560/193/567 -f 560/193/567 557/190/564 558/191/565 -f 561/194/568 560/193/567 559/192/566 -f 559/192/566 562/195/569 561/194/568 -f 563/196/570 561/194/568 564/197/571 -f 562/195/569 564/197/571 561/194/568 -f 565/198/572 563/196/570 566/199/573 -f 563/196/570 564/197/571 566/199/573 -f 566/199/573 567/200/574 565/198/572 -f 566/199/573 568/201/575 567/200/574 -f 568/201/575 569/202/576 567/200/574 -f 570/203/577 567/200/574 569/202/576 -f 569/202/576 571/204/578 570/203/577 -f 572/205/579 570/203/577 571/204/578 -f 573/206/580 572/205/579 571/204/578 -f 571/204/578 574/207/581 573/206/580 -f 575/208/582 573/206/580 574/207/581 -f 574/207/581 576/209/583 575/208/582 -f 556/189/563 575/208/582 576/209/583 -f 576/209/583 555/188/562 556/189/563 -f 555/188/562 553/186/560 546/179/553 -f 555/188/562 576/209/583 553/186/560 -f 576/209/583 574/207/581 553/186/560 -f 574/207/581 571/204/578 553/186/560 -f 571/204/578 569/202/576 553/186/560 -f 552/185/559 553/186/560 569/202/576 -f 569/202/576 568/201/575 552/185/559 -f 568/201/575 566/199/573 552/185/559 -f 559/192/566 546/179/553 545/178/552 -f 562/195/569 559/192/566 545/178/552 -f 564/197/571 562/195/569 545/178/552 -f 545/178/552 552/185/559 566/199/573 -f 564/197/571 566/199/573 545/178/552 - -# Mesh 'Brust' with 20 faces -g Brust -usemtl Skin -f 70/210/584 71/211/585 577/212/586 -f 60/120/587 577/212/586 64/213/588 -f 577/212/586 71/211/585 64/213/588 -f 70/210/584 577/212/586 578/214/589 -f 75/215/590 578/214/589 579/216/591 -f 60/120/587 579/216/591 577/212/586 -f 578/214/589 577/212/586 579/216/591 -f 70/210/584 578/214/589 580/217/592 -f 77/75/593 580/217/592 581/218/594 -f 75/215/590 581/218/594 578/214/589 -f 580/217/592 578/214/589 581/218/594 -f 77/75/593 581/218/594 72/219/595 -f 75/215/590 73/220/596 581/218/594 -f 72/219/595 581/218/594 73/220/596 -f 75/215/590 579/216/591 74/221/597 -f 60/120/587 61/222/598 579/216/591 -f 74/221/597 579/216/591 61/222/598 -f 70/210/584 580/217/592 69/223/599 -f 77/75/593 79/224/600 580/217/592 -f 69/223/599 580/217/592 79/224/600 - -# Mesh 'Kopf2' with 90 faces -g Kopf2 -usemtl Skin -f 582/225/601 583/226/602 584/123/603 -f 583/226/602 585/227/604 584/123/603 -f 586/228/605 587/229/606 588/118/607 -f 585/227/604 589/230/608 584/123/603 -f 590/231/609 586/228/605 588/118/607 -f 589/230/608 591/232/610 584/123/603 -f 592/233/611 590/231/609 588/118/607 -f 591/232/610 593/234/612 584/123/603 -f 594/235/613 592/233/611 588/118/607 -f 593/234/612 595/236/614 584/123/603 -f 587/229/606 596/237/615 597/238/616 -f 598/239/617 596/237/615 587/229/606 -f 586/228/605 598/239/617 587/229/606 -f 590/231/609 598/239/617 586/228/605 -f 590/231/609 599/237/618 598/239/617 -f 600/240/619 599/237/618 590/231/609 -f 592/233/611 600/240/619 590/231/609 -f 594/235/613 600/240/619 592/233/611 -f 594/235/613 601/241/620 600/240/619 -f 597/238/616 602/176/621 603/242/622 -f 597/238/616 604/243/623 602/176/621 -f 605/174/624 604/243/623 597/238/616 -f 596/237/615 605/174/624 597/238/616 -f 598/239/617 605/174/624 596/237/615 -f 598/239/617 606/244/625 605/174/624 -f 607/245/626 606/244/625 598/239/617 -f 599/237/618 607/245/626 598/239/617 -f 600/240/619 607/245/626 599/237/618 -f 600/240/619 608/246/627 607/245/626 -f 609/247/628 608/246/627 600/240/619 -f 601/241/620 609/247/628 600/240/619 -f 610/248/629 611/249/630 602/176/621 -f 604/243/623 610/248/629 602/176/621 -f 605/174/624 610/248/629 604/243/623 -f 605/174/624 612/250/631 610/248/629 -f 613/251/632 612/250/631 605/174/624 -f 606/244/625 613/251/632 605/174/624 -f 607/245/626 613/251/632 606/244/625 -f 607/245/626 614/252/633 613/251/632 -f 609/247/628 615/253/634 608/246/627 -f 609/247/628 616/254/635 615/253/634 -f 610/248/629 582/225/601 611/249/630 -f 610/248/629 583/226/602 582/225/601 -f 585/227/604 583/226/602 610/248/629 -f 612/250/631 585/227/604 610/248/629 -f 613/251/632 585/227/604 612/250/631 -f 613/251/632 589/230/608 585/227/604 -f 591/232/610 589/230/608 613/251/632 -f 614/252/633 591/232/610 613/251/632 -f 615/253/634 591/232/610 614/252/633 -f 615/253/634 593/234/612 591/232/610 -f 595/236/614 593/234/612 615/253/634 -f 616/254/635 595/236/614 615/253/634 -f 617/255/636 618/256/637 619/257/638 -f 617/255/636 620/258/639 608/246/627 -f 608/246/627 619/257/638 617/255/636 -f 608/246/627 620/258/639 621/259/640 -f 622/260/641 621/259/640 620/258/639 -f 620/258/639 617/255/636 622/260/641 -f 621/259/640 622/260/641 623/261/642 -f 623/261/642 624/262/643 621/259/640 -f 625/263/644 623/261/642 626/264/645 -f 623/261/642 625/263/644 624/262/643 -f 627/265/646 626/264/645 628/266/647 -f 627/265/646 625/263/644 626/264/645 -f 628/266/647 629/267/648 627/265/646 -f 629/267/648 630/268/649 627/265/646 -f 629/267/648 631/269/650 630/268/649 -f 631/269/650 629/267/648 632/270/651 -f 632/270/651 633/271/652 631/269/650 -f 633/271/652 632/270/651 634/272/653 -f 633/271/652 634/272/653 635/273/654 -f 635/273/654 636/274/655 633/271/652 -f 636/274/655 635/273/654 637/275/656 -f 637/275/656 638/276/657 636/274/655 -f 638/276/657 637/275/656 618/256/637 -f 618/256/637 619/257/638 638/276/657 -f 608/246/627 615/253/634 619/257/638 -f 615/253/634 638/276/657 619/257/638 -f 615/253/634 636/274/655 638/276/657 -f 615/253/634 633/271/652 636/274/655 -f 615/253/634 631/269/650 633/271/652 -f 631/269/650 615/253/634 614/252/633 -f 614/252/633 630/268/649 631/269/650 -f 614/252/633 627/265/646 630/268/649 -f 607/245/626 608/246/627 621/259/640 -f 607/245/626 621/259/640 624/262/643 -f 607/245/626 624/262/643 625/263/644 -f 627/265/646 614/252/633 607/245/626 -f 607/245/626 627/265/646 625/263/644 - -# Mesh 'Zahn2' with 42 faces -g Zahn2 -usemtl BeinTex -f 639/124/488 639/124/488 639/124/488 -f 640/127/658 641/126/658 642/125/658 -f 643/129/659 644/128/660 639/124/661 -f 639/124/488 643/129/659 639/124/661 -f 643/129/659 642/125/662 644/128/660 -f 643/129/659 640/127/663 642/125/662 -f 639/124/488 639/124/488 639/124/488 -f 645/130/658 641/126/658 640/127/658 -f 639/124/664 643/129/659 639/124/488 -f 639/124/664 646/131/665 643/129/659 -f 645/130/666 640/127/663 643/129/659 -f 646/131/665 645/130/666 643/129/659 -f 639/124/488 639/124/488 639/124/488 -f 647/132/658 641/126/658 645/130/658 -f 648/133/667 646/131/665 639/124/664 -f 639/124/488 648/133/667 639/124/664 -f 648/133/667 645/130/666 646/131/665 -f 648/133/667 647/132/668 645/130/666 -f 639/124/488 639/124/488 639/124/488 -f 649/134/658 641/126/658 647/132/658 -f 639/124/669 648/133/667 639/124/488 -f 639/124/669 650/135/670 648/133/667 -f 649/134/671 647/132/668 648/133/667 -f 650/135/670 649/134/671 648/133/667 -f 639/124/488 639/124/488 639/124/488 -f 651/136/658 641/126/658 649/134/658 -f 652/137/672 650/135/670 639/124/669 -f 639/124/488 652/137/672 639/124/669 -f 652/137/672 649/134/671 650/135/670 -f 652/137/672 651/136/673 649/134/671 -f 639/124/488 639/124/488 639/124/488 -f 653/138/658 641/126/658 651/136/658 -f 639/124/674 652/137/672 639/124/488 -f 639/124/674 654/139/675 652/137/672 -f 653/138/676 651/136/673 652/137/672 -f 654/139/675 653/138/676 652/137/672 -f 639/124/488 639/124/488 639/124/488 -f 642/125/658 641/126/658 653/138/658 -f 644/128/660 654/139/675 639/124/674 -f 639/124/661 644/128/660 639/124/674 -f 644/128/660 653/138/676 654/139/675 -f 644/128/660 642/125/662 653/138/676 - -# Mesh 'klZahn2' with 42 faces -g klZahn2 -usemtl BeinTex -f 655/140/488 655/140/488 655/140/488 -f 656/143/677 657/142/677 658/141/677 -f 659/145/678 660/144/679 655/140/680 -f 655/140/488 659/145/678 655/140/680 -f 659/145/678 658/141/681 660/144/679 -f 659/145/678 656/143/682 658/141/681 -f 655/140/488 655/140/488 655/140/488 -f 661/146/677 657/142/677 656/143/677 -f 655/140/683 659/145/678 655/140/488 -f 655/140/683 662/147/684 659/145/678 -f 661/146/685 656/143/682 659/145/678 -f 662/147/684 661/146/685 659/145/678 -f 655/140/488 655/140/488 655/140/488 -f 663/148/677 657/142/677 661/146/677 -f 664/149/686 662/147/684 655/140/683 -f 655/140/488 664/149/686 655/140/683 -f 664/149/686 661/146/685 662/147/684 -f 664/149/686 663/148/687 661/146/685 -f 655/140/488 655/140/488 655/140/488 -f 665/150/677 657/142/677 663/148/677 -f 655/140/688 664/149/686 655/140/488 -f 655/140/688 666/151/689 664/149/686 -f 665/150/690 663/148/687 664/149/686 -f 666/151/689 665/150/690 664/149/686 -f 655/140/488 655/140/488 655/140/488 -f 667/152/677 657/142/677 665/150/677 -f 668/153/691 666/151/689 655/140/688 -f 655/140/488 668/153/691 655/140/688 -f 668/153/691 665/150/690 666/151/689 -f 668/153/691 667/152/692 665/150/690 -f 655/140/488 655/140/488 655/140/488 -f 669/154/677 657/142/677 667/152/677 -f 655/140/693 668/153/691 655/140/488 -f 655/140/693 670/155/694 668/153/691 -f 669/154/695 667/152/692 668/153/691 -f 670/155/694 669/154/695 668/153/691 -f 655/140/488 655/140/488 655/140/488 -f 658/141/677 657/142/677 669/154/677 -f 660/144/679 670/155/694 655/140/693 -f 655/140/680 660/144/679 655/140/693 -f 660/144/679 669/154/695 670/155/694 -f 660/144/679 658/141/681 669/154/695 - -# Mesh 'Auge' with 38 faces -g Auge -usemtl Augentex -f 671/277/696 672/278/697 673/279/698 -f 671/277/696 673/279/698 674/280/699 -f 675/281/700 674/280/699 676/282/701 -f 674/280/699 673/279/698 676/282/701 -f 675/281/700 676/282/701 677/283/702 -f 678/284/703 679/285/704 680/286/705 -f 681/287/706 680/286/705 682/288/707 -f 683/289/708 682/288/707 679/285/704 -f 680/286/705 679/285/704 682/288/707 -f 681/287/706 682/288/707 684/290/709 -f 685/291/710 684/290/709 686/292/711 -f 683/289/708 686/292/711 682/288/707 -f 684/290/709 682/288/707 686/292/711 -f 685/291/710 687/293/712 688/294/713 -f 689/295/714 688/294/713 690/296/715 -f 691/297/716 690/296/715 687/293/712 -f 688/294/713 687/293/712 690/296/715 -f 689/295/714 690/296/715 692/298/717 -f 671/277/696 692/298/717 693/299/718 -f 691/297/716 693/299/718 690/296/715 -f 692/298/717 690/296/715 693/299/718 -f 671/277/696 693/299/718 672/278/697 -f 675/281/700 694/300/719 674/280/699 -f 671/277/696 674/280/699 692/298/717 -f 689/295/714 692/298/717 694/300/719 -f 674/280/699 694/300/719 692/298/717 -f 675/281/700 695/301/720 694/300/719 -f 689/295/714 694/300/719 696/302/721 -f 681/287/706 696/302/721 695/301/720 -f 694/300/719 695/301/720 696/302/721 -f 675/281/700 677/283/702 695/301/720 -f 681/287/706 695/301/720 680/286/705 -f 678/284/703 680/286/705 677/283/702 -f 695/301/720 677/283/702 680/286/705 -f 685/291/710 688/294/713 684/290/709 -f 681/287/706 684/290/709 696/302/721 -f 689/295/714 696/302/721 688/294/713 -f 684/290/709 688/294/713 696/302/721 - -# Mesh 'Duplicate05' with 38 faces -g Duplicate05 -usemtl Augentex -f 697/279/722 698/278/723 699/277/724 -f 700/280/725 697/279/722 699/277/724 -f 701/282/726 700/280/725 702/281/727 -f 701/282/726 697/279/722 700/280/725 -f 703/283/728 701/282/726 702/281/727 -f 704/286/729 705/285/730 706/284/731 -f 707/288/732 704/286/729 708/287/733 -f 705/285/730 707/288/732 709/289/734 -f 707/288/732 705/285/730 704/286/729 -f 710/290/735 707/288/732 708/287/733 -f 711/292/736 710/290/735 712/291/737 -f 707/288/732 711/292/736 709/289/734 -f 711/292/736 707/288/732 710/290/735 -f 713/294/738 714/293/739 712/291/737 -f 715/296/740 713/294/738 716/295/741 -f 714/293/739 715/296/740 717/297/742 -f 715/296/740 714/293/739 713/294/738 -f 718/298/743 715/296/740 716/295/741 -f 719/299/744 718/298/743 699/277/724 -f 715/296/740 719/299/744 717/297/742 -f 719/299/744 715/296/740 718/298/743 -f 698/278/723 719/299/744 699/277/724 -f 700/280/725 720/300/745 702/281/727 -f 718/298/743 700/280/725 699/277/724 -f 720/300/745 718/298/743 716/295/741 -f 718/298/743 720/300/745 700/280/725 -f 720/300/745 721/301/746 702/281/727 -f 722/302/747 720/300/745 716/295/741 -f 721/301/746 722/302/747 708/287/733 -f 722/302/747 721/301/746 720/300/745 -f 721/301/746 703/283/728 702/281/727 -f 704/286/729 721/301/746 708/287/733 -f 703/283/728 704/286/729 706/284/731 -f 704/286/729 703/283/728 721/301/746 -f 710/290/735 713/294/738 712/291/737 -f 722/302/747 710/290/735 708/287/733 -f 713/294/738 722/302/747 716/295/741 -f 722/302/747 713/294/738 710/290/735 - diff --git a/test/models/OBJ/test.mtl b/test/models/OBJ/test.mtl deleted file mode 100644 index af1dcb756..000000000 --- a/test/models/OBJ/test.mtl +++ /dev/null @@ -1,13 +0,0 @@ -# File produced by Open Asset Import Library (http://www.assimp.sf.net) -# (assimp v4.1.1712791017) - -newmtl DefaultMaterial -Kd 0.6000000238418579 0.6000000238418579 0.6000000238418579 -Ka 0 0 0 -Ks 0 0 0 -Ke 0 0 0 -Tf 1 1 1 -d 1 -Ni 1 -illum 1 - diff --git a/test/models/OBJ/test.obj b/test/models/OBJ/test.obj deleted file mode 100644 index 64e5a436d..000000000 --- a/test/models/OBJ/test.obj +++ /dev/null @@ -1,40 +0,0 @@ -# File produced by Open Asset Import Library (http://www.assimp.sf.net) -# (assimp v4.1.1712791017) - -mtllib test.mtl - -# 8 vertex positions and colors -v 0 0 0 124 110 120 -v 1 1 0 78 10 50 -v 1 0 0 24 200 25 -v 0 1 0 4 0 44 -v 0 1 1 224 0 10 -v 0 0 1 24 0 121 -v 1 1 1 23 0 200 -v 1 0 1 124 10 56 - -# 0 UV coordinates - -# 6 vertex normals -vn 0 0 -1 -vn -1 0 0 -vn 0 1 0 -vn 1 0 0 -vn 0 -1 0 -vn 0 0 1 - -# Mesh 'cube' with 11 faces -g cube -usemtl DefaultMaterial -f 1//1 2//1 3//1 -f 1//1 4//1 2//1 -f 1//2 5//2 4//2 -f 1//2 6//2 5//2 -f 4//3 7//3 2//3 -f 4//3 5//3 7//3 -f 3//4 2//4 7//4 -f 3//4 7//4 8//4 -f 1//5 3//5 8//5 -f 1//5 8//5 6//5 -f 6//6 8//6 7//6 - diff --git a/test/models/glTF2/BoxTextured-glTF/BoxTextured_out.bin b/test/models/glTF2/BoxTextured-glTF/BoxTextured_out.bin deleted file mode 100644 index ed2c944bd556cee1cf6aa1012531bf0095bbcb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmb7A3l4%X6e}t!Dk^@D12=O=;U;o2^_8t;Aqe`CrmyXL%QgT{c$CHjb~S#UIHJG_XG4JtuDIcDxZ(rjd|aOZ diff --git a/test/models/glTF2/BoxTextured-glTF/BoxTextured_out.gltf b/test/models/glTF2/BoxTextured-glTF/BoxTextured_out.gltf deleted file mode 100644 index ddc99d6d4..000000000 --- a/test/models/glTF2/BoxTextured-glTF/BoxTextured_out.gltf +++ /dev/null @@ -1,184 +0,0 @@ -{ - "asset": { - "version": "2.0", - "generator": "Open Asset Import Library (assimp v4.1.1712791017)" - }, - "accessors": [ - { - "bufferView": 0, - "byteOffset": 0, - "componentType": 5126, - "count": 24, - "type": "VEC3", - "max": [ - 0.5, - 0.5, - 0.5 - ], - "min": [ - -0.5, - -0.5, - -0.5 - ] - }, - { - "bufferView": 1, - "byteOffset": 0, - "componentType": 5126, - "count": 24, - "type": "VEC3", - "max": [ - 1.0, - 1.0, - 1.0 - ], - "min": [ - -1.0, - -1.0, - -1.0 - ] - }, - { - "bufferView": 2, - "byteOffset": 0, - "componentType": 5126, - "count": 24, - "type": "VEC2", - "max": [ - 6.0, - 1.0 - ], - "min": [ - 0.0, - 0.0 - ] - }, - { - "bufferView": 3, - "byteOffset": 0, - "componentType": 5123, - "count": 36, - "type": "SCALAR", - "max": [ - 23.0 - ], - "min": [ - 0.0 - ] - } - ], - "buffers": [ - { - "byteLength": 840, - "uri": "C:/Users/admin/Downloads/assimp/test/models/glTF2/BoxTextured-glTF/BoxTextured_out.bin" - } - ], - "bufferViews": [ - { - "buffer": 0, - "byteOffset": 0, - "byteLength": 288, - "target": 34962 - }, - { - "buffer": 0, - "byteOffset": 288, - "byteLength": 288, - "target": 34962 - }, - { - "buffer": 0, - "byteOffset": 576, - "byteLength": 192, - "target": 34962 - }, - { - "buffer": 0, - "byteOffset": 768, - "byteLength": 72, - "target": 34963 - } - ], - "images": [ - { - "uri": "CesiumLogoFlat.png" - } - ], - "materials": [ - { - "name": "Texture", - "pbrMetallicRoughness": { - "baseColorTexture": { - "index": 0 - }, - "metallicFactor": 0.0 - } - } - ], - "meshes": [ - { - "name": "Mesh", - "primitives": [ - { - "mode": 4, - "material": 0, - "indices": 3, - "attributes": { - "POSITION": 0, - "NORMAL": 1, - "TEXCOORD_0": 2 - } - } - ] - } - ], - "nodes": [ - { - "matrix": [ - 1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -1.0, - 0.0, - 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0 - ], - "children": [ - 1 - ] - }, - { - "name": "nodes_1", - "mesh": 0 - } - ], - "samplers": [ - { - "magFilter": 9729, - "minFilter": 9986 - } - ], - "scenes": [ - { - "nodes": [ - 0 - ] - } - ], - "textures": [ - { - "source": 0, - "sampler": 0 - } - ], - "scene": 0 -} \ No newline at end of file From 98c053a9b934bd4438872aa1bc603197dd18b2cc Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 23 Jan 2018 13:02:03 +0100 Subject: [PATCH 005/106] Fix textures --- tools/assimp_view/HUD.png | Bin 42510 -> 40474 bytes tools/assimp_view/HUDMask.png | Bin 6459 -> 6460 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/assimp_view/HUD.png b/tools/assimp_view/HUD.png index be7981977b07e77fcc6e230f410341bb2daeb41b..fe649fc16cc5a971d94808c4776f299bae1f6219 100644 GIT binary patch literal 40474 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 diff --git a/tools/assimp_view/HUDMask.png b/tools/assimp_view/HUDMask.png index 9311e464f4d6376eb0f457cebf3a472ba74308bf..98578dc536037938bc2be98e923516e45ff2c86d 100644 GIT binary patch delta 14 VcmdmOw8x0GGr-TCcO#3rBmgF_1YrOG delta 13 UcmdmEwA+ZKGr-S%BdfV203#a&Q~&?~ From ebaa8be106b158ed96c624abf5dd9d5c83de3939 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 23 Jan 2018 13:02:13 +0100 Subject: [PATCH 006/106] fix findings. --- tools/assimp_view/MessageProc.cpp | 24 +++++-------- tools/assimp_view/assimp_view.cpp | 57 ++++++++++--------------------- 2 files changed, 26 insertions(+), 55 deletions(-) diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index b8c56503b..71bc5c8bb 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -118,7 +118,7 @@ void MakeFileAssociations() D3DCOLOR_ARGB(0xFF,0,0xFF,0)); CLogDisplay::Instance().AddEntry(tmp.data,D3DCOLOR_ARGB(0xFF,0,0xFF,0)); - } +} //------------------------------------------------------------------------------- @@ -128,17 +128,16 @@ void MakeFileAssociations() // Other command line parameters are not handled //------------------------------------------------------------------------------- void HandleCommandLine(char* p_szCommand) - { +{ char* sz = p_szCommand; //bool bQuak = false; if (strlen(sz) < 2)return; - if (*sz == '\"') - { + if (*sz == '\"') { char* sz2 = strrchr(sz,'\"'); if (sz2)*sz2 = 0; - sz++; // skip the starting quote + sz++; // skip the starting quote } strcpy( g_szFileName, sz ); @@ -149,8 +148,7 @@ void HandleCommandLine(char* p_szCommand) // Save the list of previous files to the registry SaveHistory(); - } - +} //------------------------------------------------------------------------------- // Load the light colors from the registry @@ -158,16 +156,11 @@ void HandleCommandLine(char* p_szCommand) void LoadLightColors() { DWORD dwTemp = 4; - RegQueryValueEx(g_hRegistry,"LightColor0",NULL,NULL, - (BYTE*)&g_avLightColors[0],&dwTemp); - RegQueryValueEx(g_hRegistry,"LightColor1",NULL,NULL, - (BYTE*)&g_avLightColors[1],&dwTemp); - RegQueryValueEx(g_hRegistry,"LightColor2",NULL,NULL, - (BYTE*)&g_avLightColors[2],&dwTemp); - return; + RegQueryValueEx(g_hRegistry,"LightColor0",NULL,NULL, (BYTE*)&g_avLightColors[0],&dwTemp); + RegQueryValueEx(g_hRegistry,"LightColor1",NULL,NULL, (BYTE*)&g_avLightColors[1],&dwTemp); + RegQueryValueEx(g_hRegistry,"LightColor2",NULL,NULL, (BYTE*)&g_avLightColors[2],&dwTemp); } - //------------------------------------------------------------------------------- // Save the light colors to the registry //------------------------------------------------------------------------------- @@ -178,7 +171,6 @@ void SaveLightColors() RegSetValueExA(g_hRegistry,"LightColor2",0,REG_DWORD,(const BYTE*)&g_avLightColors[2],4); } - //------------------------------------------------------------------------------- // Save the checker pattern colors to the registry //------------------------------------------------------------------------------- diff --git a/tools/assimp_view/assimp_view.cpp b/tools/assimp_view/assimp_view.cpp index 108f866c4..5980c58c0 100644 --- a/tools/assimp_view/assimp_view.cpp +++ b/tools/assimp_view/assimp_view.cpp @@ -787,9 +787,17 @@ int ShutdownD3D(void) return 1; } +template +inline +void SafeRelease(TComPtr *ptr) { + if (nullptr != g_piPassThroughEffect) { + g_piPassThroughEffect->Release(); + g_piPassThroughEffect = nullptr; + } +} //------------------------------------------------------------------------------- -// Shutdown the D3D devie object and all resources associated with it +// Shutdown the D3D device object and all resources associated with it // NOTE: Assumes that the asset has already been deleted //------------------------------------------------------------------------------- int ShutdownDevice(void) @@ -798,49 +806,20 @@ int ShutdownDevice(void) CBackgroundPainter::Instance().ReleaseNativeResource(); CLogDisplay::Instance().ReleaseNativeResource(); - // release global shaders that have been allocazed - if (NULL != g_piDefaultEffect) - { - g_piDefaultEffect->Release(); - g_piDefaultEffect = NULL; - } - if (NULL != g_piNormalsEffect) - { - g_piNormalsEffect->Release(); - g_piNormalsEffect = NULL; - } - if (NULL != g_piPassThroughEffect) - { - g_piPassThroughEffect->Release(); - g_piPassThroughEffect = NULL; - } - if (NULL != g_piPatternEffect) - { - g_piPatternEffect->Release(); - g_piPatternEffect = NULL; - } - if (NULL != g_pcTexture) - { - g_pcTexture->Release(); - g_pcTexture = NULL; - } - - if( NULL != gDefaultVertexDecl) - { - gDefaultVertexDecl->Release(); - gDefaultVertexDecl = NULL; - } + // release global shaders that have been allocated + SafeRelease(g_piDefaultEffect); + SafeRelease(g_piNormalsEffect); + SafeRelease(g_piPassThroughEffect); + SafeRelease(g_piPatternEffect); + SafeRelease(g_pcTexture); + SafeRelease(gDefaultVertexDecl); // delete the main D3D device object - if (NULL != g_piDevice) - { - g_piDevice->Release(); - g_piDevice = NULL; - } + SafeRelease(g_piDevice); // deleted the one channel image allocated to hold the HUD mask delete[] g_szImageMask; - g_szImageMask = NULL; + g_szImageMask = nullptr; return 1; } From 8ac1de3287851d04d6a4cf03fac0a080149ad5bc Mon Sep 17 00:00:00 2001 From: kim kulling Date: Tue, 23 Jan 2018 15:12:57 +0100 Subject: [PATCH 007/106] closes https://github.com/assimp/assimp/issues/1390: aiScene now stores metadata as well. --- code/Version.cpp | 18 +++++++++++------- include/assimp/scene.h | 10 ++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/code/Version.cpp b/code/Version.cpp index eb4cab417..a9ecb6a3a 100644 --- a/code/Version.cpp +++ b/code/Version.cpp @@ -118,19 +118,20 @@ ASSIMP_API const char *aiGetBranchName() { // ------------------------------------------------------------------------------------------------ ASSIMP_API aiScene::aiScene() : mFlags(0) -, mRootNode(NULL) +, mRootNode(nullptr) , mNumMeshes(0) -, mMeshes(NULL) +, mMeshes(nullptr) , mNumMaterials(0) -, mMaterials(NULL) +, mMaterials(nullptr) , mNumAnimations(0) -, mAnimations(NULL) +, mAnimations(nullptr) , mNumTextures(0) -, mTextures(NULL) +, mTextures(nullptr) , mNumLights(0) -, mLights(NULL) +, mLights(nullptr) , mNumCameras(0) -, mCameras(NULL) +, mCameras(nullptr) +, mMetaData(nullptr) , mPrivate(new Assimp::ScenePrivateData()) { // empty } @@ -173,6 +174,9 @@ ASSIMP_API aiScene::~aiScene() { delete mCameras[a]; delete [] mCameras; + aiMetadata::Dealloc(mMetaData); + mMetaData = nullptr; + delete static_cast( mPrivate ); } diff --git a/include/assimp/scene.h b/include/assimp/scene.h index 00fa42142..82b38797e 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -326,6 +326,16 @@ struct aiScene */ C_STRUCT aiCamera** mCameras; + /** + * @brief The global metadata assigned to the scene itself. + * + * This data contains global metadata which belongs to the scene like + * unit-conversions, versions, vendors or other model-specific data. This + * can be used to store format-specific metadata as well. + */ + C_STRUCT aiMetadata* mMetaData; + + #ifdef __cplusplus //! Default constructor - set everything to 0/NULL From 88a0bb1b6da96e8f0036924350e27d6f24af19ce Mon Sep 17 00:00:00 2001 From: kim kulling Date: Tue, 23 Jan 2018 15:13:23 +0100 Subject: [PATCH 008/106] FBX: store UnitScaleFactor for fbx-files. --- code/FBXConverter.cpp | 385 +------------------------- code/FBXConverter.h | 382 +++++++++++++++++++++++++ code/FBXDocument.cpp | 5 +- code/FBXDocument.h | 3 +- code/FBXImporter.cpp | 3 +- code/FBXParser.h | 3 - test/models/OBJ/spider_nomtl_test.obj | 130 ++++----- test/models/PLY/cube_test.ply | 2 +- test/unit/utFBXImporterExporter.cpp | 12 + 9 files changed, 479 insertions(+), 446 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index f7a58ebdc..9b39c2883 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -66,7 +66,6 @@ namespace FBX { using namespace Util; - #define MAGIC_NODE_TAG "_$AssimpFbx$" #define CONVERT_FBX_TIME(time) static_cast(time) / 46186158000L @@ -74,373 +73,6 @@ using namespace Util; // XXX vc9's debugger won't step into anonymous namespaces //namespace { -/** Dummy class to encapsulate the conversion process */ -class Converter -{ -public: - /** - * The different parts that make up the final local transformation of a fbx-node - */ - enum TransformationComp - { - TransformationComp_Translation = 0, - TransformationComp_RotationOffset, - TransformationComp_RotationPivot, - TransformationComp_PreRotation, - TransformationComp_Rotation, - TransformationComp_PostRotation, - TransformationComp_RotationPivotInverse, - TransformationComp_ScalingOffset, - TransformationComp_ScalingPivot, - TransformationComp_Scaling, - TransformationComp_ScalingPivotInverse, - TransformationComp_GeometricTranslation, - TransformationComp_GeometricRotation, - TransformationComp_GeometricScaling, - - TransformationComp_MAXIMUM - }; - -public: - Converter( aiScene* out, const Document& doc ); - ~Converter(); - -private: - // ------------------------------------------------------------------------------------------------ - // find scene root and trigger recursive scene conversion - void ConvertRootNode(); - - // ------------------------------------------------------------------------------------------------ - // collect and assign child nodes - void ConvertNodes( uint64_t id, aiNode& parent, const aiMatrix4x4& parent_transform = aiMatrix4x4() ); - - // ------------------------------------------------------------------------------------------------ - void ConvertLights( const Model& model ); - - // ------------------------------------------------------------------------------------------------ - void ConvertCameras( const Model& model ); - - // ------------------------------------------------------------------------------------------------ - void ConvertLight( const Model& model, const Light& light ); - - // ------------------------------------------------------------------------------------------------ - void ConvertCamera( const Model& model, const Camera& cam ); - - // ------------------------------------------------------------------------------------------------ - // this returns unified names usable within assimp identifiers (i.e. no space characters - - // while these would be allowed, they are a potential trouble spot so better not use them). - const char* NameTransformationComp( TransformationComp comp ); - - // ------------------------------------------------------------------------------------------------ - // note: this returns the REAL fbx property names - const char* NameTransformationCompProperty( TransformationComp comp ); - - // ------------------------------------------------------------------------------------------------ - aiVector3D TransformationCompDefaultValue( TransformationComp comp ); - - // ------------------------------------------------------------------------------------------------ - void GetRotationMatrix( Model::RotOrder mode, const aiVector3D& rotation, aiMatrix4x4& out ); - // ------------------------------------------------------------------------------------------------ - /** - * checks if a node has more than just scaling, rotation and translation components - */ - bool NeedsComplexTransformationChain( const Model& model ); - - // ------------------------------------------------------------------------------------------------ - // note: name must be a FixNodeName() result - std::string NameTransformationChainNode( const std::string& name, TransformationComp comp ); - - // ------------------------------------------------------------------------------------------------ - /** - * note: memory for output_nodes will be managed by the caller - */ - void GenerateTransformationNodeChain( const Model& model, std::vector& output_nodes ); - - // ------------------------------------------------------------------------------------------------ - void SetupNodeMetadata( const Model& model, aiNode& nd ); - - // ------------------------------------------------------------------------------------------------ - void ConvertModel( const Model& model, aiNode& nd, const aiMatrix4x4& node_global_transform ); - - // ------------------------------------------------------------------------------------------------ - // MeshGeometry -> aiMesh, return mesh index + 1 or 0 if the conversion failed - std::vector ConvertMesh( const MeshGeometry& mesh, const Model& model, - const aiMatrix4x4& node_global_transform ); - - // ------------------------------------------------------------------------------------------------ - aiMesh* SetupEmptyMesh( const MeshGeometry& mesh ); - - // ------------------------------------------------------------------------------------------------ - unsigned int ConvertMeshSingleMaterial( const MeshGeometry& mesh, const Model& model, - const aiMatrix4x4& node_global_transform ); - - // ------------------------------------------------------------------------------------------------ - std::vector ConvertMeshMultiMaterial( const MeshGeometry& mesh, const Model& model, - const aiMatrix4x4& node_global_transform ); - - // ------------------------------------------------------------------------------------------------ - unsigned int ConvertMeshMultiMaterial( const MeshGeometry& mesh, const Model& model, - MatIndexArray::value_type index, - const aiMatrix4x4& node_global_transform ); - - // ------------------------------------------------------------------------------------------------ - static const unsigned int NO_MATERIAL_SEPARATION = /* std::numeric_limits::max() */ - static_cast(-1); - - // ------------------------------------------------------------------------------------------------ - /** - * - if materialIndex == NO_MATERIAL_SEPARATION, materials are not taken into - * account when determining which weights to include. - * - outputVertStartIndices is only used when a material index is specified, it gives for - * each output vertex the DOM index it maps to. - */ - void ConvertWeights( aiMesh* out, const Model& model, const MeshGeometry& geo, - const aiMatrix4x4& node_global_transform = aiMatrix4x4(), - unsigned int materialIndex = NO_MATERIAL_SEPARATION, - std::vector* outputVertStartIndices = NULL ); - - // ------------------------------------------------------------------------------------------------ - void ConvertCluster( std::vector& bones, const Model& /*model*/, const Cluster& cl, - std::vector& out_indices, - std::vector& index_out_indices, - std::vector& count_out_indices, - const aiMatrix4x4& node_global_transform ); - - // ------------------------------------------------------------------------------------------------ - void ConvertMaterialForMesh( aiMesh* out, const Model& model, const MeshGeometry& geo, - MatIndexArray::value_type materialIndex ); - - // ------------------------------------------------------------------------------------------------ - unsigned int GetDefaultMaterial(); - - - // ------------------------------------------------------------------------------------------------ - // Material -> aiMaterial - unsigned int ConvertMaterial( const Material& material, const MeshGeometry* const mesh ); - - // ------------------------------------------------------------------------------------------------ - // Video -> aiTexture - unsigned int ConvertVideo( const Video& video ); - - // ------------------------------------------------------------------------------------------------ - void TrySetTextureProperties( aiMaterial* out_mat, const TextureMap& textures, - const std::string& propName, - aiTextureType target, const MeshGeometry* const mesh ); - - // ------------------------------------------------------------------------------------------------ - void TrySetTextureProperties( aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, - const std::string& propName, - aiTextureType target, const MeshGeometry* const mesh ); - - // ------------------------------------------------------------------------------------------------ - void SetTextureProperties( aiMaterial* out_mat, const TextureMap& textures, const MeshGeometry* const mesh ); - - // ------------------------------------------------------------------------------------------------ - void SetTextureProperties( aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, const MeshGeometry* const mesh ); - - // ------------------------------------------------------------------------------------------------ - aiColor3D GetColorPropertyFromMaterial( const PropertyTable& props, const std::string& baseName, - bool& result ); - aiColor3D GetColorPropertyFactored( const PropertyTable& props, const std::string& colorName, - const std::string& factorName, bool& result, bool useTemplate=true ); - aiColor3D GetColorProperty( const PropertyTable& props, const std::string& colorName, - bool& result, bool useTemplate=true ); - - // ------------------------------------------------------------------------------------------------ - void SetShadingPropertiesCommon( aiMaterial* out_mat, const PropertyTable& props ); - - // ------------------------------------------------------------------------------------------------ - // get the number of fps for a FrameRate enumerated value - static double FrameRateToDouble( FileGlobalSettings::FrameRate fp, double customFPSVal = -1.0 ); - - // ------------------------------------------------------------------------------------------------ - // convert animation data to aiAnimation et al - void ConvertAnimations(); - - // ------------------------------------------------------------------------------------------------ - // rename a node already partially converted. fixed_name is a string previously returned by - // FixNodeName, new_name specifies the string FixNodeName should return on all further invocations - // which would previously have returned the old value. - // - // this also updates names in node animations, cameras and light sources and is thus slow. - // - // NOTE: the caller is responsible for ensuring that the new name is unique and does - // not collide with any other identifiers. The best way to ensure this is to only - // append to the old name, which is guaranteed to match these requirements. - void RenameNode( const std::string& fixed_name, const std::string& new_name ); - - // ------------------------------------------------------------------------------------------------ - // takes a fbx node name and returns the identifier to be used in the assimp output scene. - // the function is guaranteed to provide consistent results over multiple invocations - // UNLESS RenameNode() is called for a particular node name. - std::string FixNodeName( const std::string& name ); - - typedef std::map LayerMap; - - // XXX: better use multi_map .. - typedef std::map > NodeMap; - - - // ------------------------------------------------------------------------------------------------ - void ConvertAnimationStack( const AnimationStack& st ); - - // ------------------------------------------------------------------------------------------------ - void GenerateNodeAnimations( std::vector& node_anims, - const std::string& fixed_name, - const std::vector& curves, - const LayerMap& layer_map, - int64_t start, int64_t stop, - double& max_time, - double& min_time ); - - // ------------------------------------------------------------------------------------------------ - bool IsRedundantAnimationData( const Model& target, - TransformationComp comp, - const std::vector& curves ); - - // ------------------------------------------------------------------------------------------------ - aiNodeAnim* GenerateRotationNodeAnim( const std::string& name, - const Model& target, - const std::vector& curves, - const LayerMap& layer_map, - int64_t start, int64_t stop, - double& max_time, - double& min_time ); - - // ------------------------------------------------------------------------------------------------ - aiNodeAnim* GenerateScalingNodeAnim( const std::string& name, - const Model& /*target*/, - const std::vector& curves, - const LayerMap& layer_map, - int64_t start, int64_t stop, - double& max_time, - double& min_time ); - - // ------------------------------------------------------------------------------------------------ - aiNodeAnim* GenerateTranslationNodeAnim( const std::string& name, - const Model& /*target*/, - const std::vector& curves, - const LayerMap& layer_map, - int64_t start, int64_t stop, - double& max_time, - double& min_time, - bool inverse = false ); - - // ------------------------------------------------------------------------------------------------ - // generate node anim, extracting only Rotation, Scaling and Translation from the given chain - aiNodeAnim* GenerateSimpleNodeAnim( const std::string& name, - const Model& target, - NodeMap::const_iterator chain[ TransformationComp_MAXIMUM ], - NodeMap::const_iterator iter_end, - const LayerMap& layer_map, - int64_t start, int64_t stop, - double& max_time, - double& min_time, - bool reverse_order = false ); - - // key (time), value, mapto (component index) - typedef std::tuple, std::shared_ptr, unsigned int > KeyFrameList; - typedef std::vector KeyFrameListList; - - // ------------------------------------------------------------------------------------------------ - KeyFrameListList GetKeyframeList( const std::vector& nodes, int64_t start, int64_t stop ); - - // ------------------------------------------------------------------------------------------------ - KeyTimeList GetKeyTimeList( const KeyFrameListList& inputs ); - - // ------------------------------------------------------------------------------------------------ - void InterpolateKeys( aiVectorKey* valOut, const KeyTimeList& keys, const KeyFrameListList& inputs, - const aiVector3D& def_value, - double& max_time, - double& min_time ); - - // ------------------------------------------------------------------------------------------------ - void InterpolateKeys( aiQuatKey* valOut, const KeyTimeList& keys, const KeyFrameListList& inputs, - const aiVector3D& def_value, - double& maxTime, - double& minTime, - Model::RotOrder order ); - - // ------------------------------------------------------------------------------------------------ - void ConvertTransformOrder_TRStoSRT( aiQuatKey* out_quat, aiVectorKey* out_scale, - aiVectorKey* out_translation, - const KeyFrameListList& scaling, - const KeyFrameListList& translation, - const KeyFrameListList& rotation, - const KeyTimeList& times, - double& maxTime, - double& minTime, - Model::RotOrder order, - const aiVector3D& def_scale, - const aiVector3D& def_translate, - const aiVector3D& def_rotation ); - - // ------------------------------------------------------------------------------------------------ - // euler xyz -> quat - aiQuaternion EulerToQuaternion( const aiVector3D& rot, Model::RotOrder order ); - - // ------------------------------------------------------------------------------------------------ - void ConvertScaleKeys( aiNodeAnim* na, const std::vector& nodes, const LayerMap& /*layers*/, - int64_t start, int64_t stop, - double& maxTime, - double& minTime ); - - // ------------------------------------------------------------------------------------------------ - void ConvertTranslationKeys( aiNodeAnim* na, const std::vector& nodes, - const LayerMap& /*layers*/, - int64_t start, int64_t stop, - double& maxTime, - double& minTime ); - - // ------------------------------------------------------------------------------------------------ - void ConvertRotationKeys( aiNodeAnim* na, const std::vector& nodes, - const LayerMap& /*layers*/, - int64_t start, int64_t stop, - double& maxTime, - double& minTime, - Model::RotOrder order ); - - // ------------------------------------------------------------------------------------------------ - // copy generated meshes, animations, lights, cameras and textures to the output scene - void TransferDataToScene(); - -private: - - // 0: not assigned yet, others: index is value - 1 - unsigned int defaultMaterialIndex; - - std::vector meshes; - std::vector materials; - std::vector animations; - std::vector lights; - std::vector cameras; - std::vector textures; - - typedef std::map MaterialMap; - MaterialMap materials_converted; - - typedef std::map VideoMap; - VideoMap textures_converted; - - typedef std::map > MeshMap; - MeshMap meshes_converted; - - // fixed node name -> which trafo chain components have animations? - typedef std::map NodeAnimBitMap; - NodeAnimBitMap node_anim_chain_bits; - - // name -> has had its prefix_stripped? - typedef std::map NodeNameMap; - NodeNameMap node_names; - - typedef std::map NameNameMap; - NameNameMap renamed_nodes; - - double anim_fps; - - aiScene* const out; - const FBX::Document& doc; -}; Converter::Converter( aiScene* out, const Document& doc ) : defaultMaterialIndex() @@ -472,6 +104,7 @@ Converter::Converter( aiScene* out, const Document& doc ) } } + ConvertGlobalSettings(); TransferDataToScene(); // if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE @@ -3341,8 +2974,20 @@ void Converter::ConvertRotationKeys( aiNodeAnim* na, const std::vectormNumRotationKeys = static_cast( keys.size() ); na->mRotationKeys = new aiQuatKey[ keys.size() ]; - if ( keys.size() > 0 ) - InterpolateKeys( na->mRotationKeys, keys, inputs, aiVector3D( 0.0f, 0.0f, 0.0f ), maxTime, minTime, order ); + if (!keys.empty()) { + InterpolateKeys(na->mRotationKeys, keys, inputs, aiVector3D(0.0f, 0.0f, 0.0f), maxTime, minTime, order); + } +} + +void Converter::ConvertGlobalSettings() { + if (nullptr == out) { + return; + } + + out->mMetaData = aiMetadata::Alloc(1); + unsigned int index(0); + const double unitScalFactor(doc.GlobalSettings().UnitScaleFactor()); + out->mMetaData->Set(index, "UnitScaleFactor", unitScalFactor); } void Converter::TransferDataToScene() diff --git a/code/FBXConverter.h b/code/FBXConverter.h index 8a62d8811..c6c413052 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -45,7 +45,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef INCLUDED_AI_FBX_CONVERTER_H #define INCLUDED_AI_FBX_CONVERTER_H +#include "FBXParser.h" +#include "FBXMeshGeometry.h" +#include "FBXDocument.h" +#include "FBXUtil.h" +#include "FBXProperties.h" +#include "FBXImporter.h" +#include +#include +#include +#include +#include +#include + struct aiScene; +struct aiNode; +struct aiMaterial; namespace Assimp { namespace FBX { @@ -59,6 +74,373 @@ class Document; */ void ConvertToAssimpScene(aiScene* out, const Document& doc); +/** Dummy class to encapsulate the conversion process */ +class Converter { +public: + /** + * The different parts that make up the final local transformation of a fbx-node + */ + enum TransformationComp { + TransformationComp_Translation = 0, + TransformationComp_RotationOffset, + TransformationComp_RotationPivot, + TransformationComp_PreRotation, + TransformationComp_Rotation, + TransformationComp_PostRotation, + TransformationComp_RotationPivotInverse, + TransformationComp_ScalingOffset, + TransformationComp_ScalingPivot, + TransformationComp_Scaling, + TransformationComp_ScalingPivotInverse, + TransformationComp_GeometricTranslation, + TransformationComp_GeometricRotation, + TransformationComp_GeometricScaling, + + TransformationComp_MAXIMUM + }; + +public: + Converter(aiScene* out, const Document& doc); + ~Converter(); + +private: + // ------------------------------------------------------------------------------------------------ + // find scene root and trigger recursive scene conversion + void ConvertRootNode(); + + // ------------------------------------------------------------------------------------------------ + // collect and assign child nodes + void ConvertNodes(uint64_t id, aiNode& parent, const aiMatrix4x4& parent_transform = aiMatrix4x4()); + + // ------------------------------------------------------------------------------------------------ + void ConvertLights(const Model& model); + + // ------------------------------------------------------------------------------------------------ + void ConvertCameras(const Model& model); + + // ------------------------------------------------------------------------------------------------ + void ConvertLight(const Model& model, const Light& light); + + // ------------------------------------------------------------------------------------------------ + void ConvertCamera(const Model& model, const Camera& cam); + + // ------------------------------------------------------------------------------------------------ + // this returns unified names usable within assimp identifiers (i.e. no space characters - + // while these would be allowed, they are a potential trouble spot so better not use them). + const char* NameTransformationComp(TransformationComp comp); + + // ------------------------------------------------------------------------------------------------ + // note: this returns the REAL fbx property names + const char* NameTransformationCompProperty(TransformationComp comp); + + // ------------------------------------------------------------------------------------------------ + aiVector3D TransformationCompDefaultValue(TransformationComp comp); + + // ------------------------------------------------------------------------------------------------ + void GetRotationMatrix(Model::RotOrder mode, const aiVector3D& rotation, aiMatrix4x4& out); + // ------------------------------------------------------------------------------------------------ + /** + * checks if a node has more than just scaling, rotation and translation components + */ + bool NeedsComplexTransformationChain(const Model& model); + + // ------------------------------------------------------------------------------------------------ + // note: name must be a FixNodeName() result + std::string NameTransformationChainNode(const std::string& name, TransformationComp comp); + + // ------------------------------------------------------------------------------------------------ + /** + * note: memory for output_nodes will be managed by the caller + */ + void GenerateTransformationNodeChain(const Model& model, std::vector& output_nodes); + + // ------------------------------------------------------------------------------------------------ + void SetupNodeMetadata(const Model& model, aiNode& nd); + + // ------------------------------------------------------------------------------------------------ + void ConvertModel(const Model& model, aiNode& nd, const aiMatrix4x4& node_global_transform); + + // ------------------------------------------------------------------------------------------------ + // MeshGeometry -> aiMesh, return mesh index + 1 or 0 if the conversion failed + std::vector ConvertMesh(const MeshGeometry& mesh, const Model& model, + const aiMatrix4x4& node_global_transform); + + // ------------------------------------------------------------------------------------------------ + aiMesh* SetupEmptyMesh(const MeshGeometry& mesh); + + // ------------------------------------------------------------------------------------------------ + unsigned int ConvertMeshSingleMaterial(const MeshGeometry& mesh, const Model& model, + const aiMatrix4x4& node_global_transform); + + // ------------------------------------------------------------------------------------------------ + std::vector ConvertMeshMultiMaterial(const MeshGeometry& mesh, const Model& model, + const aiMatrix4x4& node_global_transform); + + // ------------------------------------------------------------------------------------------------ + unsigned int ConvertMeshMultiMaterial(const MeshGeometry& mesh, const Model& model, + MatIndexArray::value_type index, + const aiMatrix4x4& node_global_transform); + + // ------------------------------------------------------------------------------------------------ + static const unsigned int NO_MATERIAL_SEPARATION = /* std::numeric_limits::max() */ + static_cast(-1); + + // ------------------------------------------------------------------------------------------------ + /** + * - if materialIndex == NO_MATERIAL_SEPARATION, materials are not taken into + * account when determining which weights to include. + * - outputVertStartIndices is only used when a material index is specified, it gives for + * each output vertex the DOM index it maps to. + */ + void ConvertWeights(aiMesh* out, const Model& model, const MeshGeometry& geo, + const aiMatrix4x4& node_global_transform = aiMatrix4x4(), + unsigned int materialIndex = NO_MATERIAL_SEPARATION, + std::vector* outputVertStartIndices = NULL); + + // ------------------------------------------------------------------------------------------------ + void ConvertCluster(std::vector& bones, const Model& /*model*/, const Cluster& cl, + std::vector& out_indices, + std::vector& index_out_indices, + std::vector& count_out_indices, + const aiMatrix4x4& node_global_transform); + + // ------------------------------------------------------------------------------------------------ + void ConvertMaterialForMesh(aiMesh* out, const Model& model, const MeshGeometry& geo, + MatIndexArray::value_type materialIndex); + + // ------------------------------------------------------------------------------------------------ + unsigned int GetDefaultMaterial(); + + // ------------------------------------------------------------------------------------------------ + // Material -> aiMaterial + unsigned int ConvertMaterial(const Material& material, const MeshGeometry* const mesh); + + // ------------------------------------------------------------------------------------------------ + // Video -> aiTexture + unsigned int ConvertVideo(const Video& video); + + // ------------------------------------------------------------------------------------------------ + void TrySetTextureProperties(aiMaterial* out_mat, const TextureMap& textures, + const std::string& propName, + aiTextureType target, const MeshGeometry* const mesh); + + // ------------------------------------------------------------------------------------------------ + void TrySetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, + const std::string& propName, + aiTextureType target, const MeshGeometry* const mesh); + + // ------------------------------------------------------------------------------------------------ + void SetTextureProperties(aiMaterial* out_mat, const TextureMap& textures, const MeshGeometry* const mesh); + + // ------------------------------------------------------------------------------------------------ + void SetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, const MeshGeometry* const mesh); + + // ------------------------------------------------------------------------------------------------ + aiColor3D GetColorPropertyFromMaterial(const PropertyTable& props, const std::string& baseName, + bool& result); + aiColor3D GetColorPropertyFactored(const PropertyTable& props, const std::string& colorName, + const std::string& factorName, bool& result, bool useTemplate = true); + aiColor3D GetColorProperty(const PropertyTable& props, const std::string& colorName, + bool& result, bool useTemplate = true); + + // ------------------------------------------------------------------------------------------------ + void SetShadingPropertiesCommon(aiMaterial* out_mat, const PropertyTable& props); + + // ------------------------------------------------------------------------------------------------ + // get the number of fps for a FrameRate enumerated value + static double FrameRateToDouble(FileGlobalSettings::FrameRate fp, double customFPSVal = -1.0); + + // ------------------------------------------------------------------------------------------------ + // convert animation data to aiAnimation et al + void ConvertAnimations(); + + // ------------------------------------------------------------------------------------------------ + // rename a node already partially converted. fixed_name is a string previously returned by + // FixNodeName, new_name specifies the string FixNodeName should return on all further invocations + // which would previously have returned the old value. + // + // this also updates names in node animations, cameras and light sources and is thus slow. + // + // NOTE: the caller is responsible for ensuring that the new name is unique and does + // not collide with any other identifiers. The best way to ensure this is to only + // append to the old name, which is guaranteed to match these requirements. + void RenameNode(const std::string& fixed_name, const std::string& new_name); + + // ------------------------------------------------------------------------------------------------ + // takes a fbx node name and returns the identifier to be used in the assimp output scene. + // the function is guaranteed to provide consistent results over multiple invocations + // UNLESS RenameNode() is called for a particular node name. + std::string FixNodeName(const std::string& name); + + typedef std::map LayerMap; + + // XXX: better use multi_map .. + typedef std::map > NodeMap; + + + // ------------------------------------------------------------------------------------------------ + void ConvertAnimationStack(const AnimationStack& st); + + // ------------------------------------------------------------------------------------------------ + void GenerateNodeAnimations(std::vector& node_anims, + const std::string& fixed_name, + const std::vector& curves, + const LayerMap& layer_map, + int64_t start, int64_t stop, + double& max_time, + double& min_time); + + // ------------------------------------------------------------------------------------------------ + bool IsRedundantAnimationData(const Model& target, + TransformationComp comp, + const std::vector& curves); + + // ------------------------------------------------------------------------------------------------ + aiNodeAnim* GenerateRotationNodeAnim(const std::string& name, + const Model& target, + const std::vector& curves, + const LayerMap& layer_map, + int64_t start, int64_t stop, + double& max_time, + double& min_time); + + // ------------------------------------------------------------------------------------------------ + aiNodeAnim* GenerateScalingNodeAnim(const std::string& name, + const Model& /*target*/, + const std::vector& curves, + const LayerMap& layer_map, + int64_t start, int64_t stop, + double& max_time, + double& min_time); + + // ------------------------------------------------------------------------------------------------ + aiNodeAnim* GenerateTranslationNodeAnim(const std::string& name, + const Model& /*target*/, + const std::vector& curves, + const LayerMap& layer_map, + int64_t start, int64_t stop, + double& max_time, + double& min_time, + bool inverse = false); + + // ------------------------------------------------------------------------------------------------ + // generate node anim, extracting only Rotation, Scaling and Translation from the given chain + aiNodeAnim* GenerateSimpleNodeAnim(const std::string& name, + const Model& target, + NodeMap::const_iterator chain[TransformationComp_MAXIMUM], + NodeMap::const_iterator iter_end, + const LayerMap& layer_map, + int64_t start, int64_t stop, + double& max_time, + double& min_time, + bool reverse_order = false); + + // key (time), value, mapto (component index) + typedef std::tuple, std::shared_ptr, unsigned int > KeyFrameList; + typedef std::vector KeyFrameListList; + + // ------------------------------------------------------------------------------------------------ + KeyFrameListList GetKeyframeList(const std::vector& nodes, int64_t start, int64_t stop); + + // ------------------------------------------------------------------------------------------------ + KeyTimeList GetKeyTimeList(const KeyFrameListList& inputs); + + // ------------------------------------------------------------------------------------------------ + void InterpolateKeys(aiVectorKey* valOut, const KeyTimeList& keys, const KeyFrameListList& inputs, + const aiVector3D& def_value, + double& max_time, + double& min_time); + + // ------------------------------------------------------------------------------------------------ + void InterpolateKeys(aiQuatKey* valOut, const KeyTimeList& keys, const KeyFrameListList& inputs, + const aiVector3D& def_value, + double& maxTime, + double& minTime, + Model::RotOrder order); + + // ------------------------------------------------------------------------------------------------ + void ConvertTransformOrder_TRStoSRT(aiQuatKey* out_quat, aiVectorKey* out_scale, + aiVectorKey* out_translation, + const KeyFrameListList& scaling, + const KeyFrameListList& translation, + const KeyFrameListList& rotation, + const KeyTimeList& times, + double& maxTime, + double& minTime, + Model::RotOrder order, + const aiVector3D& def_scale, + const aiVector3D& def_translate, + const aiVector3D& def_rotation); + + // ------------------------------------------------------------------------------------------------ + // euler xyz -> quat + aiQuaternion EulerToQuaternion(const aiVector3D& rot, Model::RotOrder order); + + // ------------------------------------------------------------------------------------------------ + void ConvertScaleKeys(aiNodeAnim* na, const std::vector& nodes, const LayerMap& /*layers*/, + int64_t start, int64_t stop, + double& maxTime, + double& minTime); + + // ------------------------------------------------------------------------------------------------ + void ConvertTranslationKeys(aiNodeAnim* na, const std::vector& nodes, + const LayerMap& /*layers*/, + int64_t start, int64_t stop, + double& maxTime, + double& minTime); + + // ------------------------------------------------------------------------------------------------ + void ConvertRotationKeys(aiNodeAnim* na, const std::vector& nodes, + const LayerMap& /*layers*/, + int64_t start, int64_t stop, + double& maxTime, + double& minTime, + Model::RotOrder order); + + void ConvertGlobalSettings(); + + // ------------------------------------------------------------------------------------------------ + // copy generated meshes, animations, lights, cameras and textures to the output scene + void TransferDataToScene(); + +private: + + // 0: not assigned yet, others: index is value - 1 + unsigned int defaultMaterialIndex; + + std::vector meshes; + std::vector materials; + std::vector animations; + std::vector lights; + std::vector cameras; + std::vector textures; + + typedef std::map MaterialMap; + MaterialMap materials_converted; + + typedef std::map VideoMap; + VideoMap textures_converted; + + typedef std::map > MeshMap; + MeshMap meshes_converted; + + // fixed node name -> which trafo chain components have animations? + typedef std::map NodeAnimBitMap; + NodeAnimBitMap node_anim_chain_bits; + + // name -> has had its prefix_stripped? + typedef std::map NodeNameMap; + NodeNameMap node_names; + + typedef std::map NameNameMap; + NameNameMap renamed_nodes; + + double anim_fps; + + aiScene* const out; + const FBX::Document& doc; +}; + } } diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index 54f18b191..20c875ca1 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -344,9 +344,8 @@ void Document::ReadGlobalSettings() { const Scope& sc = parser.GetRootScope(); const Element* const ehead = sc["GlobalSettings"]; - if(!ehead || !ehead->Compound()) { - DOMWarning("no GlobalSettings dictionary found"); - + if ( nullptr == ehead || !ehead->Compound() ) { + DOMWarning( "no GlobalSettings dictionary found" ); globals.reset(new FileGlobalSettings(*this, std::make_shared())); return; } diff --git a/code/FBXDocument.h b/code/FBXDocument.h index a4e28b2aa..2b8157249 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -999,8 +999,7 @@ typedef std::multimap ConnectionMap; /** DOM class for global document settings, a single instance per document can * be accessed via Document.Globals(). */ -class FileGlobalSettings -{ +class FileGlobalSettings { public: FileGlobalSettings(const Document& doc, std::shared_ptr props); ~FileGlobalSettings(); diff --git a/code/FBXImporter.cpp b/code/FBXImporter.cpp index 566bc992f..f2231b805 100644 --- a/code/FBXImporter.cpp +++ b/code/FBXImporter.cpp @@ -140,8 +140,7 @@ void FBXImporter::SetupProperties(const Importer* pImp) // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void FBXImporter::InternReadFile( const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) +void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { std::unique_ptr stream(pIOHandler->Open(pFile,"rb")); if (!stream) { diff --git a/code/FBXParser.h b/code/FBXParser.h index c7cf5a458..996c86fcf 100644 --- a/code/FBXParser.h +++ b/code/FBXParser.h @@ -174,11 +174,9 @@ private: friend class Element; TokenPtr AdvanceToNextToken(); - TokenPtr LastToken() const; TokenPtr CurrentToken() const; - private: const TokenList& tokens; @@ -199,7 +197,6 @@ int ParseTokenAsInt(const Token& t, const char*& err_out); int64_t ParseTokenAsInt64(const Token& t, const char*& err_out); std::string ParseTokenAsString(const Token& t, const char*& err_out); - /* wrapper around ParseTokenAsXXX() with DOMError handling */ uint64_t ParseTokenAsID(const Token& t); size_t ParseTokenAsDim(const Token& t); diff --git a/test/models/OBJ/spider_nomtl_test.obj b/test/models/OBJ/spider_nomtl_test.obj index 44e8ea591..8129fff29 100644 --- a/test/models/OBJ/spider_nomtl_test.obj +++ b/test/models/OBJ/spider_nomtl_test.obj @@ -1,5 +1,5 @@ # File produced by Open Asset Import Library (http://www.assimp.sf.net) -# (assimp v4.1.1712791017) +# (assimp v4.1.3023643559) # 722 vertex positions v 1.160378932952881 4.512683868408203 6.449167251586914 @@ -12,7 +12,7 @@ v -6.442715167999268 10.77740478515625 -0.5375289916992188 v -8.120363235473633 15.6844596862793 -10.5 v -0.8867700099945068 23.4237174987793 -4.342854022979736 v -0.8867700099945068 23.4237174987793 -16.65714454650879 -v 14.40229797363281 32.89186859130859 -26.41482543945312 +v 14.40229797363281 32.89186859130859 -26.41482543945313 v 12.95316505432129 36.87333679199219 -11.5 v 30.52731704711914 37.50395202636719 -2.733282089233398 v 30.52731704711914 37.50395202636719 -20.26671600341797 @@ -21,15 +21,15 @@ v 45.09496688842773 27.71094512939453 2.684845924377441 v 57.93621826171875 30.27653312683105 -11.5 v 54.50359344482422 5.934020042419434 -11.5 v 51.09176254272461 11.23489952087402 2.684845924377441 -v 45.09496688842773 27.71094512939453 -25.68484497070312 +v 45.09496688842773 27.71094512939453 -25.68484497070313 v 39.18625640869141 16.23099708557129 -35.63270568847656 -v 51.09176254272461 11.23489952087402 -25.68484497070312 +v 51.09176254272461 11.23489952087402 -25.68484497070313 v 27.52080917358398 27.08032608032227 -34.45156478881836 v 4.568314075469971 16.85711288452148 -26.6196174621582 v 1.160378932952881 4.512683868408203 -27.44916915893555 v 22.65617179870605 10.21453857421875 -39.86968994140625 v 7.838881015777588 -6.414187908172607 -26.6196174621582 -v 30.91004180908203 -12.4627857208252 -26.41482543945312 +v 30.91004180908203 -12.4627857208252 -26.41482543945313 v 37.22381591796875 0.4215309917926788 -34.45156478881836 v 46.22711181640625 -5.630886077880859 -20.26671600341797 v 32.35918426513672 -16.44425201416016 -11.5 @@ -70,11 +70,11 @@ v -18.8264045715332 5.435883045196533 -20.58309173583984 v -32.62586212158203 10.86018753051758 -28.47975921630859 v -41.85661315917969 -0.7548459768295288 -29.43077087402344 v -27.9502124786377 1.303017020225525 -23.0814208984375 -v -39.19473266601562 -9.356718063354492 -28.47975921630859 +v -39.19473266601563 -9.356718063354492 -28.47975921630859 v -31.49889755249023 -9.618716239929199 -16.87730979919434 v -22.99813652038574 -7.403382778167725 -20.58309173583984 v -49.71383666992188 -2.983590126037598 1.421121001243591 -v -39.19473266601562 -9.356718063354492 8.47976016998291 +v -39.19473266601563 -9.356718063354492 8.47976016998291 v -22.99813652038574 -7.403382778167725 0.5830910205841064 v -31.49889755249023 -9.618716239929199 -3.122689962387085 v -50.63702392578125 8.975393295288086 -10 @@ -93,15 +93,15 @@ v -55.4437255859375 28.01696014404297 -51.02064895629883 v -55.80507659912109 29.50034332275391 -50.36057662963867 v -56.41304779052734 27.51875305175781 -54.60213470458984 v -57.93299102783203 29.20790100097656 -55.03944778442383 -v -67.98501586914062 13.43557167053223 -79.02035522460938 +v -67.98501586914063 13.43557167053223 -79.02035522460938 v -69.89360046386719 14.10584259033203 -80.14413452148438 -v -81.67832183837891 -31.37918090820312 -101.2915573120117 +v -81.67832183837891 -31.37918090820313 -101.2915573120117 v -82.77850341796875 -29.84352111816406 -101.2665863037109 v -45.27461242675781 -1.921316027641296 -17.56256103515625 v -88.2349853515625 -39.3502311706543 -103.8660430908203 v -48.86238861083984 8.964324951171875 -36.15071487426758 v -56.92498016357422 29.82746124267578 -49.55580902099609 -v -60.01216888427734 29.56021118164062 -54.08668899536133 +v -60.01216888427734 29.56021118164063 -54.08668899536133 v -72.06874084472656 14.20652008056641 -79.36090087890625 v -83.47474670410156 -29.51860809326172 -100.4707794189453 v -48.11187744140625 -2.742969989776611 -19.29600143432617 @@ -110,12 +110,12 @@ v -50.95351028442383 7.973351955413818 -36.14510726928711 v -57.96013641357422 28.75201416015625 -49.21238708496094 v -61.08487701416016 28.31040191650391 -52.46125793457031 v -72.87251281738281 13.66179847717285 -77.26039123535156 -v -83.24275207519531 -30.64902877807617 -99.50344848632812 +v -83.24275207519531 -30.64902877807617 -99.50344848632813 v -48.33858871459961 -4.09240198135376 -22.38015365600586 v -87.97438049316406 -40.34838485717773 -103.3615341186523 v -51.84541320800781 6.477696895599365 -37.66901397705078 v -58.13103866577148 27.08382415771484 -49.58887100219727 -v -60.34334564208984 26.39956665039062 -51.38712310791016 +v -60.34334564208984 26.39956665039063 -51.38712310791016 v -71.69966125488281 12.8818302154541 -75.42439270019531 v -82.25722503662109 -32.38360595703125 -99.09293365478516 v -45.78402709960938 -4.953472137451172 -24.49265670776367 @@ -125,7 +125,7 @@ v -57.30899810791016 26.07907104492188 -50.40177917480469 v -58.34596252441406 25.26664733886719 -51.67315673828125 v -69.433349609375 12.45395088195801 -75.23539733886719 v -81.26026153564453 -33.41617965698242 -99.54843139648438 -v -42.37185668945312 -4.677759170532227 -24.04270935058594 +v -42.37185668945313 -4.677759170532227 -24.04270935058594 v -87.46121978759766 -40.53748321533203 -104.0717544555664 v -48.75384521484375 6.009276866912842 -40.42763137817383 v -56.11302947998047 26.49437713623047 -51.03896713256836 @@ -137,27 +137,27 @@ v -42.83802795410156 -1.822747945785522 -1.17337703704834 v -41.96012115478516 -3.15467095375061 1.817621946334839 v -92.29042816162109 -39.21158981323242 57.38248825073242 v -92.26210784912109 -39.83740234375 57.07994079589844 -v -91.95950317382812 -39.73274230957031 57.5407600402832 +v -91.95950317382813 -39.73274230957031 57.5407600402832 v -49.36812591552734 8.476757049560547 19.08589744567871 -v -49.19630432128906 7.804555892944336 21.29348754882812 +v -49.19630432128906 7.804555892944336 21.29348754882813 v -54.25469207763672 27.27288055419922 30.44888496398926 v -54.92575836181641 28.34239959716797 29.36605453491211 v -57.45500946044922 28.70623016357422 33.83551406860352 v -55.48647308349609 27.49809265136719 33.97690582275391 v -67.46834564208984 9.109057426452637 43.49641799926758 -v -69.61196136474609 9.454971313476562 44.29645156860352 +v -69.61196136474609 9.454971313476563 44.29645156860352 v -87.01417541503906 -30.51413726806641 52.42203521728516 v -85.97149658203125 -32.07468414306641 52.63847351074219 -v -45.98867797851562 -1.450130939483643 -2.535742998123169 -v -92.60006713867188 -39.16170501708984 56.99636840820312 +v -45.98867797851563 -1.450130939483643 -2.535742998123169 +v -92.60006713867188 -39.16170501708984 56.99636840820313 v -50.88497161865234 7.785149097442627 17.48099899291992 v -55.98342132568359 28.08773803710938 28.45757293701172 v -59.41564178466797 28.14698791503906 32.74097061157227 v -71.61580657958984 8.682785987854004 43.43437957763672 v -87.75607299804688 -30.29622077941895 51.63100051879883 -v -49.03958129882812 -2.317409992218018 -1.243530988693237 +v -49.03958129882813 -2.317409992218018 -1.243530988693237 v -92.65523529052734 -39.6205940246582 56.67316055297852 -v -52.60464477539062 6.250553131103516 17.68733215332031 +v -52.60464477539063 6.250553131103516 17.68733215332031 v -56.63124847412109 26.70069122314453 28.40756416320801 v -59.89194488525391 26.24149322509766 31.51743125915527 v -71.97093963623047 7.37397575378418 41.55935287475586 @@ -182,11 +182,11 @@ v -50.4989013671875 6.274747848510742 22.44142532348633 v -54.47554779052734 25.68461608886719 30.89064788818359 v -54.99231719970703 25.43232727050781 33.05861282348633 v -66.79914093017578 7.905498027801514 41.6367301940918 -v -85.4132080078125 -33.80271530151367 52.11734008789062 +v -85.4132080078125 -33.80271530151367 52.11734008789063 v -32.53578186035156 -3.15467095375061 -19.16253662109375 v -34.38373184204102 -1.822747945785522 -16.65216445922852 v -36.48015213012695 -3.096683979034424 -19.71685028076172 -v -43.38578033447266 -41.58316040039062 -95.21874237060547 +v -43.38578033447266 -41.58316040039063 -95.21874237060547 v -43.91326141357422 -41.58873748779297 -95.02735137939453 v -43.69423675537109 -41.06890106201172 -95.43450164794922 v -35.0989875793457 7.804555892944336 -38.97930526733398 @@ -199,7 +199,7 @@ v -39.32158660888672 4.109056949615479 -79.20964813232422 v -40.77798843383789 4.454970836639404 -80.97431182861328 v -40.8770866394043 -32.42660522460938 -89.88973236083984 v -41.6864128112793 -30.95858383178711 -90.76108551025391 -v -37.81033325195312 -1.450130939483643 -16.44955062866211 +v -37.81033325195313 -1.450130939483643 -16.44955062866211 v -44.16765594482422 -40.94609069824219 -95.34366607666016 v -38.46767044067383 7.785149097442627 -36.52191925048828 v -40.04683303833008 28.08773803710938 -50.77265167236328 @@ -209,7 +209,7 @@ v -42.73056793212891 -30.60493469238281 -90.66996002197266 v -40.23527908325195 -2.317409992218018 -18.70730972290039 v -44.44951629638672 -41.30718231201172 -95.01465606689453 v -39.85378265380859 6.250553131103516 -37.56044387817383 -v -40.63287734985352 26.70069122314453 -51.05325317382812 +v -40.63287734985352 26.70069122314453 -51.05325317382813 v -41.90177536010742 26.24149322509766 -55.37683486938477 v -44.18946838378906 2.373975992202759 -79.78339385986328 v -43.2232666015625 -31.63191223144531 -89.68506622314453 @@ -229,7 +229,7 @@ v -41.56508255004883 1.750601053237915 -76.60358428955078 v -41.76493453979492 -34.27718353271484 -88.11498260498047 v -33.65802383422852 -4.442947864532471 -22.09029006958008 v -43.47456359863281 -42.10161590576172 -94.85892486572266 -v -35.65310668945312 6.274747848510742 -40.62473678588867 +v -35.65310668945313 6.274747848510742 -40.62473678588867 v -37.52444076538086 25.68461608886719 -52.12581634521484 v -36.88800048828125 25.43232727050781 -54.26172637939453 v -39.6718864440918 2.905498027801514 -77.26450347900391 @@ -249,7 +249,7 @@ v -38.03726577758789 27.49446105957031 33.66647720336914 v -34.5403938293457 17.31492233276367 46.75900650024414 v -35.8452262878418 17.43609428405762 48.66624069213867 v -28.96659469604492 -31.87043952941895 66.61157989501953 -v -28.00870513916016 -33.48403930664062 66.39229583740234 +v -28.00870513916016 -33.48403930664063 66.39229583740234 v -37.94406127929688 -1.883904933929443 -4.875525951385498 v -29.19070816040039 -38.59844589233398 75.64435577392578 v -38.12530136108398 7.461886882781982 15.15559387207031 @@ -283,8 +283,8 @@ v -28.36112785339355 -39.7656364440918 75.63690948486328 v -34.68405532836914 6.534968852996826 18.94173622131348 v -38.70342254638672 25.53554534912109 30.5754222869873 v -37.81640243530273 25.43576812744141 32.63310623168945 -v -34.87471389770508 16.03384399414062 44.86114120483398 -v -27.90771293640137 -35.34060668945312 66.05712127685547 +v -34.87471389770508 16.03384399414063 44.86114120483398 +v -27.90771293640137 -35.34060668945313 66.05712127685547 v -26.45577621459961 -3.443838119506836 -2.149142980575562 v -26.46640014648438 -2.246160984039307 -5.887526988983154 v -23.49448394775391 -3.47288703918457 -4.813465118408203 @@ -300,26 +300,26 @@ v -10.52369499206543 27.51875305175781 29.59563827514648 v -0.9972569942474365 13.43557167053223 54.88214111328125 v -1.514698028564453 14.10584259033203 57.03571319580078 v 3.385565996170044 -29.84352111816406 80.76795196533203 -v 3.675970077514648 -31.37918090820312 79.70648956298828 +v 3.675970077514648 -31.37918090820313 79.70648956298828 v -29.43033599853516 -1.921316027641296 -4.146553039550781 v 4.587766170501709 -39.3502311706543 86.69120025634766 v -18.55141067504883 8.964324951171875 11.34670639038086 v -14.50934600830078 29.82746124267578 26.45841026306152 -v -13.3946418762207 29.56021118164062 31.82656478881836 +v -13.3946418762207 29.56021118164063 31.82656478881836 v -3.589093923568726 14.20652008056641 58.0562744140625 v 2.445001125335693 -29.51860809326172 81.25101470947266 -v -30.15432739257812 -2.742969989776611 -0.9014430046081543 +v -30.15432739257813 -2.742969989776611 -0.9014430046081543 v 4.197091102600098 -39.74774169921875 86.60486602783203 v -20.00806045532227 7.973351955413818 12.8470344543457 v -15.4754638671875 28.75201416015625 26.9644775390625 v -15.30904579162598 28.31040191650391 31.46907806396484 -v -5.658416748046875 13.66179847717285 57.17532348632812 +v -5.658416748046875 13.66179847717285 57.17532348632813 v 1.562493085861206 -30.64902877807617 80.79186248779297 v -28.0932731628418 -4.09240198135376 1.404078960418701 v 4.161306858062744 -40.34838485717773 86.31630706787109 v -19.53142166137695 6.477696895599365 14.54720878601074 v -15.32335662841797 27.08382415771484 27.34894752502441 -v -15.56659698486328 26.39956665039062 30.18951416015625 +v -15.56659698486328 26.39956665039063 30.18951416015625 v -6.164387226104736 12.8818302154541 55.05625915527344 v 1.402615070343018 -32.38360595703125 79.73628997802734 v -24.79911041259766 -4.953472137451172 1.033954977989197 @@ -338,7 +338,7 @@ v -2.426440954208374 12.70041084289551 53.21726226806641 v 3.097472906112671 -32.96916198730469 78.86588287353516 v -23.49448394775391 -3.47288703918457 -15.18653869628906 v -26.46640014648438 -2.246160984039307 -14.11247634887695 -v -26.45577621459961 -3.443838119506836 -17.85086059570312 +v -26.45577621459961 -3.443838119506836 -17.85086059570313 v 5.211228847503662 -39.9835319519043 -106.1982498168945 v 4.668338775634766 -40.01747512817383 -106.3362197875977 v 5.039107799530029 -39.45514678955078 -106.5102310180664 @@ -350,27 +350,27 @@ v -10.52369499206543 27.51875305175781 -49.59563446044922 v -11.26496505737305 29.20790100097656 -50.99276733398438 v -0.9972569942474365 13.43557167053223 -74.88213348388672 v -1.514698028564453 14.10584259033203 -77.03571319580078 -v 3.675970077514648 -31.37918090820312 -99.70648956298828 +v 3.675970077514648 -31.37918090820313 -99.70648956298828 v 3.38556694984436 -29.84352111816406 -100.767951965332 v -29.43033599853516 -1.921316027641296 -15.85345077514648 v 4.587764739990234 -39.3502311706543 -106.6912002563477 -v -18.55141067504883 8.964324951171875 -31.34671020507812 +v -18.55141067504883 8.964324951171875 -31.34671020507813 v -14.50934600830078 29.82746124267578 -46.45841217041016 -v -13.3946418762207 29.56021118164062 -51.82656097412109 +v -13.3946418762207 29.56021118164063 -51.82656097412109 v -3.589093923568726 14.20652008056641 -78.05626678466797 v 2.445001125335693 -29.51860809326172 -101.2510147094727 -v -30.15432739257812 -2.742969989776611 -19.09856033325195 +v -30.15432739257813 -2.742969989776611 -19.09856033325195 v 4.197090148925781 -39.74774169921875 -106.604866027832 v -20.00806045532227 7.973351955413818 -32.8470344543457 v -15.4754638671875 28.75201416015625 -46.9644775390625 v -15.30904579162598 28.31040191650391 -51.46907806396484 v -5.658416748046875 13.66179847717285 -77.17531585693359 v 1.562493085861206 -30.64902877807617 -100.791862487793 -v -28.0932731628418 -4.09240198135376 -21.40408325195312 +v -28.0932731628418 -4.09240198135376 -21.40408325195313 v 4.161307811737061 -40.34838485717773 -106.3163070678711 v -19.53142166137695 6.477696895599365 -34.54721069335938 v -15.32335662841797 27.08382415771484 -47.34894561767578 -v -15.56659698486328 26.39956665039062 -50.18951416015625 +v -15.56659698486328 26.39956665039063 -50.18951416015625 v -6.164387226104736 12.8818302154541 -75.05625152587891 v 1.402615070343018 -32.38360595703125 -99.73628997802734 v -24.79911041259766 -4.953472137451172 -21.03395843505859 @@ -391,14 +391,14 @@ v -14.25648880004883 -6.954940795898438 -3.301691055297852 v -14.10265731811523 -6.075778961181641 -7.124460220336914 v -11.2052116394043 -7.280231952667236 -5.841878890991211 v 19.74986457824707 -37.60753631591797 68.32992553710938 -v 19.34836387634277 -38.14849472045898 68.15628051757812 +v 19.34836387634277 -38.14849472045898 68.15628051757813 v 19.89711761474609 -38.15519714355469 68.03912353515625 v -4.907510757446289 6.093640804290771 10.12681770324707 v -2.877649068832397 5.517601013183594 11.07694053649902 v 1.745674014091492 26.13694000244141 21.00781440734863 v 0.4745520055294037 27.20939636230469 20.97971534729004 v 3.233434915542603 28.02400207519531 25.24942970275879 -v 4.282450199127197 26.64773559570312 23.71314430236816 +v 4.282450199127197 26.64773559570313 23.71314430236816 v 14.8602180480957 5.642467975616455 47.61897277832031 v 14.56025314331055 6.223588943481445 49.83868408203125 v 18.9760627746582 -28.07810020446777 62.27335357666016 @@ -432,28 +432,28 @@ v 1.932853937149048 23.20393180847168 23.79626274108887 v 11.57662582397461 3.190187931060791 46.84990692138672 v 17.50724792480469 -31.60873603820801 60.42989349365234 v -10.6054573059082 -8.239757537841797 -2.646497964859009 -v 19.63114547729492 -38.69778442382812 67.83663940429688 +v 19.63114547729492 -38.69778442382813 67.83663940429688 v -2.475620031356812 4.172726154327393 12.91663932800293 v 2.032040119171143 24.59943771362305 21.57402229309082 v 3.703634023666382 24.50261497497559 23.06640815734863 -v 13.53237915039062 4.292479038238525 46.28885650634766 +v 13.53237915039063 4.292479038238525 46.28885650634766 v 18.54694938659668 -31.23143768310547 60.44495391845703 v -12.53854370117188 -7.280231952667236 -13.491455078125 v -15.43598937988281 -6.075778961181641 -12.2088737487793 v -15.58982086181641 -6.954940795898438 -16.03164291381836 -v 18.56378555297852 -38.15519714355469 -87.37246704101562 +v 18.56378555297852 -38.15519714355469 -87.37246704101563 v 18.0150318145752 -38.14849472045898 -87.4896240234375 v 18.41653251647949 -37.60753631591797 -87.66326904296875 v -4.210980892181396 5.517601013183594 -30.41027450561523 v -6.240842819213867 6.093640804290771 -29.46015167236328 v 0.4123420119285583 26.13694000244141 -40.34114837646484 v -0.8587800264358521 27.20939636230469 -40.31304931640625 -v 2.949118137359619 26.64773559570312 -43.04647827148438 +v 2.949118137359619 26.64773559570313 -43.04647827148438 v 1.900102972984314 28.02400207519531 -44.582763671875 -v 13.52688598632812 5.642467975616455 -66.95231628417969 -v 13.22692108154297 6.223588943481445 -69.17202758789062 +v 13.52688598632813 5.642467975616455 -66.95231628417969 +v 13.22692108154297 6.223588943481445 -69.17202758789063 v 17.86732864379883 -29.66015243530273 -80.59872436523438 -v 17.64273071289062 -28.07810020446777 -81.60670471191406 +v 17.64273071289063 -28.07810020446777 -81.60670471191406 v -18.44928359985352 -5.533359050750732 -13.80491638183594 v 17.96691513061523 -37.46723175048828 -87.82330322265625 v -8.370006561279297 5.467060089111328 -30.11508178710938 @@ -469,7 +469,7 @@ v -1.290704965591431 25.68392181396484 -45.89799499511719 v 9.702729225158691 4.237391948699951 -70.18302917480469 v 15.76919937133789 -28.75799560546875 -81.57952880859375 v -17.36852645874023 -7.262344837188721 -19.56281280517578 -v 17.48766136169434 -38.44494247436523 -87.45840454101562 +v 17.48766136169434 -38.44494247436523 -87.45840454101563 v -7.645581245422363 3.043694019317627 -33.43013000488281 v -1.641402959823608 24.23861885070801 -41.86458587646484 v -1.029770016670227 23.72967147827148 -44.68647766113281 @@ -483,7 +483,7 @@ v 0.5995219945907593 23.20393180847168 -43.12960052490234 v 10.24329376220703 3.190187931060791 -66.18324279785156 v 16.17391586303711 -31.60873603820801 -79.76324462890625 v -11.93878936767578 -8.239757537841797 -16.68683624267578 -v 18.29781341552734 -38.69778442382812 -87.16998291015625 +v 18.29781341552734 -38.69778442382813 -87.16998291015625 v -3.808951854705811 4.172726154327393 -32.24997329711914 v 0.6987079977989197 24.59943771362305 -40.90735626220703 v 2.370301961898804 24.50261497497559 -42.39974212646484 @@ -517,7 +517,7 @@ v -51.75783920288086 11.98240089416504 0.8355600237846375 v -56.05172729492188 7.156466007232666 5.002277851104736 v -53.53396987915039 14.21004676818848 1.72101902961731 v -57.36484146118164 8.803488731384277 5.656900882720947 -v -56.62808227539062 15.23869514465332 0.7346760034561157 +v -56.62808227539063 15.23869514465332 0.7346760034561157 v -59.24757766723633 9.889246940612793 4.827473163604736 v -58.71025466918945 14.29374885559082 -1.380638957023621 v -60.28214263916016 9.596194267272949 3.138458967208862 @@ -554,7 +554,7 @@ v -40.64442825317383 21.88604164123535 -0.7607129812240601 v -44.44827651977539 21.88604164123535 2.546009063720703 v -53.9999885559082 20.33333778381348 0.4478580057621002 v -60.29326629638672 19.47619819641113 -2.199142932891846 -v -63.06387329101562 19.47619819641113 -6.810235023498535 +v -63.06387329101563 19.47619819641113 -6.810235023498535 v -64.39229583740234 20.33333778381348 -9.944446563720703 v -63.32090759277344 15.14286994934082 -6.139256000518799 v -62.36603164672852 15.39914894104004 -5.604844093322754 @@ -616,7 +616,7 @@ v -38.80768203735352 21.88604164123535 -9.988886833190918 v -44.44827651977539 21.88604164123535 -22.47934150695801 v -53.9999885559082 20.33333778381348 -20.38118934631348 v -60.29326629638672 19.47619819641113 -17.73418998718262 -v -63.06387329101562 19.47619819641113 -13.12309837341309 +v -63.06387329101563 19.47619819641113 -13.12309837341309 v -64.39229583740234 20.33333778381348 -9.988886833190918 v -62.33220672607422 15.06181526184082 -14.44650936126709 v -62.36603164672852 15.39914894104004 -14.32849025726318 @@ -648,7 +648,7 @@ v -64.66415405273438 4.277801990509033 -18.2394905090332 v -63.78934860229492 3.570785999298096 -16.48468399047852 v -62.37599182128906 11.21470260620117 -16.82923698425293 v -66.95527648925781 4.531181812286377 -18.78395462036133 -v -63.80926132202148 13.24985885620117 -14.86489868164062 +v -63.80926132202148 13.24985885620117 -14.86489868164063 v -68.93736267089844 4.140174865722656 -17.70805549621582 v -64.48637390136719 12.67211532592773 -12.25428771972656 v -69.1180419921875 3.399224042892456 -15.82198143005371 @@ -668,7 +668,7 @@ v -51.75783920288086 12.03694534301758 -19.50222587585449 v -56.05172729492188 7.211010932922363 -23.66894340515137 v -53.53396987915039 14.26459121704102 -20.38768196105957 v -57.36484146118164 8.858034133911133 -24.32356452941895 -v -56.62808227539062 15.29323959350586 -19.40134239196777 +v -56.62808227539063 15.29323959350586 -19.40134239196777 v -59.24757766723633 9.943792343139648 -23.49413871765137 v -58.71025466918945 14.34829330444336 -17.28602600097656 v -60.28214263916016 9.650739669799805 -21.80512428283691 @@ -677,13 +677,13 @@ v -58.74361419677734 17.51846694946289 -2.271703958511353 v -59.46704864501953 18.40674209594727 -2.53897500038147 v -60.63759613037109 18.10347366333008 -2.337920904159546 v -61.55588531494141 18.15423965454102 -3.37207293510437 -v -60.57522583007812 18.69086074829102 -3.431842088699341 +v -60.57522583007813 18.69086074829102 -3.431842088699341 v -61.64485168457031 18.26233291625977 -4.609260082244873 v -61.38417816162109 17.94110488891602 -5.717274188995361 v -61.48154449462891 16.98392105102539 -6.448155879974365 v -62.26735687255859 17.28479385375977 -5.621510982513428 v -62.61495971679688 16.49116897583008 -5.094202995300293 -v -62.20498657226562 16.13167190551758 -6.081917762756348 +v -62.20498657226563 16.13167190551758 -6.081917762756348 v -61.27806091308594 15.97928333282471 -6.500585079193115 v -62.26735687255859 15.54427146911621 -4.988009929656982 v -61.38417816162109 14.97993564605713 -4.639497756958008 @@ -691,7 +691,7 @@ v -61.48154449462891 15.24338626861572 -5.814656257629395 v -60.47430419921875 15.08453464508057 -3.54331111907959 v -61.64485168457031 15.44609451293945 -3.584233999252319 v -61.55588531494141 16.32414627075195 -2.705970048904419 -v -60.57522583007812 15.87463855743408 -2.406815052032471 +v -60.57522583007813 15.87463855743408 -2.406815052032471 v -59.56442260742188 15.70901966094971 -2.636348009109497 v -60.63759613037109 17.02777481079102 -1.946398019790649 v -59.46704864501953 16.66621780395508 -1.905473947525024 @@ -702,13 +702,13 @@ v -59.46704864501953 18.14007568359375 -17.19435882568359 v -58.74361419677734 17.25180053710938 -17.46162986755371 v -59.67054748535156 17.40419006347656 -17.88029861450195 v -60.63759613037109 17.83680725097656 -17.39541244506836 -v -60.57522583007812 18.4241943359375 -16.30149078369141 +v -60.57522583007813 18.4241943359375 -16.30149078369141 v -61.55588531494141 17.8875732421875 -16.36125946044922 v -61.64485168457031 17.99566650390625 -15.12407302856445 v -62.26735687255859 17.01812744140625 -14.1118221282959 v -61.48154449462891 16.71725463867188 -13.28517723083496 v -61.38417816162109 17.6744384765625 -14.01605987548828 -v -62.20498657226562 15.86500549316406 -13.65141487121582 +v -62.20498657226563 15.86500549316406 -13.65141487121582 v -62.61495971679688 16.22450256347656 -14.63912963867188 v -61.27806091308594 15.71261596679688 -13.23274803161621 v -62.26735687255859 15.27760314941406 -14.74532318115234 @@ -716,7 +716,7 @@ v -61.48154449462891 14.97671890258789 -13.91867828369141 v -61.38417816162109 14.7132682800293 -15.09383583068848 v -61.64485168457031 15.17942810058594 -16.14909934997559 v -60.47430419921875 14.81786727905273 -16.19002342224121 -v -60.57522583007812 15.60797119140625 -17.32651901245117 +v -60.57522583007813 15.60797119140625 -17.32651901245117 v -61.55588531494141 16.05747985839844 -17.02736282348633 v -59.56442260742188 15.44235229492188 -17.09698486328125 v -60.63759613037109 16.7611083984375 -17.78693389892578 @@ -1247,7 +1247,7 @@ vn -0.7882999777793884 -0.6091880202293396 -0.08644299954175949 vn -0.6353080272674561 -0.5868319869041443 0.5020080208778381 vn -0.7489200234413147 -0.3426479995250702 0.5671960115432739 vn -0.8290749788284302 -0.1998199969530106 0.5222129821777344 -vn -0.8114089965820312 -0.2435930073261261 0.5312989950180054 +vn -0.8114089965820313 -0.2435930073261261 0.5312989950180054 vn -0.02972600050270557 -0.7129759788513184 -0.7005580067634583 vn -0.1212550029158592 -0.8703849911689758 -0.4772070050239563 vn 0.1511760056018829 -0.9298509955406189 -0.3354449868202209 @@ -1536,7 +1536,7 @@ vn -0.3590719997882843 -0.2934069931507111 -0.8859909772872925 vn -0.5312150120735168 -0.1616500020027161 -0.8316730260848999 vn 0.5217099785804749 -0.3334519863128662 -0.7852569818496704 vn 0.4982230067253113 -0.5182129740715027 -0.6951469779014587 -vn 0.3192520141601562 -0.6669300198554993 -0.6732630133628845 +vn 0.3192520141601563 -0.6669300198554993 -0.6732630133628845 vn 0.4172089993953705 0.6029300093650818 -0.6800090074539185 vn -0.3909519910812378 -0.5063930153846741 -0.7685850262641907 vn -0.785847008228302 -0.2199160009622574 -0.5779989957809448 @@ -1593,7 +1593,7 @@ vn -0.8313949704170227 0.3698750138282776 0.414698988199234 vn -0.7773889899253845 0.439754992723465 0.4497570097446442 vn -0.7120980024337769 0.07437500357627869 0.6981300115585327 vn -0.5221620202064514 -0.5821250081062317 0.6232789754867554 -vn -0.5362930297851562 0.8426250219345093 0.04870999976992607 +vn -0.5362930297851563 0.8426250219345093 0.04870999976992607 vn -0.6278550028800964 0.7403159737586975 0.2402739971876144 vn -0.817995011806488 0.4767960011959076 0.3217920064926147 vn -0.7291709780693054 0.6557949781417847 0.1955550014972687 diff --git a/test/models/PLY/cube_test.ply b/test/models/PLY/cube_test.ply index e70217c42..8de33f3de 100644 --- a/test/models/PLY/cube_test.ply +++ b/test/models/PLY/cube_test.ply @@ -1,6 +1,6 @@ ply format ascii 1.0 -comment Created by Open Asset Import Library - http://assimp.sf.net (v4.1.1712791017) +comment Created by Open Asset Import Library - http://assimp.sf.net (v4.1.3023643559) element vertex 8 property float x property float y diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index d2415a8e5..56590f494 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -97,3 +97,15 @@ TEST_F( utFBXImporterExporter, importPhongMaterial ) { EXPECT_EQ( mat->Get(AI_MATKEY_OPACITY, f), aiReturn_SUCCESS ); EXPECT_EQ( f, 0.5 ); } + +TEST_F(utFBXImporterExporter, importUnitScaleFactor) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/spider.fbx", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); + EXPECT_NE(nullptr, scene->mMetaData); + + double factor(0.0); + scene->mMetaData->Get("UnitScaleFactor", factor); + EXPECT_DOUBLE_EQ(1.0, factor); +} From f80ed093f80c756e6d1399cd94af83453a0de4b3 Mon Sep 17 00:00:00 2001 From: kim kulling Date: Tue, 23 Jan 2018 15:13:49 +0100 Subject: [PATCH 009/106] remove test artifacts from repo. --- test/models/OBJ/spider_nomtl_test.obj | 3205 ------------------------- test/models/PLY/cube_test.ply | 24 - 2 files changed, 3229 deletions(-) delete mode 100644 test/models/OBJ/spider_nomtl_test.obj delete mode 100644 test/models/PLY/cube_test.ply diff --git a/test/models/OBJ/spider_nomtl_test.obj b/test/models/OBJ/spider_nomtl_test.obj deleted file mode 100644 index 8129fff29..000000000 --- a/test/models/OBJ/spider_nomtl_test.obj +++ /dev/null @@ -1,3205 +0,0 @@ -# File produced by Open Asset Import Library (http://www.assimp.sf.net) -# (assimp v4.1.3023643559) - -# 722 vertex positions -v 1.160378932952881 4.512683868408203 6.449167251586914 -v 22.65617179870605 10.21453857421875 16.86968994140625 -v 4.568314075469971 16.85711288452148 5.619616985321045 -v 14.40229797363281 32.89186859130859 3.414829015731812 -v 27.52080917358398 27.08032608032227 11.45156478881836 -v 39.18625640869141 16.23099708557129 12.6327018737793 -v -6.442715167999268 10.77740478515625 -0.5375289916992188 -v -8.120363235473633 15.6844596862793 -10.5 -v -0.8867700099945068 23.4237174987793 -4.342854022979736 -v -0.8867700099945068 23.4237174987793 -16.65714454650879 -v 14.40229797363281 32.89186859130859 -26.41482543945313 -v 12.95316505432129 36.87333679199219 -11.5 -v 30.52731704711914 37.50395202636719 -2.733282089233398 -v 30.52731704711914 37.50395202636719 -20.26671600341797 -v 44.30125045776367 33.96472930908203 -11.5 -v 45.09496688842773 27.71094512939453 2.684845924377441 -v 57.93621826171875 30.27653312683105 -11.5 -v 54.50359344482422 5.934020042419434 -11.5 -v 51.09176254272461 11.23489952087402 2.684845924377441 -v 45.09496688842773 27.71094512939453 -25.68484497070313 -v 39.18625640869141 16.23099708557129 -35.63270568847656 -v 51.09176254272461 11.23489952087402 -25.68484497070313 -v 27.52080917358398 27.08032608032227 -34.45156478881836 -v 4.568314075469971 16.85711288452148 -26.6196174621582 -v 1.160378932952881 4.512683868408203 -27.44916915893555 -v 22.65617179870605 10.21453857421875 -39.86968994140625 -v 7.838881015777588 -6.414187908172607 -26.6196174621582 -v 30.91004180908203 -12.4627857208252 -26.41482543945313 -v 37.22381591796875 0.4215309917926788 -34.45156478881836 -v 46.22711181640625 -5.630886077880859 -20.26671600341797 -v 32.35918426513672 -16.44425201416016 -11.5 -v 30.91004180908203 -12.4627857208252 3.414829015731812 -v 46.22711181640625 -5.630886077880859 -2.733282089233398 -v 4.405118942260742 -14.23004245758057 -16.65714454650879 -v -4.681486129760742 -8.784435272216797 -10.5 -v 4.405118942260742 -14.23004245758057 -4.342854022979736 -v -4.421391010284424 -3.605049133300781 -0.5375289916992188 -v 7.838881015777588 -6.414187908172607 5.619616985321045 -v 37.22381591796875 0.4215309917926788 11.45156478881836 -v -9.876476287841797 2.961555004119873 -10.5 -v -6.442715167999268 10.77740478515625 -20.46247100830078 -v -4.421391010284424 -3.605049133300781 -20.46247100830078 -v -41.85661315917969 -0.7548459768295288 9.430771827697754 -v -27.9502124786377 1.303017020225525 3.0814208984375 -v -32.62586212158203 10.86018753051758 8.47976016998291 -v -24.40152359008789 12.2247486114502 -3.122689962387085 -v -18.8264045715332 5.435883045196533 0.5830910205841064 -v -11.22126770019531 -4.132546901702881 1.127722024917603 -v -44.88201522827148 11.88719749450684 1.421121001243591 -v -44.84470367431641 15.22849273681641 -10 -v -35.57024002075195 16.59859085083008 -2.941359043121338 -v -35.57024002075195 16.59859085083008 -17.05864334106445 -v -24.40152359008789 12.2247486114502 -16.87730979919434 -v -23.77848243713379 14.14228057861328 -10 -v -8.432302474975586 6.445052146911621 -5.95761775970459 -v -8.432302474975586 6.445052146911621 -14.04238128662109 -v -1.337092995643616 1.108109951019287 -10 -v -3.30927300453186 -1.735224008560181 -0.5947030186653137 -v -0.4196679890155792 -7.642198085784912 -10 -v -6.305181980133057 -14.18209838867188 -10 -v -6.229438781738281 -10.72257518768311 -0.5947030186653137 -v -3.30927300453186 -1.735224008560181 -19.40529632568359 -v -11.22126770019531 -4.132546901702881 -21.12771987915039 -v -6.229438781738281 -10.72257518768311 -19.40529632568359 -v -18.8264045715332 5.435883045196533 -20.58309173583984 -v -32.62586212158203 10.86018753051758 -28.47975921630859 -v -41.85661315917969 -0.7548459768295288 -29.43077087402344 -v -27.9502124786377 1.303017020225525 -23.0814208984375 -v -39.19473266601563 -9.356718063354492 -28.47975921630859 -v -31.49889755249023 -9.618716239929199 -16.87730979919434 -v -22.99813652038574 -7.403382778167725 -20.58309173583984 -v -49.71383666992188 -2.983590126037598 1.421121001243591 -v -39.19473266601563 -9.356718063354492 8.47976016998291 -v -22.99813652038574 -7.403382778167725 0.5830910205841064 -v -31.49889755249023 -9.618716239929199 -3.122689962387085 -v -50.63702392578125 8.975393295288086 -10 -v -51.64759063720703 -5.708693981170654 -10 -v -44.88201522827148 11.88719749450684 -21.42111587524414 -v -49.71383666992188 -2.983590126037598 -21.42111587524414 -v -40.67147827148438 -3.47288703918457 -21.36916732788086 -v -41.96333312988281 -2.246160984039307 -18.48523330688477 -v -44.64511871337891 -3.443838119506836 -21.08979034423828 -v -87.6058349609375 -39.9835319519043 -104.3517227172852 -v -87.87104797363281 -40.01747512817383 -103.8583068847656 -v -87.9501953125 -39.45514678955078 -104.2601852416992 -v -47.09840393066406 7.389261245727539 -39.58503341674805 -v -47.14669799804688 8.704387664794922 -37.68162155151367 -v -55.4437255859375 28.01696014404297 -51.02064895629883 -v -55.80507659912109 29.50034332275391 -50.36057662963867 -v -56.41304779052734 27.51875305175781 -54.60213470458984 -v -57.93299102783203 29.20790100097656 -55.03944778442383 -v -67.98501586914063 13.43557167053223 -79.02035522460938 -v -69.89360046386719 14.10584259033203 -80.14413452148438 -v -81.67832183837891 -31.37918090820313 -101.2915573120117 -v -82.77850341796875 -29.84352111816406 -101.2665863037109 -v -45.27461242675781 -1.921316027641296 -17.56256103515625 -v -88.2349853515625 -39.3502311706543 -103.8660430908203 -v -48.86238861083984 8.964324951171875 -36.15071487426758 -v -56.92498016357422 29.82746124267578 -49.55580902099609 -v -60.01216888427734 29.56021118164063 -54.08668899536133 -v -72.06874084472656 14.20652008056641 -79.36090087890625 -v -83.47474670410156 -29.51860809326172 -100.4707794189453 -v -48.11187744140625 -2.742969989776611 -19.29600143432617 -v -88.2457275390625 -39.74774169921875 -103.4660797119141 -v -50.95351028442383 7.973351955413818 -36.14510726928711 -v -57.96013641357422 28.75201416015625 -49.21238708496094 -v -61.08487701416016 28.31040191650391 -52.46125793457031 -v -72.87251281738281 13.66179847717285 -77.26039123535156 -v -83.24275207519531 -30.64902877807617 -99.50344848632813 -v -48.33858871459961 -4.09240198135376 -22.38015365600586 -v -87.97438049316406 -40.34838485717773 -103.3615341186523 -v -51.84541320800781 6.477696895599365 -37.66901397705078 -v -58.13103866577148 27.08382415771484 -49.58887100219727 -v -60.34334564208984 26.39956665039063 -51.38712310791016 -v -71.69966125488281 12.8818302154541 -75.42439270019531 -v -82.25722503662109 -32.38360595703125 -99.09293365478516 -v -45.78402709960938 -4.953472137451172 -24.49265670776367 -v -87.62525177001953 -40.69983673095703 -103.6310958862305 -v -50.86646270751953 5.603586196899414 -39.57491683959961 -v -57.30899810791016 26.07907104492188 -50.40177917480469 -v -58.34596252441406 25.26664733886719 -51.67315673828125 -v -69.433349609375 12.45395088195801 -75.23539733886719 -v -81.26026153564453 -33.41617965698242 -99.54843139648438 -v -42.37185668945313 -4.677759170532227 -24.04270935058594 -v -87.46121978759766 -40.53748321533203 -104.0717544555664 -v -48.75384521484375 6.009276866912842 -40.42763137817383 -v -56.11302947998047 26.49437713623047 -51.03896713256836 -v -56.59683609008789 25.76473236083984 -53.10398483276367 -v -67.78019714355469 12.70041084289551 -76.83576965332031 -v -81.00263214111328 -32.96916198730469 -100.5268630981445 -v -45.856201171875 -3.096683979034424 0.9894610047340393 -v -42.83802795410156 -1.822747945785522 -1.17337703704834 -v -41.96012115478516 -3.15467095375061 1.817621946334839 -v -92.29042816162109 -39.21158981323242 57.38248825073242 -v -92.26210784912109 -39.83740234375 57.07994079589844 -v -91.95950317382813 -39.73274230957031 57.5407600402832 -v -49.36812591552734 8.476757049560547 19.08589744567871 -v -49.19630432128906 7.804555892944336 21.29348754882813 -v -54.25469207763672 27.27288055419922 30.44888496398926 -v -54.92575836181641 28.34239959716797 29.36605453491211 -v -57.45500946044922 28.70623016357422 33.83551406860352 -v -55.48647308349609 27.49809265136719 33.97690582275391 -v -67.46834564208984 9.109057426452637 43.49641799926758 -v -69.61196136474609 9.454971313476563 44.29645156860352 -v -87.01417541503906 -30.51413726806641 52.42203521728516 -v -85.97149658203125 -32.07468414306641 52.63847351074219 -v -45.98867797851563 -1.450130939483643 -2.535742998123169 -v -92.60006713867188 -39.16170501708984 56.99636840820313 -v -50.88497161865234 7.785149097442627 17.48099899291992 -v -55.98342132568359 28.08773803710938 28.45757293701172 -v -59.41564178466797 28.14698791503906 32.74097061157227 -v -71.61580657958984 8.682785987854004 43.43437957763672 -v -87.75607299804688 -30.29622077941895 51.63100051879883 -v -49.03958129882813 -2.317409992218018 -1.243530988693237 -v -92.65523529052734 -39.6205940246582 56.67316055297852 -v -52.60464477539063 6.250553131103516 17.68733215332031 -v -56.63124847412109 26.70069122314453 28.40756416320801 -v -59.89194488525391 26.24149322509766 31.51743125915527 -v -71.97093963623047 7.37397575378418 41.55935287475586 -v -87.63851928710938 -31.58496475219727 50.86106491088867 -v -49.69331359863281 -3.771508932113647 1.730138063430786 -v -92.41441345214844 -40.24274826049805 56.65629577636719 -v -53.23219299316406 5.028540134429932 19.54948425292969 -v -56.38141632080078 25.22571563720703 29.25366592407227 -v -58.52523040771484 24.42458915710449 31.08627510070801 -v -70.40996551513672 6.514069080352783 40.08333206176758 -v -86.75009155273438 -33.40998077392578 50.69198608398438 -v -47.45761871337891 -4.717469215393066 4.146055221557617 -v -92.05893707275391 -40.55963134765625 56.95841217041016 -v -52.29503631591797 5.039290904998779 21.6652717590332 -v -55.42203521728516 24.77352905273438 30.3587532043457 -v -56.34468841552734 24.06446647644043 31.77214431762695 -v -68.10823822021484 6.750600814819336 40.11775207519531 -v -85.75971984863281 -34.3969612121582 51.2510871887207 -v -44.01602935791016 -4.442947864532471 4.184988975524902 -v -91.85649871826172 -40.33267974853516 57.35205459594727 -v -50.4989013671875 6.274747848510742 22.44142532348633 -v -54.47554779052734 25.68461608886719 30.89064788818359 -v -54.99231719970703 25.43232727050781 33.05861282348633 -v -66.79914093017578 7.905498027801514 41.6367301940918 -v -85.4132080078125 -33.80271530151367 52.11734008789063 -v -32.53578186035156 -3.15467095375061 -19.16253662109375 -v -34.38373184204102 -1.822747945785522 -16.65216445922852 -v -36.48015213012695 -3.096683979034424 -19.71685028076172 -v -43.38578033447266 -41.58316040039063 -95.21874237060547 -v -43.91326141357422 -41.58873748779297 -95.02735137939453 -v -43.69423675537109 -41.06890106201172 -95.43450164794922 -v -35.0989875793457 7.804555892944336 -38.97930526733398 -v -36.35158920288086 8.476757049560547 -37.15337371826172 -v -37.55405807495117 27.27288055419922 -51.63281631469727 -v -38.67663192749023 28.34239959716797 -51.03059768676758 -v -36.8568000793457 27.49809265136719 -55.3040657043457 -v -38.63229751586914 28.70623016357422 -56.16587829589844 -v -39.32158660888672 4.109056949615479 -79.20964813232422 -v -40.77798843383789 4.454970836639404 -80.97431182861328 -v -40.8770866394043 -32.42660522460938 -89.88973236083984 -v -41.6864128112793 -30.95858383178711 -90.76108551025391 -v -37.81033325195313 -1.450130939483643 -16.44955062866211 -v -44.16765594482422 -40.94609069824219 -95.34366607666016 -v -38.46767044067383 7.785149097442627 -36.52191925048828 -v -40.04683303833008 28.08773803710938 -50.77265167236328 -v -40.87752914428711 28.14698791503906 -56.19830703735352 -v -42.94440460205078 3.682785987854004 -81.22965240478516 -v -42.73056793212891 -30.60493469238281 -90.66996002197266 -v -40.23527908325195 -2.317409992218018 -18.70730972290039 -v -44.44951629638672 -41.30718231201172 -95.01465606689453 -v -39.85378265380859 6.250553131103516 -37.56044387817383 -v -40.63287734985352 26.70069122314453 -51.05325317382813 -v -41.90177536010742 26.24149322509766 -55.37683486938477 -v -44.18946838378906 2.373975992202759 -79.78339385986328 -v -43.2232666015625 -31.63191223144531 -89.68506622314453 -v -39.8325309753418 -3.771508932113647 -21.72522735595703 -v -44.32761383056641 -41.88030242919922 -94.69525909423828 -v -39.4661750793457 5.028540134429932 -39.48690414428711 -v -39.99345779418945 25.22571563720703 -51.66109085083008 -v -40.93375778198242 24.42458915710449 -54.3200798034668 -v -43.57563781738281 1.514069080352783 -77.72464752197266 -v -42.79354858398438 -33.2662239074707 -88.54798126220703 -v -36.90536880493164 -4.717469215393066 -23.23079490661621 -v -43.89371490478516 -42.23382568359375 -94.62592315673828 -v -37.59667587280273 5.039290904998779 -40.85063934326172 -v -38.61006164550781 24.77352905273438 -52.13843154907227 -v -38.70241546630859 24.06446647644043 -53.82379531860352 -v -41.56508255004883 1.750601053237915 -76.60358428955078 -v -41.76493453979492 -34.27718353271484 -88.11498260498047 -v -33.65802383422852 -4.442947864532471 -22.09029006958008 -v -43.47456359863281 -42.10161590576172 -94.85892486572266 -v -35.65310668945313 6.274747848510742 -40.62473678588867 -v -37.52444076538086 25.68461608886719 -52.12581634521484 -v -36.88800048828125 25.43232727050781 -54.26172637939453 -v -39.6718864440918 2.905498027801514 -77.26450347900391 -v -40.91205215454102 -33.90352249145508 -88.71208953857422 -v -36.01900863647461 -3.216418027877808 -1.765162944793701 -v -34.50244522094727 -1.655421018600464 -5.032196044921875 -v -32.20283126831055 -2.602406978607178 -2.728740930557251 -v -28.69635772705078 -38.61240768432617 75.69805145263672 -v -28.86252021789551 -39.28370666503906 75.62229156494141 -v -28.3271656036377 -39.13187408447266 75.69469451904297 -v -36.10787582397461 8.519889831542969 15.56240081787109 -v -34.57637023925781 8.107364654541016 17.24739646911621 -v -39.05897903442383 27.08562469482422 30.08821868896484 -v -40.40615463256836 27.93409729003906 29.60663604736328 -v -39.89728164672852 28.39327239990234 34.70915603637695 -v -38.03726577758789 27.49446105957031 33.66647720336914 -v -34.5403938293457 17.31492233276367 46.75900650024414 -v -35.8452262878418 17.43609428405762 48.66624069213867 -v -28.96659469604492 -31.87043952941895 66.61157989501953 -v -28.00870513916016 -33.48403930664063 66.39229583740234 -v -37.94406127929688 -1.883904933929443 -4.875525951385498 -v -29.19070816040039 -38.59844589233398 75.64435577392578 -v -38.12530136108398 7.461886882781982 15.15559387207031 -v -41.7304801940918 27.44197845458984 29.49332809448242 -v -41.99584579467773 27.45536041259766 34.97609710693359 -v -37.80666732788086 16.30614280700684 49.14663314819336 -v -30.06003952026367 -31.71491622924805 66.54987335205078 -v -39.93606948852539 -3.115807056427002 -2.376658916473389 -v -29.43793296813965 -39.1004524230957 75.57405853271484 -v -39.1094856262207 5.730080127716064 16.33332061767578 -v -42.03471374511719 25.97990417480469 29.83365058898926 -v -42.752685546875 25.38702392578125 34.26618957519531 -v -38.94770431518555 14.77594661712646 47.83845138549805 -v -30.46564483642578 -33.13447570800781 66.25366973876953 -v -38.97844314575195 -4.423483848571777 0.5826259851455688 -v -29.25189590454102 -39.74045181274414 75.54013824462891 -v -38.3193473815918 4.6285400390625 18.20871162414551 -v -41.08975601196289 24.6487865447998 30.3713264465332 -v -41.59787368774414 23.74571800231934 33.11403656005859 -v -38.40911865234375 13.99774074554443 45.72681045532227 -v -29.87803268432617 -35.06025695800781 65.94594573974609 -v -35.79229736328125 -4.822233200073242 1.77397894859314 -v -28.77267646789551 -40.03646850585938 75.56807708740234 -v -36.34981918334961 4.986735820770264 19.36955642700195 -v -39.6071891784668 24.45104026794434 30.70144844055176 -v -39.40102005004883 23.76740074157715 32.38723373413086 -v -36.59642791748047 14.5575475692749 44.40173721313477 -v -28.7396183013916 -36.04206466674805 65.85849761962891 -v -32.77687454223633 -4.011776924133301 0.3002820014953613 -v -28.36112785339355 -39.7656364440918 75.63690948486328 -v -34.68405532836914 6.534968852996826 18.94173622131348 -v -38.70342254638672 25.53554534912109 30.5754222869873 -v -37.81640243530273 25.43576812744141 32.63310623168945 -v -34.87471389770508 16.03384399414063 44.86114120483398 -v -27.90771293640137 -35.34060668945313 66.05712127685547 -v -26.45577621459961 -3.443838119506836 -2.149142980575562 -v -26.46640014648438 -2.246160984039307 -5.887526988983154 -v -23.49448394775391 -3.47288703918457 -4.813465118408203 -v 5.039107799530029 -39.45514678955078 86.51023101806641 -v 4.668338775634766 -40.01747512817383 86.33621978759766 -v 5.211228847503662 -39.9835319519043 86.19824981689453 -v -16.25835037231445 8.704387664794922 11.1760082244873 -v -14.85560417175293 7.389261245727539 12.46347618103027 -v -12.42665863037109 28.01696014404297 26.41044998168945 -v -13.15249061584473 29.50034332275391 26.21185684204102 -v -11.26496505737305 29.20790100097656 30.99277114868164 -v -10.52369499206543 27.51875305175781 29.59563827514648 -v -0.9972569942474365 13.43557167053223 54.88214111328125 -v -1.514698028564453 14.10584259033203 57.03571319580078 -v 3.385565996170044 -29.84352111816406 80.76795196533203 -v 3.675970077514648 -31.37918090820313 79.70648956298828 -v -29.43033599853516 -1.921316027641296 -4.146553039550781 -v 4.587766170501709 -39.3502311706543 86.69120025634766 -v -18.55141067504883 8.964324951171875 11.34670639038086 -v -14.50934600830078 29.82746124267578 26.45841026306152 -v -13.3946418762207 29.56021118164063 31.82656478881836 -v -3.589093923568726 14.20652008056641 58.0562744140625 -v 2.445001125335693 -29.51860809326172 81.25101470947266 -v -30.15432739257813 -2.742969989776611 -0.9014430046081543 -v 4.197091102600098 -39.74774169921875 86.60486602783203 -v -20.00806045532227 7.973351955413818 12.8470344543457 -v -15.4754638671875 28.75201416015625 26.9644775390625 -v -15.30904579162598 28.31040191650391 31.46907806396484 -v -5.658416748046875 13.66179847717285 57.17532348632813 -v 1.562493085861206 -30.64902877807617 80.79186248779297 -v -28.0932731628418 -4.09240198135376 1.404078960418701 -v 4.161306858062744 -40.34838485717773 86.31630706787109 -v -19.53142166137695 6.477696895599365 14.54720878601074 -v -15.32335662841797 27.08382415771484 27.34894752502441 -v -15.56659698486328 26.39956665039063 30.18951416015625 -v -6.164387226104736 12.8818302154541 55.05625915527344 -v 1.402615070343018 -32.38360595703125 79.73628997802734 -v -24.79911041259766 -4.953472137451172 1.033954977989197 -v 4.507323265075684 -40.69983673095703 86.04276275634766 -v -17.48039627075195 5.603586196899414 15.16696166992188 -v -14.16756820678711 26.07907104492188 27.32230758666992 -v -13.97334671020508 25.26664733886719 28.95141792297363 -v -4.726027011871338 12.45395088195801 53.29472351074219 -v 2.08576488494873 -33.41617965698242 78.87914276123047 -v -22.75246810913086 -4.677759170532227 -1.733124017715454 -v 4.974565982818604 -40.53748321533203 85.99021148681641 -v -15.39944839477539 6.009276866912842 14.2396240234375 -v -12.87841987609863 26.49437713623047 26.90462684631348 -v -11.72904586791992 25.76473236083984 28.68713760375977 -v -2.426440954208374 12.70041084289551 53.21726226806641 -v 3.097472906112671 -32.96916198730469 78.86588287353516 -v -23.49448394775391 -3.47288703918457 -15.18653869628906 -v -26.46640014648438 -2.246160984039307 -14.11247634887695 -v -26.45577621459961 -3.443838119506836 -17.85086059570313 -v 5.211228847503662 -39.9835319519043 -106.1982498168945 -v 4.668338775634766 -40.01747512817383 -106.3362197875977 -v 5.039107799530029 -39.45514678955078 -106.5102310180664 -v -14.85560417175293 7.389261245727539 -32.46347808837891 -v -16.25835037231445 8.704387664794922 -31.17601013183594 -v -12.42665863037109 28.01696014404297 -46.41044616699219 -v -13.15249061584473 29.50034332275391 -46.21185302734375 -v -10.52369499206543 27.51875305175781 -49.59563446044922 -v -11.26496505737305 29.20790100097656 -50.99276733398438 -v -0.9972569942474365 13.43557167053223 -74.88213348388672 -v -1.514698028564453 14.10584259033203 -77.03571319580078 -v 3.675970077514648 -31.37918090820313 -99.70648956298828 -v 3.38556694984436 -29.84352111816406 -100.767951965332 -v -29.43033599853516 -1.921316027641296 -15.85345077514648 -v 4.587764739990234 -39.3502311706543 -106.6912002563477 -v -18.55141067504883 8.964324951171875 -31.34671020507813 -v -14.50934600830078 29.82746124267578 -46.45841217041016 -v -13.3946418762207 29.56021118164063 -51.82656097412109 -v -3.589093923568726 14.20652008056641 -78.05626678466797 -v 2.445001125335693 -29.51860809326172 -101.2510147094727 -v -30.15432739257813 -2.742969989776611 -19.09856033325195 -v 4.197090148925781 -39.74774169921875 -106.604866027832 -v -20.00806045532227 7.973351955413818 -32.8470344543457 -v -15.4754638671875 28.75201416015625 -46.9644775390625 -v -15.30904579162598 28.31040191650391 -51.46907806396484 -v -5.658416748046875 13.66179847717285 -77.17531585693359 -v 1.562493085861206 -30.64902877807617 -100.791862487793 -v -28.0932731628418 -4.09240198135376 -21.40408325195313 -v 4.161307811737061 -40.34838485717773 -106.3163070678711 -v -19.53142166137695 6.477696895599365 -34.54721069335938 -v -15.32335662841797 27.08382415771484 -47.34894561767578 -v -15.56659698486328 26.39956665039063 -50.18951416015625 -v -6.164387226104736 12.8818302154541 -75.05625152587891 -v 1.402615070343018 -32.38360595703125 -99.73628997802734 -v -24.79911041259766 -4.953472137451172 -21.03395843505859 -v 4.50732421875 -40.69983673095703 -106.0427627563477 -v -17.48039627075195 5.603586196899414 -35.16696166992188 -v -14.16756820678711 26.07907104492188 -47.32230377197266 -v -13.97334671020508 25.26664733886719 -48.951416015625 -v -4.726027011871338 12.45395088195801 -73.29471588134766 -v 2.08576488494873 -33.41617965698242 -98.87914276123047 -v -22.75246810913086 -4.677759170532227 -18.26688003540039 -v 4.974565982818604 -40.53748321533203 -105.9902114868164 -v -15.39944839477539 6.009276866912842 -34.2396240234375 -v -12.87841987609863 26.49437713623047 -46.90462493896484 -v -11.72904586791992 25.76473236083984 -48.6871337890625 -v -2.426440954208374 12.70041084289551 -73.21726226806641 -v 3.097472906112671 -32.96916198730469 -98.86588287353516 -v -14.25648880004883 -6.954940795898438 -3.301691055297852 -v -14.10265731811523 -6.075778961181641 -7.124460220336914 -v -11.2052116394043 -7.280231952667236 -5.841878890991211 -v 19.74986457824707 -37.60753631591797 68.32992553710938 -v 19.34836387634277 -38.14849472045898 68.15628051757813 -v 19.89711761474609 -38.15519714355469 68.03912353515625 -v -4.907510757446289 6.093640804290771 10.12681770324707 -v -2.877649068832397 5.517601013183594 11.07694053649902 -v 1.745674014091492 26.13694000244141 21.00781440734863 -v 0.4745520055294037 27.20939636230469 20.97971534729004 -v 3.233434915542603 28.02400207519531 25.24942970275879 -v 4.282450199127197 26.64773559570313 23.71314430236816 -v 14.8602180480957 5.642467975616455 47.61897277832031 -v 14.56025314331055 6.223588943481445 49.83868408203125 -v 18.9760627746582 -28.07810020446777 62.27335357666016 -v 19.20066070556641 -29.66015243530273 61.26537322998047 -v -17.11595153808594 -5.533359050750732 -5.528418064117432 -v 19.30024719238281 -37.46723175048828 68.48995971679688 -v -7.036674976348877 5.467060089111328 10.78174591064453 -v -0.8241369724273682 27.00916290283203 21.51090049743652 -v 1.346554040908813 27.59506225585938 26.51851081848145 -v 12.85833549499512 5.598269939422607 51.27650451660156 -v 18.04227828979492 -27.67663192749023 62.70982360839844 -v -17.97599411010742 -6.06142520904541 -2.255570888519287 -v 18.88686752319336 -37.83989715576172 68.39877319335938 -v -7.661820888519287 4.109711170196533 12.54856109619141 -v -1.172435998916626 25.68704986572266 22.20140266418457 -v 0.0426269993185997 25.68392181396484 26.56466102600098 -v 11.03606128692627 4.237391948699951 50.84969329833984 -v 17.10253143310547 -28.75799560546875 62.24617767333984 -v -16.03519439697266 -7.262344837188721 0.2294789999723434 -v 18.82099342346191 -38.44494247436523 68.12506103515625 -v -6.312249183654785 3.043694019317627 14.09679794311523 -v -0.3080709874629974 24.23861885070801 22.53124809265137 -v 0.3035619854927063 23.72967147827148 25.3531436920166 -v 10.46565055847168 3.165694952011108 48.87973022460938 -v 16.8643856048584 -30.50795555114746 61.23151397705078 -v -12.75498580932617 -8.23180103302002 0.05550599843263626 -v 19.15221405029297 -38.82671737670898 67.87483215332031 -v -4.004155158996582 3.07171893119812 14.26059532165527 -v 1.118067026138306 23.75459671020508 22.25203132629395 -v 1.932853937149048 23.20393180847168 23.79626274108887 -v 11.57662582397461 3.190187931060791 46.84990692138672 -v 17.50724792480469 -31.60873603820801 60.42989349365234 -v -10.6054573059082 -8.239757537841797 -2.646497964859009 -v 19.63114547729492 -38.69778442382813 67.83663940429688 -v -2.475620031356812 4.172726154327393 12.91663932800293 -v 2.032040119171143 24.59943771362305 21.57402229309082 -v 3.703634023666382 24.50261497497559 23.06640815734863 -v 13.53237915039063 4.292479038238525 46.28885650634766 -v 18.54694938659668 -31.23143768310547 60.44495391845703 -v -12.53854370117188 -7.280231952667236 -13.491455078125 -v -15.43598937988281 -6.075778961181641 -12.2088737487793 -v -15.58982086181641 -6.954940795898438 -16.03164291381836 -v 18.56378555297852 -38.15519714355469 -87.37246704101563 -v 18.0150318145752 -38.14849472045898 -87.4896240234375 -v 18.41653251647949 -37.60753631591797 -87.66326904296875 -v -4.210980892181396 5.517601013183594 -30.41027450561523 -v -6.240842819213867 6.093640804290771 -29.46015167236328 -v 0.4123420119285583 26.13694000244141 -40.34114837646484 -v -0.8587800264358521 27.20939636230469 -40.31304931640625 -v 2.949118137359619 26.64773559570313 -43.04647827148438 -v 1.900102972984314 28.02400207519531 -44.582763671875 -v 13.52688598632813 5.642467975616455 -66.95231628417969 -v 13.22692108154297 6.223588943481445 -69.17202758789063 -v 17.86732864379883 -29.66015243530273 -80.59872436523438 -v 17.64273071289063 -28.07810020446777 -81.60670471191406 -v -18.44928359985352 -5.533359050750732 -13.80491638183594 -v 17.96691513061523 -37.46723175048828 -87.82330322265625 -v -8.370006561279297 5.467060089111328 -30.11508178710938 -v -2.157469034194946 27.00916290283203 -40.84423828125 -v 0.01322199963033199 27.59506225585938 -45.85184478759766 -v 11.52500343322754 5.598269939422607 -70.60984802246094 -v 16.70894622802734 -27.67663192749023 -82.04316711425781 -v -19.309326171875 -6.06142520904541 -17.07776260375977 -v 17.55353546142578 -37.83989715576172 -87.73211669921875 -v -8.995153427124023 4.109711170196533 -31.88189697265625 -v -2.505768060684204 25.68704986572266 -41.53473663330078 -v -1.290704965591431 25.68392181396484 -45.89799499511719 -v 9.702729225158691 4.237391948699951 -70.18302917480469 -v 15.76919937133789 -28.75799560546875 -81.57952880859375 -v -17.36852645874023 -7.262344837188721 -19.56281280517578 -v 17.48766136169434 -38.44494247436523 -87.45840454101563 -v -7.645581245422363 3.043694019317627 -33.43013000488281 -v -1.641402959823608 24.23861885070801 -41.86458587646484 -v -1.029770016670227 23.72967147827148 -44.68647766113281 -v 9.132317543029785 3.165694952011108 -68.21307373046875 -v 15.53105354309082 -30.50795555114746 -80.56486511230469 -v -14.08831787109375 -8.23180103302002 -19.38883972167969 -v 17.81888198852539 -38.82671737670898 -87.20817565917969 -v -5.33748722076416 3.07171893119812 -33.59392929077148 -v -0.2152650058269501 23.75459671020508 -41.58536529541016 -v 0.5995219945907593 23.20393180847168 -43.12960052490234 -v 10.24329376220703 3.190187931060791 -66.18324279785156 -v 16.17391586303711 -31.60873603820801 -79.76324462890625 -v -11.93878936767578 -8.239757537841797 -16.68683624267578 -v 18.29781341552734 -38.69778442382813 -87.16998291015625 -v -3.808951854705811 4.172726154327393 -32.24997329711914 -v 0.6987079977989197 24.59943771362305 -40.90735626220703 -v 2.370301961898804 24.50261497497559 -42.39974212646484 -v 12.19904708862305 4.292479038238525 -65.6221923828125 -v 17.2136173248291 -31.23143768310547 -79.77830505371094 -v -66.77298736572266 -11.88561820983887 -0.2029989957809448 -v -61.49651336669922 6.340155124664307 -5.812275886535645 -v -62.98685073852539 9.870844841003418 -6.308485984802246 -v -61.44757843017578 8.190096855163574 -3.647036075592041 -v -63.97118377685547 3.661695003509521 -3.830467939376831 -v -64.84598541259766 4.368710994720459 -2.075659990310669 -v -62.55780410766602 11.30561256408691 -3.485913991928101 -v -67.13710784912109 4.622090816497803 -1.531195998191833 -v -63.99109649658203 13.34076976776123 -5.450253009796143 -v -69.11919403076172 4.231084823608398 -2.607095956802368 -v -64.66820526123047 12.76302528381348 -8.06086254119873 -v -69.29987335205078 3.490133047103882 -4.493171215057373 -v -64.07926177978516 10.00739574432373 -9.351896286010742 -v -67.54299163818359 2.957120895385742 -5.769162178039551 -v -62.66775894165039 7.148978233337402 -8.351184844970703 -v -65.17147064208984 3.033509969711304 -5.474239826202393 -v -66.72484588623047 1.179926037788391 10.02946090698242 -v -58.21265029907227 12.08680152893066 -3.032124042510986 -v -55.28428649902344 12.61780071258545 -0.7646610140800476 -v -55.50985717773438 10.27971935272217 -2.97612190246582 -v -59.68946075439453 8.144949913024902 1.861809968948364 -v -57.9158821105957 6.628377914428711 1.958868980407715 -v -52.63722610473633 10.23327159881592 -1.25485098361969 -v -56.29685974121094 6.188433170318604 3.356508016586304 -v -51.75783920288086 11.98240089416504 0.8355600237846375 -v -56.05172729492188 7.156466007232666 5.002277851104736 -v -53.53396987915039 14.21004676818848 1.72101902961731 -v -57.36484146118164 8.803488731384277 5.656900882720947 -v -56.62808227539063 15.23869514465332 0.7346760034561157 -v -59.24757766723633 9.889246940612793 4.827473163604736 -v -58.71025466918945 14.29374885559082 -1.380638957023621 -v -60.28214263916016 9.596194267272949 3.138458967208862 -v -53.9999885559082 26.33333778381348 -9.944446563720703 -v -44.00383377075195 24.25179481506348 -7.336516857147217 -v -43.19998550415039 24.25179481506348 -9.944446563720703 -v -46.64442825317383 24.25179481506348 -0.7607110142707825 -v -53.9999885559082 2.333333969116211 -9.944446563720703 -v -50.9999885559082 3.941030979156494 -4.748294830322266 -v -53.9999885559082 3.941030979156494 -3.944447040557861 -v -53.9999885559082 24.72564125061035 -3.944446086883545 -v -55.80000305175781 6.941027164459229 -4.748294830322266 -v -56.99998474121094 24.72564125061035 -4.748292922973633 -v -57.99615859985352 5.774363040924072 -6.944447040557861 -v -59.19614028930664 24.72564125061035 -6.944447040557861 -v -58.80000686645508 5.774363040924072 -9.944446563720703 -v -59.99999237060547 24.72564125061035 -9.944446563720703 -v -45.44443130493164 8.333334922790527 -0.08162699639797211 -v -48.80383682250977 8.333334922790527 -0.9444469809532166 -v -53.9999885559082 10.66667366027832 1.822437047958374 -v -59.19614028930664 8.333334922790527 -0.9444469809532166 -v -62.9999885559082 8.333334922790527 -4.748293876647949 -v -64.19229888916016 7.533350944519043 -9.944446563720703 -v -43.60768508911133 8.333334922790527 -9.944446563720703 -v -37.19998550415039 18.65442848205566 -9.944446563720703 -v -39.25212478637695 18.65442848205566 -0.06191999837756157 -v -43.64442825317383 18.65442848205566 3.756353855133057 -v -53.9999885559082 14.33333778381348 2.055552959442139 -v -61.41007232666016 13.47619915008545 -1.042665958404541 -v -64.60929870605469 13.47619915008545 -6.367094039916992 -v -66.39998626708984 12.33334636688232 -9.944446563720703 -v -38.80768203735352 21.88604164123535 -9.944446563720703 -v -40.64442825317383 21.88604164123535 -0.7607129812240601 -v -44.44827651977539 21.88604164123535 2.546009063720703 -v -53.9999885559082 20.33333778381348 0.4478580057621002 -v -60.29326629638672 19.47619819641113 -2.199142932891846 -v -63.06387329101563 19.47619819641113 -6.810235023498535 -v -64.39229583740234 20.33333778381348 -9.944446563720703 -v -63.32090759277344 15.14286994934082 -6.139256000518799 -v -62.36603164672852 15.39914894104004 -5.604844093322754 -v -62.33220672607422 15.06181526184082 -5.486823081970215 -v -62.95563125610352 14.64286994934082 -5.390261173248291 -v -62.37112808227539 14.47619819641113 -4.191868782043457 -v -62.07738494873047 15.07085609436035 -4.598177909851074 -v -61.73810577392578 15.73718452453613 -3.414914131164551 -v -61.64052581787109 15.30952644348145 -2.693876981735229 -v -61.55341339111328 16.74508094787598 -2.770823001861572 -v -61.42134857177734 16.64286994934082 -2.244477033615112 -v -61.58245086669922 17.63445472717285 -2.87214994430542 -v -61.56745147705078 17.80952644348145 -2.544080018997192 -v -61.72498321533203 18.15569496154785 -3.369262933731079 -v -61.85970306396484 18.47619819641113 -3.143272876739502 -v -62.29808807373047 18.64286994934082 -4.042075157165527 -v -61.89406585693359 18.04158973693848 -3.958856105804443 -v -62.73646926879883 18.14286994934082 -4.940859794616699 -v -62.07035064697266 17.69966316223145 -4.573657035827637 -v -62.11862945556641 16.98106575012207 -4.741918087005615 -v -62.95563125610352 16.97619819641113 -5.390261173248291 -v -62.20188140869141 16.16166877746582 -5.032281875610352 -v -63.24786376953125 16.30952644348145 -5.989458084106445 -v -15.18229866027832 -14.32931900024414 -14.04238128662109 -v -32.1219482421875 -11.5362491607666 -10 -v -15.18229866027832 -14.32931900024414 -5.95761775970459 -v -44.94972991943359 -12.26852130889893 -17.05864334106445 -v -44.94972991943359 -12.26852130889893 -2.941359043121338 -v -43.19998550415039 24.25179481506348 -9.988886833190918 -v -44.00383377075195 24.25179481506348 -12.59681606292725 -v -53.9999885559082 26.33333778381348 -9.988886833190918 -v -46.64442825317383 24.25179481506348 -19.17262077331543 -v -53.9999885559082 3.941030979156494 -15.9888858795166 -v -50.9999885559082 3.941030979156494 -15.18503856658936 -v -53.9999885559082 2.333333969116211 -9.988886833190918 -v -53.9999885559082 24.72564125061035 -15.9888858795166 -v -55.80000305175781 6.941027164459229 -15.18503856658936 -v -56.99998474121094 24.72564125061035 -15.18503952026367 -v -57.99615859985352 5.774363040924072 -12.98888683319092 -v -59.19614028930664 24.72564125061035 -12.98888683319092 -v -58.80000686645508 5.774363040924072 -9.988886833190918 -v -59.99999237060547 24.72564125061035 -9.988886833190918 -v -48.80383682250977 8.333334922790527 -18.9888858795166 -v -45.44443130493164 8.333334922790527 -19.85170555114746 -v -53.9999885559082 10.66667366027832 -21.75576972961426 -v -59.19614028930664 8.333334922790527 -18.9888858795166 -v -62.9999885559082 8.333334922790527 -15.18503856658936 -v -64.19229888916016 7.533350944519043 -9.988886833190918 -v -37.19998550415039 18.65442848205566 -9.988886833190918 -v -43.60768508911133 8.333334922790527 -9.988886833190918 -v -39.25212478637695 18.65442848205566 -19.87141227722168 -v -43.64442825317383 18.65442848205566 -23.68968772888184 -v -53.9999885559082 14.33333778381348 -21.9888858795166 -v -61.41007232666016 13.47619915008545 -18.89066886901855 -v -64.60929870605469 13.47619915008545 -13.56623935699463 -v -66.39998626708984 12.33334636688232 -9.988886833190918 -v -40.64442825317383 21.88604164123535 -19.17262077331543 -v -38.80768203735352 21.88604164123535 -9.988886833190918 -v -44.44827651977539 21.88604164123535 -22.47934150695801 -v -53.9999885559082 20.33333778381348 -20.38118934631348 -v -60.29326629638672 19.47619819641113 -17.73418998718262 -v -63.06387329101563 19.47619819641113 -13.12309837341309 -v -64.39229583740234 20.33333778381348 -9.988886833190918 -v -62.33220672607422 15.06181526184082 -14.44650936126709 -v -62.36603164672852 15.39914894104004 -14.32849025726318 -v -63.32090759277344 15.14286994934082 -13.79407787322998 -v -62.95563125610352 14.64286994934082 -14.54307270050049 -v -62.37112808227539 14.47619819641113 -15.74146461486816 -v -62.07738494873047 15.07085609436035 -15.33515357971191 -v -61.73810577392578 15.73718452453613 -16.51841926574707 -v -61.64052581787109 15.30952644348145 -17.23945426940918 -v -61.42134857177734 16.64286994934082 -17.68885612487793 -v -61.55341339111328 16.74508094787598 -17.16251182556152 -v -61.56745147705078 17.80952644348145 -17.38925361633301 -v -61.58245086669922 17.63445472717285 -17.06118202209473 -v -61.72498321533203 18.15569496154785 -16.5640697479248 -v -61.85970306396484 18.47619819641113 -16.79006004333496 -v -62.29808807373047 18.64286994934082 -15.89125633239746 -v -61.89406585693359 18.04158973693848 -15.97447776794434 -v -62.73646926879883 18.14286994934082 -14.99247264862061 -v -62.07035064697266 17.69966316223145 -15.35967445373535 -v -62.11862945556641 16.98106575012207 -15.19141483306885 -v -62.95563125610352 16.97619819641113 -14.54307270050049 -v -62.20188140869141 16.16166877746582 -14.90105247497559 -v -63.24786376953125 16.30952644348145 -13.94387531280518 -v -66.59115600585938 -11.97652816772461 -20.11215209960938 -v -61.26576614379883 8.099187850952148 -16.66811561584473 -v -62.80503845214844 9.779933929443359 -14.00666618347168 -v -61.31470108032227 6.249245166778564 -14.50287628173828 -v -64.66415405273438 4.277801990509033 -18.2394905090332 -v -63.78934860229492 3.570785999298096 -16.48468399047852 -v -62.37599182128906 11.21470260620117 -16.82923698425293 -v -66.95527648925781 4.531181812286377 -18.78395462036133 -v -63.80926132202148 13.24985885620117 -14.86489868164063 -v -68.93736267089844 4.140174865722656 -17.70805549621582 -v -64.48637390136719 12.67211532592773 -12.25428771972656 -v -69.1180419921875 3.399224042892456 -15.82198143005371 -v -63.89742660522461 9.916484832763672 -10.96325492858887 -v -67.36116027832031 2.8662109375 -14.54598999023438 -v -62.48594665527344 7.058069229125977 -11.96396636962891 -v -64.98963928222656 2.942600965499878 -14.84091186523438 -v -66.72484588623047 1.234470963478088 -28.69612312316895 -v -55.50985717773438 10.33426475524902 -15.69054412841797 -v -55.28428649902344 12.6723461151123 -17.90200424194336 -v -58.21265029907227 12.14134788513184 -15.63454246520996 -v -57.9158821105957 6.682922840118408 -20.62553215026855 -v -59.68946075439453 8.199495315551758 -20.52847480773926 -v -52.63722610473633 10.28781700134277 -17.41181564331055 -v -56.29685974121094 6.242978096008301 -22.02317237854004 -v -51.75783920288086 12.03694534301758 -19.50222587585449 -v -56.05172729492188 7.211010932922363 -23.66894340515137 -v -53.53396987915039 14.26459121704102 -20.38768196105957 -v -57.36484146118164 8.858034133911133 -24.32356452941895 -v -56.62808227539063 15.29323959350586 -19.40134239196777 -v -59.24757766723633 9.943792343139648 -23.49413871765137 -v -58.71025466918945 14.34829330444336 -17.28602600097656 -v -60.28214263916016 9.650739669799805 -21.80512428283691 -v -59.67054748535156 17.67085647583008 -1.853034973144531 -v -58.74361419677734 17.51846694946289 -2.271703958511353 -v -59.46704864501953 18.40674209594727 -2.53897500038147 -v -60.63759613037109 18.10347366333008 -2.337920904159546 -v -61.55588531494141 18.15423965454102 -3.37207293510437 -v -60.57522583007813 18.69086074829102 -3.431842088699341 -v -61.64485168457031 18.26233291625977 -4.609260082244873 -v -61.38417816162109 17.94110488891602 -5.717274188995361 -v -61.48154449462891 16.98392105102539 -6.448155879974365 -v -62.26735687255859 17.28479385375977 -5.621510982513428 -v -62.61495971679688 16.49116897583008 -5.094202995300293 -v -62.20498657226563 16.13167190551758 -6.081917762756348 -v -61.27806091308594 15.97928333282471 -6.500585079193115 -v -62.26735687255859 15.54427146911621 -4.988009929656982 -v -61.38417816162109 14.97993564605713 -4.639497756958008 -v -61.48154449462891 15.24338626861572 -5.814656257629395 -v -60.47430419921875 15.08453464508057 -3.54331111907959 -v -61.64485168457031 15.44609451293945 -3.584233999252319 -v -61.55588531494141 16.32414627075195 -2.705970048904419 -v -60.57522583007813 15.87463855743408 -2.406815052032471 -v -59.56442260742188 15.70901966094971 -2.636348009109497 -v -60.63759613037109 17.02777481079102 -1.946398019790649 -v -59.46704864501953 16.66621780395508 -1.905473947525024 -v -61.74577331542969 17.31189346313477 -2.839264869689941 -v -62.3682861328125 17.41006851196289 -4.243031024932861 -v -62.3682861328125 16.33436965942383 -3.851508140563965 -v -59.46704864501953 18.14007568359375 -17.19435882568359 -v -58.74361419677734 17.25180053710938 -17.46162986755371 -v -59.67054748535156 17.40419006347656 -17.88029861450195 -v -60.63759613037109 17.83680725097656 -17.39541244506836 -v -60.57522583007813 18.4241943359375 -16.30149078369141 -v -61.55588531494141 17.8875732421875 -16.36125946044922 -v -61.64485168457031 17.99566650390625 -15.12407302856445 -v -62.26735687255859 17.01812744140625 -14.1118221282959 -v -61.48154449462891 16.71725463867188 -13.28517723083496 -v -61.38417816162109 17.6744384765625 -14.01605987548828 -v -62.20498657226563 15.86500549316406 -13.65141487121582 -v -62.61495971679688 16.22450256347656 -14.63912963867188 -v -61.27806091308594 15.71261596679688 -13.23274803161621 -v -62.26735687255859 15.27760314941406 -14.74532318115234 -v -61.48154449462891 14.97671890258789 -13.91867828369141 -v -61.38417816162109 14.7132682800293 -15.09383583068848 -v -61.64485168457031 15.17942810058594 -16.14909934997559 -v -60.47430419921875 14.81786727905273 -16.19002342224121 -v -60.57522583007813 15.60797119140625 -17.32651901245117 -v -61.55588531494141 16.05747985839844 -17.02736282348633 -v -59.56442260742188 15.44235229492188 -17.09698486328125 -v -60.63759613037109 16.7611083984375 -17.78693389892578 -v -59.46704864501953 16.39955139160156 -17.82785987854004 -v -61.74577331542969 17.04522705078125 -16.89406776428223 -v -62.3682861328125 17.14340209960938 -15.49030303955078 -v -62.3682861328125 16.06770324707031 -15.8818244934082 - -# 302 UV coordinates -vt 0.1861920058727264 0.2227180004119873 0 -vt 0.5031800270080566 0.03906299918889999 0 -vt 0.2364480048418045 0.2373390048742294 0 -vt 0.3814640045166016 0.2761969864368439 0 -vt 0.5749170184135437 0.134553998708725 0 -vt 0.7469409704208374 0.1137370020151138 0 -vt 0.07407300174236298 0.3458549976348877 0 -vt 0.04933400079607964 0.5214380025863647 0 -vt 0.1560039967298508 0.4129219949245453 0 -vt 0.1560039967298508 0.6299539804458618 0 -vt 0.3814640045166016 0.8019279837608337 0 -vt 0.3600949943065643 0.5390629768371582 0 -vt 0.6192520260810852 0.384553998708725 0 -vt 0.6192520260810852 0.6935709714889526 0 -vt 0.8223689794540405 0.5390629768371582 0 -vt 0.8340740203857422 0.2890630066394806 0 -vt 1.023437976837158 0.5390629768371582 0 -vt 0.9728180170059204 0.5390629768371582 0 -vt 0.9225059747695923 0.2890630066394806 0 -vt 0.8340740203857422 0.7890629768371582 0 -vt 0.7469409704208374 0.9643880128860474 0 -vt 0.9225059747695923 0.7890629768371582 0 -vt 0.5749170184135437 0.9435709714889526 0 -vt 0.2364480048418045 0.8055369853973389 0 -vt 0.1861920058727264 0.8201580047607422 0 -vt 0.5031800270080566 1.039062976837158 0 -vt 0.2846769988536835 0.8055369853973389 0 -vt 0.6248959898948669 0.8019279837608337 0 -vt 0.7180020213127136 0.9435709714889526 0 -vt 0.8507689833641052 0.6935709714889526 0 -vt 0.646265983581543 0.5390629768371582 0 -vt 0.6248959898948669 0.2761969864368439 0 -vt 0.8507689833641052 0.384553998708725 0 -vt 0.2340410053730011 0.6299539804458618 0 -vt 0.1000450029969215 0.5214380025863647 0 -vt 0.2340410053730011 0.4129219949245453 0 -vt 0.1038810014724731 0.3458549976348877 0 -vt 0.2846769988536835 0.2373390048742294 0 -vt 0.7180020213127136 0.134553998708725 0 -vt 0.02343799918889999 0.5214380025863647 0 -vt 0.07407300174236298 0.6970210075378418 0 -vt 0.1038810014724731 0.6970210075378418 0 -vt -0.06587100028991699 -0.4100160002708435 0 -vt 0.4030880033969879 -0.109436996281147 0 -vt 0.1274410039186478 -0.364995002746582 0 -vt 0.4030880033969879 0.1842669993638992 0 -vt 0.6787350177764893 0.008834999985992908 0 -vt 1.058290958404541 -0.01694799959659576 0 -vt -0.3185659945011139 -0.03083699941635132 0 -vt -0.3557040095329285 0.5098400115966797 0 -vt -0.04291899874806404 0.175683006644249 0 -vt -0.04291899874806404 0.8439980149269104 0 -vt 0.4030880033969879 0.8354139924049377 0 -vt 0.4030880033969879 0.5098400115966797 0 -vt 1.035338997840881 0.3184730112552643 0 -vt 1.035338997840881 0.7012069821357727 0 -vt 1.348124027252197 0.5098400115966797 0 -vt 1.310984969139099 0.06459199637174606 0 -vt 1.481344938278198 0.5098400115966797 0 -vt 1.310984969139099 0.9550889730453491 0 -vt 1.058290958404541 1.03662896156311 0 -vt 0.6787350177764893 1.010846018791199 0 -vt 0.1274410039186478 1.384675025939941 0 -vt -0.06587100028991699 1.429695963859558 0 -vt 0.4030880033969879 1.129117012023926 0 -vt -0.4889250099658966 0.5098400115966797 0 -vt -0.3185659945011139 1.050518035888672 0 -vt 0 1 0 -vt 0 0 0 -vt 0 0.1666669994592667 0 -vt 0.1428570002317429 0.1666669994592667 0 -vt 0.1428570002317429 0 0 -vt 0 0.3333329856395721 0 -vt 0.1428570002317429 0.3333329856395721 0 -vt 0 0.5 0 -vt 0.1428570002317429 0.5 0 -vt 0 0.6666669845581055 0 -vt 0.1428570002317429 0.6666669845581055 0 -vt 0 0.8333330154418945 0 -vt 0.1428570002317429 0.8333330154418945 0 -vt 0.1428570002317429 1 0 -vt 0.2857140004634857 0 0 -vt 0.2857140004634857 0.1666669994592667 0 -vt 0.2857140004634857 0.3333329856395721 0 -vt 0.2857140004634857 0.5 0 -vt 0.2857140004634857 0.6666669845581055 0 -vt 0.2857140004634857 0.8333330154418945 0 -vt 0.2857140004634857 1 0 -vt 0.4285709857940674 0.1666669994592667 0 -vt 0.4285709857940674 0 0 -vt 0.4285709857940674 0.3333329856395721 0 -vt 0.4285709857940674 0.5 0 -vt 0.4285709857940674 0.6666669845581055 0 -vt 0.4285709857940674 0.8333330154418945 0 -vt 0.4285709857940674 1 0 -vt 0.5714290142059326 0 0 -vt 0.5714290142059326 0.1666669994592667 0 -vt 0.5714290142059326 0.3333329856395721 0 -vt 0.5714290142059326 0.5 0 -vt 0.5714290142059326 0.6666669845581055 0 -vt 0.5714290142059326 0.8333330154418945 0 -vt 0.5714290142059326 1 0 -vt 0.7142860293388367 0.1666669994592667 0 -vt 0.7142860293388367 0 0 -vt 0.7142860293388367 0.3333329856395721 0 -vt 0.7142860293388367 0.5 0 -vt 0.7142860293388367 0.6666669845581055 0 -vt 0.7142860293388367 0.8333330154418945 0 -vt 0.7142860293388367 1 0 -vt 0.8571429848670959 0 0 -vt 0.8571429848670959 0.1666669994592667 0 -vt 0.8571429848670959 0.3333329856395721 0 -vt 0.8571429848670959 0.5 0 -vt 0.8571429848670959 0.6666669845581055 0 -vt 0.8571429848670959 0.8333330154418945 0 -vt 0.8571429848670959 1 0 -vt 1 0.1666669994592667 0 -vt 1 0 0 -vt 1 0.3333329856395721 0 -vt 1 0.5 0 -vt 1 0.6666669845581055 0 -vt 1 0.8333330154418945 0 -vt 1 1 0 -vt 0.3329190015792847 0.2726939916610718 0 -vt 0.4468950033187866 0.3977729976177216 0 -vt 0.4569770097732544 0.4220040142536163 0 -vt 0.4028989970684052 0.4104689955711365 0 -vt 0.4066259860992432 0.379391998052597 0 -vt 0.3709700107574463 0.3842439949512482 0 -vt 0.3996250033378601 0.4318499863147736 0 -vt 0.3599070012569427 0.3859829902648926 0 -vt 0.439538985490799 0.4458169937133789 0 -vt 0.3817679882049561 0.3832989931106567 0 -vt 0.4925839900970459 0.4418520033359528 0 -vt 0.420091986656189 0.3782140016555786 0 -vt 0.5188159942626953 0.4229409992694855 0 -vt 0.4460189938545227 0.3745560050010681 0 -vt 0.4984830021858215 0.4033240079879761 0 -vt 0.4400259852409363 0.3750799894332886 0 -vt 0.3448100090026855 0.3380840122699738 0 -vt 0.4880180060863495 0.4240910112857819 0 -vt 0.4631580114364624 0.428277999162674 0 -vt 0.487405002117157 0.409841001033783 0 -vt 0.4343610107898712 0.3930070102214813 0 -vt 0.4332970082759857 0.3810479938983917 0 -vt 0.468531996011734 0.4094749987125397 0 -vt 0.4179730117321014 0.377579003572464 0 -vt 0.4456129968166351 0.4232679903507233 0 -vt 0.3999280035495758 0.3852129876613617 0 -vt 0.4359039962291718 0.4408339858055115 0 -vt 0.392751008272171 0.3982000052928925 0 -vt 0.4467189908027649 0.4489449858665466 0 -vt 0.4018450081348419 0.4067620038986206 0 -vt 0.4699110090732574 0.4414939880371094 0 -vt 0.4203630089759827 0.4044510126113892 0 -vt 0.1903489977121353 0.9132689833641052 0 -vt 0 0.9132689833641052 0 -vt 0.6703060269355774 0.9132689833641052 0 -vt 0.3792589902877808 0.06698700040578842 0 -vt 0.4379310011863708 0.06698700040578842 0 -vt 0.4379310011863708 0.9330130219459534 0 -vt 0.3792589902877808 0.1919869929552078 0 -vt 0.3792589902877808 0.9330130219459534 0 -vt 0.2189649939537048 0.1433759927749634 0 -vt 0.2189649939537048 0.9330130219459534 0 -vt 0 0.1433759927749634 0 -vt 0 0.9330130219459534 0 -vt 0.719871997833252 0.25 0 -vt 0.6568959951400757 0.25 0 -vt 0.8588460087776184 0.3472220003604889 0 -vt 0.3792589902877808 0.25 0 -vt 0 0.2166669964790344 0 -vt 0 0.25 0 -vt 0 0.6800450086593628 0 -vt 0.721310019493103 0.6800450086593628 0 -vt 1 0.6800450086593628 0 -vt 0.8758609890937805 0.5 0 -vt 0.6497269868850708 0.4642859995365143 0 -vt 0.2611050009727478 0.4642859995365143 0 -vt 0 0.4166670143604279 0 -vt 0 0.8146960139274597 0 -vt 0.6703060269355774 0.8146960139274597 0 -vt 0.9116590023040771 0.8146960139274597 0 -vt 0.7585179805755615 0.75 0 -vt 0.5653179883956909 0.7142860293388367 0 -vt 0.2287610024213791 0.7142860293388367 0 -vt 0 0.75 0 -vt 0.2777349948883057 0.5337309837341309 0 -vt 0.3167409896850586 0.5444089770317078 0 -vt 0.3253549933433533 0.5303530097007751 0 -vt 0.3324030041694641 0.5128970146179199 0 -vt 0.419871985912323 0.5059530138969421 0 -vt 0.3902159929275513 0.5307300090789795 0 -vt 0.4765799939632416 0.558493971824646 0 -vt 0.5292080044746399 0.5406749844551086 0 -vt 0.5235919952392578 0.6004890203475952 0 -vt 0.5620089769363403 0.5962309837341309 0 -vt 0.5161960124969482 0.6375470161437988 0 -vt 0.5401409864425659 0.6448410153388977 0 -vt 0.4799120128154755 0.6592649817466736 0 -vt 0.4964070022106171 0.6726189851760864 0 -vt 0.4308049976825714 0.6795639991760254 0 -vt 0.4368790090084076 0.6545109748840332 0 -vt 0.3652040064334869 0.6587309837341309 0 -vt 0.3920060098171234 0.6402639746665955 0 -vt 0.379723995923996 0.6103219985961914 0 -vt 0.3324030041694641 0.6101189851760864 0 -vt 0.3585309982299805 0.5761809945106506 0 -vt 0.2886680066585541 0.5823410153388977 0 -vt 0.445345014333725 0.6860769987106323 0 -vt 0.607125997543335 0.786342978477478 0 -vt 0.8164219856262207 0.6093729734420776 0 -vt 0.9782029986381531 0.754476010799408 0 -vt 0.445345014333725 0.5 0 -vt 0.445345014333725 0.3139230012893677 0 -vt 0.8164219856262207 0.3906269967556 0 -vt 0.1835779994726181 0.69098299741745 0 -vt 0.1835779994726181 0.30901700258255 0 -vt 0.02179699949920177 0.19098299741745 0 -vt 0.2835640013217926 0 0 -vt 0.607125997543335 0.2136570066213608 0 -vt 0.9782029986381531 0.2455240041017532 0 -vt 0.2835640013217926 1 0 -vt 0.02179699949920177 0.80901700258255 0 -vt 1 0.9132689833641052 0 -vt 0.8096510171890259 0.9132689833641052 0 -vt 0.329694002866745 0.9132689833641052 0 -vt 0.5620689988136292 0.06698700040578842 0 -vt 0.6207410097122192 0.06698700040578842 0 -vt 0.5620689988136292 0.9330130219459534 0 -vt 0.6207410097122192 0.1919869929552078 0 -vt 0.6207410097122192 0.9330130219459534 0 -vt 0.7810350060462952 0.1433759927749634 0 -vt 0.7810350060462952 0.9330130219459534 0 -vt 1 0.1433759927749634 0 -vt 1 0.9330130219459534 0 -vt 0.3431040048599243 0.25 0 -vt 0.280128002166748 0.25 0 -vt 0.1411540061235428 0.3472220003604889 0 -vt 0.6207410097122192 0.25 0 -vt 1 0.2166669964790344 0 -vt 1 0.25 0 -vt 0.2786900103092194 0.6800450086593628 0 -vt 0.1241390034556389 0.5 0 -vt 0.3502730131149292 0.4642859995365143 0 -vt 0.7388949990272522 0.4642859995365143 0 -vt 1 0.4166670143604279 0 -vt 0.329694002866745 0.8146960139274597 0 -vt 1 0.8146960139274597 0 -vt 0.08834099769592285 0.8146960139274597 0 -vt 0.2414820045232773 0.75 0 -vt 0.4346820116043091 0.7142860293388367 0 -vt 0.7712389826774597 0.7142860293388367 0 -vt 1 0.75 0 -vt 0.6746450066566467 0.5303530097007751 0 -vt 0.6832590103149414 0.5444089770317078 0 -vt 0.7222650051116943 0.5337309837341309 0 -vt 0.6675969958305359 0.5128970146179199 0 -vt 0.580128014087677 0.5059530138969421 0 -vt 0.6097840070724487 0.5307300090789795 0 -vt 0.523419976234436 0.558493971824646 0 -vt 0.4707919955253601 0.5406749844551086 0 -vt 0.4379909932613373 0.5962309837341309 0 -vt 0.4764080047607422 0.6004890203475952 0 -vt 0.4598590135574341 0.6448410153388977 0 -vt 0.4838039875030518 0.6375470161437988 0 -vt 0.5200880169868469 0.6592649817466736 0 -vt 0.5035930275917053 0.6726189851760864 0 -vt 0.5691949725151062 0.6795639991760254 0 -vt 0.5631210207939148 0.6545109748840332 0 -vt 0.6347960233688354 0.6587309837341309 0 -vt 0.6079949736595154 0.6402639746665955 0 -vt 0.6202759742736816 0.6103219985961914 0 -vt 0.6675969958305359 0.6101189851760864 0 -vt 0.6414690017700195 0.5761809945106506 0 -vt 0.7113320231437683 0.5823410153388977 0 -vt 1.046875 0.7720100283622742 0 -vt 0.9567909836769104 0.7309449911117554 0 -vt 0.8992829918861389 0.9703119993209839 0 -vt 0.9425439834594727 0.8885890245437622 0 -vt 0.7200279831886292 0.9022690057754517 0 -vt 0.7071679830551147 1.046875 0 -vt 0.4538260102272034 0.9313979744911194 0 -vt 0.2154179960489273 0.8448349833488464 0 -vt 0.05815599858760834 0.5868980288505554 0 -vt 0.2360229939222336 0.6679760217666626 0 -vt 0.349481999874115 0.4541139900684357 0 -vt 0.1369580030441284 0.3572390079498291 0 -vt 0.046875 0.3161740005016327 0 -vt 0.3723309934139252 0.1989489942789078 0 -vt 0.4473200142383575 0.046875 0 -vt 0.1944639980792999 0.11786799877882 0 -vt 0.6831830143928528 0.07506199926137924 0 -vt 0.674377977848053 0.1724929958581924 0 -vt 0.8633509874343872 0.4091059863567352 0 -vt 0.9277200102806091 0.287975013256073 0 -vt 0.8783320188522339 0.2433450073003769 0 -vt 1.026785969734192 0.5987160205841064 0 -vt 1.035591959953308 0.5012850165367126 0 -vt 0.8346710205078125 0.6752780079841614 0 -vt 0.5326259732246399 0.7017340064048767 0 -vt 0.6168689727783203 0.4118610024452209 0 - -# 747 vertex normals -vn -0.5375880002975464 -0.07179799675941467 0.840146005153656 -vn -0.1515550017356873 -0.01711099967360497 0.9883009791374207 -vn -0.510263979434967 0.3471930027008057 0.7868220210075378 -vn -0.383882999420166 0.7247530221939087 0.572160005569458 -vn 0.006790999788790941 0.5470830202102661 0.8370509743690491 -vn 0.4419640004634857 0.160861998796463 0.8824920058250427 -vn -0.8104130029678345 0.1847179979085922 0.5559759736061096 -vn -0.9155340194702148 0.4022400081157684 0 -vn -0.710112988948822 0.6201850175857544 0.3333309888839722 -vn -0.7216730117797852 0.6078910231590271 -0.3311449885368347 -vn -0.4136289954185486 0.7018579840660095 -0.5799199938774109 -vn -0.4094110131263733 0.9123499989509583 0.0004339999868534505 -vn 0.1323229968547821 0.9380099773406982 0.3203549981117249 -vn 0.1323229968547821 0.9380099773406982 -0.3203549981117249 -vn 0.3397679924964905 0.940509021282196 0 -vn 0.4818519949913025 0.6178590059280396 0.6213449835777283 -vn 0.8813369870185852 0.4724879860877991 0 -vn 0.9429519772529602 -0.3329299986362457 0 -vn 0.7952039837837219 -0.09252200275659561 0.5992419719696045 -vn 0.4818519949913025 0.6178590059280396 -0.6213449835777283 -vn 0.4419640004634857 0.160861998796463 -0.8824920058250427 -vn 0.7952039837837219 -0.09252200275659561 -0.5992419719696045 -vn -0.01252099964767694 0.539700984954834 -0.841763973236084 -vn -0.5448579788208008 0.3272939920425415 -0.7720159888267517 -vn -0.5613030195236206 -0.07517900317907333 -0.8241890072822571 -vn -0.1957750022411346 -0.0270760003477335 -0.9802749752998352 -vn -0.2998470067977905 -0.5292649865150452 -0.793707013130188 -vn 0.1448850035667419 -0.802478015422821 -0.578823983669281 -vn 0.343163013458252 -0.4203700125217438 -0.8399569988250732 -vn 0.7043060064315796 -0.6335020065307617 -0.3203549981117249 -vn 0.2609860002994537 -0.9653429985046387 0.0003220000071451068 -vn 0.173225998878479 -0.8032519817352295 0.569894015789032 -vn 0.7043060064315796 -0.6335020065307617 0.3203549981117249 -vn -0.3462300002574921 -0.8729979991912842 -0.3435100018978119 -vn -0.769195020198822 -0.6390140056610107 0 -vn -0.334289014339447 -0.8776149749755859 0.3435750007629395 -vn -0.7281039953231812 -0.4009419977664948 0.5559759736061096 -vn -0.2649039924144745 -0.5273450016975403 0.8072999715805054 -vn 0.3593209981918335 -0.4139899909496307 0.8363620042800903 -vn -0.9902679920196533 -0.1391730010509491 -0 -vn -0.8104130029678345 0.1847179979085922 -0.5559759736061096 -vn -0.7281039953231812 -0.4009419977664948 -0.5559759736061096 -vn -0.2362789958715439 0.02918500080704689 0.9712470173835754 -vn 0.3209069967269897 -0.1081760004162788 0.9409130215644836 -vn 0.2328509986400604 0.4920690059661865 0.8388379812240601 -vn 0.4011589884757996 0.816008985042572 0.4161730110645294 -vn 0.3620760142803192 0.3835749924182892 0.8495709896087646 -vn 0.1260980069637299 -0.04097200185060501 0.9911710023880005 -vn -0.604686975479126 0.6148959994316101 0.5062180161476135 -vn -0.4789099991321564 0.8778640031814575 0 -vn 0.03857599943876266 0.9693480134010315 0.2426449954509735 -vn 0.03857599943876266 0.9693480134010315 -0.2426449954509735 -vn 0.4011589884757996 0.816008985042572 -0.4161730110645294 -vn 0.3609150052070618 0.9325990080833435 0 -vn 0.4944109916687012 0.798675000667572 0.3430379927158356 -vn 0.4944109916687012 0.798675000667572 -0.3430379927158356 -vn 0.8612650036811829 0.5081560015678406 0 -vn 0.6479099988937378 0.2460869997739792 0.7208700180053711 -vn 0.9510570168495178 -0.30901700258255 0 -vn 0.7433170080184937 -0.668940007686615 0 -vn 0.5354629755020142 -0.3628270030021667 0.7626510262489319 -vn 0.6479099988937378 0.2460860013961792 -0.7208700180053711 -vn 0.1260980069637299 -0.04097200185060501 -0.9911710023880005 -vn 0.5354629755020142 -0.3628270030021667 -0.7626510262489319 -vn 0.3620760142803192 0.3835749924182892 -0.8495709896087646 -vn 0.2328509986400604 0.4920690059661865 -0.8388379812240601 -vn -0.2362789958715439 0.02918500080704689 -0.9712470173835754 -vn 0.3209069967269897 -0.1081760004162788 -0.9409130215644836 -vn 0.1329340040683746 -0.4152190089225769 -0.8999559879302979 -vn 0.1888570040464401 -0.9709110260009766 -0.1471920013427734 -vn 0.1993210017681122 -0.4351809918880463 -0.8780030012130737 -vn -0.8620179891586304 0.08302299678325653 0.5000320076942444 -vn 0.1329340040683746 -0.4152190089225769 0.8999559879302979 -vn 0.1993210017681122 -0.4351809918880463 0.8780019879341125 -vn 0.1888570040464401 -0.9709110260009766 0.1471920013427734 -vn -0.9302049875259399 0.3670400083065033 0 -vn -0.9976400136947632 0.0686580017209053 0 -vn -0.604686975479126 0.6148959994316101 -0.5062180161476135 -vn -0.8620179891586304 0.08302299678325653 -0.5000320076942444 -vn 0.02138300053775311 -0.9165120124816895 0.3994359970092773 -vn -0.7818620204925537 -0.4315609931945801 -0.4499419927597046 -vn 0.9563360214233398 0.2284609973430634 -0.1822829991579056 -vn 0.8339009881019592 -0.1045610010623932 -0.5419189929962158 -vn 0.767799973487854 0.6018419861793518 0.2197020053863525 -vn 0.5461239814758301 0.7825490236282349 0.2989400029182434 -vn 0.9109249711036682 0.174918994307518 -0.3736560046672821 -vn 0.7487580180168152 0.6616759896278381 -0.03931299969553947 -vn 0.949258029460907 -0.04748500138521194 -0.3108929991722107 -vn 0.4068360030651093 0.8022599816322327 -0.4368790090084076 -vn 0.7691559791564941 0.182668998837471 -0.6123980283737183 -vn 0.1995120048522949 0.6090829968452454 -0.7676020264625549 -vn 0.6676030158996582 0.001959000015631318 -0.7445150017738342 -vn -0.0993880033493042 0.4149369895458221 -0.9044049978256226 -vn 0.3527739942073822 0.07949899882078171 -0.932325005531311 -vn -0.2833180129528046 0.4208430051803589 -0.8617550134658813 -vn -0.05747900158166885 0.8575270175933838 0.5112180113792419 -vn 0.1317239999771118 0.7430220246315002 0.6561769843101501 -vn -0.005809000227600336 0.8595520257949829 0.5110160112380981 -vn -0.3505710065364838 0.931430995464325 -0.09765499830245972 -vn -0.6476929783821106 0.6648160219192505 -0.372173011302948 -vn -0.8983089923858643 0.4048080146312714 -0.1707939952611923 -vn -0.8662490248680115 0.4800429940223694 -0.1384589970111847 -vn -0.7151209712028503 0.3602499961853027 0.5990179777145386 -vn -0.8666250109672546 0.3417699933052063 0.3635300099849701 -vn -0.6623769998550415 0.2970130145549774 0.6877800226211548 -vn -0.8117250204086304 0.3888390064239502 0.4357819855213165 -vn -0.9508990049362183 0.2433879971504211 0.1911900043487549 -vn -0.8467730283737183 0.07804299890995026 0.5261989831924438 -vn -0.7594159841537476 0.1409499943256378 0.6351540088653564 -vn -0.9400110244750977 -0.3405149877071381 -0.02069300040602684 -vn -0.9724000096321106 -0.2049909979104996 0.1114299967885017 -vn -0.8170300126075745 -0.3317660093307495 0.4715850055217743 -vn -0.6166999936103821 -0.3858979940414429 0.6861220002174377 -vn -0.5654150247573853 -0.4132109880447388 0.7138370275497437 -vn -0.3424369990825653 -0.3165769875049591 0.884598970413208 -vn -0.2633169889450073 -0.3102239966392517 0.9134690165519714 -vn -0.4920729994773865 -0.6772800087928772 -0.5469520092010498 -vn -0.2165350019931793 -0.8325880169868469 -0.5098140239715576 -vn -0.336313009262085 -0.9366880059242249 -0.09751000255346298 -vn 0.08508399873971939 -0.8829479813575745 0.4616970121860504 -vn 0.1960570067167282 -0.7339509725570679 0.6502910256385803 -vn 0.454815000295639 -0.6157029867172241 0.6434699892997742 -vn 0.4893380105495453 -0.7108240127563477 0.5052499771118164 -vn 0.4581849873065948 -0.6546030044555664 -0.6013000011444092 -vn 0.2736169993877411 -0.5752760171890259 -0.7708380222320557 -vn 0.5572580099105835 -0.6418589949607849 -0.526764988899231 -vn 0.7707909941673279 -0.6368250250816345 0.01830600015819073 -vn 0.8732380270957947 -0.4872829914093018 0.003169999923557043 -vn 0.8787599802017212 -0.285726010799408 -0.3822849988937378 -vn 0.7752519845962524 -0.4531359970569611 -0.4400599896907806 -vn 0.07676800340414047 -0.9022539854049683 -0.4243170022964478 -vn -0.7608579993247986 -0.310029000043869 0.5700669884681702 -vn 0.6989830136299133 0.6327279806137085 -0.333285003900528 -vn 0.9189450144767761 -0.0186110008507967 0.3939450085163116 -vn 0.9469230175018311 0.2427060008049011 0.2107869982719421 -vn 0.5977060198783875 0.7759019732475281 -0.2018010020256042 -vn 0.8984569907188416 0.3959749937057495 0.1896820068359375 -vn 0.5849769711494446 0.7775779962539673 -0.2305970042943954 -vn 0.06112100183963776 0.8655030131340027 0.4971610009670258 -vn 0.81489098072052 0.173455998301506 0.5530520081520081 -vn 0.488323986530304 0.05219599977135658 0.8711000084877014 -vn -0.07333800196647644 0.3724580109119415 0.9251469969749451 -vn -0.1685570031404495 0.420635998249054 0.8914330005645752 -vn 0.5626059770584106 0.01164999976754189 0.8266429901123047 -vn 0.424549013376236 0.2200690060853958 0.8782529830932617 -vn -0.2022739946842194 0.5748890042304993 0.792834997177124 -vn -0.2014950066804886 0.8707110285758972 -0.4486219882965088 -vn -0.1475190073251724 0.7000659704208374 -0.6986740231513977 -vn -0.247406005859375 0.6800289750099182 -0.6901819705963135 -vn -0.6592289805412292 0.7426900267601013 -0.1175960004329681 -vn -0.8238279819488525 0.5144019722938538 0.2381149977445602 -vn -0.8807550072669983 0.462224006652832 0.1030530035495758 -vn -0.8354460000991821 0.5381479859352112 0.1114759966731071 -vn -0.8354330062866211 0.2911489903926849 -0.4661380052566528 -vn -0.7990170121192932 0.4768629968166351 -0.3662959933280945 -vn -0.7965649962425232 -0.008375000208616257 -0.6044949889183044 -vn -0.7460759878158569 0.1244580000638962 -0.654125988483429 -vn -0.8470270037651062 0.2575120031833649 -0.4650079905986786 -vn -0.7743350267410278 0.09411299973726273 -0.6257380247116089 -vn -0.7994340062141418 0.06731099635362625 -0.5969709753990173 -vn -0.914825975894928 -0.4032889902591705 0.0212399996817112 -vn -0.9607080221176147 -0.2765470147132874 0.02371999993920326 -vn -0.7760940194129944 -0.562736988067627 -0.2846130132675171 -vn -0.2481050044298172 -0.5148569941520691 -0.820589005947113 -vn -0.2315990030765533 -0.2342070043087006 -0.9441980123519897 -vn -0.2359499931335449 -0.3241190016269684 -0.9161189794540405 -vn -0.3423370122909546 -0.4482719898223877 -0.825747013092041 -vn -0.3890469968318939 -0.6779909729957581 0.6236749887466431 -vn -0.2865490019321442 -0.8684669733047485 0.4045419991016388 -vn -0.05829200148582458 -0.911346971988678 0.407490998506546 -vn 0.4559510052204132 -0.7950720191001892 -0.3999620079994202 -vn 0.4897150099277496 -0.5246649980545044 -0.6963520050048828 -vn 0.5158429741859436 -0.6365799903869629 -0.5733000040054321 -vn 0.423911988735199 -0.8095009922981262 -0.4062100052833557 -vn 0.5356029868125916 -0.6355810165405273 0.5560269951820374 -vn 0.4908620119094849 -0.4675160050392151 0.7351760268211365 -vn 0.7313770055770874 -0.3685759902000427 0.5737929940223694 -vn 0.8901190161705017 -0.3876970112323761 0.2395379990339279 -vn 0.8836299777030945 -0.404119998216629 0.2363989949226379 -vn 0.8226990103721619 -0.324539989233017 0.4667330086231232 -vn 0.7892469763755798 -0.4085890054702759 0.4584139883518219 -vn -0.07298800349235535 -0.9022539854049683 0.4249840080738068 -vn -0.2881479859352112 -0.512224018573761 -0.8090720176696777 -vn 0.9188060164451599 0.3839870095252991 0.09137199819087982 -vn 0.993162989616394 0.114096000790596 -0.02468799985945225 -vn 0.4343830049037933 0.7090979814529419 0.5554199814796448 -vn 0.4718630015850067 0.8051769733428955 0.3592160046100616 -vn 0.8680509924888611 0.4418930113315582 0.2263129949569702 -vn 0.3869659900665283 0.8111780285835266 0.4384610056877136 -vn 0.9717289805412292 0.2360440045595169 0.005162999965250492 -vn 0.2779389917850494 0.90385901927948 -0.3252519965171814 -vn 0.9075610041618347 0.1839890033006668 -0.377467006444931 -vn 0.3897979855537415 0.4576799869537354 -0.7991160154342651 -vn 0.9741809964179993 -0.04597700014710426 -0.2210370004177094 -vn 0.4417490065097809 0.2665829956531525 -0.8566160202026367 -vn 0.8866739869117737 0.01747499965131283 -0.4620650112628937 -vn 0.3720920085906982 0.3275539875030518 -0.8684790134429932 -vn -0.3850800096988678 0.8340460062026978 0.3950709998607635 -vn -0.4761059880256653 0.6599609851837158 0.581184983253479 -vn -0.5561609864234924 0.6855729818344116 0.4697610139846802 -vn -0.6268590092658997 0.7454360127449036 -0.2266560047864914 -vn -0.5542709827423096 0.4361459910869598 -0.7089149951934814 -vn -0.5615590214729309 0.3103019893169403 -0.7670490145683289 -vn -0.5438100099563599 0.4169149994850159 -0.7283220291137695 -vn -0.9747139811515808 0.1763579994440079 0.1372230052947998 -vn -0.9172520041465759 0.3692820072174072 0.1492629945278168 -vn -0.9827640056610107 -0.03630400076508522 0.1812669932842255 -vn -0.9872050285339355 0.07037699967622757 0.1430840045213699 -vn -0.9887080192565918 0.09066099673509598 -0.119318999350071 -vn -0.9954649806022644 0.06980500370264053 -0.0646279975771904 -vn -0.9868990182876587 0.1531080007553101 -0.0508820004761219 -vn -0.7857019901275635 -0.5462189912796021 -0.2903740108013153 -vn -0.8021669983863831 -0.4474230110645294 -0.3953999876976013 -vn -0.7882999777793884 -0.6091880202293396 -0.08644299954175949 -vn -0.6353080272674561 -0.5868319869041443 0.5020080208778381 -vn -0.7489200234413147 -0.3426479995250702 0.5671960115432739 -vn -0.8290749788284302 -0.1998199969530106 0.5222129821777344 -vn -0.8114089965820313 -0.2435930073261261 0.5312989950180054 -vn -0.02972600050270557 -0.7129759788513184 -0.7005580067634583 -vn -0.1212550029158592 -0.8703849911689758 -0.4772070050239563 -vn 0.1511760056018829 -0.9298509955406189 -0.3354449868202209 -vn 0.2028409987688065 -0.8257309794425964 0.5263310074806213 -vn 0.08091399818658829 -0.5281829833984375 0.8452659845352173 -vn 0.01067500002682209 -0.4742409884929657 0.8803300261497498 -vn 0.0144889997318387 -0.6355460286140442 0.7719269990921021 -vn 0.7427240014076233 -0.5451459884643555 -0.3888140022754669 -vn 0.7865099906921387 -0.3833020031452179 -0.4842329919338226 -vn 0.9205939769744873 -0.3581419885158539 -0.1556950062513351 -vn 0.8897669911384583 -0.3594259917736053 0.2812969982624054 -vn 0.8730049729347229 -0.2942259907722473 0.3889650106430054 -vn 0.9076560139656067 -0.2917299866676331 0.3017520010471344 -vn 0.8630970120429993 -0.4457089900970459 0.2375019937753677 -vn 0.04144300147891045 -0.9088649749755859 -0.415026992559433 -vn -0.1099570021033287 -0.08454799652099609 0.9903339743614197 -vn 0.2451310008764267 0.7632600069046021 -0.5977830290794373 -vn 0.9554449915885925 0.2843270003795624 -0.07926099747419357 -vn 0.8238049745559692 0.5351709723472595 -0.1869129985570908 -vn 0.2853530049324036 0.8679130077362061 -0.4065710008144379 -vn 0.7501500248908997 0.5809810161590576 -0.3158090114593506 -vn 0.193001002073288 0.8577240109443665 -0.4765090048313141 -vn 0.1220619976520538 0.9612579941749573 0.2471510022878647 -vn 0.8907639980316162 0.4299469888210297 -0.147257000207901 -vn 0.8693600296974182 0.404801994562149 0.2834579944610596 -vn 0.3425579965114594 0.6023179888725281 0.7210180163383484 -vn 0.4495930075645447 0.5570510029792786 0.6982550024986267 -vn 0.9799709916114807 0.1605979949235916 0.1177510023117065 -vn 0.9129520058631897 0.3300270140171051 0.2400040030479431 -vn 0.3969599902629852 0.7427070140838623 0.5392670035362244 -vn -0.5626519918441772 0.7477009892463684 -0.3526549935340881 -vn -0.640733003616333 0.5571630001068115 -0.5282340049743652 -vn -0.7121180295944214 0.5705819725990295 -0.4090529978275299 -vn -0.7194139957427979 0.6329879760742188 0.2859529852867126 -vn -0.5416349768638611 0.3929080069065094 0.7431390285491943 -vn -0.5068719983100891 0.4453279972076416 0.7380809783935547 -vn -0.5300359725952148 0.6580139994621277 0.5348640084266663 -vn -0.9993979930877686 0.002857000101357698 -0.03458600118756294 -vn -0.9778590202331543 0.2025559991598129 -0.05256599932909012 -vn -0.9748870134353638 -0.2087630033493042 -0.07754799723625183 -vn -0.9908090233802795 -0.1349709928035736 -0.00891099963337183 -vn -0.9714679718017578 -0.08408299833536148 0.2217649966478348 -vn -0.9839869737625122 -0.0358319990336895 0.1746020019054413 -vn -0.9879299998283386 0.05565499886870384 0.1445589959621429 -vn -0.6447849869728088 -0.6683390140533447 0.3709119856357574 -vn -0.6672559976577759 -0.5719799995422363 0.4770840108394623 -vn -0.6573889851570129 -0.7345010042190552 0.1683689951896667 -vn -0.5605350136756897 -0.7363070249557495 -0.3790149986743927 -vn -0.692903995513916 -0.5403270125389099 -0.4774209856987 -vn -0.805446982383728 -0.4507080018520355 -0.3848600089550018 -vn -0.8070970177650452 -0.5522969961166382 -0.2087150067090988 -vn 0.1668089926242828 -0.6945620179176331 0.699828028678894 -vn 0.08150500059127808 -0.8694409728050232 0.4872680008411407 -vn 0.3440600037574768 -0.8835279941558838 0.3178069889545441 -vn 0.3032650053501129 -0.806547999382019 -0.5074549913406372 -vn 0.1325059980154037 -0.5874869823455811 -0.7983120083808899 -vn 0.02260999940335751 -0.6936299800872803 -0.719976007938385 -vn 0.04509999975562096 -0.9239140152931213 -0.3799329996109009 -vn 0.8621219992637634 -0.401540994644165 0.3090479969978333 -vn 0.8867239952087402 -0.2328619956970215 0.3993679881095886 -vn 0.9798589944839478 -0.1908919960260391 0.05861499905586243 -vn 0.9012619853019714 -0.1982769966125488 -0.3852449953556061 -vn 0.8543739914894104 -0.1819390058517456 -0.4867680072784424 -vn 0.9012380242347717 -0.2525070011615753 -0.3521510064601898 -vn 0.8982779979705811 -0.4129990041255951 -0.1500930041074753 -vn -0.272473007440567 -0.9165120124816895 -0.2928540110588074 -vn 0.2474620044231415 -0.4315969944000244 0.8674600124359131 -vn 0.3753190040588379 0.6018419861793518 -0.7049270272254944 -vn 0.9690999984741211 -0.1045589968562126 -0.2234120070934296 -vn 0.7954490184783936 0.2284629940986633 -0.5613070130348206 -vn 0.1643320024013519 0.7825480103492737 -0.6005110144615173 -vn 0.9015669822692871 0.174918994307518 -0.395700991153717 -vn 0.5484110116958618 0.6616759896278381 -0.5113030076026917 -vn 0.596875011920929 0.8022609949111938 0.01082899980247021 -vn 0.8830479979515076 -0.04748399928212166 -0.4668749868869781 -vn 0.9758470058441162 0.1404889971017838 -0.1672890037298203 -vn 0.6950060129165649 0.6005629897117615 0.3953349888324738 -vn 0.8043910264968872 0.3754850029945374 0.4603970050811768 -vn 0.9504550099372864 -0.06233000010251999 -0.3045510053634644 -vn 0.9899749755859375 0.07949800044298172 -0.1167469993233681 -vn 0.7676119804382324 0.4208459854125977 0.4833849966526031 -vn -0.4076670110225677 0.8575270175933838 -0.3137750029563904 -vn -0.3805089890956879 0.7430220246315002 -0.550574004650116 -vn -0.371628999710083 0.8595520257949829 -0.3508029878139496 -vn -0.1732809990644455 0.931430995464325 0.320017009973526 -vn -0.08834400027990341 0.681833028793335 0.7261540293693542 -vn -0.09786199778318405 0.460783988237381 0.882099986076355 -vn -0.07521700114011765 0.4800420105457306 0.8740149736404419 -vn -0.9276620149612427 0.3602499961853027 0.09830199927091599 -vn -0.8635100126266479 0.3417719900608063 0.3708679974079132 -vn -0.9548730254173279 0.2970120012760162 -0.001296999980695546 -vn -0.877348005771637 0.388837993144989 0.2811869978904724 -vn -0.7982050180435181 0.2586430013179779 0.5440329909324646 -vn -0.8309450149536133 0.1299329996109009 0.5409700274467468 -vn -0.80000901222229 0.1409460008144379 0.5831969976425171 -vn -0.6381030082702637 -0.3405129909515381 0.6905620098114014 -vn -0.7556419968605042 -0.2049909979104996 0.6220800280570984 -vn -0.9067860245704651 -0.3317669928073883 0.2601329982280731 -vn -0.9219499826431274 -0.3858990073204041 -0.03300400078296661 -vn -0.9323030114173889 -0.3608480095863342 -0.02450799942016602 -vn -0.9716429710388184 -0.2363799959421158 0.005919000133872032 -vn -0.9500359892845154 -0.3102270066738129 0.03450300171971321 -vn 0.05162100121378899 -0.6772800087928772 0.7339119911193848 -vn 0.2163099944591522 -0.8325870037078857 0.509909987449646 -vn -0.1634809970855713 -0.9366880059242249 0.3096620142459869 -vn -0.2730129957199097 -0.8829479813575745 -0.3819249868392944 -vn -0.3344889879226685 -0.7286760210990906 -0.5976189970970154 -vn -0.4082350134849548 -0.6025800108909607 -0.6857410073280334 -vn -0.3718569874763489 -0.7108250260353088 -0.5970349907875061 -vn 0.7508220076560974 -0.6546019911766052 0.08810699731111526 -vn 0.7445650100708008 -0.5752760171890259 0.3386459946632385 -vn 0.7660269737243652 -0.6418589949607849 -0.03493599966168404 -vn 0.5222679972648621 -0.6368250250816345 -0.5671759843826294 -vn 0.5276669859886169 -0.5274670124053955 -0.6658419966697693 -vn 0.6410369873046875 -0.3752210140228271 -0.6695380210876465 -vn 0.6145420074462891 -0.4531340003013611 -0.6457610130310059 -vn -0.2724759876728058 -0.9165120124816895 0.2928540110588074 -vn 0.2474450021982193 -0.4315490126609802 -0.8674880266189575 -vn 0.7954490184783936 0.2284629940986633 0.5613070130348206 -vn 0.9690999984741211 -0.1045589968562126 0.2234120070934296 -vn 0.3753179907798767 0.6018419861793518 0.7049270272254944 -vn 0.1643320024013519 0.7825480103492737 0.6005110144615173 -vn 0.9015669822692871 0.174918994307518 0.395700991153717 -vn 0.5484099984169006 0.6616759896278381 0.5113030076026917 -vn 0.8830469846725464 -0.04748500138521194 0.4668749868869781 -vn 0.596875011920929 0.8022609949111938 -0.01082899980247021 -vn 0.9758470058441162 0.1404889971017838 0.1672890037298203 -vn 0.6950060129165649 0.6005640029907227 -0.3953360021114349 -vn 0.9504539966583252 -0.06233000010251999 0.3045510053634644 -vn 0.8043910264968872 0.3754850029945374 -0.4603970050811768 -vn 0.9899749755859375 0.07949800044298172 0.1167469993233681 -vn 0.767611026763916 0.4208459854125977 -0.4833849966526031 -vn -0.4076670110225677 0.8575270175933838 0.3137750029563904 -vn -0.3805089890956879 0.7430220246315002 0.550574004650116 -vn -0.371628999710083 0.8595520257949829 0.3508029878139496 -vn -0.1732809990644455 0.931430995464325 -0.320017009973526 -vn -0.0883449986577034 0.681833028793335 -0.7261540293693542 -vn -0.09786199778318405 0.460783988237381 -0.882099986076355 -vn -0.07521700114011765 0.4800420105457306 -0.8740149736404419 -vn -0.9276620149612427 0.3602499961853027 -0.09830199927091599 -vn -0.8635100126266479 0.3417719900608063 -0.3708679974079132 -vn -0.9548730254173279 0.2970120012760162 0.001296999980695546 -vn -0.877348005771637 0.388837993144989 -0.2811869978904724 -vn -0.7982050180435181 0.2586430013179779 -0.5440329909324646 -vn -0.8309450149536133 0.1299329996109009 -0.5409700274467468 -vn -0.8000100255012512 0.1409450024366379 -0.5831959843635559 -vn -0.6381030082702637 -0.3405129909515381 -0.6905620098114014 -vn -0.7556419968605042 -0.2049909979104996 -0.6220809817314148 -vn -0.9067860245704651 -0.3317669928073883 -0.2601329982280731 -vn -0.9219499826431274 -0.3858990073204041 0.03300400078296661 -vn -0.9323030114173889 -0.3608480095863342 0.02450799942016602 -vn -0.9716429710388184 -0.2363799959421158 -0.005919000133872032 -vn -0.9500359892845154 -0.3102270066738129 -0.03450300171971321 -vn 0.05162100121378899 -0.6772800087928772 -0.7339119911193848 -vn 0.2163099944591522 -0.8325870037078857 -0.509909987449646 -vn -0.1634809970855713 -0.9366869926452637 -0.3096620142459869 -vn -0.2730129957199097 -0.8829479813575745 0.3819249868392944 -vn -0.3344880044460297 -0.7286760210990906 0.5976200103759766 -vn -0.4082350134849548 -0.6025800108909607 0.6857410073280334 -vn -0.3718569874763489 -0.7108250260353088 0.5970349907875061 -vn 0.7508220076560974 -0.6546019911766052 -0.08810699731111526 -vn 0.7445650100708008 -0.5752760171890259 -0.3386459946632385 -vn 0.7660269737243652 -0.6418589949607849 0.03493599966168404 -vn 0.5222679972648621 -0.6368250250816345 0.5671769976615906 -vn 0.5276669859886169 -0.5274670124053955 0.6658419966697693 -vn 0.6410369873046875 -0.3752210140228271 0.6695380210876465 -vn 0.6145420074462891 -0.4531340003013611 0.6457610130310059 -vn -0.287102997303009 -0.9309409856796265 -0.2256560027599335 -vn 0.1843679994344711 -0.4218010008335114 0.8877459764480591 -vn 0.07405100017786026 0.6319169998168945 -0.7714899778366089 -vn 0.8553329706192017 0.06064699962735176 -0.5145170092582703 -vn 0.7307729721069336 0.3228900134563446 -0.6014260053634644 -vn 0.2098069936037064 0.7427859902381897 -0.6358069777488708 -vn 0.6162220239639282 0.3713270127773285 -0.6945400238037109 -vn 0.09581899642944336 0.7464309930801392 -0.6585279703140259 -vn 0.4080640077590942 0.9123439788818359 0.03336000069975853 -vn 0.8213359713554382 0.1804669946432114 -0.5411459803581238 -vn 0.969681978225708 0.1661700010299683 -0.17917600274086 -vn 0.7540370225906372 0.5044180154800415 0.4207040071487427 -vn 0.828561007976532 0.3165900111198425 0.4617980122566223 -vn 0.9432830214500427 -0.08009400218725204 -0.3221819996833801 -vn 0.9967989921569824 0.009220999665558338 -0.07941699773073196 -vn 0.775767982006073 0.3821409940719604 0.5021479725837708 -vn -0.5359219908714294 0.8157860040664673 -0.2174420058727264 -vn -0.7117419838905334 0.631197988986969 -0.3082410097122192 -vn -0.7205860018730164 0.6709820032119751 -0.1747539937496185 -vn -0.4114960134029388 0.7961680293083191 0.4436070024967194 -vn -0.0943790003657341 0.527301013469696 0.8444210290908813 -vn -0.06975200027227402 0.4077039957046509 0.9104459881782532 -vn -0.07522699981927872 0.5093169808387756 0.8572840094566345 -vn -0.899321973323822 0.2172179967164993 0.3795219957828522 -vn -0.8569710254669189 0.4048359990119934 0.318917989730835 -vn -0.9294880032539368 0.002263000002130866 0.3688459992408752 -vn -0.9130200147628784 0.1119910031557083 0.3922390043735504 -vn -0.7752439975738525 0.1555069983005524 0.6122210025787354 -vn -0.809952974319458 0.130293995141983 0.5718389749526978 -vn -0.8099700212478638 0.21145099401474 0.5470259785652161 -vn -0.5124379992485046 -0.4739649891853333 0.7160750031471252 -vn -0.4707460105419159 -0.3654879927635193 0.8030049800872803 -vn -0.6227080225944519 -0.5545240044593811 0.5520300269126892 -vn -0.8047950267791748 -0.5929269790649414 -0.02723599970340729 -vn -0.9356880187988281 -0.3495660126209259 -0.04786499962210655 -vn -0.9798259735107422 -0.1990929991006851 0.01738799922168255 -vn -0.9696599841117859 -0.2444050014019012 0.004995000082999468 -vn 0.3460299968719482 -0.6453220248222351 0.6810449957847595 -vn 0.1500509977340698 -0.8165979981422424 0.5573610067367554 -vn 0.305963009595871 -0.9033949971199036 0.3004390001296997 -vn -0.1068940013647079 -0.8791000247001648 -0.4644969999790192 -vn -0.3793039917945862 -0.6047009825706482 -0.70033198595047 -vn -0.4574509859085083 -0.5502709746360779 -0.6985269784927368 -vn -0.3967710137367249 -0.701295018196106 -0.5922489762306213 -vn 0.8359060287475586 -0.5488340258598328 -0.006517999805510044 -vn 0.9236019849777222 -0.3818440139293671 0.03396600112318993 -vn 0.8632140159606934 -0.3933719992637634 -0.3164179921150208 -vn 0.6054999828338623 -0.4316779971122742 -0.6685979962348938 -vn 0.5342289805412292 -0.3754520118236542 -0.7573869824409485 -vn 0.6098309755325317 -0.3671579957008362 -0.7023540139198303 -vn 0.6060940027236938 -0.5121269822120667 -0.6085860133171082 -vn -0.2871040105819702 -0.9309409856796265 0.2256550043821335 -vn 0.1843840032815933 -0.4217509925365448 -0.8877660036087036 -vn 0.7307729721069336 0.3228900134563446 0.6014260053634644 -vn 0.8553329706192017 0.06064699962735176 0.5145170092582703 -vn 0.07405100017786026 0.6319169998168945 0.7714899778366089 -vn 0.2098069936037064 0.7427859902381897 0.6358069777488708 -vn 0.6162220239639282 0.3713270127773285 0.6945400238037109 -vn 0.09581799805164337 0.7464309930801392 0.6585279703140259 -vn 0.8213359713554382 0.1804669946432114 0.5411450266838074 -vn 0.4080640077590942 0.9123439788818359 -0.03336000069975853 -vn 0.969681978225708 0.1661700010299683 0.17917500436306 -vn 0.7540370225906372 0.5044180154800415 -0.4207040071487427 -vn 0.9432830214500427 -0.08009400218725204 0.3221819996833801 -vn 0.8285599946975708 0.3165900111198425 -0.4617989957332611 -vn 0.9967989921569824 0.009220999665558338 0.07941699773073196 -vn 0.775767982006073 0.3821409940719604 -0.5021479725837708 -vn -0.5359219908714294 0.8157860040664673 0.2174420058727264 -vn -0.7117419838905334 0.631197988986969 0.3082410097122192 -vn -0.7205860018730164 0.6709820032119751 0.1747539937496185 -vn -0.4114960134029388 0.7961680293083191 -0.4436070024967194 -vn -0.09437999874353409 0.527301013469696 -0.8444210290908813 -vn -0.06975200027227402 0.4077039957046509 -0.9104459881782532 -vn -0.07522699981927872 0.5093169808387756 -0.8572850227355957 -vn -0.899321973323822 0.2172179967164993 -0.3795219957828522 -vn -0.8569710254669189 0.4048359990119934 -0.318917989730835 -vn -0.9294880032539368 0.002263000002130866 -0.3688449859619141 -vn -0.9130200147628784 0.1119910031557083 -0.3922390043735504 -vn -0.7752439975738525 0.1555059999227524 -0.6122210025787354 -vn -0.8099520206451416 0.130293995141983 -0.5718389749526978 -vn -0.8099690079689026 0.21144999563694 -0.5470269918441772 -vn -0.5124379992485046 -0.4739649891853333 -0.7160750031471252 -vn -0.4707460105419159 -0.3654879927635193 -0.8030049800872803 -vn -0.6227080225944519 -0.5545240044593811 -0.5520300269126892 -vn -0.8047950267791748 -0.5929279923439026 0.02723599970340729 -vn -0.9356880187988281 -0.3495660126209259 0.04786499962210655 -vn -0.9798259735107422 -0.1990929991006851 -0.01738799922168255 -vn -0.9696599841117859 -0.2444050014019012 -0.004995000082999468 -vn 0.3460299968719482 -0.6453220248222351 -0.6810449957847595 -vn 0.1500509977340698 -0.8165979981422424 -0.5573610067367554 -vn 0.3059639930725098 -0.9033949971199036 -0.3004390001296997 -vn -0.1068949997425079 -0.8791000247001648 0.464495986700058 -vn -0.3793050050735474 -0.6047009825706482 0.70033198595047 -vn -0.4574509859085083 -0.5502709746360779 0.6985269784927368 -vn -0.3967710137367249 -0.7012940049171448 0.5922489762306213 -vn 0.8359060287475586 -0.5488340258598328 0.006517999805510044 -vn 0.9236019849777222 -0.3818440139293671 -0.03396600112318993 -vn 0.8632140159606934 -0.3933730125427246 0.3164179921150208 -vn 0.6054999828338623 -0.4316790103912354 0.6685979962348938 -vn 0.5342299938201904 -0.3754520118236542 0.7573869824409485 -vn 0.6098309755325317 -0.3671579957008362 0.7023540139198303 -vn 0.6060940027236938 -0.5121260285377502 0.6085860133171082 -vn 0 0 0 -vn 0.8919450044631958 0.3336060047149658 -0.3051899969577789 -vn 0.8852859735488892 -0.05170800164341927 0.4621630012989044 -vn 0.8717010021209717 -0.4864040017127991 -0.05957400053739548 -vn 0.6025350093841553 -0.1140230000019073 0.7899060249328613 -vn 0.7673320174217224 -0.6138780117034912 0.1853529959917068 -vn 0.6157039999961853 -0.2387659996747971 0.750931978225708 -vn -0.1322280019521713 0.07659800350666046 0.9882550239562988 -vn -0.1344829946756363 0.2189230024814606 0.9664300084114075 -vn -0.08265399932861328 0.3330360054969788 0.9392849802970886 -vn -0.7942630052566528 0.3628509938716888 0.4873250126838684 -vn -0.686972975730896 0.5388749837875366 0.4875270128250122 -vn -0.9116560220718384 -0.2424139976501465 -0.3318400084972382 -vn -0.903469979763031 -0.005853999871760607 -0.4286110103130341 -vn -0.8802070021629333 0.2844929993152618 -0.3798680007457733 -vn -0.3590719997882843 -0.2934069931507111 -0.8859909772872925 -vn -0.5312150120735168 -0.1616500020027161 -0.8316730260848999 -vn 0.5217099785804749 -0.3334519863128662 -0.7852569818496704 -vn 0.4982230067253113 -0.5182129740715027 -0.6951469779014587 -vn 0.3192520141601563 -0.6669300198554993 -0.6732630133628845 -vn 0.4172089993953705 0.6029300093650818 -0.6800090074539185 -vn -0.3909519910812378 -0.5063930153846741 -0.7685850262641907 -vn -0.785847008228302 -0.2199160009622574 -0.5779989957809448 -vn -0.1128029972314835 -0.7670649886131287 -0.6315749883651733 -vn -0.6768519878387451 -0.4520730078220367 -0.5809479951858521 -vn -0.07061299681663513 -0.7851089835166931 -0.6153200268745422 -vn 0.4044640064239502 -0.913004994392395 -0.05320600047707558 -vn 0.5100409984588623 -0.8511109948158264 -0.1243719980120659 -vn 0.600862979888916 -0.7767530083656311 -0.188727006316185 -vn 0.7341600060462952 -0.2982490062713623 0.6099640130996704 -vn 0.8028550148010254 -0.2451270073652267 0.5434489846229553 -vn 0.2039200067520142 0.286547988653183 0.9361129999160767 -vn 0.2590579986572266 0.3469229936599731 0.90140700340271 -vn 0.3050769865512848 0.4136070013046265 0.857820987701416 -vn -0.3951399922370911 0.6723129749298096 0.6259869933128357 -vn -0.3882040083408356 0.6723269820213318 0.6302970051765442 -vn -0.8444070219993591 0.5085629820823669 -0.1683440059423447 -vn -0.9073770046234131 0.4102010130882263 -0.09166599810123444 -vn -0.9431279897689819 0.3317759931087494 0.02084000036120415 -vn -0.03268500044941902 0.9875209927558899 0.1540600061416626 -vn 0.2856169939041138 0.9530180096626282 0.1008900031447411 -vn 0.3564079999923706 0.9297230243682861 0.092678003013134 -vn 0.05804499983787537 0.9152950048446655 0.3985790014266968 -vn -0.4380980134010315 -0.8398249745368958 0.3205699920654297 -vn 0.0398080013692379 -0.7493849992752075 0.6609370112419128 -vn -0.4364219903945923 -0.7586889863014221 0.4836600124835968 -vn -0.1446219980716705 0.8584669828414917 0.4920569956302643 -vn -0.3905079960823059 -0.8025469779968262 0.4510230123996735 -vn -0.3789550065994263 0.7686259746551514 0.5153710246086121 -vn -0.3518399894237518 -0.8554270267486572 0.3800710141658783 -vn -0.5039129853248596 0.8112840056419373 0.2964630126953125 -vn -0.4345029890537262 -0.8862379789352417 0.1605930030345917 -vn -0.5895540118217468 0.7668499946594238 0.2537069916725159 -vn 0.4611240029335022 -0.5667420029640198 0.682765007019043 -vn -0.03327900171279907 -0.5302489995956421 0.8471890091896057 -vn -0.1550759971141815 -0.4793860018253326 0.8637940287590027 -vn -0.3325540125370026 -0.6754969954490662 0.6581119894981384 -vn -0.6243529915809631 -0.6490340232849121 0.434671014547348 -vn -0.6404299736022949 -0.7232750058174133 0.258307009935379 -vn 0.8391460180282593 -0.5209720134735107 0.1562740057706833 -vn 0.9793859720230103 -0.04739199951291084 0.1963589936494827 -vn 0.8591970205307007 -0.01306600030511618 0.5114780068397522 -vn 0.1697809994220734 0.01797799952328205 0.9853180050849915 -vn -0.2981239855289459 0.09316399693489075 0.949970006942749 -vn -0.6025810241699219 0.1407950073480606 0.785539984703064 -vn -0.7606229782104492 0.3568800091743469 0.5422999858856201 -vn -0.9164419770240784 -0.01278399955481291 0.3999640047550201 -vn 0.7099589705467224 0.6897799968719482 0.1419920027256012 -vn 0.6163280010223389 0.7111549973487854 0.3382270038127899 -vn 0.1215279996395111 0.6381019949913025 0.7602999806404114 -vn -0.3081580102443695 0.474483996629715 0.8245630264282227 -vn -0.5849490165710449 0.4978660047054291 0.64028400182724 -vn -0.8313949704170227 0.3698750138282776 0.414698988199234 -vn -0.7773889899253845 0.439754992723465 0.4497570097446442 -vn -0.7120980024337769 0.07437500357627869 0.6981300115585327 -vn -0.5221620202064514 -0.5821250081062317 0.6232789754867554 -vn -0.5362930297851563 0.8426250219345093 0.04870999976992607 -vn -0.6278550028800964 0.7403159737586975 0.2402739971876144 -vn -0.817995011806488 0.4767960011959076 0.3217920064926147 -vn -0.7291709780693054 0.6557949781417847 0.1955550014972687 -vn -0.9585440158843994 0.2151080071926117 0.1868750005960464 -vn -0.9505919814109802 0.1639280021190643 0.2636339962482452 -vn -0.9833920001983643 -0.02283000014722347 0.1800519973039627 -vn -0.8917449712753296 0.1107539981603622 0.4387759864330292 -vn -0.9918580055236816 -0.08782999962568283 0.09221799671649933 -vn -0.8591039776802063 0.04482100158929825 0.5098350048065186 -vn -0.8949519991874695 -0.4028989970684052 0.1916580051183701 -vn -0.9036110043525696 0.009092999622225761 0.4282569885253906 -vn -0.8893200159072876 0.01745700091123581 0.4569520056247711 -vn -0.7315409779548645 -0.4924210011959076 0.4715610146522522 -vn -0.7941030263900757 -0.1783780008554459 0.581017017364502 -vn -0.6259329915046692 -0.3735530078411102 0.6845920085906982 -vn -0.5845080018043518 -0.1848309934139252 0.7900559902191162 -vn -0.8015180230140686 -0.1042689979076385 0.5888090133666992 -vn -0.6420310139656067 -0.2967270016670227 0.7069290280342102 -vn -0.8202810287475586 -0.1234560012817383 0.5584779977798462 -vn 0.01690500043332577 -0.9364719986915588 -0.3503330051898956 -vn -0.09879499673843384 -0.7398999929428101 -0.6654229760169983 -vn -0.06946200132369995 -0.9367489814758301 -0.3430390059947968 -vn 0.123930998146534 -0.9922909736633301 0 -vn 0.03589100018143654 -0.8559809923171997 -0.5157600045204163 -vn -0.0289510004222393 -0.999580979347229 0 -vn 0.01690500043332577 -0.9364719986915588 0.3503330051898956 -vn -0.06946200132369995 -0.9367489814758301 0.3430390059947968 -vn -0.3344019949436188 -0.9161610007286072 -0.2209639996290207 -vn -0.7904769778251648 -0.6124920248985291 -0 -vn -0.3344019949436188 -0.9161610007286072 0.2209639996290207 -vn -0.7410100102424622 -0.556659996509552 0.375544011592865 -vn -0.2743130028247833 -0.8896610140800476 0.3650420010089874 -vn -0.09879499673843384 -0.7398999929428101 0.6654229760169983 -vn 0.03589100018143654 -0.8559809923171997 0.5157600045204163 -vn -0.2743130028247833 -0.8896610140800476 -0.3650420010089874 -vn -0.7410100102424622 -0.556659996509552 -0.375544011592865 -vn 0.3564079999923706 0.9297230243682861 -0.092678003013134 -vn 0.2856169939041138 0.9530180096626282 -0.1008900031447411 -vn -0.03268500044941902 0.9875209927558899 -0.1540600061416626 -vn 0.05804499983787537 0.9152950048446655 -0.3985790014266968 -vn -0.4364219903945923 -0.7586889863014221 -0.4836600124835968 -vn 0.0398080013692379 -0.7493849992752075 -0.6609370112419128 -vn -0.4380980134010315 -0.8398249745368958 -0.3205699920654297 -vn -0.1446219980716705 0.8584669828414917 -0.4920569956302643 -vn -0.3905079960823059 -0.8025469779968262 -0.4510230123996735 -vn -0.3789550065994263 0.7686259746551514 -0.5153710246086121 -vn -0.3518399894237518 -0.8554270267486572 -0.3800710141658783 -vn -0.5039129853248596 0.8112840056419373 -0.2964630126953125 -vn -0.4345029890537262 -0.8862379789352417 -0.1605930030345917 -vn -0.5895540118217468 0.7668499946594238 -0.2537069916725159 -vn -0.03327900171279907 -0.5302489995956421 -0.8471890091896057 -vn 0.4611240029335022 -0.5667420029640198 -0.682765007019043 -vn -0.1550759971141815 -0.4793860018253326 -0.8637940287590027 -vn -0.3325540125370026 -0.6754969954490662 -0.6581119894981384 -vn -0.624351978302002 -0.6490340232849121 -0.434671014547348 -vn -0.6404299736022949 -0.7232750058174133 -0.258307009935379 -vn 0.9793859720230103 -0.04739199951291084 -0.1963589936494827 -vn 0.8391469717025757 -0.5209720134735107 -0.1562740057706833 -vn 0.8591970205307007 -0.01306699961423874 -0.5114780068397522 -vn 0.1697809994220734 0.01797799952328205 -0.9853180050849915 -vn -0.2981239855289459 0.09316399693489075 -0.949970006942749 -vn -0.6025800108909607 0.1407950073480606 -0.785539984703064 -vn -0.7606229782104492 0.3568800091743469 -0.5422999858856201 -vn -0.9164419770240784 -0.01278399955481291 -0.3999640047550201 -vn 0.6163280010223389 0.7111549973487854 -0.3382270038127899 -vn 0.7099589705467224 0.6897799968719482 -0.1419920027256012 -vn 0.1215270012617111 0.6381019949913025 -0.7602999806404114 -vn -0.3081580102443695 0.474483996629715 -0.8245630264282227 -vn -0.5849490165710449 0.4978669881820679 -0.64028400182724 -vn -0.8313949704170227 0.3698750138282776 -0.414698988199234 -vn -0.7773889899253845 0.439754992723465 -0.4497570097446442 -vn -0.5362920165061951 0.8426259756088257 -0.04870999976992607 -vn -0.522163987159729 -0.5821229815483093 -0.6232799887657166 -vn -0.7120980024337769 0.07437700033187866 -0.6981289982795715 -vn -0.6278539896011353 0.7403159737586975 -0.2402739971876144 -vn -0.817995011806488 0.4767970144748688 -0.3217920064926147 -vn -0.7291709780693054 0.6557959914207458 -0.1955550014972687 -vn -0.9585440158843994 0.2151080071926117 -0.1868750005960464 -vn -0.9505919814109802 0.1639280021190643 -0.2636339962482452 -vn -0.8917449712753296 0.1107529997825623 -0.4387759864330292 -vn -0.9833920001983643 -0.02283000014722347 -0.1800529956817627 -vn -0.8591039776802063 0.04482100158929825 -0.5098339915275574 -vn -0.9918580055236816 -0.08783099800348282 -0.09221699833869934 -vn -0.8949530124664307 -0.4028989970684052 -0.1916570067405701 -vn -0.9036110043525696 0.009092999622225761 -0.4282569885253906 -vn -0.8893200159072876 0.0174579992890358 -0.4569520056247711 -vn -0.7315409779548645 -0.4924199879169464 -0.4715610146522522 -vn -0.7941030263900757 -0.1783780008554459 -0.5810179710388184 -vn -0.625931978225708 -0.3735530078411102 -0.6845930218696594 -vn -0.5845069885253906 -0.1848299950361252 -0.7900559902191162 -vn -0.8015180230140686 -0.1042689979076385 -0.5888090133666992 -vn -0.6420310139656067 -0.2967270016670227 -0.7069299817085266 -vn -0.8202810287475586 -0.1234560012817383 -0.5584779977798462 -vn 0.8919439911842346 0.3336179852485657 0.3051789999008179 -vn 0.6025350093841553 -0.1140210032463074 -0.7899050116539001 -vn 0.8717020153999329 -0.4864020049571991 0.05957499891519547 -vn 0.8852850198745728 -0.05170699954032898 -0.4621649980545044 -vn 0.7673349976539612 -0.6138749718666077 -0.1853519976139069 -vn 0.6157060265541077 -0.2387650012969971 -0.7509310245513916 -vn -0.1322280019521713 0.07659800350666046 -0.9882550239562988 -vn -0.1344819962978363 0.2189230024814606 -0.9664300084114075 -vn -0.08265399932861328 0.3330360054969788 -0.9392840266227722 -vn -0.7942630052566528 0.3628509938716888 -0.4873250126838684 -vn -0.686972975730896 0.5388749837875366 -0.487525999546051 -vn -0.9116560220718384 -0.2424139976501465 0.3318400084972382 -vn -0.903469979763031 -0.005853999871760607 0.4286110103130341 -vn -0.8802070021629333 0.2844929993152618 0.3798680007457733 -vn -0.3590719997882843 -0.2934069931507111 0.8859909772872925 -vn -0.5312150120735168 -0.1616500020027161 0.8316730260848999 -vn 0.5217090249061584 -0.3334519863128662 0.7852579951286316 -vn 0.4982230067253113 -0.5182120203971863 0.6951479911804199 -vn 0.319252997636795 -0.6669290065765381 0.6732640266418457 -vn 0.4172079861164093 0.602931022644043 0.6800090074539185 -vn -0.1128029972314835 -0.7670649886131287 0.6315749883651733 -vn -0.785847008228302 -0.2199160009622574 0.5779979825019836 -vn -0.3909519910812378 -0.5063920021057129 0.7685850262641907 -vn -0.6768519878387451 -0.4520730078220367 0.5809479951858521 -vn -0.07061299681663513 -0.7851079702377319 0.6153200268745422 -vn 0.4044640064239502 -0.913004994392395 0.05320600047707558 -vn 0.5100420117378235 -0.8511109948158264 0.1243719980120659 -vn 0.600862979888916 -0.7767530083656311 0.188727006316185 -vn 0.7341600060462952 -0.2982490062713623 -0.6099640130996704 -vn 0.8028540015220642 -0.2451270073652267 -0.5434499979019165 -vn 0.2039200067520142 0.286547988653183 -0.9361129999160767 -vn 0.2590579986572266 0.3469229936599731 -0.90140700340271 -vn 0.3050769865512848 0.4136070013046265 -0.857820987701416 -vn -0.3951399922370911 0.6723120212554932 -0.6259880065917969 -vn -0.3882040083408356 0.6723269820213318 -0.6302970051765442 -vn -0.8444070219993591 0.5085629820823669 0.1683440059423447 -vn -0.9073770046234131 0.4102010130882263 0.09166599810123444 -vn -0.9431279897689819 0.3317759931087494 -0.02084000036120415 -vn 0.09283199906349182 0.3405439853668213 0.9356340169906616 -vn 0.4332149922847748 0.3082599937915802 0.8469359874725342 -vn 0.07513599842786789 0.7418090105056763 0.666388988494873 -vn -0.3755930066108704 0.6224439740180969 0.6866539716720581 -vn -0.6413879990577698 0.6895880103111267 0.3362880051136017 -vn -0.3539179861545563 0.8731229901313782 0.3352580070495605 -vn -0.6627640128135681 0.7462409734725952 -0.06218799948692322 -vn -0.5455629825592041 0.6585090160369873 -0.5183889865875244 -vn -0.5422859787940979 0.2685939967632294 -0.7961050271987915 -vn -0.7763820290565491 0.4680269956588745 -0.4221160113811493 -vn -0.9955589771270752 -0.03219699859619141 -0.08845899999141693 -vn -0.7381539940834045 -0.2307370007038116 -0.633948028087616 -vn -0.433216005563736 -0.3082579970359802 -0.8469359874725342 -vn -0.7763850092887878 -0.6298570036888123 -0.02251699939370155 -vn -0.4675639867782593 -0.8743969798088074 0.1296679973602295 -vn -0.5422919988632202 -0.7174760103225708 -0.4372040033340454 -vn -0.1898339986801147 -0.8541020154953003 0.4842230081558228 -vn -0.5458049774169922 -0.7113950252532959 0.4427349865436554 -vn -0.6413909792900085 -0.3120909929275513 0.7008680105209351 -vn -0.2153560072183609 -0.6237800121307373 0.7513459920883179 -vn 0.03750099986791611 -0.724698007106781 0.6880459785461426 -vn -0.3755939900875092 -0.03544300049543381 0.9261069893836975 -vn 0.07813700288534164 -0.2686049938201904 0.9600759744644165 -vn -0.7573850154876709 0.2233279943466187 0.6135900020599365 -vn -0.902417004108429 0.4006629884243011 0.1584679931402206 -vn -0.902417004108429 -0.2050659954547882 0.3789339959621429 -vn 0.07513599842786789 0.7418090105056763 -0.666388988494873 -vn 0.4332149922847748 0.3082599937915802 -0.8469359874725342 -vn 0.09283199906349182 0.3405439853668213 -0.935634970664978 -vn -0.3755930066108704 0.6224439740180969 -0.6866539716720581 -vn -0.3539179861545563 0.8731229901313782 -0.3352569937705994 -vn -0.6413879990577698 0.6895880103111267 -0.3362880051136017 -vn -0.6627640128135681 0.7462409734725952 0.06218799948692322 -vn -0.7763820290565491 0.4680269956588745 0.4221160113811493 -vn -0.5422859787940979 0.2685939967632294 0.7961050271987915 -vn -0.5455620288848877 0.6585100293159485 0.5183889865875244 -vn -0.7381539940834045 -0.2307370007038116 0.633948028087616 -vn -0.9955589771270752 -0.03219600021839142 0.08845899999141693 -vn -0.433216005563736 -0.3082579970359802 0.8469359874725342 -vn -0.7763850092887878 -0.6298559904098511 0.02251699939370155 -vn -0.5422919988632202 -0.717477023601532 0.4372040033340454 -vn -0.4675650000572205 -0.8743969798088074 -0.1296679973602295 -vn -0.5458049774169922 -0.7113940119743347 -0.4427359998226166 -vn -0.1898339986801147 -0.8541020154953003 -0.4842230081558228 -vn -0.2153560072183609 -0.6237789988517761 -0.7513459920883179 -vn -0.6413909792900085 -0.3120909929275513 -0.7008690237998962 -vn 0.03750099986791611 -0.724698007106781 -0.6880459785461426 -vn -0.3755939900875092 -0.03544300049543381 -0.9261059761047363 -vn 0.07813599705696106 -0.2686049938201904 -0.9600759744644165 -vn -0.7573840022087097 0.2233279943466187 -0.6135900020599365 -vn -0.902417004108429 0.4006629884243011 -0.1584679931402206 -vn -0.902417004108429 -0.2050659954547882 -0.3789339959621429 - -# Mesh 'HLeib01' with 80 faces -g HLeib01 -f 1/1/1 2/2/2 3/3/3 -f 4/4/4 3/3/3 5/5/5 -f 6/6/6 5/5/5 2/2/2 -f 3/3/3 2/2/2 5/5/5 -f 1/1/1 3/3/3 7/7/7 -f 8/8/8 7/7/7 9/9/9 -f 4/4/4 9/9/9 3/3/3 -f 7/7/7 3/3/3 9/9/9 -f 8/8/8 9/9/9 10/10/10 -f 11/11/11 10/10/10 12/12/12 -f 4/4/4 12/12/12 9/9/9 -f 10/10/10 9/9/9 12/12/12 -f 4/4/4 13/13/13 12/12/12 -f 11/11/11 12/12/12 14/14/14 -f 15/15/15 14/14/14 13/13/13 -f 12/12/12 13/13/13 14/14/14 -f 4/4/4 5/5/5 13/13/13 -f 15/15/15 13/13/13 16/16/16 -f 6/6/6 16/16/16 5/5/5 -f 13/13/13 5/5/5 16/16/16 -f 15/15/15 16/16/16 17/17/17 -f 18/18/18 17/17/17 19/19/19 -f 6/6/6 19/19/19 16/16/16 -f 17/17/17 16/16/16 19/19/19 -f 15/15/15 17/17/17 20/20/20 -f 21/21/21 20/20/20 22/22/22 -f 18/18/18 22/22/22 17/17/17 -f 20/20/20 17/17/17 22/22/22 -f 11/11/11 14/14/14 23/23/23 -f 21/21/21 23/23/23 20/20/20 -f 15/15/15 20/20/20 14/14/14 -f 23/23/23 14/14/14 20/20/20 -f 11/11/11 23/23/23 24/24/24 -f 25/25/25 24/24/24 26/26/26 -f 21/21/21 26/26/26 23/23/23 -f 24/24/24 23/23/23 26/26/26 -f 25/25/25 26/26/26 27/27/27 -f 28/28/28 27/27/27 29/29/29 -f 21/21/21 29/29/29 26/26/26 -f 27/27/27 26/26/26 29/29/29 -f 28/28/28 29/29/29 30/30/30 -f 18/18/18 30/30/30 22/22/22 -f 21/21/21 22/22/22 29/29/29 -f 30/30/30 29/29/29 22/22/22 -f 28/28/28 30/30/30 31/31/31 -f 32/32/32 31/31/31 33/33/33 -f 18/18/18 33/33/33 30/30/30 -f 31/31/31 30/30/30 33/33/33 -f 28/28/28 31/31/31 34/34/34 -f 35/35/35 34/34/34 36/36/36 -f 32/32/32 36/36/36 31/31/31 -f 34/34/34 31/31/31 36/36/36 -f 35/35/35 36/36/36 37/37/37 -f 1/1/1 37/37/37 38/38/38 -f 32/32/32 38/38/38 36/36/36 -f 37/37/37 36/36/36 38/38/38 -f 1/1/1 38/38/38 2/2/2 -f 6/6/6 2/2/2 39/39/39 -f 32/32/32 39/39/39 38/38/38 -f 2/2/2 38/38/38 39/39/39 -f 32/32/32 33/33/33 39/39/39 -f 6/6/6 39/39/39 19/19/19 -f 18/18/18 19/19/19 33/33/33 -f 39/39/39 33/33/33 19/19/19 -f 8/8/8 40/40/40 7/7/7 -f 1/1/1 7/7/7 37/37/37 -f 35/35/35 37/37/37 40/40/40 -f 7/7/7 40/40/40 37/37/37 -f 8/8/8 41/41/41 40/40/40 -f 35/35/35 40/40/40 42/42/42 -f 25/25/25 42/42/42 41/41/41 -f 40/40/40 41/41/41 42/42/42 -f 8/8/8 10/10/10 41/41/41 -f 25/25/25 41/41/41 24/24/24 -f 11/11/11 24/24/24 10/10/10 -f 41/41/41 10/10/10 24/24/24 -f 28/28/28 34/34/34 27/27/27 -f 25/25/25 27/27/27 42/42/42 -f 35/35/35 42/42/42 34/34/34 -f 27/27/27 34/34/34 42/42/42 - -# Mesh 'OK' with 60 faces -g OK -f 43/43/43 44/44/44 45/45/45 -f 46/46/46 45/45/45 47/47/47 -f 48/48/48 47/47/47 44/44/44 -f 45/45/45 44/44/44 47/47/47 -f 43/43/43 45/45/45 49/49/49 -f 50/50/50 49/49/49 51/51/51 -f 46/46/46 51/51/51 45/45/45 -f 49/49/49 45/45/45 51/51/51 -f 50/50/50 51/51/51 52/52/52 -f 53/53/53 52/52/52 54/54/54 -f 46/46/46 54/54/54 51/51/51 -f 52/52/52 51/51/51 54/54/54 -f 46/46/46 55/55/55 54/54/54 -f 53/53/53 54/54/54 56/56/56 -f 57/57/57 56/56/56 55/55/55 -f 54/54/54 55/55/55 56/56/56 -f 46/46/46 47/47/47 55/55/55 -f 57/57/57 55/55/55 58/58/58 -f 48/48/48 58/58/58 47/47/47 -f 55/55/55 47/47/47 58/58/58 -f 57/57/57 58/58/58 59/59/59 -f 60/57/60 59/59/59 61/58/61 -f 48/48/48 61/58/61 58/58/58 -f 59/59/59 58/58/58 61/58/61 -f 57/57/57 59/59/59 62/60/62 -f 63/61/63 62/60/62 64/60/64 -f 60/57/60 64/60/64 59/59/59 -f 62/60/62 59/59/59 64/60/64 -f 53/53/53 56/56/56 65/62/65 -f 63/61/63 65/62/65 62/60/62 -f 57/57/57 62/60/62 56/56/56 -f 65/62/65 56/56/56 62/60/62 -f 53/53/53 65/62/65 66/63/66 -f 67/64/67 66/63/66 68/65/68 -f 63/61/63 68/65/68 65/62/65 -f 66/63/66 65/62/65 68/65/68 -f 67/64/67 68/65/68 69/63/69 -f 70/53/70 69/63/69 71/62/71 -f 63/61/63 71/62/71 68/65/68 -f 69/63/69 68/65/68 71/62/71 -f 63/61/63 64/60/64 71/62/71 -f 43/43/43 72/49/72 73/45/73 -f 43/43/43 73/45/73 44/44/44 -f 48/48/48 44/44/44 74/47/74 -f 75/46/75 74/47/74 73/45/73 -f 44/44/44 73/45/73 74/47/74 -f 48/48/48 74/47/74 61/58/61 -f 50/50/50 76/66/76 49/49/49 -f 43/43/43 49/49/49 72/49/72 -f 77/50/77 72/49/72 76/66/76 -f 49/49/49 76/66/76 72/49/72 -f 50/50/50 78/67/78 76/66/76 -f 77/50/77 76/66/76 79/67/79 -f 67/64/67 79/67/79 78/67/78 -f 76/66/76 78/67/78 79/67/79 -f 50/50/50 52/52/52 78/67/78 -f 67/64/67 78/67/78 66/63/66 -f 53/53/53 66/63/66 52/52/52 -f 78/67/78 52/52/52 66/63/66 -f 67/64/67 69/63/69 79/67/79 - -# Mesh 'Bein1Li' with 98 faces -g Bein1Li -f 80/68/80 81/68/80 82/68/80 -f 83/68/81 84/68/81 85/68/81 -f 80/69/82 86/70/83 87/71/84 -f 80/69/82 87/71/84 81/72/85 -f 86/70/83 88/73/86 87/71/84 -f 88/73/86 89/74/87 87/71/84 -f 88/73/86 90/75/88 91/76/89 -f 88/73/86 91/76/89 89/74/87 -f 90/75/88 92/77/90 91/76/89 -f 92/77/90 93/78/91 91/76/89 -f 92/77/90 94/79/92 95/80/93 -f 92/77/90 95/80/93 93/78/91 -f 94/79/92 83/68/94 95/80/93 -f 83/68/94 85/81/95 95/80/93 -f 81/68/80 96/68/80 82/68/80 -f 85/68/81 84/68/81 97/68/81 -f 81/72/85 87/71/84 96/82/96 -f 87/71/84 98/83/97 96/82/96 -f 87/71/84 89/74/87 99/84/98 -f 87/71/84 99/84/98 98/83/97 -f 89/74/87 91/76/89 99/84/98 -f 91/76/89 100/85/99 99/84/98 -f 91/76/89 93/78/91 101/86/100 -f 91/76/89 101/86/100 100/85/99 -f 93/78/91 95/80/93 101/86/100 -f 95/80/93 102/87/101 101/86/100 -f 95/80/93 85/81/95 97/88/102 -f 95/80/93 97/88/102 102/87/101 -f 96/68/80 103/68/80 82/68/80 -f 97/68/81 84/68/81 104/68/81 -f 96/82/96 98/83/97 105/89/103 -f 96/82/96 105/89/103 103/90/104 -f 98/83/97 99/84/98 105/89/103 -f 99/84/98 106/91/105 105/89/103 -f 99/84/98 100/85/99 107/92/106 -f 99/84/98 107/92/106 106/91/105 -f 100/85/99 101/86/100 107/92/106 -f 101/86/100 108/93/107 107/92/106 -f 101/86/100 102/87/101 109/94/108 -f 101/86/100 109/94/108 108/93/107 -f 102/87/101 97/88/102 109/94/108 -f 97/88/102 104/95/109 109/94/108 -f 103/68/80 110/68/80 82/68/80 -f 104/68/81 84/68/81 111/68/81 -f 103/90/104 105/89/103 110/96/110 -f 105/89/103 112/97/111 110/96/110 -f 105/89/103 106/91/105 113/98/112 -f 105/89/103 113/98/112 112/97/111 -f 106/91/105 107/92/106 113/98/112 -f 107/92/106 114/99/113 113/98/112 -f 107/92/106 108/93/107 115/100/114 -f 107/92/106 115/100/114 114/99/113 -f 108/93/107 109/94/108 115/100/114 -f 109/94/108 116/101/115 115/100/114 -f 109/94/108 104/95/109 111/102/116 -f 109/94/108 111/102/116 116/101/115 -f 110/68/80 117/68/80 82/68/80 -f 111/68/81 84/68/81 118/68/81 -f 110/96/110 112/97/111 119/103/117 -f 110/96/110 119/103/117 117/104/118 -f 112/97/111 113/98/112 119/103/117 -f 113/98/112 120/105/119 119/103/117 -f 113/98/112 114/99/113 121/106/120 -f 113/98/112 121/106/120 120/105/119 -f 114/99/113 115/100/114 121/106/120 -f 115/100/114 122/107/121 121/106/120 -f 115/100/114 116/101/115 123/108/122 -f 115/100/114 123/108/122 122/107/121 -f 116/101/115 111/102/116 123/108/122 -f 111/102/116 118/109/123 123/108/122 -f 117/68/80 124/68/80 82/68/80 -f 118/68/81 84/68/81 125/68/81 -f 117/104/118 119/103/117 124/110/124 -f 119/103/117 126/111/125 124/110/124 -f 119/103/117 120/105/119 127/112/126 -f 119/103/117 127/112/126 126/111/125 -f 120/105/119 121/106/120 127/112/126 -f 121/106/120 128/113/127 127/112/126 -f 121/106/120 122/107/121 129/114/128 -f 121/106/120 129/114/128 128/113/127 -f 122/107/121 123/108/122 129/114/128 -f 123/108/122 130/115/129 129/114/128 -f 123/108/122 118/109/123 125/116/130 -f 123/108/122 125/116/130 130/115/129 -f 124/68/80 80/68/80 82/68/80 -f 125/68/81 84/68/81 83/68/81 -f 124/110/124 126/111/125 86/117/83 -f 124/110/124 86/117/83 80/118/82 -f 126/111/125 127/112/126 86/117/83 -f 127/112/126 88/119/86 86/117/83 -f 127/112/126 128/113/127 90/120/88 -f 127/112/126 90/120/88 88/119/86 -f 128/113/127 129/114/128 90/120/88 -f 129/114/128 92/121/90 90/120/88 -f 129/114/128 130/115/129 94/122/92 -f 129/114/128 94/122/92 92/121/90 -f 130/115/129 125/116/130 94/122/92 -f 125/116/130 83/123/94 94/122/92 - -# Mesh 'Bein1Re' with 98 faces -g Bein1Re -f 131/68/131 132/68/131 133/68/131 -f 134/68/132 135/68/132 136/68/132 -f 137/71/133 138/70/134 133/69/135 -f 132/72/136 137/71/133 133/69/135 -f 137/71/133 139/73/137 138/70/134 -f 137/71/133 140/74/138 139/73/137 -f 141/76/139 142/75/140 139/73/137 -f 140/74/138 141/76/139 139/73/137 -f 141/76/139 143/77/141 142/75/140 -f 141/76/139 144/78/142 143/77/141 -f 145/80/143 146/79/144 143/77/141 -f 144/78/142 145/80/143 143/77/141 -f 145/80/143 136/68/145 146/79/144 -f 145/80/143 134/81/146 136/68/145 -f 131/68/131 147/68/131 132/68/131 -f 148/68/132 135/68/132 134/68/132 -f 147/82/147 137/71/133 132/72/136 -f 147/82/147 149/83/148 137/71/133 -f 150/84/149 140/74/138 137/71/133 -f 149/83/148 150/84/149 137/71/133 -f 150/84/149 141/76/139 140/74/138 -f 150/84/149 151/85/150 141/76/139 -f 152/86/151 144/78/142 141/76/139 -f 151/85/150 152/86/151 141/76/139 -f 152/86/151 145/80/143 144/78/142 -f 152/86/151 153/87/152 145/80/143 -f 148/88/153 134/81/146 145/80/143 -f 153/87/152 148/88/153 145/80/143 -f 131/68/131 154/68/131 147/68/131 -f 155/68/132 135/68/132 148/68/132 -f 156/89/154 149/83/148 147/82/147 -f 154/90/155 156/89/154 147/82/147 -f 156/89/154 150/84/149 149/83/148 -f 156/89/154 157/91/156 150/84/149 -f 158/92/157 151/85/150 150/84/149 -f 157/91/156 158/92/157 150/84/149 -f 158/92/157 152/86/151 151/85/150 -f 158/92/157 159/93/158 152/86/151 -f 160/94/159 153/87/152 152/86/151 -f 159/93/158 160/94/159 152/86/151 -f 160/94/159 148/88/153 153/87/152 -f 160/94/159 155/95/160 148/88/153 -f 131/68/131 161/68/131 154/68/131 -f 162/68/132 135/68/132 155/68/132 -f 161/96/161 156/89/154 154/90/155 -f 161/96/161 163/97/162 156/89/154 -f 164/98/163 157/91/156 156/89/154 -f 163/97/162 164/98/163 156/89/154 -f 164/98/163 158/92/157 157/91/156 -f 164/98/163 165/99/164 158/92/157 -f 166/100/165 159/93/158 158/92/157 -f 165/99/164 166/100/165 158/92/157 -f 166/100/165 160/94/159 159/93/158 -f 166/100/165 167/101/166 160/94/159 -f 162/102/167 155/95/160 160/94/159 -f 167/101/166 162/102/167 160/94/159 -f 131/68/131 168/68/131 161/68/131 -f 169/68/132 135/68/132 162/68/132 -f 170/103/168 163/97/162 161/96/161 -f 168/104/169 170/103/168 161/96/161 -f 170/103/168 164/98/163 163/97/162 -f 170/103/168 171/105/170 164/98/163 -f 172/106/171 165/99/164 164/98/163 -f 171/105/170 172/106/171 164/98/163 -f 172/106/171 166/100/165 165/99/164 -f 172/106/171 173/107/172 166/100/165 -f 174/108/173 167/101/166 166/100/165 -f 173/107/172 174/108/173 166/100/165 -f 174/108/173 162/102/167 167/101/166 -f 174/108/173 169/109/174 162/102/167 -f 131/68/131 175/68/131 168/68/131 -f 176/68/132 135/68/132 169/68/132 -f 175/110/175 170/103/168 168/104/169 -f 175/110/175 177/111/176 170/103/168 -f 178/112/177 171/105/170 170/103/168 -f 177/111/176 178/112/177 170/103/168 -f 178/112/177 172/106/171 171/105/170 -f 178/112/177 179/113/178 172/106/171 -f 180/114/179 173/107/172 172/106/171 -f 179/113/178 180/114/179 172/106/171 -f 180/114/179 174/108/173 173/107/172 -f 180/114/179 181/115/180 174/108/173 -f 176/116/181 169/109/174 174/108/173 -f 181/115/180 176/116/181 174/108/173 -f 131/68/131 133/68/131 175/68/131 -f 136/68/132 135/68/132 176/68/132 -f 138/117/134 177/111/176 175/110/175 -f 133/118/135 138/117/134 175/110/175 -f 138/117/134 178/112/177 177/111/176 -f 138/117/134 139/119/137 178/112/177 -f 142/120/140 179/113/178 178/112/177 -f 139/119/137 142/120/140 178/112/177 -f 142/120/140 180/114/179 179/113/178 -f 142/120/140 143/121/141 180/114/179 -f 146/122/144 181/115/180 180/114/179 -f 143/121/141 146/122/144 180/114/179 -f 146/122/144 176/116/181 181/115/180 -f 146/122/144 136/123/145 176/116/181 - -# Mesh 'Bein2Li' with 98 faces -g Bein2Li -f 182/68/182 183/68/182 184/68/182 -f 185/68/183 186/68/183 187/68/183 -f 182/69/184 188/70/185 189/71/186 -f 182/69/184 189/71/186 183/72/187 -f 188/70/185 190/73/188 189/71/186 -f 190/73/188 191/74/189 189/71/186 -f 190/73/188 192/75/190 193/76/191 -f 190/73/188 193/76/191 191/74/189 -f 192/75/190 194/77/192 193/76/191 -f 194/77/192 195/78/193 193/76/191 -f 194/77/192 196/79/194 197/80/195 -f 194/77/192 197/80/195 195/78/193 -f 196/79/194 185/68/196 197/80/195 -f 185/68/196 187/81/197 197/80/195 -f 183/68/182 198/68/182 184/68/182 -f 187/68/183 186/68/183 199/68/183 -f 183/72/187 189/71/186 198/82/198 -f 189/71/186 200/83/199 198/82/198 -f 189/71/186 191/74/189 201/84/200 -f 189/71/186 201/84/200 200/83/199 -f 191/74/189 193/76/191 201/84/200 -f 193/76/191 202/85/201 201/84/200 -f 193/76/191 195/78/193 203/86/202 -f 193/76/191 203/86/202 202/85/201 -f 195/78/193 197/80/195 203/86/202 -f 197/80/195 204/87/203 203/86/202 -f 197/80/195 187/81/197 199/88/204 -f 197/80/195 199/88/204 204/87/203 -f 198/68/182 205/68/182 184/68/182 -f 199/68/183 186/68/183 206/68/183 -f 198/82/198 200/83/199 207/89/205 -f 198/82/198 207/89/205 205/90/206 -f 200/83/199 201/84/200 207/89/205 -f 201/84/200 208/91/207 207/89/205 -f 201/84/200 202/85/201 209/92/208 -f 201/84/200 209/92/208 208/91/207 -f 202/85/201 203/86/202 209/92/208 -f 203/86/202 210/93/209 209/92/208 -f 203/86/202 204/87/203 211/94/210 -f 203/86/202 211/94/210 210/93/209 -f 204/87/203 199/88/204 211/94/210 -f 199/88/204 206/95/211 211/94/210 -f 205/68/182 212/68/182 184/68/182 -f 206/68/183 186/68/183 213/68/183 -f 205/90/206 207/89/205 212/96/212 -f 207/89/205 214/97/213 212/96/212 -f 207/89/205 208/91/207 215/98/214 -f 207/89/205 215/98/214 214/97/213 -f 208/91/207 209/92/208 215/98/214 -f 209/92/208 216/99/215 215/98/214 -f 209/92/208 210/93/209 217/100/216 -f 209/92/208 217/100/216 216/99/215 -f 210/93/209 211/94/210 217/100/216 -f 211/94/210 218/101/217 217/100/216 -f 211/94/210 206/95/211 213/102/218 -f 211/94/210 213/102/218 218/101/217 -f 212/68/182 219/68/182 184/68/182 -f 213/68/183 186/68/183 220/68/183 -f 212/96/212 214/97/213 221/103/219 -f 212/96/212 221/103/219 219/104/220 -f 214/97/213 215/98/214 221/103/219 -f 215/98/214 222/105/221 221/103/219 -f 215/98/214 216/99/215 223/106/222 -f 215/98/214 223/106/222 222/105/221 -f 216/99/215 217/100/216 223/106/222 -f 217/100/216 224/107/223 223/106/222 -f 217/100/216 218/101/217 225/108/224 -f 217/100/216 225/108/224 224/107/223 -f 218/101/217 213/102/218 225/108/224 -f 213/102/218 220/109/225 225/108/224 -f 219/68/182 226/68/182 184/68/182 -f 220/68/183 186/68/183 227/68/183 -f 219/104/220 221/103/219 226/110/226 -f 221/103/219 228/111/227 226/110/226 -f 221/103/219 222/105/221 229/112/228 -f 221/103/219 229/112/228 228/111/227 -f 222/105/221 223/106/222 229/112/228 -f 223/106/222 230/113/229 229/112/228 -f 223/106/222 224/107/223 231/114/230 -f 223/106/222 231/114/230 230/113/229 -f 224/107/223 225/108/224 231/114/230 -f 225/108/224 232/115/231 231/114/230 -f 225/108/224 220/109/225 227/116/232 -f 225/108/224 227/116/232 232/115/231 -f 226/68/182 182/68/182 184/68/182 -f 227/68/183 186/68/183 185/68/183 -f 226/110/226 228/111/227 188/117/185 -f 226/110/226 188/117/185 182/118/184 -f 228/111/227 229/112/228 188/117/185 -f 229/112/228 190/119/188 188/117/185 -f 229/112/228 230/113/229 192/120/190 -f 229/112/228 192/120/190 190/119/188 -f 230/113/229 231/114/230 192/120/190 -f 231/114/230 194/121/192 192/120/190 -f 231/114/230 232/115/231 196/122/194 -f 231/114/230 196/122/194 194/121/192 -f 232/115/231 227/116/232 196/122/194 -f 227/116/232 185/123/196 196/122/194 - -# Mesh 'Bein2Re' with 98 faces -g Bein2Re -f 233/68/233 234/68/233 235/68/233 -f 236/68/234 237/68/234 238/68/234 -f 239/71/235 240/70/236 235/69/237 -f 234/72/238 239/71/235 235/69/237 -f 239/71/235 241/73/239 240/70/236 -f 239/71/235 242/74/240 241/73/239 -f 243/76/241 244/75/242 241/73/239 -f 242/74/240 243/76/241 241/73/239 -f 243/76/241 245/77/243 244/75/242 -f 243/76/241 246/78/244 245/77/243 -f 247/80/245 248/79/246 245/77/243 -f 246/78/244 247/80/245 245/77/243 -f 247/80/245 238/68/247 248/79/246 -f 247/80/245 236/81/248 238/68/247 -f 233/68/233 249/68/233 234/68/233 -f 250/68/234 237/68/234 236/68/234 -f 249/82/249 239/71/235 234/72/238 -f 249/82/249 251/83/250 239/71/235 -f 252/84/251 242/74/240 239/71/235 -f 251/83/250 252/84/251 239/71/235 -f 252/84/251 243/76/241 242/74/240 -f 252/84/251 253/85/252 243/76/241 -f 254/86/253 246/78/244 243/76/241 -f 253/85/252 254/86/253 243/76/241 -f 254/86/253 247/80/245 246/78/244 -f 254/86/253 255/87/254 247/80/245 -f 250/88/255 236/81/248 247/80/245 -f 255/87/254 250/88/255 247/80/245 -f 233/68/233 256/68/233 249/68/233 -f 257/68/234 237/68/234 250/68/234 -f 258/89/256 251/83/250 249/82/249 -f 256/90/257 258/89/256 249/82/249 -f 258/89/256 252/84/251 251/83/250 -f 258/89/256 259/91/258 252/84/251 -f 260/92/259 253/85/252 252/84/251 -f 259/91/258 260/92/259 252/84/251 -f 260/92/259 254/86/253 253/85/252 -f 260/92/259 261/93/260 254/86/253 -f 262/94/261 255/87/254 254/86/253 -f 261/93/260 262/94/261 254/86/253 -f 262/94/261 250/88/255 255/87/254 -f 262/94/261 257/95/262 250/88/255 -f 233/68/233 263/68/233 256/68/233 -f 264/68/234 237/68/234 257/68/234 -f 263/96/263 258/89/256 256/90/257 -f 263/96/263 265/97/264 258/89/256 -f 266/98/265 259/91/258 258/89/256 -f 265/97/264 266/98/265 258/89/256 -f 266/98/265 260/92/259 259/91/258 -f 266/98/265 267/99/266 260/92/259 -f 268/100/267 261/93/260 260/92/259 -f 267/99/266 268/100/267 260/92/259 -f 268/100/267 262/94/261 261/93/260 -f 268/100/267 269/101/268 262/94/261 -f 264/102/269 257/95/262 262/94/261 -f 269/101/268 264/102/269 262/94/261 -f 233/68/233 270/68/233 263/68/233 -f 271/68/234 237/68/234 264/68/234 -f 272/103/270 265/97/264 263/96/263 -f 270/104/271 272/103/270 263/96/263 -f 272/103/270 266/98/265 265/97/264 -f 272/103/270 273/105/272 266/98/265 -f 274/106/273 267/99/266 266/98/265 -f 273/105/272 274/106/273 266/98/265 -f 274/106/273 268/100/267 267/99/266 -f 274/106/273 275/107/274 268/100/267 -f 276/108/275 269/101/268 268/100/267 -f 275/107/274 276/108/275 268/100/267 -f 276/108/275 264/102/269 269/101/268 -f 276/108/275 271/109/276 264/102/269 -f 233/68/233 277/68/233 270/68/233 -f 278/68/234 237/68/234 271/68/234 -f 277/110/277 272/103/270 270/104/271 -f 277/110/277 279/111/278 272/103/270 -f 280/112/279 273/105/272 272/103/270 -f 279/111/278 280/112/279 272/103/270 -f 280/112/279 274/106/273 273/105/272 -f 280/112/279 281/113/280 274/106/273 -f 282/114/281 275/107/274 274/106/273 -f 281/113/280 282/114/281 274/106/273 -f 282/114/281 276/108/275 275/107/274 -f 282/114/281 283/115/282 276/108/275 -f 278/116/283 271/109/276 276/108/275 -f 283/115/282 278/116/283 276/108/275 -f 233/68/233 235/68/233 277/68/233 -f 238/68/234 237/68/234 278/68/234 -f 240/117/236 279/111/278 277/110/277 -f 235/118/237 240/117/236 277/110/277 -f 240/117/236 280/112/279 279/111/278 -f 240/117/236 241/119/239 280/112/279 -f 244/120/242 281/113/280 280/112/279 -f 241/119/239 244/120/242 280/112/279 -f 244/120/242 282/114/281 281/113/280 -f 244/120/242 245/121/243 282/114/281 -f 248/122/246 283/115/282 282/114/281 -f 245/121/243 248/122/246 282/114/281 -f 248/122/246 278/116/283 283/115/282 -f 248/122/246 238/123/247 278/116/283 - -# Mesh 'Bein3Re' with 98 faces -g Bein3Re -f 284/68/284 285/68/284 286/68/284 -f 287/68/285 288/68/285 289/68/285 -f 290/71/286 291/70/287 286/69/288 -f 285/72/289 290/71/286 286/69/288 -f 290/71/286 292/73/290 291/70/287 -f 290/71/286 293/74/291 292/73/290 -f 294/76/292 295/75/293 292/73/290 -f 293/74/291 294/76/292 292/73/290 -f 294/76/292 296/77/294 295/75/293 -f 294/76/292 297/78/295 296/77/294 -f 298/80/296 299/79/297 296/77/294 -f 297/78/295 298/80/296 296/77/294 -f 298/80/296 289/68/298 299/79/297 -f 298/80/296 287/81/299 289/68/298 -f 284/68/284 300/68/284 285/68/284 -f 301/68/285 288/68/285 287/68/285 -f 300/82/300 290/71/286 285/72/289 -f 300/82/300 302/83/301 290/71/286 -f 303/84/302 293/74/291 290/71/286 -f 302/83/301 303/84/302 290/71/286 -f 303/84/302 294/76/292 293/74/291 -f 303/84/302 304/85/303 294/76/292 -f 305/86/304 297/78/295 294/76/292 -f 304/85/303 305/86/304 294/76/292 -f 305/86/304 298/80/296 297/78/295 -f 305/86/304 306/87/305 298/80/296 -f 301/88/306 287/81/299 298/80/296 -f 306/87/305 301/88/306 298/80/296 -f 284/68/284 307/68/284 300/68/284 -f 308/68/285 288/68/285 301/68/285 -f 309/89/307 302/83/301 300/82/300 -f 307/90/308 309/89/307 300/82/300 -f 309/89/307 303/84/302 302/83/301 -f 309/89/307 310/91/309 303/84/302 -f 311/92/310 304/85/303 303/84/302 -f 310/91/309 311/92/310 303/84/302 -f 311/92/310 305/86/304 304/85/303 -f 311/92/310 312/93/311 305/86/304 -f 313/94/312 306/87/305 305/86/304 -f 312/93/311 313/94/312 305/86/304 -f 313/94/312 301/88/306 306/87/305 -f 313/94/312 308/95/313 301/88/306 -f 284/68/284 314/68/284 307/68/284 -f 315/68/285 288/68/285 308/68/285 -f 314/96/314 309/89/307 307/90/308 -f 314/96/314 316/97/315 309/89/307 -f 317/98/316 310/91/309 309/89/307 -f 316/97/315 317/98/316 309/89/307 -f 317/98/316 311/92/310 310/91/309 -f 317/98/316 318/99/317 311/92/310 -f 319/100/318 312/93/311 311/92/310 -f 318/99/317 319/100/318 311/92/310 -f 319/100/318 313/94/312 312/93/311 -f 319/100/318 320/101/319 313/94/312 -f 315/102/320 308/95/313 313/94/312 -f 320/101/319 315/102/320 313/94/312 -f 284/68/284 321/68/284 314/68/284 -f 322/68/285 288/68/285 315/68/285 -f 323/103/321 316/97/315 314/96/314 -f 321/104/322 323/103/321 314/96/314 -f 323/103/321 317/98/316 316/97/315 -f 323/103/321 324/105/323 317/98/316 -f 325/106/324 318/99/317 317/98/316 -f 324/105/323 325/106/324 317/98/316 -f 325/106/324 319/100/318 318/99/317 -f 325/106/324 326/107/325 319/100/318 -f 327/108/326 320/101/319 319/100/318 -f 326/107/325 327/108/326 319/100/318 -f 327/108/326 315/102/320 320/101/319 -f 327/108/326 322/109/327 315/102/320 -f 284/68/284 328/68/284 321/68/284 -f 329/68/285 288/68/285 322/68/285 -f 328/110/328 323/103/321 321/104/322 -f 328/110/328 330/111/329 323/103/321 -f 331/112/330 324/105/323 323/103/321 -f 330/111/329 331/112/330 323/103/321 -f 331/112/330 325/106/324 324/105/323 -f 331/112/330 332/113/331 325/106/324 -f 333/114/332 326/107/325 325/106/324 -f 332/113/331 333/114/332 325/106/324 -f 333/114/332 327/108/326 326/107/325 -f 333/114/332 334/115/333 327/108/326 -f 329/116/334 322/109/327 327/108/326 -f 334/115/333 329/116/334 327/108/326 -f 284/68/284 286/68/284 328/68/284 -f 289/68/285 288/68/285 329/68/285 -f 291/117/287 330/111/329 328/110/328 -f 286/118/288 291/117/287 328/110/328 -f 291/117/287 331/112/330 330/111/329 -f 291/117/287 292/119/290 331/112/330 -f 295/120/293 332/113/331 331/112/330 -f 292/119/290 295/120/293 331/112/330 -f 295/120/293 333/114/332 332/113/331 -f 295/120/293 296/121/294 333/114/332 -f 299/122/297 334/115/333 333/114/332 -f 296/121/294 299/122/297 333/114/332 -f 299/122/297 329/116/334 334/115/333 -f 299/122/297 289/123/298 329/116/334 - -# Mesh 'Bein3Li' with 98 faces -g Bein3Li -f 335/68/335 336/68/335 337/68/335 -f 338/68/336 339/68/336 340/68/336 -f 335/69/337 341/70/338 342/71/339 -f 335/69/337 342/71/339 336/72/340 -f 341/70/338 343/73/341 342/71/339 -f 343/73/341 344/74/342 342/71/339 -f 343/73/341 345/75/343 346/76/344 -f 343/73/341 346/76/344 344/74/342 -f 345/75/343 347/77/345 346/76/344 -f 347/77/345 348/78/346 346/76/344 -f 347/77/345 349/79/347 350/80/348 -f 347/77/345 350/80/348 348/78/346 -f 349/79/347 338/68/349 350/80/348 -f 338/68/349 340/81/350 350/80/348 -f 336/68/335 351/68/335 337/68/335 -f 340/68/336 339/68/336 352/68/336 -f 336/72/340 342/71/339 351/82/351 -f 342/71/339 353/83/352 351/82/351 -f 342/71/339 344/74/342 354/84/353 -f 342/71/339 354/84/353 353/83/352 -f 344/74/342 346/76/344 354/84/353 -f 346/76/344 355/85/354 354/84/353 -f 346/76/344 348/78/346 356/86/355 -f 346/76/344 356/86/355 355/85/354 -f 348/78/346 350/80/348 356/86/355 -f 350/80/348 357/87/356 356/86/355 -f 350/80/348 340/81/350 352/88/357 -f 350/80/348 352/88/357 357/87/356 -f 351/68/335 358/68/335 337/68/335 -f 352/68/336 339/68/336 359/68/336 -f 351/82/351 353/83/352 360/89/358 -f 351/82/351 360/89/358 358/90/359 -f 353/83/352 354/84/353 360/89/358 -f 354/84/353 361/91/360 360/89/358 -f 354/84/353 355/85/354 362/92/361 -f 354/84/353 362/92/361 361/91/360 -f 355/85/354 356/86/355 362/92/361 -f 356/86/355 363/93/362 362/92/361 -f 356/86/355 357/87/356 364/94/363 -f 356/86/355 364/94/363 363/93/362 -f 357/87/356 352/88/357 364/94/363 -f 352/88/357 359/95/364 364/94/363 -f 358/68/335 365/68/335 337/68/335 -f 359/68/336 339/68/336 366/68/336 -f 358/90/359 360/89/358 365/96/365 -f 360/89/358 367/97/366 365/96/365 -f 360/89/358 361/91/360 368/98/367 -f 360/89/358 368/98/367 367/97/366 -f 361/91/360 362/92/361 368/98/367 -f 362/92/361 369/99/368 368/98/367 -f 362/92/361 363/93/362 370/100/369 -f 362/92/361 370/100/369 369/99/368 -f 363/93/362 364/94/363 370/100/369 -f 364/94/363 371/101/370 370/100/369 -f 364/94/363 359/95/364 366/102/371 -f 364/94/363 366/102/371 371/101/370 -f 365/68/335 372/68/335 337/68/335 -f 366/68/336 339/68/336 373/68/336 -f 365/96/365 367/97/366 374/103/372 -f 365/96/365 374/103/372 372/104/373 -f 367/97/366 368/98/367 374/103/372 -f 368/98/367 375/105/374 374/103/372 -f 368/98/367 369/99/368 376/106/375 -f 368/98/367 376/106/375 375/105/374 -f 369/99/368 370/100/369 376/106/375 -f 370/100/369 377/107/376 376/106/375 -f 370/100/369 371/101/370 378/108/377 -f 370/100/369 378/108/377 377/107/376 -f 371/101/370 366/102/371 378/108/377 -f 366/102/371 373/109/378 378/108/377 -f 372/68/335 379/68/335 337/68/335 -f 373/68/336 339/68/336 380/68/336 -f 372/104/373 374/103/372 379/110/379 -f 374/103/372 381/111/380 379/110/379 -f 374/103/372 375/105/374 382/112/381 -f 374/103/372 382/112/381 381/111/380 -f 375/105/374 376/106/375 382/112/381 -f 376/106/375 383/113/382 382/112/381 -f 376/106/375 377/107/376 384/114/383 -f 376/106/375 384/114/383 383/113/382 -f 377/107/376 378/108/377 384/114/383 -f 378/108/377 385/115/384 384/114/383 -f 378/108/377 373/109/378 380/116/385 -f 378/108/377 380/116/385 385/115/384 -f 379/68/335 335/68/335 337/68/335 -f 380/68/336 339/68/336 338/68/336 -f 379/110/379 381/111/380 341/117/338 -f 379/110/379 341/117/338 335/118/337 -f 381/111/380 382/112/381 341/117/338 -f 382/112/381 343/119/341 341/117/338 -f 382/112/381 383/113/382 345/120/343 -f 382/112/381 345/120/343 343/119/341 -f 383/113/382 384/114/383 345/120/343 -f 384/114/383 347/121/345 345/120/343 -f 384/114/383 385/115/384 349/122/347 -f 384/114/383 349/122/347 347/121/345 -f 385/115/384 380/116/385 349/122/347 -f 380/116/385 338/123/349 349/122/347 - -# Mesh 'Bein4Re' with 98 faces -g Bein4Re -f 386/68/386 387/68/386 388/68/386 -f 389/68/387 390/68/387 391/68/387 -f 392/71/388 393/70/389 388/69/390 -f 387/72/391 392/71/388 388/69/390 -f 392/71/388 394/73/392 393/70/389 -f 392/71/388 395/74/393 394/73/392 -f 396/76/394 397/75/395 394/73/392 -f 395/74/393 396/76/394 394/73/392 -f 396/76/394 398/77/396 397/75/395 -f 396/76/394 399/78/397 398/77/396 -f 400/80/398 401/79/399 398/77/396 -f 399/78/397 400/80/398 398/77/396 -f 400/80/398 391/68/400 401/79/399 -f 400/80/398 389/81/401 391/68/400 -f 386/68/386 402/68/386 387/68/386 -f 403/68/387 390/68/387 389/68/387 -f 402/82/402 392/71/388 387/72/391 -f 402/82/402 404/83/403 392/71/388 -f 405/84/404 395/74/393 392/71/388 -f 404/83/403 405/84/404 392/71/388 -f 405/84/404 396/76/394 395/74/393 -f 405/84/404 406/85/405 396/76/394 -f 407/86/406 399/78/397 396/76/394 -f 406/85/405 407/86/406 396/76/394 -f 407/86/406 400/80/398 399/78/397 -f 407/86/406 408/87/407 400/80/398 -f 403/88/408 389/81/401 400/80/398 -f 408/87/407 403/88/408 400/80/398 -f 386/68/386 409/68/386 402/68/386 -f 410/68/387 390/68/387 403/68/387 -f 411/89/409 404/83/403 402/82/402 -f 409/90/410 411/89/409 402/82/402 -f 411/89/409 405/84/404 404/83/403 -f 411/89/409 412/91/411 405/84/404 -f 413/92/412 406/85/405 405/84/404 -f 412/91/411 413/92/412 405/84/404 -f 413/92/412 407/86/406 406/85/405 -f 413/92/412 414/93/413 407/86/406 -f 415/94/414 408/87/407 407/86/406 -f 414/93/413 415/94/414 407/86/406 -f 415/94/414 403/88/408 408/87/407 -f 415/94/414 410/95/415 403/88/408 -f 386/68/386 416/68/386 409/68/386 -f 417/68/387 390/68/387 410/68/387 -f 416/96/416 411/89/409 409/90/410 -f 416/96/416 418/97/417 411/89/409 -f 419/98/418 412/91/411 411/89/409 -f 418/97/417 419/98/418 411/89/409 -f 419/98/418 413/92/412 412/91/411 -f 419/98/418 420/99/419 413/92/412 -f 421/100/420 414/93/413 413/92/412 -f 420/99/419 421/100/420 413/92/412 -f 421/100/420 415/94/414 414/93/413 -f 421/100/420 422/101/421 415/94/414 -f 417/102/422 410/95/415 415/94/414 -f 422/101/421 417/102/422 415/94/414 -f 386/68/386 423/68/386 416/68/386 -f 424/68/387 390/68/387 417/68/387 -f 425/103/423 418/97/417 416/96/416 -f 423/104/424 425/103/423 416/96/416 -f 425/103/423 419/98/418 418/97/417 -f 425/103/423 426/105/425 419/98/418 -f 427/106/426 420/99/419 419/98/418 -f 426/105/425 427/106/426 419/98/418 -f 427/106/426 421/100/420 420/99/419 -f 427/106/426 428/107/427 421/100/420 -f 429/108/428 422/101/421 421/100/420 -f 428/107/427 429/108/428 421/100/420 -f 429/108/428 417/102/422 422/101/421 -f 429/108/428 424/109/429 417/102/422 -f 386/68/386 430/68/386 423/68/386 -f 431/68/387 390/68/387 424/68/387 -f 430/110/430 425/103/423 423/104/424 -f 430/110/430 432/111/431 425/103/423 -f 433/112/432 426/105/425 425/103/423 -f 432/111/431 433/112/432 425/103/423 -f 433/112/432 427/106/426 426/105/425 -f 433/112/432 434/113/433 427/106/426 -f 435/114/434 428/107/427 427/106/426 -f 434/113/433 435/114/434 427/106/426 -f 435/114/434 429/108/428 428/107/427 -f 435/114/434 436/115/435 429/108/428 -f 431/116/436 424/109/429 429/108/428 -f 436/115/435 431/116/436 429/108/428 -f 386/68/386 388/68/386 430/68/386 -f 391/68/387 390/68/387 431/68/387 -f 393/117/389 432/111/431 430/110/430 -f 388/118/390 393/117/389 430/110/430 -f 393/117/389 433/112/432 432/111/431 -f 393/117/389 394/119/392 433/112/432 -f 397/120/395 434/113/433 433/112/432 -f 394/119/392 397/120/395 433/112/432 -f 397/120/395 435/114/434 434/113/433 -f 397/120/395 398/121/396 435/114/434 -f 401/122/399 436/115/435 435/114/434 -f 398/121/396 401/122/399 435/114/434 -f 401/122/399 431/116/436 436/115/435 -f 401/122/399 391/123/400 431/116/436 - -# Mesh 'Bein4Li' with 98 faces -g Bein4Li -f 437/68/437 438/68/437 439/68/437 -f 440/68/438 441/68/438 442/68/438 -f 437/69/439 443/70/440 444/71/441 -f 437/69/439 444/71/441 438/72/442 -f 443/70/440 445/73/443 444/71/441 -f 445/73/443 446/74/444 444/71/441 -f 445/73/443 447/75/445 448/76/446 -f 445/73/443 448/76/446 446/74/444 -f 447/75/445 449/77/447 448/76/446 -f 449/77/447 450/78/448 448/76/446 -f 449/77/447 451/79/449 452/80/450 -f 449/77/447 452/80/450 450/78/448 -f 451/79/449 440/68/451 452/80/450 -f 440/68/451 442/81/452 452/80/450 -f 438/68/437 453/68/437 439/68/437 -f 442/68/438 441/68/438 454/68/438 -f 438/72/442 444/71/441 453/82/453 -f 444/71/441 455/83/454 453/82/453 -f 444/71/441 446/74/444 456/84/455 -f 444/71/441 456/84/455 455/83/454 -f 446/74/444 448/76/446 456/84/455 -f 448/76/446 457/85/456 456/84/455 -f 448/76/446 450/78/448 458/86/457 -f 448/76/446 458/86/457 457/85/456 -f 450/78/448 452/80/450 458/86/457 -f 452/80/450 459/87/458 458/86/457 -f 452/80/450 442/81/452 454/88/459 -f 452/80/450 454/88/459 459/87/458 -f 453/68/437 460/68/437 439/68/437 -f 454/68/438 441/68/438 461/68/438 -f 453/82/453 455/83/454 462/89/460 -f 453/82/453 462/89/460 460/90/461 -f 455/83/454 456/84/455 462/89/460 -f 456/84/455 463/91/462 462/89/460 -f 456/84/455 457/85/456 464/92/463 -f 456/84/455 464/92/463 463/91/462 -f 457/85/456 458/86/457 464/92/463 -f 458/86/457 465/93/464 464/92/463 -f 458/86/457 459/87/458 466/94/465 -f 458/86/457 466/94/465 465/93/464 -f 459/87/458 454/88/459 466/94/465 -f 454/88/459 461/95/466 466/94/465 -f 460/68/437 467/68/437 439/68/437 -f 461/68/438 441/68/438 468/68/438 -f 460/90/461 462/89/460 467/96/467 -f 462/89/460 469/97/468 467/96/467 -f 462/89/460 463/91/462 470/98/469 -f 462/89/460 470/98/469 469/97/468 -f 463/91/462 464/92/463 470/98/469 -f 464/92/463 471/99/470 470/98/469 -f 464/92/463 465/93/464 472/100/471 -f 464/92/463 472/100/471 471/99/470 -f 465/93/464 466/94/465 472/100/471 -f 466/94/465 473/101/472 472/100/471 -f 466/94/465 461/95/466 468/102/473 -f 466/94/465 468/102/473 473/101/472 -f 467/68/437 474/68/437 439/68/437 -f 468/68/438 441/68/438 475/68/438 -f 467/96/467 469/97/468 476/103/474 -f 467/96/467 476/103/474 474/104/475 -f 469/97/468 470/98/469 476/103/474 -f 470/98/469 477/105/476 476/103/474 -f 470/98/469 471/99/470 478/106/477 -f 470/98/469 478/106/477 477/105/476 -f 471/99/470 472/100/471 478/106/477 -f 472/100/471 479/107/478 478/106/477 -f 472/100/471 473/101/472 480/108/479 -f 472/100/471 480/108/479 479/107/478 -f 473/101/472 468/102/473 480/108/479 -f 468/102/473 475/109/480 480/108/479 -f 474/68/437 481/68/437 439/68/437 -f 475/68/438 441/68/438 482/68/438 -f 474/104/475 476/103/474 481/110/481 -f 476/103/474 483/111/482 481/110/481 -f 476/103/474 477/105/476 484/112/483 -f 476/103/474 484/112/483 483/111/482 -f 477/105/476 478/106/477 484/112/483 -f 478/106/477 485/113/484 484/112/483 -f 478/106/477 479/107/478 486/114/485 -f 478/106/477 486/114/485 485/113/484 -f 479/107/478 480/108/479 486/114/485 -f 480/108/479 487/115/486 486/114/485 -f 480/108/479 475/109/480 482/116/487 -f 480/108/479 482/116/487 487/115/486 -f 481/68/437 437/68/437 439/68/437 -f 482/68/438 441/68/438 440/68/438 -f 481/110/481 483/111/482 443/117/440 -f 481/110/481 443/117/440 437/118/439 -f 483/111/482 484/112/483 443/117/440 -f 484/112/483 445/119/443 443/117/440 -f 484/112/483 485/113/484 447/120/445 -f 484/112/483 447/120/445 445/119/443 -f 485/113/484 486/114/485 447/120/445 -f 486/114/485 449/121/447 447/120/445 -f 486/114/485 487/115/486 451/122/449 -f 486/114/485 451/122/449 449/121/447 -f 487/115/486 482/116/487 451/122/449 -f 482/116/487 440/123/451 451/122/449 - -# Mesh 'Zahn' with 42 faces -g Zahn -f 488/124/488 488/124/488 488/124/488 -f 489/125/489 490/126/489 491/127/489 -f 488/124/490 492/128/491 493/129/492 -f 488/124/490 493/129/492 488/124/488 -f 492/128/491 489/125/493 493/129/492 -f 489/125/493 491/127/494 493/129/492 -f 488/124/488 488/124/488 488/124/488 -f 491/127/489 490/126/489 494/130/489 -f 488/124/488 493/129/492 488/124/495 -f 493/129/492 495/131/496 488/124/495 -f 493/129/492 491/127/494 494/130/497 -f 493/129/492 494/130/497 495/131/496 -f 488/124/488 488/124/488 488/124/488 -f 494/130/489 490/126/489 496/132/489 -f 488/124/495 495/131/496 497/133/498 -f 488/124/495 497/133/498 488/124/488 -f 495/131/496 494/130/497 497/133/498 -f 494/130/497 496/132/499 497/133/498 -f 488/124/488 488/124/488 488/124/488 -f 496/132/489 490/126/489 498/134/489 -f 488/124/488 497/133/498 488/124/500 -f 497/133/498 499/135/501 488/124/500 -f 497/133/498 496/132/499 498/134/502 -f 497/133/498 498/134/502 499/135/501 -f 488/124/488 488/124/488 488/124/488 -f 498/134/489 490/126/489 500/136/489 -f 488/124/500 499/135/501 501/137/503 -f 488/124/500 501/137/503 488/124/488 -f 499/135/501 498/134/502 501/137/503 -f 498/134/502 500/136/504 501/137/503 -f 488/124/488 488/124/488 488/124/488 -f 500/136/489 490/126/489 502/138/489 -f 488/124/488 501/137/503 488/124/505 -f 501/137/503 503/139/506 488/124/505 -f 501/137/503 500/136/504 502/138/507 -f 501/137/503 502/138/507 503/139/506 -f 488/124/488 488/124/488 488/124/488 -f 502/138/489 490/126/489 489/125/489 -f 488/124/505 503/139/506 492/128/491 -f 488/124/505 492/128/491 488/124/490 -f 503/139/506 502/138/507 492/128/491 -f 502/138/507 489/125/493 492/128/491 - -# Mesh 'klZahn' with 42 faces -g klZahn -f 504/140/488 504/140/488 504/140/488 -f 505/141/508 506/142/508 507/143/508 -f 504/140/509 508/144/510 509/145/511 -f 504/140/509 509/145/511 504/140/488 -f 508/144/510 505/141/512 509/145/511 -f 505/141/512 507/143/513 509/145/511 -f 504/140/488 504/140/488 504/140/488 -f 507/143/508 506/142/508 510/146/508 -f 504/140/488 509/145/511 504/140/514 -f 509/145/511 511/147/515 504/140/514 -f 509/145/511 507/143/513 510/146/516 -f 509/145/511 510/146/516 511/147/515 -f 504/140/488 504/140/488 504/140/488 -f 510/146/508 506/142/508 512/148/508 -f 504/140/514 511/147/515 513/149/517 -f 504/140/514 513/149/517 504/140/488 -f 511/147/515 510/146/516 513/149/517 -f 510/146/516 512/148/518 513/149/517 -f 504/140/488 504/140/488 504/140/488 -f 512/148/508 506/142/508 514/150/508 -f 504/140/488 513/149/517 504/140/519 -f 513/149/517 515/151/520 504/140/519 -f 513/149/517 512/148/518 514/150/521 -f 513/149/517 514/150/521 515/151/520 -f 504/140/488 504/140/488 504/140/488 -f 514/150/508 506/142/508 516/152/508 -f 504/140/519 515/151/520 517/153/522 -f 504/140/519 517/153/522 504/140/488 -f 515/151/520 514/150/521 517/153/522 -f 514/150/521 516/152/523 517/153/522 -f 504/140/488 504/140/488 504/140/488 -f 516/152/508 506/142/508 518/154/508 -f 504/140/488 517/153/522 504/140/524 -f 517/153/522 519/155/525 504/140/524 -f 517/153/522 516/152/523 518/154/526 -f 517/153/522 518/154/526 519/155/525 -f 504/140/488 504/140/488 504/140/488 -f 518/154/508 506/142/508 505/141/508 -f 504/140/524 519/155/525 508/144/510 -f 504/140/524 508/144/510 504/140/509 -f 519/155/525 518/154/526 508/144/510 -f 518/154/526 505/141/512 508/144/510 - -# Mesh 'Kopf' with 90 faces -g Kopf -f 520/68/527 521/156/528 522/157/529 -f 520/68/527 523/158/530 521/156/528 -f 524/69/531 525/159/532 526/160/533 -f 520/68/527 527/161/534 523/158/530 -f 524/69/531 526/160/533 528/162/535 -f 520/68/527 529/163/536 527/161/534 -f 524/69/531 528/162/535 530/164/537 -f 520/68/527 531/165/538 529/163/536 -f 524/69/531 530/164/537 532/166/539 -f 520/68/527 533/167/540 531/165/538 -f 534/168/541 535/169/542 525/159/532 -f 525/159/532 535/169/542 536/170/543 -f 525/159/532 536/170/543 526/160/533 -f 526/160/533 536/170/543 528/162/535 -f 536/170/543 537/169/544 528/162/535 -f 528/162/535 537/169/544 538/171/545 -f 528/162/535 538/171/545 530/164/537 -f 530/164/537 538/171/545 532/166/539 -f 538/171/545 539/172/546 532/166/539 -f 540/173/547 541/174/548 534/168/541 -f 541/174/548 542/175/549 534/168/541 -f 534/168/541 542/175/549 543/176/550 -f 534/168/541 543/176/550 535/169/542 -f 535/169/542 543/176/550 536/170/543 -f 543/176/550 544/177/551 536/170/543 -f 536/170/543 544/177/551 545/178/552 -f 536/170/543 545/178/552 537/169/544 -f 537/169/544 545/178/552 538/171/545 -f 545/178/552 546/179/553 538/171/545 -f 538/171/545 546/179/553 547/180/554 -f 538/171/545 547/180/554 539/172/546 -f 541/174/548 548/181/555 549/182/556 -f 541/174/548 549/182/556 542/175/549 -f 542/175/549 549/182/556 543/176/550 -f 549/182/556 550/183/557 543/176/550 -f 543/176/550 550/183/557 551/184/558 -f 543/176/550 551/184/558 544/177/551 -f 544/177/551 551/184/558 545/178/552 -f 551/184/558 552/185/559 545/178/552 -f 546/179/553 553/186/560 547/180/554 -f 553/186/560 554/187/561 547/180/554 -f 548/181/555 522/157/529 549/182/556 -f 522/157/529 521/156/528 549/182/556 -f 549/182/556 521/156/528 523/158/530 -f 549/182/556 523/158/530 550/183/557 -f 550/183/557 523/158/530 551/184/558 -f 523/158/530 527/161/534 551/184/558 -f 551/184/558 527/161/534 529/163/536 -f 551/184/558 529/163/536 552/185/559 -f 552/185/559 529/163/536 553/186/560 -f 529/163/536 531/165/538 553/186/560 -f 553/186/560 531/165/538 533/167/540 -f 553/186/560 533/167/540 554/187/561 -f 555/188/562 556/189/563 557/190/564 -f 546/179/553 558/191/565 557/190/564 -f 557/190/564 555/188/562 546/179/553 -f 559/192/566 558/191/565 546/179/553 -f 558/191/565 559/192/566 560/193/567 -f 560/193/567 557/190/564 558/191/565 -f 561/194/568 560/193/567 559/192/566 -f 559/192/566 562/195/569 561/194/568 -f 563/196/570 561/194/568 564/197/571 -f 562/195/569 564/197/571 561/194/568 -f 565/198/572 563/196/570 566/199/573 -f 563/196/570 564/197/571 566/199/573 -f 566/199/573 567/200/574 565/198/572 -f 566/199/573 568/201/575 567/200/574 -f 568/201/575 569/202/576 567/200/574 -f 570/203/577 567/200/574 569/202/576 -f 569/202/576 571/204/578 570/203/577 -f 572/205/579 570/203/577 571/204/578 -f 573/206/580 572/205/579 571/204/578 -f 571/204/578 574/207/581 573/206/580 -f 575/208/582 573/206/580 574/207/581 -f 574/207/581 576/209/583 575/208/582 -f 556/189/563 575/208/582 576/209/583 -f 576/209/583 555/188/562 556/189/563 -f 555/188/562 553/186/560 546/179/553 -f 555/188/562 576/209/583 553/186/560 -f 576/209/583 574/207/581 553/186/560 -f 574/207/581 571/204/578 553/186/560 -f 571/204/578 569/202/576 553/186/560 -f 552/185/559 553/186/560 569/202/576 -f 569/202/576 568/201/575 552/185/559 -f 568/201/575 566/199/573 552/185/559 -f 559/192/566 546/179/553 545/178/552 -f 562/195/569 559/192/566 545/178/552 -f 564/197/571 562/195/569 545/178/552 -f 545/178/552 552/185/559 566/199/573 -f 564/197/571 566/199/573 545/178/552 - -# Mesh 'Brust' with 20 faces -g Brust -f 70/210/584 71/211/585 577/212/586 -f 60/120/587 577/212/586 64/213/588 -f 577/212/586 71/211/585 64/213/588 -f 70/210/584 577/212/586 578/214/589 -f 75/215/590 578/214/589 579/216/591 -f 60/120/587 579/216/591 577/212/586 -f 578/214/589 577/212/586 579/216/591 -f 70/210/584 578/214/589 580/217/592 -f 77/75/593 580/217/592 581/218/594 -f 75/215/590 581/218/594 578/214/589 -f 580/217/592 578/214/589 581/218/594 -f 77/75/593 581/218/594 72/219/595 -f 75/215/590 73/220/596 581/218/594 -f 72/219/595 581/218/594 73/220/596 -f 75/215/590 579/216/591 74/221/597 -f 60/120/587 61/222/598 579/216/591 -f 74/221/597 579/216/591 61/222/598 -f 70/210/584 580/217/592 69/223/599 -f 77/75/593 79/224/600 580/217/592 -f 69/223/599 580/217/592 79/224/600 - -# Mesh 'Kopf2' with 90 faces -g Kopf2 -f 582/225/601 583/226/602 584/123/603 -f 583/226/602 585/227/604 584/123/603 -f 586/228/605 587/229/606 588/118/607 -f 585/227/604 589/230/608 584/123/603 -f 590/231/609 586/228/605 588/118/607 -f 589/230/608 591/232/610 584/123/603 -f 592/233/611 590/231/609 588/118/607 -f 591/232/610 593/234/612 584/123/603 -f 594/235/613 592/233/611 588/118/607 -f 593/234/612 595/236/614 584/123/603 -f 587/229/606 596/237/615 597/238/616 -f 598/239/617 596/237/615 587/229/606 -f 586/228/605 598/239/617 587/229/606 -f 590/231/609 598/239/617 586/228/605 -f 590/231/609 599/237/618 598/239/617 -f 600/240/619 599/237/618 590/231/609 -f 592/233/611 600/240/619 590/231/609 -f 594/235/613 600/240/619 592/233/611 -f 594/235/613 601/241/620 600/240/619 -f 597/238/616 602/176/621 603/242/622 -f 597/238/616 604/243/623 602/176/621 -f 605/174/624 604/243/623 597/238/616 -f 596/237/615 605/174/624 597/238/616 -f 598/239/617 605/174/624 596/237/615 -f 598/239/617 606/244/625 605/174/624 -f 607/245/626 606/244/625 598/239/617 -f 599/237/618 607/245/626 598/239/617 -f 600/240/619 607/245/626 599/237/618 -f 600/240/619 608/246/627 607/245/626 -f 609/247/628 608/246/627 600/240/619 -f 601/241/620 609/247/628 600/240/619 -f 610/248/629 611/249/630 602/176/621 -f 604/243/623 610/248/629 602/176/621 -f 605/174/624 610/248/629 604/243/623 -f 605/174/624 612/250/631 610/248/629 -f 613/251/632 612/250/631 605/174/624 -f 606/244/625 613/251/632 605/174/624 -f 607/245/626 613/251/632 606/244/625 -f 607/245/626 614/252/633 613/251/632 -f 609/247/628 615/253/634 608/246/627 -f 609/247/628 616/254/635 615/253/634 -f 610/248/629 582/225/601 611/249/630 -f 610/248/629 583/226/602 582/225/601 -f 585/227/604 583/226/602 610/248/629 -f 612/250/631 585/227/604 610/248/629 -f 613/251/632 585/227/604 612/250/631 -f 613/251/632 589/230/608 585/227/604 -f 591/232/610 589/230/608 613/251/632 -f 614/252/633 591/232/610 613/251/632 -f 615/253/634 591/232/610 614/252/633 -f 615/253/634 593/234/612 591/232/610 -f 595/236/614 593/234/612 615/253/634 -f 616/254/635 595/236/614 615/253/634 -f 617/255/636 618/256/637 619/257/638 -f 617/255/636 620/258/639 608/246/627 -f 608/246/627 619/257/638 617/255/636 -f 608/246/627 620/258/639 621/259/640 -f 622/260/641 621/259/640 620/258/639 -f 620/258/639 617/255/636 622/260/641 -f 621/259/640 622/260/641 623/261/642 -f 623/261/642 624/262/643 621/259/640 -f 625/263/644 623/261/642 626/264/645 -f 623/261/642 625/263/644 624/262/643 -f 627/265/646 626/264/645 628/266/647 -f 627/265/646 625/263/644 626/264/645 -f 628/266/647 629/267/648 627/265/646 -f 629/267/648 630/268/649 627/265/646 -f 629/267/648 631/269/650 630/268/649 -f 631/269/650 629/267/648 632/270/651 -f 632/270/651 633/271/652 631/269/650 -f 633/271/652 632/270/651 634/272/653 -f 633/271/652 634/272/653 635/273/654 -f 635/273/654 636/274/655 633/271/652 -f 636/274/655 635/273/654 637/275/656 -f 637/275/656 638/276/657 636/274/655 -f 638/276/657 637/275/656 618/256/637 -f 618/256/637 619/257/638 638/276/657 -f 608/246/627 615/253/634 619/257/638 -f 615/253/634 638/276/657 619/257/638 -f 615/253/634 636/274/655 638/276/657 -f 615/253/634 633/271/652 636/274/655 -f 615/253/634 631/269/650 633/271/652 -f 631/269/650 615/253/634 614/252/633 -f 614/252/633 630/268/649 631/269/650 -f 614/252/633 627/265/646 630/268/649 -f 607/245/626 608/246/627 621/259/640 -f 607/245/626 621/259/640 624/262/643 -f 607/245/626 624/262/643 625/263/644 -f 627/265/646 614/252/633 607/245/626 -f 607/245/626 627/265/646 625/263/644 - -# Mesh 'Zahn2' with 42 faces -g Zahn2 -f 639/124/488 639/124/488 639/124/488 -f 640/127/658 641/126/658 642/125/658 -f 643/129/659 644/128/660 639/124/661 -f 639/124/488 643/129/659 639/124/661 -f 643/129/659 642/125/662 644/128/660 -f 643/129/659 640/127/663 642/125/662 -f 639/124/488 639/124/488 639/124/488 -f 645/130/658 641/126/658 640/127/658 -f 639/124/664 643/129/659 639/124/488 -f 639/124/664 646/131/665 643/129/659 -f 645/130/666 640/127/663 643/129/659 -f 646/131/665 645/130/666 643/129/659 -f 639/124/488 639/124/488 639/124/488 -f 647/132/658 641/126/658 645/130/658 -f 648/133/667 646/131/665 639/124/664 -f 639/124/488 648/133/667 639/124/664 -f 648/133/667 645/130/666 646/131/665 -f 648/133/667 647/132/668 645/130/666 -f 639/124/488 639/124/488 639/124/488 -f 649/134/658 641/126/658 647/132/658 -f 639/124/669 648/133/667 639/124/488 -f 639/124/669 650/135/670 648/133/667 -f 649/134/671 647/132/668 648/133/667 -f 650/135/670 649/134/671 648/133/667 -f 639/124/488 639/124/488 639/124/488 -f 651/136/658 641/126/658 649/134/658 -f 652/137/672 650/135/670 639/124/669 -f 639/124/488 652/137/672 639/124/669 -f 652/137/672 649/134/671 650/135/670 -f 652/137/672 651/136/673 649/134/671 -f 639/124/488 639/124/488 639/124/488 -f 653/138/658 641/126/658 651/136/658 -f 639/124/674 652/137/672 639/124/488 -f 639/124/674 654/139/675 652/137/672 -f 653/138/676 651/136/673 652/137/672 -f 654/139/675 653/138/676 652/137/672 -f 639/124/488 639/124/488 639/124/488 -f 642/125/658 641/126/658 653/138/658 -f 644/128/660 654/139/675 639/124/674 -f 639/124/661 644/128/660 639/124/674 -f 644/128/660 653/138/676 654/139/675 -f 644/128/660 642/125/662 653/138/676 - -# Mesh 'klZahn2' with 42 faces -g klZahn2 -f 655/140/488 655/140/488 655/140/488 -f 656/143/677 657/142/677 658/141/677 -f 659/145/678 660/144/679 655/140/680 -f 655/140/488 659/145/678 655/140/680 -f 659/145/678 658/141/681 660/144/679 -f 659/145/678 656/143/682 658/141/681 -f 655/140/488 655/140/488 655/140/488 -f 661/146/677 657/142/677 656/143/677 -f 655/140/683 659/145/678 655/140/488 -f 655/140/683 662/147/684 659/145/678 -f 661/146/685 656/143/682 659/145/678 -f 662/147/684 661/146/685 659/145/678 -f 655/140/488 655/140/488 655/140/488 -f 663/148/677 657/142/677 661/146/677 -f 664/149/686 662/147/684 655/140/683 -f 655/140/488 664/149/686 655/140/683 -f 664/149/686 661/146/685 662/147/684 -f 664/149/686 663/148/687 661/146/685 -f 655/140/488 655/140/488 655/140/488 -f 665/150/677 657/142/677 663/148/677 -f 655/140/688 664/149/686 655/140/488 -f 655/140/688 666/151/689 664/149/686 -f 665/150/690 663/148/687 664/149/686 -f 666/151/689 665/150/690 664/149/686 -f 655/140/488 655/140/488 655/140/488 -f 667/152/677 657/142/677 665/150/677 -f 668/153/691 666/151/689 655/140/688 -f 655/140/488 668/153/691 655/140/688 -f 668/153/691 665/150/690 666/151/689 -f 668/153/691 667/152/692 665/150/690 -f 655/140/488 655/140/488 655/140/488 -f 669/154/677 657/142/677 667/152/677 -f 655/140/693 668/153/691 655/140/488 -f 655/140/693 670/155/694 668/153/691 -f 669/154/695 667/152/692 668/153/691 -f 670/155/694 669/154/695 668/153/691 -f 655/140/488 655/140/488 655/140/488 -f 658/141/677 657/142/677 669/154/677 -f 660/144/679 670/155/694 655/140/693 -f 655/140/680 660/144/679 655/140/693 -f 660/144/679 669/154/695 670/155/694 -f 660/144/679 658/141/681 669/154/695 - -# Mesh 'Auge' with 38 faces -g Auge -f 671/277/696 672/278/697 673/279/698 -f 671/277/696 673/279/698 674/280/699 -f 675/281/700 674/280/699 676/282/701 -f 674/280/699 673/279/698 676/282/701 -f 675/281/700 676/282/701 677/283/702 -f 678/284/703 679/285/704 680/286/705 -f 681/287/706 680/286/705 682/288/707 -f 683/289/708 682/288/707 679/285/704 -f 680/286/705 679/285/704 682/288/707 -f 681/287/706 682/288/707 684/290/709 -f 685/291/710 684/290/709 686/292/711 -f 683/289/708 686/292/711 682/288/707 -f 684/290/709 682/288/707 686/292/711 -f 685/291/710 687/293/712 688/294/713 -f 689/295/714 688/294/713 690/296/715 -f 691/297/716 690/296/715 687/293/712 -f 688/294/713 687/293/712 690/296/715 -f 689/295/714 690/296/715 692/298/717 -f 671/277/696 692/298/717 693/299/718 -f 691/297/716 693/299/718 690/296/715 -f 692/298/717 690/296/715 693/299/718 -f 671/277/696 693/299/718 672/278/697 -f 675/281/700 694/300/719 674/280/699 -f 671/277/696 674/280/699 692/298/717 -f 689/295/714 692/298/717 694/300/719 -f 674/280/699 694/300/719 692/298/717 -f 675/281/700 695/301/720 694/300/719 -f 689/295/714 694/300/719 696/302/721 -f 681/287/706 696/302/721 695/301/720 -f 694/300/719 695/301/720 696/302/721 -f 675/281/700 677/283/702 695/301/720 -f 681/287/706 695/301/720 680/286/705 -f 678/284/703 680/286/705 677/283/702 -f 695/301/720 677/283/702 680/286/705 -f 685/291/710 688/294/713 684/290/709 -f 681/287/706 684/290/709 696/302/721 -f 689/295/714 696/302/721 688/294/713 -f 684/290/709 688/294/713 696/302/721 - -# Mesh 'Duplicate05' with 38 faces -g Duplicate05 -f 697/279/722 698/278/723 699/277/724 -f 700/280/725 697/279/722 699/277/724 -f 701/282/726 700/280/725 702/281/727 -f 701/282/726 697/279/722 700/280/725 -f 703/283/728 701/282/726 702/281/727 -f 704/286/729 705/285/730 706/284/731 -f 707/288/732 704/286/729 708/287/733 -f 705/285/730 707/288/732 709/289/734 -f 707/288/732 705/285/730 704/286/729 -f 710/290/735 707/288/732 708/287/733 -f 711/292/736 710/290/735 712/291/737 -f 707/288/732 711/292/736 709/289/734 -f 711/292/736 707/288/732 710/290/735 -f 713/294/738 714/293/739 712/291/737 -f 715/296/740 713/294/738 716/295/741 -f 714/293/739 715/296/740 717/297/742 -f 715/296/740 714/293/739 713/294/738 -f 718/298/743 715/296/740 716/295/741 -f 719/299/744 718/298/743 699/277/724 -f 715/296/740 719/299/744 717/297/742 -f 719/299/744 715/296/740 718/298/743 -f 698/278/723 719/299/744 699/277/724 -f 700/280/725 720/300/745 702/281/727 -f 718/298/743 700/280/725 699/277/724 -f 720/300/745 718/298/743 716/295/741 -f 718/298/743 720/300/745 700/280/725 -f 720/300/745 721/301/746 702/281/727 -f 722/302/747 720/300/745 716/295/741 -f 721/301/746 722/302/747 708/287/733 -f 722/302/747 721/301/746 720/300/745 -f 721/301/746 703/283/728 702/281/727 -f 704/286/729 721/301/746 708/287/733 -f 703/283/728 704/286/729 706/284/731 -f 704/286/729 703/283/728 721/301/746 -f 710/290/735 713/294/738 712/291/737 -f 722/302/747 710/290/735 708/287/733 -f 713/294/738 722/302/747 716/295/741 -f 722/302/747 713/294/738 710/290/735 - diff --git a/test/models/PLY/cube_test.ply b/test/models/PLY/cube_test.ply deleted file mode 100644 index 8de33f3de..000000000 --- a/test/models/PLY/cube_test.ply +++ /dev/null @@ -1,24 +0,0 @@ -ply -format ascii 1.0 -comment Created by Open Asset Import Library - http://assimp.sf.net (v4.1.3023643559) -element vertex 8 -property float x -property float y -property float z -element face 6 -property list uchar int vertex_index -end_header -0 0 0 -0 0 1 -0 1 1 -0 1 0 -1 0 0 -1 0 1 -1 1 1 -1 1 0 -4 0 1 2 3 -4 7 6 5 4 -4 0 4 5 1 -4 1 5 6 2 -4 2 6 7 3 -4 3 7 4 0 From 70ae30f26a8c3c2b25f4d5f75e3ac9941205b5da Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 18:55:40 +0200 Subject: [PATCH 010/106] ASE: Reformat initializer list --- code/ASEParser.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index 33d4ea53d..dda487547 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -68,7 +68,9 @@ using namespace D3DS; struct Material : public D3DS::Material { //! Default constructor - Material() : pcInstance(NULL), bNeed (false) + Material() + : pcInstance(NULL) + , bNeed (false) {} //! Contains all sub materials of this material From 6c4e3bce5301d48275fbc1a51508ad0e79ef9aae Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 18:57:48 +0200 Subject: [PATCH 011/106] 3DS: Reformat initializer list --- code/3DSLoader.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index 26c487abf..b5534f157 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -105,14 +105,14 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer Discreet3DSImporter::Discreet3DSImporter() - : stream(), - mLastNodeIndex(), - mCurrentNode(), - mRootNode(), - mScene(), - mMasterScale(), - bHasBG(), - bIsPrj() +: stream() +, mLastNodeIndex() +, mCurrentNode() +, mRootNode() +, mScene() +, mMasterScale() +, bHasBG() +, bIsPrj() {} // ------------------------------------------------------------------------------------------------ From 4d946d9e314bc5e1ff2c4489bf0b12247e8d32a4 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:10:00 +0200 Subject: [PATCH 012/106] ASE: Reformat another initializer list --- code/ASELoader.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index a8d2206cf..798f25f85 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -83,11 +83,11 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer ASEImporter::ASEImporter() - : mParser(), - mBuffer(), - pcScene(), - configRecomputeNormals(), - noSkeletonMesh() +: mParser() +, mBuffer() +, pcScene() +, configRecomputeNormals() +, noSkeletonMesh() {} // ------------------------------------------------------------------------------------------------ From 9e7b21f83dc0eb1452ae89bbc4f35a76205bd8f8 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:24:22 +0200 Subject: [PATCH 013/106] 3DS: Add explicit default constructors and assignment operators to Material --- code/3DSHelper.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 4996650eb..f0ab18e51 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -387,6 +387,16 @@ struct Material mName = szTemp; } + + Material(const Material &other) = default; + Material(Material &&other) = default; + + Material &operator=(const Material &other) = default; + Material &operator=(Material &&other) = default; + + ~Material() {} + + //! Name of the material std::string mName; //! Diffuse color of the material From 024aade20861a1399aaab9755bdda6df3b56dc77 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:33:50 +0200 Subject: [PATCH 014/106] ASE: Add explicit default constructors and assignment operators to Material --- code/ASEParser.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/ASEParser.h b/code/ASEParser.h index dda487547..4e2d6f7ef 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -73,6 +73,16 @@ struct Material : public D3DS::Material , bNeed (false) {} + + Material(const Material &other) = default; + Material(Material &&other) = default; + + Material &operator=(const Material &other) = default; + Material &operator=(Material &&other) = default; + + ~Material() {} + + //! Contains all sub materials of this material std::vector avSubMaterials; From d49996d8a672efe60ef6279782f74b521bcc8037 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:38:38 +0200 Subject: [PATCH 015/106] 3DS: Add Material constructor which takes material name --- code/3DSHelper.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index f0ab18e51..d70a6baf7 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -388,6 +388,20 @@ struct Material } + //! Constructor with explicit name + explicit Material(const std::string &name) + : mDiffuse ( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ) ) // FIX ... we won't want object to be black + , mSpecularExponent ( ai_real( 0.0 ) ) + , mShininessStrength ( ai_real( 1.0 ) ) + , mShading(Discreet3DS::Gouraud) + , mTransparency ( ai_real( 1.0 ) ) + , mBumpHeight ( ai_real( 1.0 ) ) + , mTwoSided (false) + { + mName = name; + } + + Material(const Material &other) = default; Material(Material &&other) = default; From 60d78f1701af1f12258f560fc0fc72173193bd44 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:43:15 +0200 Subject: [PATCH 016/106] ASE: Add Material constructor which takes material name --- code/ASEParser.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/ASEParser.h b/code/ASEParser.h index 4e2d6f7ef..d9a74e645 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -74,6 +74,14 @@ struct Material : public D3DS::Material {} + //! Constructor with explicit name + explicit Material(const std::string &name) + : D3DS::Material(name) + , pcInstance(NULL) + , bNeed (false) + {} + + Material(const Material &other) = default; Material(Material &&other) = default; From 4b1b5f1b59a4fd7098628d0a3bb1f03ae25f9012 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:50:20 +0200 Subject: [PATCH 017/106] ASE: Pass a default material name when resizing materials buffer --- code/ASEParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index fcb90b3ca..a11512ae3 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -528,7 +528,7 @@ void Parser::ParseLV1MaterialListBlock() ParseLV4MeshLong(iMaterialCount); // now allocate enough storage to hold all materials - m_vMaterials.resize(iOldMaterialCount+iMaterialCount); + m_vMaterials.resize(iOldMaterialCount+iMaterialCount, Material("INVALID")); continue; } if (TokenMatch(filePtr,"MATERIAL",8)) From 1b28124f21b8b81fa6f0df0a7fd094b96c4bf8a9 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 19:54:16 +0200 Subject: [PATCH 018/106] ASE: Pass a default material name when resizing submaterials buffer --- code/ASEParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index a11512ae3..79624ad2e 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -706,7 +706,7 @@ void Parser::ParseLV2MaterialBlock(ASE::Material& mat) ParseLV4MeshLong(iNumSubMaterials); // allocate enough storage - mat.avSubMaterials.resize(iNumSubMaterials); + mat.avSubMaterials.resize(iNumSubMaterials, Material("INVALID SUBMATERIAL")); } // submaterial chunks if (TokenMatch(filePtr,"SUBMATERIAL",11)) From 209966ef35e3881936a98c8f1cebc5f1ac45d079 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 20:15:21 +0200 Subject: [PATCH 019/106] ASE: Pass default material name to constructor --- code/ASELoader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index 798f25f85..6dd6bcdd7 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -276,14 +276,13 @@ void ASEImporter::GenerateDefaultMaterial() } if (bHas || mParser->m_vMaterials.empty()) { // add a simple material without submaterials to the parser's list - mParser->m_vMaterials.push_back ( ASE::Material() ); + mParser->m_vMaterials.push_back ( ASE::Material(AI_DEFAULT_MATERIAL_NAME) ); ASE::Material& mat = mParser->m_vMaterials.back(); mat.mDiffuse = aiColor3D(0.6f,0.6f,0.6f); mat.mSpecular = aiColor3D(1.0f,1.0f,1.0f); mat.mAmbient = aiColor3D(0.05f,0.05f,0.05f); mat.mShading = Discreet3DS::Gouraud; - mat.mName = AI_DEFAULT_MATERIAL_NAME; } } From f2ec3eeeb8a0dd192c0ee65a80cbf8039fac52b0 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 20:20:37 +0200 Subject: [PATCH 020/106] ASE: Delete Material default constructor --- code/ASEParser.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index d9a74e645..e079c4931 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -67,11 +67,8 @@ using namespace D3DS; /** Helper structure representing an ASE material */ struct Material : public D3DS::Material { - //! Default constructor - Material() - : pcInstance(NULL) - , bNeed (false) - {} + //! Default constructor has been deleted + Material() = delete; //! Constructor with explicit name From 10246bf0522ae2bbe08fd9d80facc8c605609167 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 20:29:46 +0200 Subject: [PATCH 021/106] 3DS: Pass default material name to Material constructor --- code/3DSLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index b5534f157..d003fec4a 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -346,7 +346,7 @@ void Discreet3DSImporter::ParseObjectChunk() case Discreet3DS::CHUNK_MAT_MATERIAL: // Add a new material to the list - mScene->mMaterials.push_back(D3DS::Material()); + mScene->mMaterials.push_back(D3DS::Material(std::string("UNNAMED_" + std::to_string(mScene->mMaterials.size())))); ParseMaterialChunk(); break; From dd7035372d822000ad50b78369ac8f9d50582bae Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 20:36:05 +0200 Subject: [PATCH 022/106] 3DS: Pass default material name to constructor instead of changing after the fact --- code/3DSConverter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/3DSConverter.cpp b/code/3DSConverter.cpp index af62e9f3c..9a437e33f 100644 --- a/code/3DSConverter.cpp +++ b/code/3DSConverter.cpp @@ -127,9 +127,8 @@ void Discreet3DSImporter::ReplaceDefaultMaterial() if (cnt && idx == mScene->mMaterials.size()) { // We need to create our own default material - D3DS::Material sMat; + D3DS::Material sMat("%%%DEFAULT"); sMat.mDiffuse = aiColor3D(0.3f,0.3f,0.3f); - sMat.mName = "%%%DEFAULT"; mScene->mMaterials.push_back(sMat); DefaultLogger::get()->info("3DS: Generating default material"); From 4acd96d40555bcb4768ac96020577801144c9152 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 20:36:51 +0200 Subject: [PATCH 023/106] 3DS: Remove Material default constructor --- code/3DSHelper.h | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index d70a6baf7..229d2ae20 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -370,22 +370,8 @@ struct Texture /** Helper structure representing a 3ds material */ struct Material { - //! Default constructor. Builds a default name for the material - Material() - : mDiffuse ( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ) ) // FIX ... we won't want object to be black - , mSpecularExponent ( ai_real( 0.0 ) ) - , mShininessStrength ( ai_real( 1.0 ) ) - , mShading(Discreet3DS::Gouraud) - , mTransparency ( ai_real( 1.0 ) ) - , mBumpHeight ( ai_real( 1.0 ) ) - , mTwoSided (false) - { - static int iCnt = 0; - - char szTemp[128]; - ai_snprintf(szTemp, 128, "UNNAMED_%i",iCnt++); - mName = szTemp; - } + //! Default constructor has been deleted + Material() = delete; //! Constructor with explicit name From e6ff15d20146a87a807684900e4fb71c38336873 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 23 Jan 2018 20:41:26 +0200 Subject: [PATCH 024/106] 3DS: Initialize Material name in initializer list --- code/3DSHelper.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 229d2ae20..9091b990f 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -376,7 +376,8 @@ struct Material //! Constructor with explicit name explicit Material(const std::string &name) - : mDiffuse ( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ) ) // FIX ... we won't want object to be black + : mName(name) + , mDiffuse ( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ) ) // FIX ... we won't want object to be black , mSpecularExponent ( ai_real( 0.0 ) ) , mShininessStrength ( ai_real( 1.0 ) ) , mShading(Discreet3DS::Gouraud) @@ -384,7 +385,6 @@ struct Material , mBumpHeight ( ai_real( 1.0 ) ) , mTwoSided (false) { - mName = name; } From cbd7916cedf5081aa411c230c76d1b47e1425de1 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Wed, 24 Jan 2018 12:10:46 +0200 Subject: [PATCH 025/106] 3DS: Explicitly write out Material move constructor and assignment operator Because MSVC doesn't support defaulting them --- code/3DSHelper.h | 58 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 9091b990f..150eb27b6 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -389,10 +389,62 @@ struct Material Material(const Material &other) = default; - Material(Material &&other) = default; - Material &operator=(const Material &other) = default; - Material &operator=(Material &&other) = default; + + + //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it + Material(Material &&other) + : mName(std::move(other.mName)) + , mDiffuse(std::move(other.mDiffuse)) + , mSpecularExponent(std::move(other.mSpecularExponent)) + , mShininessStrength(std::move(other.mShininessStrength)) + , mSpecular(std::move(other.mSpecular)) + , mAmbient(std::move(other.mAmbient)) + , mShading(std::move(other.mShading)) + , mTransparency(std::move(other.mTransparency)) + , sTexDiffuse(std::move(other.sTexDiffuse)) + , sTexOpacity(std::move(other.sTexOpacity)) + , sTexSpecular(std::move(other.sTexSpecular)) + , sTexReflective(std::move(other.sTexReflective)) + , sTexBump(std::move(other.sTexBump)) + , sTexEmissive(std::move(other.sTexEmissive)) + , sTexShininess(std::move(other.sTexShininess)) + , mBumpHeight(std::move(other.mBumpHeight)) + , mEmissive(std::move(other.mEmissive)) + , sTexAmbient(std::move(other.sTexAmbient)) + , mTwoSided(std::move(other.mTwoSided)) + { + } + + + Material &operator=(Material &&other) { + if (this == &other) { + return *this; + } + + mName = std::move(other.mName); + mDiffuse = std::move(other.mDiffuse); + mSpecularExponent = std::move(other.mSpecularExponent); + mShininessStrength = std::move(other.mShininessStrength), + mSpecular = std::move(other.mSpecular); + mAmbient = std::move(other.mAmbient); + mShading = std::move(other.mShading); + mTransparency = std::move(other.mTransparency); + sTexDiffuse = std::move(other.sTexDiffuse); + sTexOpacity = std::move(other.sTexOpacity); + sTexSpecular = std::move(other.sTexSpecular); + sTexReflective = std::move(other.sTexReflective); + sTexBump = std::move(other.sTexBump); + sTexEmissive = std::move(other.sTexEmissive); + sTexShininess = std::move(other.sTexShininess); + mBumpHeight = std::move(other.mBumpHeight); + mEmissive = std::move(other.mEmissive); + sTexAmbient = std::move(other.sTexAmbient); + mTwoSided = std::move(other.mTwoSided); + + return *this; + } + ~Material() {} From a8fd9f668f39cd2fcffb390919faa492bf0ef888 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Wed, 24 Jan 2018 12:25:30 +0200 Subject: [PATCH 026/106] ASE: Explicitly write out Material move constructor and assignment operator Because MSVC doesn't support defaulting them --- code/ASEParser.h | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index e079c4931..843cec6ab 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -80,10 +80,36 @@ struct Material : public D3DS::Material Material(const Material &other) = default; - Material(Material &&other) = default; - Material &operator=(const Material &other) = default; - Material &operator=(Material &&other) = default; + + + //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it + Material(Material &&other) + : D3DS::Material(std::move(other)) + , avSubMaterials(std::move(other.avSubMaterials)) + , pcInstance(std::move(other.pcInstance)) + , bNeed(std::move(other.bNeed)) + { + other.pcInstance = nullptr; + } + + + Material &operator=(Material &&other) { + if (this == &other) { + return *this; + } + + D3DS::Material::operator=(std::move(other)); + + avSubMaterials = std::move(other.avSubMaterials); + pcInstance = std::move(other.pcInstance); + bNeed = std::move(other.bNeed); + + other.pcInstance = nullptr; + + return *this; + } + ~Material() {} From 5b948e9cca2f4627e2a6df8a0e4558575f804408 Mon Sep 17 00:00:00 2001 From: carmenfan Date: Wed, 24 Jan 2018 11:32:58 +0000 Subject: [PATCH 027/106] add const to GetEmbeddedTexture --- include/assimp/scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/scene.h b/include/assimp/scene.h index 82b38797e..2533f1a66 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -387,7 +387,7 @@ struct aiScene } //! Returns an embedded texture - const aiTexture* GetEmbeddedTexture(const char* filename) { + const aiTexture* GetEmbeddedTexture(const char* filename) const { const char* shortFilename = GetShortFilename(filename); for (unsigned int i = 0; i < mNumTextures; i++) { const char* shortTextureFilename = GetShortFilename(mTextures[i]->mFilename.C_Str()); From 0b15d5cd46caaa7fcb2d82e025a914f9e21cbeef Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 24 Jan 2018 21:20:34 +0100 Subject: [PATCH 028/106] closes https://github.com/assimp/assimp/issues/1721: set camera parameters instead of nonsense. --- code/FBXConverter.cpp | 21 ++++++++++----------- code/FBXParser.cpp | 23 ++++++++++------------- code/FBXProperties.cpp | 5 +---- code/FBXTokenizer.cpp | 2 -- code/MDLLoader.cpp | 34 ++++++++++++++-------------------- include/assimp/IOStream.hpp | 11 ++++++----- 6 files changed, 41 insertions(+), 55 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index f7a58ebdc..61883946c 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -443,10 +443,9 @@ private: }; Converter::Converter( aiScene* out, const Document& doc ) - : defaultMaterialIndex() - , out( out ) - , doc( doc ) -{ +: defaultMaterialIndex() +, out( out ) +, doc( doc ) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -483,8 +482,7 @@ Converter::Converter( aiScene* out, const Document& doc ) } -Converter::~Converter() -{ +Converter::~Converter() { std::for_each( meshes.begin(), meshes.end(), Util::delete_fun() ); std::for_each( materials.begin(), materials.end(), Util::delete_fun() ); std::for_each( animations.begin(), animations.end(), Util::delete_fun() ); @@ -493,8 +491,7 @@ Converter::~Converter() std::for_each( textures.begin(), textures.end(), Util::delete_fun() ); } -void Converter::ConvertRootNode() -{ +void Converter::ConvertRootNode() { out->mRootNode = new aiNode(); out->mRootNode->mName.Set( "RootNode" ); @@ -721,10 +718,12 @@ void Converter::ConvertCamera( const Model& model, const Camera& cam ) out_camera->mName.Set( FixNodeName( model.Name() ) ); out_camera->mAspect = cam.AspectWidth() / cam.AspectHeight(); + //cameras are defined along positive x direction - out_camera->mPosition = aiVector3D(0.0f); - out_camera->mLookAt = aiVector3D(1.0f, 0.0f, 0.0f); - out_camera->mUp = aiVector3D(0.0f, 1.0f, 0.0f); + out_camera->mPosition = cam.Position(); + out_camera->mLookAt = ( cam.InterestPosition() - out_camera->mPosition ).Normalize(); + out_camera->mUp = cam.UpVector(); + out_camera->mHorizontalFOV = AI_DEG_TO_RAD( cam.FieldOfView() ); out_camera->mClipPlaneNear = cam.NearPlane(); out_camera->mClipPlaneFar = cam.FarPlane(); diff --git a/code/FBXParser.cpp b/code/FBXParser.cpp index e8e588b06..a49d96af1 100644 --- a/code/FBXParser.cpp +++ b/code/FBXParser.cpp @@ -45,7 +45,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER - #ifdef ASSIMP_BUILD_NO_OWN_ZLIB # include #else @@ -67,7 +66,6 @@ using namespace Assimp::FBX; namespace { - // ------------------------------------------------------------------------------------------------ // signal parse error, this is always unrecoverable. Throws DeadlyImportError. AI_WONT_RETURN void ParseError(const std::string& message, const Token& token) AI_WONT_RETURN_SUFFIX; @@ -213,7 +211,6 @@ Scope::~Scope() } } - // ------------------------------------------------------------------------------------------------ Parser::Parser (const TokenList& tokens, bool is_binary) : tokens(tokens) @@ -537,18 +534,18 @@ void ReadBinaryDataArray(char type, uint32_t count, const char*& data, const cha uint32_t stride = 0; switch(type) { - case 'f': - case 'i': - stride = 4; - break; + case 'f': + case 'i': + stride = 4; + break; - case 'd': - case 'l': - stride = 8; - break; + case 'd': + case 'l': + stride = 8; + break; - default: - ai_assert(false); + default: + ai_assert(false); }; const uint32_t full_length = stride * count; diff --git a/code/FBXProperties.cpp b/code/FBXProperties.cpp index 774beac3c..6126dc53c 100644 --- a/code/FBXProperties.cpp +++ b/code/FBXProperties.cpp @@ -108,7 +108,7 @@ Property* ReadTypedProperty(const Element& element) ParseTokenAsFloat(*tok[6])) ); } - else if (!strcmp(cs,"double") || !strcmp(cs,"Number") || !strcmp(cs,"Float") || !strcmp(cs,"FieldOfView")) { + else if (!strcmp(cs,"double") || !strcmp(cs,"Number") || !strcmp(cs,"Float") || !strcmp(cs,"FieldOfView") || !strcmp( cs, "UnitScaleFactor" ) ) { return new TypedProperty(ParseTokenAsFloat(*tok[4])); } return NULL; @@ -138,7 +138,6 @@ PropertyTable::PropertyTable() { } - // ------------------------------------------------------------------------------------------------ PropertyTable::PropertyTable(const Element& element, std::shared_ptr templateProps) : templateProps(templateProps) @@ -229,8 +228,6 @@ DirectPropertyMap PropertyTable::GetUnparsedProperties() const return result; } - - } //! FBX } //! Assimp diff --git a/code/FBXTokenizer.cpp b/code/FBXTokenizer.cpp index d94556b97..aa0274ab5 100644 --- a/code/FBXTokenizer.cpp +++ b/code/FBXTokenizer.cpp @@ -76,13 +76,11 @@ Token::Token(const char* sbegin, const char* send, TokenType type, unsigned int ai_assert(static_cast(send-sbegin) > 0); } - // ------------------------------------------------------------------------------------------------ Token::~Token() { } - namespace { // ------------------------------------------------------------------------------------------------ diff --git a/code/MDLLoader.cpp b/code/MDLLoader.cpp index 4597afe11..bbb1c24d5 100644 --- a/code/MDLLoader.cpp +++ b/code/MDLLoader.cpp @@ -340,9 +340,9 @@ void FlipQuakeHeader(BE_NCONST MDL::Header* pcHeader) // ------------------------------------------------------------------------------------------------ // Read a Quake 1 file -void MDLImporter::InternReadFile_Quake1( ) -{ +void MDLImporter::InternReadFile_Quake1() { ai_assert(NULL != pScene); + BE_NCONST MDL::Header *pcHeader = (BE_NCONST MDL::Header*)this->mBuffer; #ifdef AI_BUILD_BIG_ENDIAN @@ -355,9 +355,11 @@ void MDLImporter::InternReadFile_Quake1( ) const unsigned char* szCurrent = (const unsigned char*)(pcHeader+1); // need to read all textures - for (unsigned int i = 0; i < (unsigned int)pcHeader->num_skins;++i) - { - union{BE_NCONST MDL::Skin* pcSkin;BE_NCONST MDL::GroupSkin* pcGroupSkin;}; + for ( unsigned int i = 0; i < (unsigned int)pcHeader->num_skins; ++i) { + union { + BE_NCONST MDL::Skin* pcSkin; + BE_NCONST MDL::GroupSkin* pcGroupSkin; + }; if (szCurrent + sizeof(MDL::Skin) > this->mBuffer + this->iFileSize) { throw DeadlyImportError("[Quake 1 MDL] Unexpected EOF"); } @@ -365,17 +367,15 @@ void MDLImporter::InternReadFile_Quake1( ) AI_SWAP4( pcSkin->group ); - // Quake 1 groupskins - if (1 == pcSkin->group) - { + // Quake 1 group-skins + if (1 == pcSkin->group) { AI_SWAP4( pcGroupSkin->nb ); // need to skip multiple images const unsigned int iNumImages = (unsigned int)pcGroupSkin->nb; szCurrent += sizeof(uint32_t) * 2; - if (0 != iNumImages) - { + if (0 != iNumImages) { if (!i) { // however, create only one output image (the first) this->CreateTextureARGB8_3DGS_MDL3(szCurrent + iNumImages * sizeof(float)); @@ -384,10 +384,7 @@ void MDLImporter::InternReadFile_Quake1( ) szCurrent += pcHeader->skinheight * pcHeader->skinwidth + sizeof(float) * iNumImages; } - } - // 3DGS has a few files that are using other 3DGS like texture formats here - else - { + } else { szCurrent += sizeof(uint32_t); unsigned int iSkip = i ? UINT_MAX : 0; CreateTexture_3DGS_MDL4(szCurrent,pcSkin->group,&iSkip); @@ -407,17 +404,14 @@ void MDLImporter::InternReadFile_Quake1( ) BE_NCONST MDL::Frame* pcFrames = (BE_NCONST MDL::Frame*)szCurrent; BE_NCONST MDL::SimpleFrame* pcFirstFrame; - if (0 == pcFrames->type) - { + if (0 == pcFrames->type) { // get address of single frame pcFirstFrame = &pcFrames->frame; - } - else - { + } else { // get the first frame in the group #if 1 - // FIXME: the cast is wrong and causea a warning on clang 5.0 + // FIXME: the cast is wrong and cause a warning on clang 5.0 // disable thi code for now, fix it later ai_assert(false && "Bad pointer cast"); #else diff --git a/include/assimp/IOStream.hpp b/include/assimp/IOStream.hpp index ce5907a47..2d7ac52af 100644 --- a/include/assimp/IOStream.hpp +++ b/include/assimp/IOStream.hpp @@ -70,7 +70,7 @@ class ASSIMP_API IOStream { protected: /** Constructor protected, use IOSystem::Open() to create an instance. */ - IOStream(void); + IOStream(); public: // ------------------------------------------------------------------- @@ -124,17 +124,18 @@ public: }; //! class IOStream // ---------------------------------------------------------------------------------- -inline IOStream::IOStream() -{ +inline +IOStream::IOStream() { // empty } // ---------------------------------------------------------------------------------- -inline IOStream::~IOStream() -{ +inline +IOStream::~IOStream() { // empty } // ---------------------------------------------------------------------------------- + } //!namespace Assimp #endif //!!AI_IOSTREAM_H_INC From 47a2775b94eedf6e3422d4803b8dbef2d8655bf7 Mon Sep 17 00:00:00 2001 From: Giuseppe Barbieri Date: Wed, 24 Jan 2018 21:30:25 +0100 Subject: [PATCH 029/106] Update FBXConverter.cpp Renamed nested looping variable --- code/FBXConverter.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index 24bdfdd11..bb85468eb 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -1505,14 +1505,14 @@ unsigned int Converter::ConvertMeshMultiMaterial( const MeshGeometry& mesh, cons out_mesh->mBitangents[ cursor ] = ( *binormals )[ in_cursor ]; } - for ( unsigned int i = 0; i < num_uvs; ++i ) { - const std::vector& uvs = mesh.GetTextureCoords( i ); - out_mesh->mTextureCoords[ i ][ cursor ] = aiVector3D( uvs[ in_cursor ].x, uvs[ in_cursor ].y, 0.0f ); + for ( unsigned int j = 0; j < num_uvs; ++j ) { + const std::vector& uvs = mesh.GetTextureCoords( j ); + out_mesh->mTextureCoords[ j ][ cursor ] = aiVector3D( uvs[ in_cursor ].x, uvs[ in_cursor ].y, 0.0f ); } - for ( unsigned int i = 0; i < num_vcs; ++i ) { - const std::vector& cols = mesh.GetVertexColors( i ); - out_mesh->mColors[ i ][ cursor ] = cols[ in_cursor ]; + for ( unsigned int j = 0; j < num_vcs; ++j ) { + const std::vector& cols = mesh.GetVertexColors( j ); + out_mesh->mColors[ j ][ cursor ] = cols[ in_cursor ]; } } } From 5baba374147de5f701a3685c1dc836e239214ea2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 24 Jan 2018 21:43:36 +0100 Subject: [PATCH 030/106] closes https://github.com/assimp/assimp/issues/1728: check if mesh is a null instance before dereferencing it. --- code/XFileImporter.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/XFileImporter.cpp b/code/XFileImporter.cpp index 75be90310..6d1316194 100644 --- a/code/XFileImporter.cpp +++ b/code/XFileImporter.cpp @@ -246,6 +246,10 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec for( unsigned int a = 0; a < pMeshes.size(); a++) { XFile::Mesh* sourceMesh = pMeshes[a]; + if ( nullptr == sourceMesh ) { + continue; + } + // first convert its materials so that we can find them with their index afterwards ConvertMaterials( pScene, sourceMesh->mMaterials); From cec006f74baf0cba881ebd8c831bad5e24976820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B6ber?= Date: Thu, 25 Jan 2018 14:56:37 +0100 Subject: [PATCH 031/106] Add note to aiProcess_FindDegenerates about AI_CONFIG_PP_FD_CHECKAREA --- include/assimp/postprocess.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/assimp/postprocess.h b/include/assimp/postprocess.h index 970df8e8a..d1263599b 100644 --- a/include/assimp/postprocess.h +++ b/include/assimp/postprocess.h @@ -360,6 +360,11 @@ enum aiPostProcessSteps * and line meshes from the scene. * * + * + * This step also removes very small triangles with a surface area smaller + * than 10^-6. If you rely on having these small triangles, or notice holes + * in your model, set the property #AI_CONFIG_PP_FD_CHECKAREA to + * false. * @note Degenerate polygons are not necessarily evil and that's why * they're not removed by default. There are several file formats which * don't support lines or points, and some exporters bypass the From 98325ee95dac2b8f26a5f35ae987fd7e72840f86 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 27 Jan 2018 09:20:22 +0100 Subject: [PATCH 032/106] closes https://github.com/assimp/assimp/issues/1743: introduce /bigobj compile flag. --- CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7ebed370..1a20b6c3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -213,7 +213,9 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) ELSEIF(MSVC) # enable multi-core compilation with MSVC add_compile_options(/MP) - + if("${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)") + add_compile_options( /bigobj ) + endif() # disable "elements of array '' will be default initialized" warning on MSVC2013 IF(MSVC12) add_compile_options(/wd4351) From b58006441492de8934328cac3f5bb040b2f80713 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:11:19 +0200 Subject: [PATCH 033/106] 3DS: Add Mesh constructor with takes name --- code/3DSHelper.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 150eb27b6..21ef6f5e9 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -505,6 +505,14 @@ struct Mesh : public MeshWithSmoothingGroups mName = szTemp; } + + //! Constructor with explicit name + explicit Mesh(const std::string &name) + : mName(name) + { + } + + //! Name of the mesh std::string mName; From 93fa3732060488a9692838c191f6b0586f243b55 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:15:58 +0200 Subject: [PATCH 034/106] 3DS: Pass name to Mesh constructor --- code/3DSLoader.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index d003fec4a..73bfba748 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -402,11 +402,7 @@ void Discreet3DSImporter::ParseChunk(const char* name, unsigned int num) case Discreet3DS::CHUNK_TRIMESH: { // this starts a new triangle mesh - mScene->mMeshes.push_back(D3DS::Mesh()); - D3DS::Mesh& m = mScene->mMeshes.back(); - - // Setup the name of the mesh - m.mName = std::string(name, num); + mScene->mMeshes.push_back(D3DS::Mesh(std::string(name, num))); // Read mesh chunks ParseMeshChunk(); From 8c219c7bd1b419cde7982b0ab03f12af0337be67 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:17:31 +0200 Subject: [PATCH 035/106] 3DS: Delete Mesh default constructor --- code/3DSHelper.h | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 21ef6f5e9..eb664a262 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -494,17 +494,8 @@ struct Material /** Helper structure to represent a 3ds file mesh */ struct Mesh : public MeshWithSmoothingGroups { - //! Default constructor - Mesh() - { - static int iCnt = 0; - - // Generate a default name for the mesh - char szTemp[128]; - ai_snprintf(szTemp, 128, "UNNAMED_%i",iCnt++); - mName = szTemp; - } - + //! Default constructor has been deleted + Mesh() = delete; //! Constructor with explicit name explicit Mesh(const std::string &name) From c0c06093b473fc3d65ebc94b38431875a0876af1 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:20:00 +0200 Subject: [PATCH 036/106] 3DS: Whitespace --- code/3DSHelper.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index eb664a262..a2498fc2f 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -549,12 +549,12 @@ struct aiFloatKey /** Helper structure to represent a 3ds file node */ struct Node { - Node(): - mParent(NULL) - , mInstanceNumber(0) - , mHierarchyPos (0) - , mHierarchyIndex (0) - , mInstanceCount (1) + Node() + : mParent(NULL) + , mInstanceNumber(0) + , mHierarchyPos (0) + , mHierarchyIndex (0) + , mInstanceCount (1) { static int iCnt = 0; From 56a19ac492a99fad3a8cee78815b0c90edb86cde Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:24:47 +0200 Subject: [PATCH 037/106] 3DS: Add Node constructor which takes name --- code/3DSHelper.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index a2498fc2f..e174b94de 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -568,6 +568,21 @@ struct Node aScalingKeys.reserve (20); } + + explicit Node(const std::string &name) + : mParent(NULL) + , mName(name) + , mInstanceNumber(0) + , mHierarchyPos (0) + , mHierarchyIndex (0) + , mInstanceCount (1) + { + aRotationKeys.reserve (20); + aPositionKeys.reserve (20); + aScalingKeys.reserve (20); + } + + ~Node() { for (unsigned int i = 0; i < mChildren.size();++i) From 6c23b5720815b4e7c22410166eeb6284c4f465c6 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:30:01 +0200 Subject: [PATCH 038/106] 3DS: Pass name to Node constructor --- code/3DSLoader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index 73bfba748..1dd3ad4be 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -686,8 +686,7 @@ void Discreet3DSImporter::ParseHierarchyChunk(uint16_t parent) pcNode->mInstanceCount++; instanceNumber = pcNode->mInstanceCount; } - pcNode = new D3DS::Node(); - pcNode->mName = name; + pcNode = new D3DS::Node(name); pcNode->mInstanceNumber = instanceNumber; // There are two unknown values which we can safely ignore From 0d69b15238e70edd4fe2cf74a33c3b97b0cb12cc Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:35:03 +0200 Subject: [PATCH 039/106] 3DS: Explicitly pass "UNNAMED" as 3DS root node name --- code/3DSLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index 1dd3ad4be..17c06f44d 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -170,7 +170,7 @@ void Discreet3DSImporter::InternReadFile( const std::string& pFile, // Initialize members mLastNodeIndex = -1; - mCurrentNode = new D3DS::Node(); + mCurrentNode = new D3DS::Node("UNNAMED"); mRootNode = mCurrentNode; mRootNode->mHierarchyPos = -1; mRootNode->mHierarchyIndex = -1; From 3f377e11f5d85694de90959f80efb10c5309644b Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:35:44 +0200 Subject: [PATCH 040/106] 3DS: Delete Node default constructor --- code/3DSHelper.h | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index e174b94de..c4dbfcc38 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -549,25 +549,7 @@ struct aiFloatKey /** Helper structure to represent a 3ds file node */ struct Node { - Node() - : mParent(NULL) - , mInstanceNumber(0) - , mHierarchyPos (0) - , mHierarchyIndex (0) - , mInstanceCount (1) - { - static int iCnt = 0; - - // Generate a default name for the node - char szTemp[128]; - ::ai_snprintf(szTemp, 128, "UNNAMED_%i",iCnt++); - mName = szTemp; - - aRotationKeys.reserve (20); - aPositionKeys.reserve (20); - aScalingKeys.reserve (20); - } - + Node() = delete; explicit Node(const std::string &name) : mParent(NULL) From e75f7a596497b16a0e2be6f33ee8ef6d6cfb1e58 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:42:36 +0200 Subject: [PATCH 041/106] ASE: Explicitly pass "UNNAMED" as default bone name --- code/ASEParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index 79624ad2e..7c1197139 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -1553,7 +1553,7 @@ void Parser::ParseLV3MeshWeightsBlock(ASE::Mesh& mesh) void Parser::ParseLV4MeshBones(unsigned int iNumBones,ASE::Mesh& mesh) { AI_ASE_PARSER_INIT(); - mesh.mBones.resize(iNumBones); + mesh.mBones.resize(iNumBones, Bone("UNNAMED")); while (true) { if ('*' == *filePtr) From 1836b00f5107cc68074d95896db37d91f247087c Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:43:04 +0200 Subject: [PATCH 042/106] ASE: Delete Bone default constructor --- code/ASEParser.h | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index 843cec6ab..88fc8dfd7 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -168,15 +168,7 @@ struct Face : public FaceWithSmoothingGroup struct Bone { //! Constructor - Bone() - { - static int iCnt = 0; - - // Generate a default name for the bone - char szTemp[128]; - ::ai_snprintf(szTemp, 128, "UNNAMED_%i",iCnt++); - mName = szTemp; - } + Bone() = delete; //! Construction from an existing name explicit Bone( const std::string& name) From 3874720947df842e0ed18fc641de4677130f7948 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 17:59:09 +0200 Subject: [PATCH 043/106] ASE: Add BaseNode constructor which takes name --- code/ASEParser.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/ASEParser.h b/code/ASEParser.h index 88fc8dfd7..cfa01b5ad 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -264,6 +264,19 @@ struct BaseNode mTargetPosition.x = qnan; } + + //! Construction from an existing name + BaseNode(Type _mType, const std::string &name) + : mType (_mType) + , mName (name) + , mProcessed (false) + { + // Set mTargetPosition to qnan + const ai_real qnan = get_qnan(); + mTargetPosition.x = qnan; + } + + //! Name of the mesh std::string mName; From f3474fb399550b41c377988363ccb048f3458cf9 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:03:57 +0200 Subject: [PATCH 044/106] ASE: Add Mesh constructor which takes name --- code/ASEParser.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/ASEParser.h b/code/ASEParser.h index cfa01b5ad..71d87b6c3 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -321,6 +321,19 @@ struct Mesh : public MeshWithSmoothingGroups, public BaseNode iMaterialIndex = Face::DEFAULT_MATINDEX; } + + //! Construction from an existing name + explicit Mesh(const std::string &name) + : BaseNode (BaseNode::Mesh, name) + , iMaterialIndex(Face::DEFAULT_MATINDEX) + , bSkip (false) + { + // use 2 texture vertex components by default + for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c) + this->mNumUVComponents[c] = 2; + } + + //! List of all texture coordinate sets std::vector amTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; From 59ab30cb25d24f77825ceaac460f767c433e01fc Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:08:52 +0200 Subject: [PATCH 045/106] ASE: Explicitly pass "UNNAMED" as default mesh name --- code/ASEParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index 7c1197139..166782d77 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -292,7 +292,7 @@ void Parser::Parse() if (TokenMatch(filePtr,"GEOMOBJECT",10)) { - m_vMeshes.push_back(Mesh()); + m_vMeshes.push_back(Mesh("UNNAMED")); ParseLV1ObjectBlock(m_vMeshes.back()); continue; } From 17f801ae8a510770f2b662f6a06667c16e542474 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:09:23 +0200 Subject: [PATCH 046/106] ASE: Delete Mesh default constructor --- code/ASEParser.h | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index 71d87b6c3..cde324216 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -308,18 +308,8 @@ struct BaseNode /** Helper structure to represent an ASE file mesh */ struct Mesh : public MeshWithSmoothingGroups, public BaseNode { - //! Constructor. - Mesh() - : BaseNode (BaseNode::Mesh) - , bSkip (false) - { - // use 2 texture vertex components by default - for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c) - this->mNumUVComponents[c] = 2; - - // setup the default material index by default - iMaterialIndex = Face::DEFAULT_MATINDEX; - } + //! Default constructor has been deleted + Mesh() = delete; //! Construction from an existing name From f3d702339c24ba456ef00a426a9df5aa53b2b5fb Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:14:01 +0200 Subject: [PATCH 047/106] ASE: Add Light constructor which takes name --- code/ASEParser.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/ASEParser.h b/code/ASEParser.h index cde324216..4a9fd71fe 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -369,6 +369,19 @@ struct Light : public BaseNode { } + + //! Construction from an existing name + explicit Light(const std::string &name) + : BaseNode (BaseNode::Light, name) + , mLightType (OMNI) + , mColor (1.f,1.f,1.f) + , mIntensity (1.f) // light is white by default + , mAngle (45.f) + , mFalloff (0.f) + { + } + + LightType mLightType; aiColor3D mColor; ai_real mIntensity; From 4fd791796cc6eb2af899ae5c1483d60d1580dd1a Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:19:17 +0200 Subject: [PATCH 048/106] ASE: Explicitly pass "UNNAMED" as default Light name --- code/ASEParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index 166782d77..12023c239 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -308,7 +308,7 @@ void Parser::Parse() if (TokenMatch(filePtr,"LIGHTOBJECT",11)) { - m_vLights.push_back(Light()); + m_vLights.push_back(Light("UNNAMED")); ParseLV1ObjectBlock(m_vLights.back()); continue; } From 039ca38542a8493299bb5d195c1ed1f5d98c1468 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:19:44 +0200 Subject: [PATCH 049/106] ASE: Delete Light default constructor --- code/ASEParser.h | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index 4a9fd71fe..352cc0832 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -358,17 +358,8 @@ struct Light : public BaseNode DIRECTIONAL }; - //! Constructor. - Light() - : BaseNode (BaseNode::Light) - , mLightType (OMNI) - , mColor (1.f,1.f,1.f) - , mIntensity (1.f) // light is white by default - , mAngle (45.f) - , mFalloff (0.f) - { - } - + //! Default constructor has been deleted + Light() = delete; //! Construction from an existing name explicit Light(const std::string &name) From 945f2bed09510244ca3555d5234329dbf70de6d6 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:25:01 +0200 Subject: [PATCH 050/106] ASE: Add Camera constructor which takes name --- code/ASEParser.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/ASEParser.h b/code/ASEParser.h index 352cc0832..cb5a30af5 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -400,6 +400,18 @@ struct Camera : public BaseNode { } + + //! Construction from an existing name + explicit Camera(const std::string &name) + : BaseNode (BaseNode::Camera, name) + , mFOV (0.75f) // in radians + , mNear (0.1f) + , mFar (1000.f) // could be zero + , mCameraType (FREE) + { + } + + ai_real mFOV, mNear, mFar; CameraType mCameraType; }; From 7fef5e6d2319ac064a40f8c9a227cfc0e66d7dd1 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:27:41 +0200 Subject: [PATCH 051/106] ASE: Explicitly pass "UNNAMED" as default camera name --- code/ASEParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index 12023c239..7d361b6f7 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -315,7 +315,7 @@ void Parser::Parse() // camera object if (TokenMatch(filePtr,"CAMERAOBJECT",12)) { - m_vCameras.push_back(Camera()); + m_vCameras.push_back(Camera("UNNAMED")); ParseLV1ObjectBlock(m_vCameras.back()); continue; } From 2d1bd1eec4f2f1b02e5b1dcf1aebe5ea4e64adb6 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:29:29 +0200 Subject: [PATCH 052/106] ASE: Delete Camera default constructor --- code/ASEParser.h | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index cb5a30af5..c80342ece 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -390,15 +390,8 @@ struct Camera : public BaseNode TARGET }; - //! Constructor - Camera() - : BaseNode (BaseNode::Camera) - , mFOV (0.75f) // in radians - , mNear (0.1f) - , mFar (1000.f) // could be zero - , mCameraType (FREE) - { - } + //! Default constructor has been deleted + Camera() = delete; //! Construction from an existing name From 4b20e9712ccadff3c3d0d4ca1b06b6a53ef08c01 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:33:15 +0200 Subject: [PATCH 053/106] ASE: Explicitly pass "DUMMY" as Dummy node name --- code/ASEParser.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index c80342ece..8d0db71e0 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -415,7 +415,7 @@ struct Dummy : public BaseNode { //! Constructor Dummy() - : BaseNode (BaseNode::Dummy) + : BaseNode (BaseNode::Dummy, "DUMMY") { } }; From e0cbd92da4c9bcaed287bc2998948eecbb1f5d63 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 27 Jan 2018 18:34:04 +0200 Subject: [PATCH 054/106] ASE: Delete BaseNode constructor which doesn't take name --- code/ASEParser.h | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/code/ASEParser.h b/code/ASEParser.h index 8d0db71e0..7c8e1b158 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -248,22 +248,6 @@ struct BaseNode { enum Type {Light, Camera, Mesh, Dummy} mType; - //! Constructor. Creates a default name for the node - explicit BaseNode(Type _mType) - : mType (_mType) - , mProcessed (false) - { - // generate a default name for the node - static int iCnt = 0; - char szTemp[128]; // should be sufficiently large - ::ai_snprintf(szTemp, 128, "UNNAMED_%i",iCnt++); - mName = szTemp; - - // Set mTargetPosition to qnan - const ai_real qnan = get_qnan(); - mTargetPosition.x = qnan; - } - //! Construction from an existing name BaseNode(Type _mType, const std::string &name) From b049933d2f20436b4c6e30b977a9dbdbede67193 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 28 Jan 2018 19:42:05 +0100 Subject: [PATCH 055/106] update license dates. --- CMakeLists.txt | 3 +- code/3DSConverter.cpp | 3 +- code/3DSExporter.cpp | 3 +- code/3DSExporter.h | 3 +- code/3DSHelper.h | 3 +- code/3DSLoader.cpp | 3 +- code/3DSLoader.h | 3 +- code/3MFXmlTags.h | 3 +- code/ACLoader.cpp | 3 +- code/ACLoader.h | 3 +- code/AMFImporter.cpp | 3 +- code/AMFImporter.hpp | 3 +- code/AMFImporter_Geometry.cpp | 3 +- code/AMFImporter_Macro.hpp | 3 +- code/AMFImporter_Material.cpp | 3 +- code/AMFImporter_Node.hpp | 3 +- code/AMFImporter_Postprocess.cpp | 3 +- code/ASELoader.cpp | 3 +- code/ASELoader.h | 3 +- code/ASEParser.cpp | 3 +- code/ASEParser.h | 3 +- code/AssbinExporter.cpp | 3 +- code/AssbinExporter.h | 3 +- code/AssbinLoader.cpp | 3 +- code/AssbinLoader.h | 3 +- code/Assimp.cpp | 3 +- code/AssimpCExport.cpp | 3 +- code/AssxmlExporter.cpp | 3 +- code/AssxmlExporter.h | 3 +- code/B3DImporter.cpp | 3 +- code/B3DImporter.h | 3 +- code/BVHLoader.cpp | 3 +- code/BVHLoader.h | 3 +- code/BaseImporter.cpp | 3 +- code/BaseProcess.cpp | 3 +- code/BaseProcess.h | 3 +- code/Bitmap.cpp | 3 +- code/BlenderDNA.cpp | 3 +- code/BlenderDNA.h | 3 +- code/BlenderDNA.inl | 3 +- code/BlenderIntermediate.h | 3 +- code/BlenderLoader.cpp | 3 +- code/BlenderLoader.h | 3 +- code/BlenderModifier.cpp | 3 +- code/BlenderModifier.h | 3 +- code/BlenderScene.h | 3 +- code/BlenderTessellator.cpp | 3 +- code/BlenderTessellator.h | 3 +- code/CInterfaceIOWrapper.cpp | 3 +- code/CInterfaceIOWrapper.h | 3 +- code/CMakeLists.txt | 3 +- code/COBLoader.cpp | 3 +- code/COBLoader.h | 3 +- code/COBScene.h | 3 +- code/CSMLoader.cpp | 3 +- code/CSMLoader.h | 3 +- code/CalcTangentsProcess.cpp | 3 +- code/CalcTangentsProcess.h | 3 +- code/ColladaExporter.cpp | 3 +- code/ColladaExporter.h | 3 +- code/ColladaHelper.h | 3 +- code/ColladaLoader.cpp | 3 +- code/ColladaLoader.h | 3 +- code/ColladaParser.cpp | 3 +- code/ColladaParser.h | 3 +- code/ComputeUVMappingProcess.cpp | 3 +- code/ComputeUVMappingProcess.h | 3 +- code/ConvertToLHProcess.cpp | 3 +- code/ConvertToLHProcess.h | 3 +- code/D3MFExporter.cpp | 3 +- code/D3MFExporter.h | 3 +- code/D3MFImporter.cpp | 3 +- code/D3MFImporter.h | 3 +- code/D3MFOpcPackage.cpp | 3 +- code/D3MFOpcPackage.h | 3 +- code/DXFHelper.h | 3 +- code/DXFLoader.cpp | 3 +- code/DXFLoader.h | 3 +- code/DeboneProcess.cpp | 3 +- code/DeboneProcess.h | 3 +- code/DefaultIOStream.cpp | 3 +- code/DefaultIOSystem.cpp | 3 +- code/DefaultLogger.cpp | 3 +- code/DefaultProgressHandler.h | 3 +- code/EmbedTexturesProcess.cpp | 3 +- code/EmbedTexturesProcess.h | 3 +- code/Exporter.cpp | 3 +- code/FBXAnimation.cpp | 3 +- code/FBXBinaryTokenizer.cpp | 3 +- code/FBXCompileConfig.h | 3 +- code/FBXConverter.cpp | 3 +- code/FBXConverter.h | 3 +- code/FBXDeformer.cpp | 3 +- code/FBXDocument.cpp | 3 +- code/FBXDocument.h | 3 +- code/FBXDocumentUtil.cpp | 3 +- code/FBXImportSettings.h | 3 +- code/FBXImporter.cpp | 3 +- code/FBXImporter.h | 3 +- code/FBXMaterial.cpp | 3 +- code/FBXMeshGeometry.cpp | 3 +- code/FBXMeshGeometry.h | 3 +- code/FBXModel.cpp | 3 +- code/FBXNodeAttribute.cpp | 3 +- code/FBXParser.cpp | 3 +- code/FBXParser.h | 3 +- code/FBXProperties.cpp | 3 +- code/FBXProperties.h | 3 +- code/FBXTokenizer.cpp | 3 +- code/FBXTokenizer.h | 3 +- code/FBXUtil.cpp | 3 +- code/FBXUtil.h | 3 +- code/FIReader.cpp | 3 +- code/FIReader.hpp | 3 +- code/FileLogStream.h | 3 +- code/FindDegenerates.cpp | 3 +- code/FindDegenerates.h | 3 +- code/FindInstancesProcess.cpp | 3 +- code/FindInstancesProcess.h | 3 +- code/FindInvalidDataProcess.cpp | 3 +- code/FindInvalidDataProcess.h | 3 +- code/FixNormalsStep.cpp | 3 +- code/FixNormalsStep.h | 3 +- code/GenFaceNormalsProcess.cpp | 3 +- code/GenFaceNormalsProcess.h | 3 +- code/GenVertexNormalsProcess.cpp | 3 +- code/GenVertexNormalsProcess.h | 3 +- code/HMPFileData.h | 3 +- code/HMPLoader.cpp | 3 +- code/HMPLoader.h | 3 +- code/HalfLifeFileData.h | 3 +- code/IRRLoader.cpp | 3 +- code/IRRLoader.h | 3 +- code/IRRMeshLoader.cpp | 3 +- code/IRRMeshLoader.h | 3 +- code/IRRShared.cpp | 3 +- code/Importer.cpp | 3 +- code/Importer.h | 3 +- code/Importer/IFC/IFCCurve.cpp | 3 +- code/Importer/IFC/IFCLoader.cpp | 3 +- code/Importer/IFC/IFCLoader.h | 3 +- code/Importer/IFC/IFCMaterial.cpp | 3 +- code/Importer/IFC/IFCProfile.cpp | 3 +- code/Importer/IFC/IFCUtil.cpp | 3 +- code/Importer/IFC/IFCUtil.h | 3 +- code/Importer/IFC/STEPFileEncoding.cpp | 3 +- code/Importer/IFC/STEPFileEncoding.h | 3 +- code/Importer/IFC/STEPFileReader.cpp | 3 +- code/Importer/IFC/STEPFileReader.h | 3 +- code/ImporterRegistry.cpp | 3 +- code/ImproveCacheLocality.cpp | 3 +- code/ImproveCacheLocality.h | 3 +- code/JoinVerticesProcess.cpp | 3 +- code/JoinVerticesProcess.h | 3 +- code/LWOAnimation.cpp | 3 +- code/LWOAnimation.h | 3 +- code/LWOBLoader.cpp | 3 +- code/LWOFileData.h | 3 +- code/LWOLoader.cpp | 3 +- code/LWOLoader.h | 3 +- code/LWOMaterial.cpp | 3 +- code/LWSLoader.cpp | 3 +- code/LWSLoader.h | 3 +- code/LimitBoneWeightsProcess.cpp | 3 +- code/LimitBoneWeightsProcess.h | 3 +- code/MD2FileData.h | 3 +- code/MD2Loader.cpp | 3 +- code/MD2Loader.h | 3 +- code/MD2NormalTable.h | 3 +- code/MD3FileData.h | 3 +- code/MD3Loader.cpp | 3 +- code/MD3Loader.h | 3 +- code/MD5Loader.cpp | 3 +- code/MD5Loader.h | 3 +- code/MD5Parser.cpp | 3 +- code/MD5Parser.h | 3 +- code/MDCFileData.h | 3 +- code/MDCLoader.cpp | 3 +- code/MDCLoader.h | 3 +- code/MDLDefaultColorMap.h | 3 +- code/MDLFileData.h | 3 +- code/MDLLoader.cpp | 3 +- code/MDLLoader.h | 3 +- code/MDLMaterialLoader.cpp | 3 +- code/MMDCpp14.h | 3 +- code/MMDPmdParser.h | 3 +- code/MMDPmxParser.cpp | 3 +- code/MMDPmxParser.h | 3 +- code/MMDVmdParser.h | 3 +- code/MS3DLoader.cpp | 3 +- code/MS3DLoader.h | 3 +- code/MakeVerboseFormat.cpp | 3 +- code/MakeVerboseFormat.h | 3 +- code/MaterialSystem.cpp | 3 +- code/MaterialSystem.h | 3 +- code/NDOLoader.cpp | 3 +- code/NFFLoader.cpp | 3 +- code/NFFLoader.h | 3 +- code/OFFLoader.cpp | 3 +- code/OFFLoader.h | 3 +- code/ObjExporter.cpp | 3 +- code/ObjExporter.h | 3 +- code/ObjFileData.h | 3 +- code/ObjFileImporter.cpp | 3 +- code/ObjFileImporter.h | 3 +- code/ObjFileMtlImporter.cpp | 3 +- code/ObjFileMtlImporter.h | 3 +- code/ObjFileParser.cpp | 3 +- code/ObjFileParser.h | 3 +- code/ObjTools.h | 3 +- code/OgreBinarySerializer.cpp | 3 +- code/OgreBinarySerializer.h | 3 +- code/OgreImporter.cpp | 3 +- code/OgreImporter.h | 3 +- code/OgreMaterial.cpp | 3 +- code/OgreParsingUtils.h | 3 +- code/OgreStructs.cpp | 3 +- code/OgreStructs.h | 3 +- code/OgreXmlSerializer.cpp | 3 +- code/OgreXmlSerializer.h | 3 +- code/OpenGEXExporter.cpp | 3 +- code/OpenGEXExporter.h | 3 +- code/OpenGEXImporter.cpp | 3 +- code/OpenGEXImporter.h | 3 +- code/OpenGEXStructs.h | 3 +- code/OptimizeGraph.cpp | 3 +- code/OptimizeGraph.h | 3 +- code/OptimizeMeshes.cpp | 3 +- code/OptimizeMeshes.h | 3 +- code/PlyExporter.cpp | 3 +- code/PlyExporter.h | 3 +- code/PlyLoader.cpp | 3 +- code/PlyLoader.h | 3 +- code/PlyParser.cpp | 3 +- code/PlyParser.h | 3 +- code/PolyTools.h | 3 +- code/PostStepRegistry.cpp | 3 +- code/PretransformVertices.cpp | 3 +- code/PretransformVertices.h | 3 +- code/ProcessHelper.cpp | 3 +- code/ProcessHelper.h | 3 +- code/Q3BSPFileData.h | 3 +- code/Q3BSPFileImporter.cpp | 3 +- code/Q3BSPFileImporter.h | 3 +- code/Q3BSPFileParser.cpp | 3 +- code/Q3BSPFileParser.h | 3 +- code/Q3BSPZipArchive.cpp | 3 +- code/Q3BSPZipArchive.h | 3 +- code/Q3DLoader.cpp | 3 +- code/Q3DLoader.h | 3 +- code/RawLoader.cpp | 3 +- code/RawLoader.h | 3 +- code/RemoveComments.cpp | 3 +- code/RemoveRedundantMaterials.cpp | 3 +- code/RemoveRedundantMaterials.h | 3 +- code/RemoveVCProcess.cpp | 3 +- code/RemoveVCProcess.h | 3 +- code/SGSpatialSort.cpp | 3 +- code/SIBImporter.cpp | 3 +- code/SIBImporter.h | 3 +- code/SMDLoader.cpp | 3 +- code/SMDLoader.h | 3 +- code/STEPFile.h | 3 +- code/STLExporter.cpp | 3 +- code/STLExporter.h | 3 +- code/STLLoader.cpp | 3 +- code/STLLoader.h | 3 +- code/ScaleProcess.cpp | 3 +- code/ScaleProcess.h | 3 +- code/SceneCombiner.cpp | 3 +- code/ScenePreprocessor.cpp | 3 +- code/ScenePreprocessor.h | 3 +- code/ScenePrivate.h | 3 +- code/SkeletonMeshBuilder.cpp | 3 +- code/SortByPTypeProcess.cpp | 3 +- code/SortByPTypeProcess.h | 3 +- code/SpatialSort.cpp | 3 +- code/SplitByBoneCountProcess.cpp | 3 +- code/SplitByBoneCountProcess.h | 3 +- code/SplitLargeMeshes.cpp | 3 +- code/SplitLargeMeshes.h | 3 +- code/StandardShapes.cpp | 3 +- code/StdOStreamLogStream.h | 3 +- code/StepExporter.cpp | 3 +- code/StepExporter.h | 3 +- code/Subdivision.cpp | 3 +- code/TargetAnimation.cpp | 3 +- code/TargetAnimation.h | 3 +- code/TerragenLoader.cpp | 3 +- code/TerragenLoader.h | 3 +- code/TextureTransform.cpp | 3 +- code/TextureTransform.h | 3 +- code/TriangulateProcess.cpp | 3 +- code/TriangulateProcess.h | 3 +- code/UnrealLoader.cpp | 3 +- code/UnrealLoader.h | 3 +- code/ValidateDataStructure.cpp | 3 +- code/ValidateDataStructure.h | 3 +- code/Version.cpp | 3 +- code/VertexTriangleAdjacency.cpp | 3 +- code/VertexTriangleAdjacency.h | 3 +- code/Win32DebugLogStream.h | 3 +- code/X3DImporter.cpp | 3 +- code/X3DImporter.hpp | 3 +- code/X3DImporter_Geometry2D.cpp | 3 +- code/X3DImporter_Geometry3D.cpp | 3 +- code/X3DImporter_Group.cpp | 3 +- code/X3DImporter_Light.cpp | 3 +- code/X3DImporter_Macro.hpp | 3 +- code/X3DImporter_Metadata.cpp | 3 +- code/X3DImporter_Networking.cpp | 3 +- code/X3DImporter_Node.hpp | 3 +- code/X3DImporter_Postprocess.cpp | 3 +- code/X3DImporter_Rendering.cpp | 3 +- code/X3DImporter_Shape.cpp | 3 +- code/X3DImporter_Texturing.cpp | 3 +- code/X3DVocabulary.cpp | 3 +- code/XFileExporter.cpp | 3 +- code/XFileExporter.h | 3 +- code/XFileHelper.h | 3 +- code/XFileImporter.cpp | 3 +- code/XFileImporter.h | 3 +- code/XFileParser.cpp | 3 +- code/XFileParser.h | 3 +- code/XGLLoader.cpp | 3 +- code/XGLLoader.h | 3 +- code/glTF2Asset.h | 3 +- code/glTF2Asset.inl | 3 +- code/glTF2AssetWriter.h | 3 +- code/glTF2AssetWriter.inl | 3 +- code/glTF2Exporter.cpp | 3 +- code/glTF2Exporter.h | 3 +- code/glTF2Importer.cpp | 3 +- code/glTF2Importer.h | 3 +- code/glTFAsset.h | 3 +- code/glTFAsset.inl | 3 +- code/glTFAssetWriter.h | 3 +- code/glTFAssetWriter.inl | 3 +- code/glTFExporter.cpp | 3 +- code/glTFExporter.h | 3 +- code/glTFImporter.cpp | 3 +- code/glTFImporter.h | 3 +- code/scene.cpp | 3 +- include/assimp/BaseImporter.h | 3 +- include/assimp/Bitmap.h | 3 +- include/assimp/BlobIOSystem.h | 3 +- include/assimp/ByteSwapper.h | 3 +- include/assimp/CreateAnimMesh.h | 3 +- include/assimp/DefaultIOStream.h | 3 +- include/assimp/DefaultIOSystem.h | 3 +- include/assimp/DefaultLogger.hpp | 3 +- include/assimp/Exporter.hpp | 3 +- include/assimp/GenericProperty.h | 3 +- include/assimp/Hash.h | 3 +- include/assimp/IOStream.hpp | 3 +- include/assimp/IOStreamBuffer.h | 3 +- include/assimp/IOSystem.hpp | 3 +- include/assimp/Importer.hpp | 3 +- include/assimp/LineSplitter.h | 3 +- include/assimp/LogAux.h | 3 +- include/assimp/LogStream.hpp | 3 +- include/assimp/Logger.hpp | 3 +- include/assimp/MemoryIOWrapper.h | 3 +- include/assimp/NullLogger.hpp | 3 +- include/assimp/ParsingUtils.h | 3 +- include/assimp/Profiler.h | 3 +- include/assimp/ProgressHandler.hpp | 3 +- include/assimp/RemoveComments.h | 3 +- include/assimp/SGSpatialSort.h | 3 +- include/assimp/SceneCombiner.h | 3 +- include/assimp/SkeletonMeshBuilder.h | 3 +- include/assimp/SmoothingGroups.h | 3 +- include/assimp/SpatialSort.h | 3 +- include/assimp/StandardShapes.h | 3 +- include/assimp/StreamReader.h | 3 +- include/assimp/StreamWriter.h | 3 +- include/assimp/StringComparison.h | 3 +- include/assimp/StringUtils.h | 3 +- include/assimp/Subdivision.h | 3 +- include/assimp/TinyFormatter.h | 3 +- include/assimp/Vertex.h | 3 +- include/assimp/XMLTools.h | 3 +- include/assimp/ai_assert.h | 3 +- include/assimp/anim.h | 3 +- include/assimp/camera.h | 3 +- include/assimp/cfileio.h | 3 +- include/assimp/cimport.h | 3 +- include/assimp/color4.h | 3 +- include/assimp/color4.inl | 3 +- include/assimp/config.h.in | 3 +- include/assimp/defs.h | 107 ++++++++++++----------- include/assimp/importerdesc.h | 3 +- include/assimp/irrXMLWrapper.h | 3 +- include/assimp/light.h | 3 +- include/assimp/material.h | 3 +- include/assimp/material.inl | 3 +- include/assimp/matrix3x3.h | 3 +- include/assimp/matrix3x3.inl | 3 +- include/assimp/matrix4x4.h | 3 +- include/assimp/matrix4x4.inl | 3 +- include/assimp/mesh.h | 3 +- include/assimp/metadata.h | 3 +- include/assimp/postprocess.h | 3 +- include/assimp/qnan.h | 3 +- include/assimp/quaternion.h | 3 +- include/assimp/quaternion.inl | 3 +- include/assimp/scene.h | 3 +- include/assimp/texture.h | 3 +- include/assimp/types.h | 3 +- include/assimp/vector2.h | 3 +- include/assimp/vector2.inl | 3 +- include/assimp/vector3.h | 3 +- include/assimp/vector3.inl | 3 +- include/assimp/version.h | 3 +- test/CMakeLists.txt | 3 +- test/unit/AbstractImportExportBase.cpp | 3 +- test/unit/AssimpAPITest.cpp | 3 +- test/unit/SceneDiffer.cpp | 3 +- test/unit/SceneDiffer.h | 3 +- test/unit/TestIOSystem.h | 3 +- test/unit/TestModelFactory.h | 3 +- test/unit/UTLogStream.h | 3 +- test/unit/ut3DImportExport.cpp | 3 +- test/unit/ut3DSImportExport.cpp | 3 +- test/unit/utACImportExport.cpp | 3 +- test/unit/utAMFImportExport.cpp | 3 +- test/unit/utASEImportExport.cpp | 3 +- test/unit/utAnim.cpp | 3 +- test/unit/utB3DImportExport.cpp | 3 +- test/unit/utBVHImportExport.cpp | 3 +- test/unit/utBatchLoader.cpp | 3 +- test/unit/utBlendImportAreaLight.cpp | 3 +- test/unit/utBlendImportMaterials.cpp | 3 +- test/unit/utBlenderImportExport.cpp | 3 +- test/unit/utBlenderIntermediate.cpp | 3 +- test/unit/utCSMImportExport.cpp | 3 +- test/unit/utColladaExportCamera.cpp | 3 +- test/unit/utColladaExportLight.cpp | 3 +- test/unit/utColladaImportExport.cpp | 3 +- test/unit/utD3MFImportExport.cpp | 3 +- test/unit/utDXFImporterExporter.cpp | 3 +- test/unit/utDefaultIOStream.cpp | 3 +- test/unit/utFBXImporterExporter.cpp | 3 +- test/unit/utFastAtof.cpp | 3 +- test/unit/utFindDegenerates.cpp | 3 +- test/unit/utFindInvalidData.cpp | 3 +- test/unit/utFixInfacingNormals.cpp | 3 +- test/unit/utGenNormals.cpp | 3 +- test/unit/utHMPImportExport.cpp | 3 +- test/unit/utIFCImportExport.cpp | 3 +- test/unit/utIOStreamBuffer.cpp | 3 +- test/unit/utIOSystem.cpp | 3 +- test/unit/utImporter.cpp | 3 +- test/unit/utImproveCacheLocality.cpp | 3 +- test/unit/utIssues.cpp | 3 +- test/unit/utJoinVertices.cpp | 3 +- test/unit/utLWSImportExport.cpp | 3 +- test/unit/utLimitBoneWeights.cpp | 3 +- test/unit/utMaterialSystem.cpp | 3 +- test/unit/utMatrix3x3.cpp | 3 +- test/unit/utMatrix4x4.cpp | 3 +- test/unit/utMetadata.cpp | 3 +- test/unit/utObjImportExport.cpp | 3 +- test/unit/utObjTools.cpp | 3 +- test/unit/utOpenGEXImportExport.cpp | 3 +- test/unit/utPLYImportExport.cpp | 3 +- test/unit/utPretransformVertices.cpp | 3 +- test/unit/utProfiler.cpp | 3 +- test/unit/utQ3DImportExport.cpp | 3 +- test/unit/utRemoveComments.cpp | 3 +- test/unit/utRemoveComponent.cpp | 3 +- test/unit/utRemoveRedundantMaterials.cpp | 3 +- test/unit/utRemoveVCProcess.cpp | 3 +- test/unit/utSIBImporter.cpp | 3 +- test/unit/utSMDImportExport.cpp | 3 +- test/unit/utSTLImportExport.cpp | 3 +- test/unit/utScaleProcess.cpp | 3 +- test/unit/utSceneCombiner.cpp | 3 +- test/unit/utScenePreprocessor.cpp | 3 +- test/unit/utSharedPPData.cpp | 3 +- test/unit/utSortByPType.cpp | 3 +- test/unit/utSplitLargeMeshes.cpp | 3 +- test/unit/utStringUtils.cpp | 3 +- test/unit/utTargetAnimation.cpp | 3 +- test/unit/utTextureTransform.cpp | 3 +- test/unit/utTriangulate.cpp | 3 +- test/unit/utTypes.cpp | 3 +- test/unit/utVector3.cpp | 3 +- test/unit/utVersion.cpp | 3 +- test/unit/utVertexTriangleAdjacency.cpp | 3 +- test/unit/utX3DImportExport.cpp | 3 +- test/unit/utXImporterExporter.cpp | 3 +- test/unit/utglTF2ImportExport.cpp | 3 +- test/unit/utglTFImportExport.cpp | 3 +- tools/assimp_cmd/CMakeLists.txt | 3 +- tools/assimp_cmd/CompareDump.cpp | 3 +- tools/assimp_cmd/Export.cpp | 3 +- tools/assimp_cmd/ImageExtractor.cpp | 3 +- tools/assimp_cmd/Info.cpp | 3 +- tools/assimp_cmd/Main.cpp | 3 +- tools/assimp_cmd/WriteDumb.cpp | 3 +- tools/assimp_view/CMakeLists.txt | 3 +- tools/assimp_view/assimp_view.cpp | 3 +- tools/assimp_view/assimp_view.h | 3 +- 504 files changed, 1060 insertions(+), 556 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a20b6c3f..5d8972b1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- -# Copyright (c) 2006-2017, assimp team +# Copyright (c) 2006-2018, assimp team + # All rights reserved. # # Redistribution and use of this software in source and binary forms, diff --git a/code/3DSConverter.cpp b/code/3DSConverter.cpp index 9a437e33f..cbc6d31d2 100644 --- a/code/3DSConverter.cpp +++ b/code/3DSConverter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/3DSExporter.cpp b/code/3DSExporter.cpp index d33025b10..65f4bf8d8 100644 --- a/code/3DSExporter.cpp +++ b/code/3DSExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/3DSExporter.h b/code/3DSExporter.h index 8ac9c8b82..5e138e92d 100644 --- a/code/3DSExporter.h +++ b/code/3DSExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 150eb27b6..738278bc7 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index d003fec4a..cb9649f57 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/3DSLoader.h b/code/3DSLoader.h index cb751d71a..eb311a81b 100644 --- a/code/3DSLoader.h +++ b/code/3DSLoader.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/3MFXmlTags.h b/code/3MFXmlTags.h index 7e47422f1..30aed0e95 100644 --- a/code/3MFXmlTags.h +++ b/code/3MFXmlTags.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ACLoader.cpp b/code/ACLoader.cpp index 7c09cc0ad..3f8653d5d 100644 --- a/code/ACLoader.cpp +++ b/code/ACLoader.cpp @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ACLoader.h b/code/ACLoader.h index 82b017d64..86af9afb6 100644 --- a/code/ACLoader.h +++ b/code/ACLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter.cpp b/code/AMFImporter.cpp index 2c0435add..d20be6b9f 100644 --- a/code/AMFImporter.cpp +++ b/code/AMFImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter.hpp b/code/AMFImporter.hpp index 654ccb7a5..060cbf10a 100644 --- a/code/AMFImporter.hpp +++ b/code/AMFImporter.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter_Geometry.cpp b/code/AMFImporter_Geometry.cpp index afba3f2bc..d4d648fbd 100644 --- a/code/AMFImporter_Geometry.cpp +++ b/code/AMFImporter_Geometry.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter_Macro.hpp b/code/AMFImporter_Macro.hpp index b7c0f9863..afa120028 100644 --- a/code/AMFImporter_Macro.hpp +++ b/code/AMFImporter_Macro.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter_Material.cpp b/code/AMFImporter_Material.cpp index d15099fac..77f49d39e 100644 --- a/code/AMFImporter_Material.cpp +++ b/code/AMFImporter_Material.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter_Node.hpp b/code/AMFImporter_Node.hpp index 522e6ccca..cdbedf2c7 100644 --- a/code/AMFImporter_Node.hpp +++ b/code/AMFImporter_Node.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AMFImporter_Postprocess.cpp b/code/AMFImporter_Postprocess.cpp index 486ab464b..f048e1178 100644 --- a/code/AMFImporter_Postprocess.cpp +++ b/code/AMFImporter_Postprocess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index 6dd6bcdd7..122b226f4 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ASELoader.h b/code/ASELoader.h index d46657b8b..7f71bf49d 100644 --- a/code/ASELoader.h +++ b/code/ASELoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index 79624ad2e..202a7c9d1 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ASEParser.h b/code/ASEParser.h index 843cec6ab..4bf2b7ca9 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssbinExporter.cpp b/code/AssbinExporter.cpp index 6d6ab6b68..398eb5bba 100644 --- a/code/AssbinExporter.cpp +++ b/code/AssbinExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssbinExporter.h b/code/AssbinExporter.h index 55bb9fc82..2539984c3 100644 --- a/code/AssbinExporter.h +++ b/code/AssbinExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssbinLoader.cpp b/code/AssbinLoader.cpp index 6cd94bca2..65b29b737 100644 --- a/code/AssbinLoader.cpp +++ b/code/AssbinLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssbinLoader.h b/code/AssbinLoader.h index 7cf4b0784..9ffd84a16 100644 --- a/code/AssbinLoader.h +++ b/code/AssbinLoader.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Assimp.cpp b/code/Assimp.cpp index 1fdcb1c7f..44e3ed563 100644 --- a/code/Assimp.cpp +++ b/code/Assimp.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssimpCExport.cpp b/code/AssimpCExport.cpp index b8d3264a1..caf51a08c 100644 --- a/code/AssimpCExport.cpp +++ b/code/AssimpCExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssxmlExporter.cpp b/code/AssxmlExporter.cpp index 90ed66701..27e77383b 100644 --- a/code/AssxmlExporter.cpp +++ b/code/AssxmlExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/AssxmlExporter.h b/code/AssxmlExporter.h index 9694f74a3..3db496db2 100644 --- a/code/AssxmlExporter.h +++ b/code/AssxmlExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/B3DImporter.cpp b/code/B3DImporter.cpp index 4f5b762a6..e4572f8eb 100644 --- a/code/B3DImporter.cpp +++ b/code/B3DImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/B3DImporter.h b/code/B3DImporter.h index 8b4577cd4..3cb66e5c7 100644 --- a/code/B3DImporter.h +++ b/code/B3DImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BVHLoader.cpp b/code/BVHLoader.cpp index 43983a0d1..dfeeb60ac 100644 --- a/code/BVHLoader.cpp +++ b/code/BVHLoader.cpp @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BVHLoader.h b/code/BVHLoader.h index 72f0f8e99..0836488ff 100644 --- a/code/BVHLoader.h +++ b/code/BVHLoader.h @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BaseImporter.cpp b/code/BaseImporter.cpp index d213e5828..f653d8d81 100644 --- a/code/BaseImporter.cpp +++ b/code/BaseImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BaseProcess.cpp b/code/BaseProcess.cpp index e19d57604..8508f59e4 100644 --- a/code/BaseProcess.cpp +++ b/code/BaseProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BaseProcess.h b/code/BaseProcess.h index 332adc2e0..d9323fbef 100644 --- a/code/BaseProcess.h +++ b/code/BaseProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Bitmap.cpp b/code/Bitmap.cpp index ae248f62e..903a13fb1 100644 --- a/code/Bitmap.cpp +++ b/code/Bitmap.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderDNA.cpp b/code/BlenderDNA.cpp index 193d29538..285cb05b8 100644 --- a/code/BlenderDNA.cpp +++ b/code/BlenderDNA.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderDNA.h b/code/BlenderDNA.h index 932784e9f..6f4c69c04 100644 --- a/code/BlenderDNA.h +++ b/code/BlenderDNA.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderDNA.inl b/code/BlenderDNA.inl index de85815cc..185531d1a 100644 --- a/code/BlenderDNA.inl +++ b/code/BlenderDNA.inl @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderIntermediate.h b/code/BlenderIntermediate.h index c6f9cba1e..74184a1f1 100644 --- a/code/BlenderIntermediate.h +++ b/code/BlenderIntermediate.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderLoader.cpp b/code/BlenderLoader.cpp index 6d298cf0e..482f9ae5c 100644 --- a/code/BlenderLoader.cpp +++ b/code/BlenderLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderLoader.h b/code/BlenderLoader.h index d9e1da035..9f452a0aa 100644 --- a/code/BlenderLoader.h +++ b/code/BlenderLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderModifier.cpp b/code/BlenderModifier.cpp index a0b332dd2..9b73239ed 100644 --- a/code/BlenderModifier.cpp +++ b/code/BlenderModifier.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderModifier.h b/code/BlenderModifier.h index 0d894d82d..01d133499 100644 --- a/code/BlenderModifier.h +++ b/code/BlenderModifier.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderScene.h b/code/BlenderScene.h index 86ab1f30c..1d6b918c3 100644 --- a/code/BlenderScene.h +++ b/code/BlenderScene.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderTessellator.cpp b/code/BlenderTessellator.cpp index 9f4c51048..afedbfb53 100644 --- a/code/BlenderTessellator.cpp +++ b/code/BlenderTessellator.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/BlenderTessellator.h b/code/BlenderTessellator.h index 3b4777852..59d698295 100644 --- a/code/BlenderTessellator.h +++ b/code/BlenderTessellator.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CInterfaceIOWrapper.cpp b/code/CInterfaceIOWrapper.cpp index 9de75b683..41dbba772 100644 --- a/code/CInterfaceIOWrapper.cpp +++ b/code/CInterfaceIOWrapper.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CInterfaceIOWrapper.h b/code/CInterfaceIOWrapper.h index 78cac0cf9..6f0eb7957 100644 --- a/code/CInterfaceIOWrapper.h +++ b/code/CInterfaceIOWrapper.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 19acd9d8d..376725e7e 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1,7 +1,8 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2017, assimp team +# Copyright (c) 2006-2018, assimp team + # All rights reserved. # diff --git a/code/COBLoader.cpp b/code/COBLoader.cpp index 14d022a5f..793cbfe75 100644 --- a/code/COBLoader.cpp +++ b/code/COBLoader.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/COBLoader.h b/code/COBLoader.h index 062a0cd68..103f0348a 100644 --- a/code/COBLoader.h +++ b/code/COBLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/COBScene.h b/code/COBScene.h index 08253f603..2473c42a5 100644 --- a/code/COBScene.h +++ b/code/COBScene.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CSMLoader.cpp b/code/CSMLoader.cpp index 13032b68a..7b0064164 100644 --- a/code/CSMLoader.cpp +++ b/code/CSMLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CSMLoader.h b/code/CSMLoader.h index fc6feb1f3..ea82bb87a 100644 --- a/code/CSMLoader.h +++ b/code/CSMLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CalcTangentsProcess.cpp b/code/CalcTangentsProcess.cpp index 67ff18f7c..cb0117aef 100644 --- a/code/CalcTangentsProcess.cpp +++ b/code/CalcTangentsProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/CalcTangentsProcess.h b/code/CalcTangentsProcess.h index a22785639..4cac2ed9f 100644 --- a/code/CalcTangentsProcess.h +++ b/code/CalcTangentsProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index 50245103c..dc6b15ec4 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaExporter.h b/code/ColladaExporter.h index 325f642e8..773039735 100644 --- a/code/ColladaExporter.h +++ b/code/ColladaExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaHelper.h b/code/ColladaHelper.h index e691a6062..0c90a42e6 100644 --- a/code/ColladaHelper.h +++ b/code/ColladaHelper.h @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 3dbd5560a..a3516f9c4 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaLoader.h b/code/ColladaLoader.h index 3ab03bbcc..c63bf2945 100644 --- a/code/ColladaLoader.h +++ b/code/ColladaLoader.h @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp index 8359341b7..d62c5cafc 100644 --- a/code/ColladaParser.cpp +++ b/code/ColladaParser.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ColladaParser.h b/code/ColladaParser.h index f8245f8a3..566386840 100644 --- a/code/ColladaParser.h +++ b/code/ColladaParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- - Copyright (c) 2006-2017, assimp team + Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ComputeUVMappingProcess.cpp b/code/ComputeUVMappingProcess.cpp index 3b0e64397..6e778ddba 100644 --- a/code/ComputeUVMappingProcess.cpp +++ b/code/ComputeUVMappingProcess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ComputeUVMappingProcess.h b/code/ComputeUVMappingProcess.h index 1de97961d..41e25f99f 100644 --- a/code/ComputeUVMappingProcess.h +++ b/code/ComputeUVMappingProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ConvertToLHProcess.cpp b/code/ConvertToLHProcess.cpp index 6a43d5c2d..47e2fb949 100644 --- a/code/ConvertToLHProcess.cpp +++ b/code/ConvertToLHProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ConvertToLHProcess.h b/code/ConvertToLHProcess.h index 130fdcafd..f219d6ca2 100644 --- a/code/ConvertToLHProcess.h +++ b/code/ConvertToLHProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/D3MFExporter.cpp b/code/D3MFExporter.cpp index 25a57009f..91f06fc87 100644 --- a/code/D3MFExporter.cpp +++ b/code/D3MFExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/D3MFExporter.h b/code/D3MFExporter.h index b6be73976..64967f68b 100644 --- a/code/D3MFExporter.h +++ b/code/D3MFExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/D3MFImporter.cpp b/code/D3MFImporter.cpp index e44d6fb1a..3c1f7ba68 100644 --- a/code/D3MFImporter.cpp +++ b/code/D3MFImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/D3MFImporter.h b/code/D3MFImporter.h index f5496eec5..701d056e2 100644 --- a/code/D3MFImporter.h +++ b/code/D3MFImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/D3MFOpcPackage.cpp b/code/D3MFOpcPackage.cpp index 05e82122a..b6abc0b98 100644 --- a/code/D3MFOpcPackage.cpp +++ b/code/D3MFOpcPackage.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/D3MFOpcPackage.h b/code/D3MFOpcPackage.h index cebe4fd62..8cf08d092 100644 --- a/code/D3MFOpcPackage.h +++ b/code/D3MFOpcPackage.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DXFHelper.h b/code/DXFHelper.h index 6ab08c998..5aaf4844f 100644 --- a/code/DXFHelper.h +++ b/code/DXFHelper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DXFLoader.cpp b/code/DXFLoader.cpp index 0c036dbb9..9a13caa33 100644 --- a/code/DXFLoader.cpp +++ b/code/DXFLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DXFLoader.h b/code/DXFLoader.h index b6fbd05ac..487bb99f8 100644 --- a/code/DXFLoader.h +++ b/code/DXFLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DeboneProcess.cpp b/code/DeboneProcess.cpp index b43dcad84..33692b6a3 100644 --- a/code/DeboneProcess.cpp +++ b/code/DeboneProcess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DeboneProcess.h b/code/DeboneProcess.h index 8d4607bb9..3da861362 100644 --- a/code/DeboneProcess.h +++ b/code/DeboneProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DefaultIOStream.cpp b/code/DefaultIOStream.cpp index 487ba27ca..3b0a672a7 100644 --- a/code/DefaultIOStream.cpp +++ b/code/DefaultIOStream.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DefaultIOSystem.cpp b/code/DefaultIOSystem.cpp index 45082e59c..5e50be8bd 100644 --- a/code/DefaultIOSystem.cpp +++ b/code/DefaultIOSystem.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DefaultLogger.cpp b/code/DefaultLogger.cpp index 98c63a293..ad101174c 100644 --- a/code/DefaultLogger.cpp +++ b/code/DefaultLogger.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/DefaultProgressHandler.h b/code/DefaultProgressHandler.h index 6cd872eaa..a40501fe5 100644 --- a/code/DefaultProgressHandler.h +++ b/code/DefaultProgressHandler.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/EmbedTexturesProcess.cpp b/code/EmbedTexturesProcess.cpp index e928c2773..addfb9746 100644 --- a/code/EmbedTexturesProcess.cpp +++ b/code/EmbedTexturesProcess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/EmbedTexturesProcess.h b/code/EmbedTexturesProcess.h index 5a472f644..ce9821652 100644 --- a/code/EmbedTexturesProcess.h +++ b/code/EmbedTexturesProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Exporter.cpp b/code/Exporter.cpp index e1f1a604f..51c639cfd 100644 --- a/code/Exporter.cpp +++ b/code/Exporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXAnimation.cpp b/code/FBXAnimation.cpp index 6f9613f0d..24ab9b14b 100644 --- a/code/FBXAnimation.cpp +++ b/code/FBXAnimation.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXBinaryTokenizer.cpp b/code/FBXBinaryTokenizer.cpp index c977be4c1..d6c34de6f 100644 --- a/code/FBXBinaryTokenizer.cpp +++ b/code/FBXBinaryTokenizer.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXCompileConfig.h b/code/FBXCompileConfig.h index 56aa1c787..2e7336e85 100644 --- a/code/FBXCompileConfig.h +++ b/code/FBXCompileConfig.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index d246a85d9..6929e5c33 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXConverter.h b/code/FBXConverter.h index c6c413052..c882e9326 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXDeformer.cpp b/code/FBXDeformer.cpp index 637144ab1..9c7c7a4c4 100644 --- a/code/FBXDeformer.cpp +++ b/code/FBXDeformer.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index 20c875ca1..3714cd617 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 2b8157249..386a660d9 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXDocumentUtil.cpp b/code/FBXDocumentUtil.cpp index 27921b920..775067021 100644 --- a/code/FBXDocumentUtil.cpp +++ b/code/FBXDocumentUtil.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXImportSettings.h b/code/FBXImportSettings.h index 84129cd4a..e612fddef 100644 --- a/code/FBXImportSettings.h +++ b/code/FBXImportSettings.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXImporter.cpp b/code/FBXImporter.cpp index f2231b805..b004bcd8c 100644 --- a/code/FBXImporter.cpp +++ b/code/FBXImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXImporter.h b/code/FBXImporter.h index 139fdecae..870f1c49b 100644 --- a/code/FBXImporter.h +++ b/code/FBXImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXMaterial.cpp b/code/FBXMaterial.cpp index 73e5e482c..10f3bbe6c 100644 --- a/code/FBXMaterial.cpp +++ b/code/FBXMaterial.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index 4868b3e72..d55a8b0bb 100644 --- a/code/FBXMeshGeometry.cpp +++ b/code/FBXMeshGeometry.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXMeshGeometry.h b/code/FBXMeshGeometry.h index 19f7b0a9c..5dbf6f491 100644 --- a/code/FBXMeshGeometry.h +++ b/code/FBXMeshGeometry.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXModel.cpp b/code/FBXModel.cpp index 3d694d7d8..c16ca841c 100644 --- a/code/FBXModel.cpp +++ b/code/FBXModel.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXNodeAttribute.cpp b/code/FBXNodeAttribute.cpp index 545343c09..1064151b3 100644 --- a/code/FBXNodeAttribute.cpp +++ b/code/FBXNodeAttribute.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXParser.cpp b/code/FBXParser.cpp index a49d96af1..96d113bd1 100644 --- a/code/FBXParser.cpp +++ b/code/FBXParser.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXParser.h b/code/FBXParser.h index 996c86fcf..389da3fed 100644 --- a/code/FBXParser.h +++ b/code/FBXParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXProperties.cpp b/code/FBXProperties.cpp index 6126dc53c..ca89743ca 100644 --- a/code/FBXProperties.cpp +++ b/code/FBXProperties.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXProperties.h b/code/FBXProperties.h index bf1b38e97..404e04deb 100644 --- a/code/FBXProperties.h +++ b/code/FBXProperties.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXTokenizer.cpp b/code/FBXTokenizer.cpp index aa0274ab5..c9dd1697a 100644 --- a/code/FBXTokenizer.cpp +++ b/code/FBXTokenizer.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXTokenizer.h b/code/FBXTokenizer.h index e00ff5b79..e93982617 100644 --- a/code/FBXTokenizer.h +++ b/code/FBXTokenizer.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXUtil.cpp b/code/FBXUtil.cpp index 652174ffc..992c30efc 100644 --- a/code/FBXUtil.cpp +++ b/code/FBXUtil.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FBXUtil.h b/code/FBXUtil.h index c1d9459b3..caea7f115 100644 --- a/code/FBXUtil.h +++ b/code/FBXUtil.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FIReader.cpp b/code/FIReader.cpp index 3d5b6ad41..bdc447b34 100755 --- a/code/FIReader.cpp +++ b/code/FIReader.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FIReader.hpp b/code/FIReader.hpp index e142a571b..9ff752d5c 100644 --- a/code/FIReader.hpp +++ b/code/FIReader.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FileLogStream.h b/code/FileLogStream.h index e935624a1..9966091d2 100644 --- a/code/FileLogStream.h +++ b/code/FileLogStream.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/FindDegenerates.cpp b/code/FindDegenerates.cpp index fe13509b9..dc2b5d01c 100644 --- a/code/FindDegenerates.cpp +++ b/code/FindDegenerates.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FindDegenerates.h b/code/FindDegenerates.h index cf03a24bc..2df94710a 100644 --- a/code/FindDegenerates.h +++ b/code/FindDegenerates.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FindInstancesProcess.cpp b/code/FindInstancesProcess.cpp index ab2d2257b..089e6c078 100644 --- a/code/FindInstancesProcess.cpp +++ b/code/FindInstancesProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FindInstancesProcess.h b/code/FindInstancesProcess.h index dc4396566..2ef6c1ca7 100644 --- a/code/FindInstancesProcess.h +++ b/code/FindInstancesProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FindInvalidDataProcess.cpp b/code/FindInvalidDataProcess.cpp index 5b6b822b7..aac69950c 100644 --- a/code/FindInvalidDataProcess.cpp +++ b/code/FindInvalidDataProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FindInvalidDataProcess.h b/code/FindInvalidDataProcess.h index cc0ef946d..00dfef145 100644 --- a/code/FindInvalidDataProcess.h +++ b/code/FindInvalidDataProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FixNormalsStep.cpp b/code/FixNormalsStep.cpp index e00458009..e66fec5ef 100644 --- a/code/FixNormalsStep.cpp +++ b/code/FixNormalsStep.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/FixNormalsStep.h b/code/FixNormalsStep.h index 71309c7e5..389e6e1a6 100644 --- a/code/FixNormalsStep.h +++ b/code/FixNormalsStep.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/GenFaceNormalsProcess.cpp b/code/GenFaceNormalsProcess.cpp index f42b17ad0..be726302c 100644 --- a/code/GenFaceNormalsProcess.cpp +++ b/code/GenFaceNormalsProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/GenFaceNormalsProcess.h b/code/GenFaceNormalsProcess.h index 024c74a28..27ae7acac 100644 --- a/code/GenFaceNormalsProcess.h +++ b/code/GenFaceNormalsProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/GenVertexNormalsProcess.cpp b/code/GenVertexNormalsProcess.cpp index 7e6267b9b..f746f3776 100644 --- a/code/GenVertexNormalsProcess.cpp +++ b/code/GenVertexNormalsProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/GenVertexNormalsProcess.h b/code/GenVertexNormalsProcess.h index 0471ed6b0..5ab9eb6f5 100644 --- a/code/GenVertexNormalsProcess.h +++ b/code/GenVertexNormalsProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/HMPFileData.h b/code/HMPFileData.h index 3c060ba1a..a8ad2deb0 100644 --- a/code/HMPFileData.h +++ b/code/HMPFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/HMPLoader.cpp b/code/HMPLoader.cpp index 2a669201e..aafd3a25c 100644 --- a/code/HMPLoader.cpp +++ b/code/HMPLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/HMPLoader.h b/code/HMPLoader.h index f85246e50..4e513aee6 100644 --- a/code/HMPLoader.h +++ b/code/HMPLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/HalfLifeFileData.h b/code/HalfLifeFileData.h index 3a36d2422..930980c80 100644 --- a/code/HalfLifeFileData.h +++ b/code/HalfLifeFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/IRRLoader.cpp b/code/IRRLoader.cpp index 79cea759a..fbec3da00 100644 --- a/code/IRRLoader.cpp +++ b/code/IRRLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/IRRLoader.h b/code/IRRLoader.h index d7a972211..3bd39092a 100644 --- a/code/IRRLoader.h +++ b/code/IRRLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/IRRMeshLoader.cpp b/code/IRRMeshLoader.cpp index f01b02561..5885d69a2 100644 --- a/code/IRRMeshLoader.cpp +++ b/code/IRRMeshLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/IRRMeshLoader.h b/code/IRRMeshLoader.h index 041b7183c..ef6a8a11b 100644 --- a/code/IRRMeshLoader.h +++ b/code/IRRMeshLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/IRRShared.cpp b/code/IRRShared.cpp index 35eef2db2..fa90916b3 100644 --- a/code/IRRShared.cpp +++ b/code/IRRShared.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer.cpp b/code/Importer.cpp index 5923fa7bc..4ebc72420 100644 --- a/code/Importer.cpp +++ b/code/Importer.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer.h b/code/Importer.h index e0fb57f5b..d15df2f85 100644 --- a/code/Importer.h +++ b/code/Importer.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCCurve.cpp b/code/Importer/IFC/IFCCurve.cpp index 618b46975..af58e7b10 100644 --- a/code/Importer/IFC/IFCCurve.cpp +++ b/code/Importer/IFC/IFCCurve.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCLoader.cpp b/code/Importer/IFC/IFCLoader.cpp index 13ff85388..0849e01d5 100644 --- a/code/Importer/IFC/IFCLoader.cpp +++ b/code/Importer/IFC/IFCLoader.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCLoader.h b/code/Importer/IFC/IFCLoader.h index 049c53382..99e3e8ed9 100644 --- a/code/Importer/IFC/IFCLoader.h +++ b/code/Importer/IFC/IFCLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCMaterial.cpp b/code/Importer/IFC/IFCMaterial.cpp index 1fa1bc8e4..423d1471e 100644 --- a/code/Importer/IFC/IFCMaterial.cpp +++ b/code/Importer/IFC/IFCMaterial.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCProfile.cpp b/code/Importer/IFC/IFCProfile.cpp index c6ca48ba3..2236d0d9b 100644 --- a/code/Importer/IFC/IFCProfile.cpp +++ b/code/Importer/IFC/IFCProfile.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCUtil.cpp b/code/Importer/IFC/IFCUtil.cpp index e9418981b..97f621935 100644 --- a/code/Importer/IFC/IFCUtil.cpp +++ b/code/Importer/IFC/IFCUtil.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/IFCUtil.h b/code/Importer/IFC/IFCUtil.h index e073f6f3c..479772d89 100644 --- a/code/Importer/IFC/IFCUtil.h +++ b/code/Importer/IFC/IFCUtil.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/STEPFileEncoding.cpp b/code/Importer/IFC/STEPFileEncoding.cpp index 13a87d370..70d5f4e4b 100644 --- a/code/Importer/IFC/STEPFileEncoding.cpp +++ b/code/Importer/IFC/STEPFileEncoding.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/STEPFileEncoding.h b/code/Importer/IFC/STEPFileEncoding.h index 56615c8f6..232cb81ba 100644 --- a/code/Importer/IFC/STEPFileEncoding.h +++ b/code/Importer/IFC/STEPFileEncoding.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/STEPFileReader.cpp b/code/Importer/IFC/STEPFileReader.cpp index 407643862..ca02f7626 100644 --- a/code/Importer/IFC/STEPFileReader.cpp +++ b/code/Importer/IFC/STEPFileReader.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Importer/IFC/STEPFileReader.h b/code/Importer/IFC/STEPFileReader.h index e541a85bb..b9dcf8948 100644 --- a/code/Importer/IFC/STEPFileReader.h +++ b/code/Importer/IFC/STEPFileReader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ImporterRegistry.cpp b/code/ImporterRegistry.cpp index 35cc4f1a6..4a8428d25 100644 --- a/code/ImporterRegistry.cpp +++ b/code/ImporterRegistry.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ImproveCacheLocality.cpp b/code/ImproveCacheLocality.cpp index f7cbdc9bd..cc6e9db46 100644 --- a/code/ImproveCacheLocality.cpp +++ b/code/ImproveCacheLocality.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ImproveCacheLocality.h b/code/ImproveCacheLocality.h index d91388c41..18eb5e460 100644 --- a/code/ImproveCacheLocality.h +++ b/code/ImproveCacheLocality.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/JoinVerticesProcess.cpp b/code/JoinVerticesProcess.cpp index 693000215..cffe74fb2 100644 --- a/code/JoinVerticesProcess.cpp +++ b/code/JoinVerticesProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/JoinVerticesProcess.h b/code/JoinVerticesProcess.h index a3204782a..a7366efbe 100644 --- a/code/JoinVerticesProcess.h +++ b/code/JoinVerticesProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOAnimation.cpp b/code/LWOAnimation.cpp index 4b5338f7a..ff02a8eab 100644 --- a/code/LWOAnimation.cpp +++ b/code/LWOAnimation.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOAnimation.h b/code/LWOAnimation.h index f0c578ad9..7d7c6d699 100644 --- a/code/LWOAnimation.h +++ b/code/LWOAnimation.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOBLoader.cpp b/code/LWOBLoader.cpp index 6a07f81a7..45e149914 100644 --- a/code/LWOBLoader.cpp +++ b/code/LWOBLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOFileData.h b/code/LWOFileData.h index 7fa9a216d..6e3c476c3 100644 --- a/code/LWOFileData.h +++ b/code/LWOFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOLoader.cpp b/code/LWOLoader.cpp index 516b95df6..38e330b8f 100644 --- a/code/LWOLoader.cpp +++ b/code/LWOLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOLoader.h b/code/LWOLoader.h index 078e34fcf..fa646648d 100644 --- a/code/LWOLoader.h +++ b/code/LWOLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWOMaterial.cpp b/code/LWOMaterial.cpp index a0d8f70b4..df8d328da 100644 --- a/code/LWOMaterial.cpp +++ b/code/LWOMaterial.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWSLoader.cpp b/code/LWSLoader.cpp index baf8d5103..1fcc5f789 100644 --- a/code/LWSLoader.cpp +++ b/code/LWSLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LWSLoader.h b/code/LWSLoader.h index b5b33a87d..9f1636f21 100644 --- a/code/LWSLoader.h +++ b/code/LWSLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LimitBoneWeightsProcess.cpp b/code/LimitBoneWeightsProcess.cpp index 9c8e56755..8c21f2394 100644 --- a/code/LimitBoneWeightsProcess.cpp +++ b/code/LimitBoneWeightsProcess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/LimitBoneWeightsProcess.h b/code/LimitBoneWeightsProcess.h index 3826dbe58..2fc6e02b1 100644 --- a/code/LimitBoneWeightsProcess.h +++ b/code/LimitBoneWeightsProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD2FileData.h b/code/MD2FileData.h index f65193264..4b893bbb1 100644 --- a/code/MD2FileData.h +++ b/code/MD2FileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD2Loader.cpp b/code/MD2Loader.cpp index ea6fa50bb..8f5b1c045 100644 --- a/code/MD2Loader.cpp +++ b/code/MD2Loader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD2Loader.h b/code/MD2Loader.h index 29a0e173c..f26b31736 100644 --- a/code/MD2Loader.h +++ b/code/MD2Loader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD2NormalTable.h b/code/MD2NormalTable.h index 98fbc1d7a..dd2c837b4 100644 --- a/code/MD2NormalTable.h +++ b/code/MD2NormalTable.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD3FileData.h b/code/MD3FileData.h index 19740c30e..3f9741366 100644 --- a/code/MD3FileData.h +++ b/code/MD3FileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD3Loader.cpp b/code/MD3Loader.cpp index 7948a635e..e86c3e0ca 100644 --- a/code/MD3Loader.cpp +++ b/code/MD3Loader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD3Loader.h b/code/MD3Loader.h index 967d4cb35..e2a89afcd 100644 --- a/code/MD3Loader.h +++ b/code/MD3Loader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD5Loader.cpp b/code/MD5Loader.cpp index d9eb74ec8..d5aea6a47 100644 --- a/code/MD5Loader.cpp +++ b/code/MD5Loader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD5Loader.h b/code/MD5Loader.h index 59e8a114f..1ba5fea68 100644 --- a/code/MD5Loader.h +++ b/code/MD5Loader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD5Parser.cpp b/code/MD5Parser.cpp index 26fac1b29..5593a3a0b 100644 --- a/code/MD5Parser.cpp +++ b/code/MD5Parser.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MD5Parser.h b/code/MD5Parser.h index 9cf4db017..b62df996f 100644 --- a/code/MD5Parser.h +++ b/code/MD5Parser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDCFileData.h b/code/MDCFileData.h index 9ea3d8f5e..e89433ed7 100644 --- a/code/MDCFileData.h +++ b/code/MDCFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDCLoader.cpp b/code/MDCLoader.cpp index 8af18992d..34ead53a9 100644 --- a/code/MDCLoader.cpp +++ b/code/MDCLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDCLoader.h b/code/MDCLoader.h index 841c8b680..5bbe2b666 100644 --- a/code/MDCLoader.h +++ b/code/MDCLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDLDefaultColorMap.h b/code/MDLDefaultColorMap.h index 800c717c5..b96a60a06 100644 --- a/code/MDLDefaultColorMap.h +++ b/code/MDLDefaultColorMap.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDLFileData.h b/code/MDLFileData.h index e94bf9870..56f686280 100644 --- a/code/MDLFileData.h +++ b/code/MDLFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDLLoader.cpp b/code/MDLLoader.cpp index bbb1c24d5..5dd471cf5 100644 --- a/code/MDLLoader.cpp +++ b/code/MDLLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDLLoader.h b/code/MDLLoader.h index 284370537..f1504beea 100644 --- a/code/MDLLoader.h +++ b/code/MDLLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MDLMaterialLoader.cpp b/code/MDLMaterialLoader.cpp index 9c3c94041..d50957094 100644 --- a/code/MDLMaterialLoader.cpp +++ b/code/MDLMaterialLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MMDCpp14.h b/code/MMDCpp14.h index f6f81f827..5ec2fd975 100644 --- a/code/MMDCpp14.h +++ b/code/MMDCpp14.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MMDPmdParser.h b/code/MMDPmdParser.h index 586f20a5f..d61a355fb 100644 --- a/code/MMDPmdParser.h +++ b/code/MMDPmdParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MMDPmxParser.cpp b/code/MMDPmxParser.cpp index 3f194b6ba..2eb724a31 100644 --- a/code/MMDPmxParser.cpp +++ b/code/MMDPmxParser.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MMDPmxParser.h b/code/MMDPmxParser.h index a26eddb04..43cad5899 100644 --- a/code/MMDPmxParser.h +++ b/code/MMDPmxParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MMDVmdParser.h b/code/MMDVmdParser.h index 43e7a923a..600959e94 100644 --- a/code/MMDVmdParser.h +++ b/code/MMDVmdParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MS3DLoader.cpp b/code/MS3DLoader.cpp index 56a1fcd75..09b3be6e1 100644 --- a/code/MS3DLoader.cpp +++ b/code/MS3DLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MS3DLoader.h b/code/MS3DLoader.h index 6db60b3a4..2efa3be5f 100644 --- a/code/MS3DLoader.h +++ b/code/MS3DLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MakeVerboseFormat.cpp b/code/MakeVerboseFormat.cpp index 720d44519..f6a978e56 100644 --- a/code/MakeVerboseFormat.cpp +++ b/code/MakeVerboseFormat.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MakeVerboseFormat.h b/code/MakeVerboseFormat.h index 9832a3f65..292d9bea6 100644 --- a/code/MakeVerboseFormat.h +++ b/code/MakeVerboseFormat.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MaterialSystem.cpp b/code/MaterialSystem.cpp index 7dbee911e..e7e8a077d 100644 --- a/code/MaterialSystem.cpp +++ b/code/MaterialSystem.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/MaterialSystem.h b/code/MaterialSystem.h index b083a5bb8..d6f2cea46 100644 --- a/code/MaterialSystem.h +++ b/code/MaterialSystem.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/NDOLoader.cpp b/code/NDOLoader.cpp index 8247db049..b09fc1e2d 100644 --- a/code/NDOLoader.cpp +++ b/code/NDOLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/NFFLoader.cpp b/code/NFFLoader.cpp index 811f60618..acd057d90 100644 --- a/code/NFFLoader.cpp +++ b/code/NFFLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/NFFLoader.h b/code/NFFLoader.h index 6f8964a01..1e3f0bd26 100644 --- a/code/NFFLoader.h +++ b/code/NFFLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OFFLoader.cpp b/code/OFFLoader.cpp index ff8721ce2..d99ba55a2 100644 --- a/code/OFFLoader.cpp +++ b/code/OFFLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OFFLoader.h b/code/OFFLoader.h index 01ddd1072..ed1ed98c1 100644 --- a/code/OFFLoader.h +++ b/code/OFFLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjExporter.cpp b/code/ObjExporter.cpp index 163960d4c..9beb418f3 100644 --- a/code/ObjExporter.cpp +++ b/code/ObjExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjExporter.h b/code/ObjExporter.h index 391f8416d..7920598d0 100644 --- a/code/ObjExporter.h +++ b/code/ObjExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileData.h b/code/ObjFileData.h index 2658f8a2a..38786e6f4 100644 --- a/code/ObjFileData.h +++ b/code/ObjFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileImporter.cpp b/code/ObjFileImporter.cpp index c4295ab01..02d6ac581 100644 --- a/code/ObjFileImporter.cpp +++ b/code/ObjFileImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileImporter.h b/code/ObjFileImporter.h index 3947996c0..f564fe22b 100644 --- a/code/ObjFileImporter.h +++ b/code/ObjFileImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileMtlImporter.cpp b/code/ObjFileMtlImporter.cpp index 1d20c99cb..835f529cc 100644 --- a/code/ObjFileMtlImporter.cpp +++ b/code/ObjFileMtlImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileMtlImporter.h b/code/ObjFileMtlImporter.h index c9bcc9a9f..d6a7b1f1a 100644 --- a/code/ObjFileMtlImporter.h +++ b/code/ObjFileMtlImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileParser.cpp b/code/ObjFileParser.cpp index 25b0a97f1..ae95edbcb 100644 --- a/code/ObjFileParser.cpp +++ b/code/ObjFileParser.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjFileParser.h b/code/ObjFileParser.h index 3b6578c5e..7cf06ae05 100644 --- a/code/ObjFileParser.h +++ b/code/ObjFileParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ObjTools.h b/code/ObjTools.h index 502f7c3c0..842efd749 100644 --- a/code/ObjTools.h +++ b/code/ObjTools.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreBinarySerializer.cpp b/code/OgreBinarySerializer.cpp index f98bd583c..88fe02057 100644 --- a/code/OgreBinarySerializer.cpp +++ b/code/OgreBinarySerializer.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreBinarySerializer.h b/code/OgreBinarySerializer.h index 06ce5f7fa..a31047c70 100644 --- a/code/OgreBinarySerializer.h +++ b/code/OgreBinarySerializer.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreImporter.cpp b/code/OgreImporter.cpp index 4dc802574..e77654d7b 100644 --- a/code/OgreImporter.cpp +++ b/code/OgreImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreImporter.h b/code/OgreImporter.h index 97ea5463c..8f088a3cc 100644 --- a/code/OgreImporter.h +++ b/code/OgreImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreMaterial.cpp b/code/OgreMaterial.cpp index 61a3caa5e..c20c8fa6f 100644 --- a/code/OgreMaterial.cpp +++ b/code/OgreMaterial.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreParsingUtils.h b/code/OgreParsingUtils.h index 8c921c9e9..a77b94121 100644 --- a/code/OgreParsingUtils.h +++ b/code/OgreParsingUtils.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreStructs.cpp b/code/OgreStructs.cpp index b9c7df566..0f3e2fa97 100644 --- a/code/OgreStructs.cpp +++ b/code/OgreStructs.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreStructs.h b/code/OgreStructs.h index 613510dde..dfe0346dc 100644 --- a/code/OgreStructs.h +++ b/code/OgreStructs.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreXmlSerializer.cpp b/code/OgreXmlSerializer.cpp index 215b72e9f..a7e6b5a09 100644 --- a/code/OgreXmlSerializer.cpp +++ b/code/OgreXmlSerializer.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OgreXmlSerializer.h b/code/OgreXmlSerializer.h index b10e105e3..1ad46f95f 100644 --- a/code/OgreXmlSerializer.h +++ b/code/OgreXmlSerializer.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OpenGEXExporter.cpp b/code/OpenGEXExporter.cpp index 0f2b1c35b..ea2f64e8f 100644 --- a/code/OpenGEXExporter.cpp +++ b/code/OpenGEXExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OpenGEXExporter.h b/code/OpenGEXExporter.h index 9df9d853e..76d2418a4 100644 --- a/code/OpenGEXExporter.h +++ b/code/OpenGEXExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index 8f565849f..37c765f4c 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OpenGEXImporter.h b/code/OpenGEXImporter.h index 104ae3091..bbbe3678d 100644 --- a/code/OpenGEXImporter.h +++ b/code/OpenGEXImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OpenGEXStructs.h b/code/OpenGEXStructs.h index 6144a10c5..6cd7488e9 100644 --- a/code/OpenGEXStructs.h +++ b/code/OpenGEXStructs.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OptimizeGraph.cpp b/code/OptimizeGraph.cpp index 75df935ea..5a2607d4f 100644 --- a/code/OptimizeGraph.cpp +++ b/code/OptimizeGraph.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OptimizeGraph.h b/code/OptimizeGraph.h index 22d53afff..aa6aa8651 100644 --- a/code/OptimizeGraph.h +++ b/code/OptimizeGraph.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OptimizeMeshes.cpp b/code/OptimizeMeshes.cpp index a65661c26..f586cc316 100644 --- a/code/OptimizeMeshes.cpp +++ b/code/OptimizeMeshes.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/OptimizeMeshes.h b/code/OptimizeMeshes.h index bcefe9247..f57447ccd 100644 --- a/code/OptimizeMeshes.h +++ b/code/OptimizeMeshes.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PlyExporter.cpp b/code/PlyExporter.cpp index f9b97cf0b..0ddba0d2a 100644 --- a/code/PlyExporter.cpp +++ b/code/PlyExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PlyExporter.h b/code/PlyExporter.h index d1d4eafbb..060aa7ceb 100644 --- a/code/PlyExporter.h +++ b/code/PlyExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PlyLoader.cpp b/code/PlyLoader.cpp index f8238c5c1..b6ae368df 100644 --- a/code/PlyLoader.cpp +++ b/code/PlyLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PlyLoader.h b/code/PlyLoader.h index e117784e9..beada5f23 100644 --- a/code/PlyLoader.h +++ b/code/PlyLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PlyParser.cpp b/code/PlyParser.cpp index 0dabcc739..85c0f823e 100644 --- a/code/PlyParser.cpp +++ b/code/PlyParser.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PlyParser.h b/code/PlyParser.h index 05d37e288..cba48a4b6 100644 --- a/code/PlyParser.h +++ b/code/PlyParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/PolyTools.h b/code/PolyTools.h index 1089327ae..f43bd9de1 100644 --- a/code/PolyTools.h +++ b/code/PolyTools.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PostStepRegistry.cpp b/code/PostStepRegistry.cpp index eaae1447b..49f5d7375 100644 --- a/code/PostStepRegistry.cpp +++ b/code/PostStepRegistry.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PretransformVertices.cpp b/code/PretransformVertices.cpp index 70d16382d..6c569c185 100644 --- a/code/PretransformVertices.cpp +++ b/code/PretransformVertices.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/PretransformVertices.h b/code/PretransformVertices.h index 65b4938b0..8b400dc0c 100644 --- a/code/PretransformVertices.h +++ b/code/PretransformVertices.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ProcessHelper.cpp b/code/ProcessHelper.cpp index c255979bd..d6f8cd165 100644 --- a/code/ProcessHelper.cpp +++ b/code/ProcessHelper.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ProcessHelper.h b/code/ProcessHelper.h index 4cacdcf85..5ef3707e8 100644 --- a/code/ProcessHelper.h +++ b/code/ProcessHelper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPFileData.h b/code/Q3BSPFileData.h index b836795f8..eb3a1444a 100644 --- a/code/Q3BSPFileData.h +++ b/code/Q3BSPFileData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPFileImporter.cpp b/code/Q3BSPFileImporter.cpp index cbe531cfc..aad2bf93c 100644 --- a/code/Q3BSPFileImporter.cpp +++ b/code/Q3BSPFileImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPFileImporter.h b/code/Q3BSPFileImporter.h index dad1aca48..7d26d2c55 100644 --- a/code/Q3BSPFileImporter.h +++ b/code/Q3BSPFileImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPFileParser.cpp b/code/Q3BSPFileParser.cpp index 69721fc2d..c53280cb5 100644 --- a/code/Q3BSPFileParser.cpp +++ b/code/Q3BSPFileParser.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPFileParser.h b/code/Q3BSPFileParser.h index 4ca9f6c24..747d1d494 100644 --- a/code/Q3BSPFileParser.h +++ b/code/Q3BSPFileParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPZipArchive.cpp b/code/Q3BSPZipArchive.cpp index 1c8b18ad3..5c9209512 100644 --- a/code/Q3BSPZipArchive.cpp +++ b/code/Q3BSPZipArchive.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3BSPZipArchive.h b/code/Q3BSPZipArchive.h index 5430bac6f..db1303d19 100644 --- a/code/Q3BSPZipArchive.h +++ b/code/Q3BSPZipArchive.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3DLoader.cpp b/code/Q3DLoader.cpp index 3a5b763b5..9495713a8 100644 --- a/code/Q3DLoader.cpp +++ b/code/Q3DLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Q3DLoader.h b/code/Q3DLoader.h index f163e15dc..bdb104df3 100644 --- a/code/Q3DLoader.h +++ b/code/Q3DLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RawLoader.cpp b/code/RawLoader.cpp index 2d51c4a72..0c149a1f6 100644 --- a/code/RawLoader.cpp +++ b/code/RawLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RawLoader.h b/code/RawLoader.h index 8f633d011..f6e894fdd 100644 --- a/code/RawLoader.h +++ b/code/RawLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RemoveComments.cpp b/code/RemoveComments.cpp index 024ff7f7a..3ba3c60be 100644 --- a/code/RemoveComments.cpp +++ b/code/RemoveComments.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RemoveRedundantMaterials.cpp b/code/RemoveRedundantMaterials.cpp index d7d2de402..683fb7fdd 100644 --- a/code/RemoveRedundantMaterials.cpp +++ b/code/RemoveRedundantMaterials.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RemoveRedundantMaterials.h b/code/RemoveRedundantMaterials.h index cb4ec02bb..37b69ffbe 100644 --- a/code/RemoveRedundantMaterials.h +++ b/code/RemoveRedundantMaterials.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RemoveVCProcess.cpp b/code/RemoveVCProcess.cpp index 016757dbb..1c4975e35 100644 --- a/code/RemoveVCProcess.cpp +++ b/code/RemoveVCProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/RemoveVCProcess.h b/code/RemoveVCProcess.h index d7d45e73e..597de8584 100644 --- a/code/RemoveVCProcess.h +++ b/code/RemoveVCProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SGSpatialSort.cpp b/code/SGSpatialSort.cpp index e3714610f..d74c57ed5 100644 --- a/code/SGSpatialSort.cpp +++ b/code/SGSpatialSort.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SIBImporter.cpp b/code/SIBImporter.cpp index af6e45cb1..97df708ba 100644 --- a/code/SIBImporter.cpp +++ b/code/SIBImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SIBImporter.h b/code/SIBImporter.h index e8df2b07c..9437af588 100644 --- a/code/SIBImporter.h +++ b/code/SIBImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SMDLoader.cpp b/code/SMDLoader.cpp index 9bb07ba96..ab7146daa 100644 --- a/code/SMDLoader.cpp +++ b/code/SMDLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SMDLoader.h b/code/SMDLoader.h index a8e88f448..adc596a63 100644 --- a/code/SMDLoader.h +++ b/code/SMDLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/STEPFile.h b/code/STEPFile.h index 09c3f7223..d789faac2 100644 --- a/code/STEPFile.h +++ b/code/STEPFile.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/STLExporter.cpp b/code/STLExporter.cpp index 648e5645b..4c7a8a639 100644 --- a/code/STLExporter.cpp +++ b/code/STLExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/STLExporter.h b/code/STLExporter.h index 7fb6a3e75..1bd589627 100644 --- a/code/STLExporter.h +++ b/code/STLExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/STLLoader.cpp b/code/STLLoader.cpp index cf54db636..fc326b2c7 100644 --- a/code/STLLoader.cpp +++ b/code/STLLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/STLLoader.h b/code/STLLoader.h index 12ad4707e..3b87f70a3 100644 --- a/code/STLLoader.h +++ b/code/STLLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ScaleProcess.cpp b/code/ScaleProcess.cpp index ada978e82..ef7357b68 100644 --- a/code/ScaleProcess.cpp +++ b/code/ScaleProcess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ScaleProcess.h b/code/ScaleProcess.h index 7eb91fd5c..0621220a8 100644 --- a/code/ScaleProcess.h +++ b/code/ScaleProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SceneCombiner.cpp b/code/SceneCombiner.cpp index bc466562b..30722618f 100644 --- a/code/SceneCombiner.cpp +++ b/code/SceneCombiner.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ScenePreprocessor.cpp b/code/ScenePreprocessor.cpp index 0a6366b7d..2da890a84 100644 --- a/code/ScenePreprocessor.cpp +++ b/code/ScenePreprocessor.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ScenePreprocessor.h b/code/ScenePreprocessor.h index 3311036c3..3900a237b 100644 --- a/code/ScenePreprocessor.h +++ b/code/ScenePreprocessor.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ScenePrivate.h b/code/ScenePrivate.h index 90d34bade..a09d8784b 100644 --- a/code/ScenePrivate.h +++ b/code/ScenePrivate.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SkeletonMeshBuilder.cpp b/code/SkeletonMeshBuilder.cpp index a0a26bb7b..ecfe8586f 100644 --- a/code/SkeletonMeshBuilder.cpp +++ b/code/SkeletonMeshBuilder.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SortByPTypeProcess.cpp b/code/SortByPTypeProcess.cpp index 7f934da1f..8d6be695d 100644 --- a/code/SortByPTypeProcess.cpp +++ b/code/SortByPTypeProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SortByPTypeProcess.h b/code/SortByPTypeProcess.h index 0be7925ff..27bfa2155 100644 --- a/code/SortByPTypeProcess.h +++ b/code/SortByPTypeProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SpatialSort.cpp b/code/SpatialSort.cpp index 297452884..010cad7c1 100644 --- a/code/SpatialSort.cpp +++ b/code/SpatialSort.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SplitByBoneCountProcess.cpp b/code/SplitByBoneCountProcess.cpp index 6244db35e..105ee517d 100644 --- a/code/SplitByBoneCountProcess.cpp +++ b/code/SplitByBoneCountProcess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SplitByBoneCountProcess.h b/code/SplitByBoneCountProcess.h index 434ef9866..b46dd6b0f 100644 --- a/code/SplitByBoneCountProcess.h +++ b/code/SplitByBoneCountProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SplitLargeMeshes.cpp b/code/SplitLargeMeshes.cpp index 2066f7989..f24ddd205 100644 --- a/code/SplitLargeMeshes.cpp +++ b/code/SplitLargeMeshes.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/SplitLargeMeshes.h b/code/SplitLargeMeshes.h index 7556e9fe8..7a977ff07 100644 --- a/code/SplitLargeMeshes.h +++ b/code/SplitLargeMeshes.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/StandardShapes.cpp b/code/StandardShapes.cpp index 1925e8f12..a5b368f7f 100644 --- a/code/StandardShapes.cpp +++ b/code/StandardShapes.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/StdOStreamLogStream.h b/code/StdOStreamLogStream.h index d9993b246..43b8d7de2 100644 --- a/code/StdOStreamLogStream.h +++ b/code/StdOStreamLogStream.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/StepExporter.cpp b/code/StepExporter.cpp index 5d95d34e6..5bad2feb2 100644 --- a/code/StepExporter.cpp +++ b/code/StepExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/StepExporter.h b/code/StepExporter.h index e5cdda7a1..f1323bee8 100644 --- a/code/StepExporter.h +++ b/code/StepExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Subdivision.cpp b/code/Subdivision.cpp index b780a2656..450e03883 100644 --- a/code/Subdivision.cpp +++ b/code/Subdivision.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TargetAnimation.cpp b/code/TargetAnimation.cpp index ab6b3d12f..2834b1f10 100644 --- a/code/TargetAnimation.cpp +++ b/code/TargetAnimation.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TargetAnimation.h b/code/TargetAnimation.h index 21b66e591..bb37e6008 100644 --- a/code/TargetAnimation.h +++ b/code/TargetAnimation.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TerragenLoader.cpp b/code/TerragenLoader.cpp index 5a1847d55..0f5f4cb9d 100644 --- a/code/TerragenLoader.cpp +++ b/code/TerragenLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TerragenLoader.h b/code/TerragenLoader.h index a4a22fcac..a02889de1 100644 --- a/code/TerragenLoader.h +++ b/code/TerragenLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TextureTransform.cpp b/code/TextureTransform.cpp index 72ee8ec21..79914b898 100644 --- a/code/TextureTransform.cpp +++ b/code/TextureTransform.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TextureTransform.h b/code/TextureTransform.h index cff675657..fafa48178 100644 --- a/code/TextureTransform.h +++ b/code/TextureTransform.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TriangulateProcess.cpp b/code/TriangulateProcess.cpp index e2d77a80f..25d92c470 100644 --- a/code/TriangulateProcess.cpp +++ b/code/TriangulateProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/TriangulateProcess.h b/code/TriangulateProcess.h index 6775eca7c..e6300085d 100644 --- a/code/TriangulateProcess.h +++ b/code/TriangulateProcess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/UnrealLoader.cpp b/code/UnrealLoader.cpp index c5d55eb39..5990ce1c5 100644 --- a/code/UnrealLoader.cpp +++ b/code/UnrealLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/UnrealLoader.h b/code/UnrealLoader.h index b930fc280..4095aa142 100644 --- a/code/UnrealLoader.h +++ b/code/UnrealLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ValidateDataStructure.cpp b/code/ValidateDataStructure.cpp index 87ff094fd..045776204 100644 --- a/code/ValidateDataStructure.cpp +++ b/code/ValidateDataStructure.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/ValidateDataStructure.h b/code/ValidateDataStructure.h index 084a2b083..4e1636bfa 100644 --- a/code/ValidateDataStructure.h +++ b/code/ValidateDataStructure.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Version.cpp b/code/Version.cpp index a9ecb6a3a..10e051629 100644 --- a/code/Version.cpp +++ b/code/Version.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/VertexTriangleAdjacency.cpp b/code/VertexTriangleAdjacency.cpp index 09c0a51a7..022d5d902 100644 --- a/code/VertexTriangleAdjacency.cpp +++ b/code/VertexTriangleAdjacency.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/VertexTriangleAdjacency.h b/code/VertexTriangleAdjacency.h index ed7b83a6b..566783835 100644 --- a/code/VertexTriangleAdjacency.h +++ b/code/VertexTriangleAdjacency.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/Win32DebugLogStream.h b/code/Win32DebugLogStream.h index 0833712f9..7bbe8002a 100644 --- a/code/Win32DebugLogStream.h +++ b/code/Win32DebugLogStream.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter.cpp b/code/X3DImporter.cpp index 3d898757a..e6c915e90 100644 --- a/code/X3DImporter.cpp +++ b/code/X3DImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter.hpp b/code/X3DImporter.hpp index db0b5e2fc..34aab3c22 100644 --- a/code/X3DImporter.hpp +++ b/code/X3DImporter.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Geometry2D.cpp b/code/X3DImporter_Geometry2D.cpp index 895ba8798..5229017b3 100644 --- a/code/X3DImporter_Geometry2D.cpp +++ b/code/X3DImporter_Geometry2D.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Geometry3D.cpp b/code/X3DImporter_Geometry3D.cpp index 1802967fc..a366e8062 100644 --- a/code/X3DImporter_Geometry3D.cpp +++ b/code/X3DImporter_Geometry3D.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Group.cpp b/code/X3DImporter_Group.cpp index e7df97b4b..0c2e820de 100644 --- a/code/X3DImporter_Group.cpp +++ b/code/X3DImporter_Group.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Light.cpp b/code/X3DImporter_Light.cpp index d6a0091ed..4ffea4411 100644 --- a/code/X3DImporter_Light.cpp +++ b/code/X3DImporter_Light.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Macro.hpp b/code/X3DImporter_Macro.hpp index 6281efcd5..cff521408 100644 --- a/code/X3DImporter_Macro.hpp +++ b/code/X3DImporter_Macro.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Metadata.cpp b/code/X3DImporter_Metadata.cpp index 0fa1b27b3..0dc9bcec1 100644 --- a/code/X3DImporter_Metadata.cpp +++ b/code/X3DImporter_Metadata.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Networking.cpp b/code/X3DImporter_Networking.cpp index 269c58ba3..9c15c4ac4 100644 --- a/code/X3DImporter_Networking.cpp +++ b/code/X3DImporter_Networking.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Node.hpp b/code/X3DImporter_Node.hpp index 6ed96c2f9..cb1317582 100644 --- a/code/X3DImporter_Node.hpp +++ b/code/X3DImporter_Node.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Postprocess.cpp b/code/X3DImporter_Postprocess.cpp index 65775959c..c439a4004 100644 --- a/code/X3DImporter_Postprocess.cpp +++ b/code/X3DImporter_Postprocess.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Rendering.cpp b/code/X3DImporter_Rendering.cpp index 1d4632f32..1b44f8c19 100644 --- a/code/X3DImporter_Rendering.cpp +++ b/code/X3DImporter_Rendering.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Shape.cpp b/code/X3DImporter_Shape.cpp index 55ce7fa99..43089c698 100644 --- a/code/X3DImporter_Shape.cpp +++ b/code/X3DImporter_Shape.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DImporter_Texturing.cpp b/code/X3DImporter_Texturing.cpp index 40ea47797..807d19ff8 100644 --- a/code/X3DImporter_Texturing.cpp +++ b/code/X3DImporter_Texturing.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/X3DVocabulary.cpp b/code/X3DVocabulary.cpp index 780c4ffc2..dc361b7aa 100644 --- a/code/X3DVocabulary.cpp +++ b/code/X3DVocabulary.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileExporter.cpp b/code/XFileExporter.cpp index 446aed943..b2862c6d9 100644 --- a/code/XFileExporter.cpp +++ b/code/XFileExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileExporter.h b/code/XFileExporter.h index e45fd7983..fc480f40b 100644 --- a/code/XFileExporter.h +++ b/code/XFileExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileHelper.h b/code/XFileHelper.h index e7c02c7c6..582466689 100644 --- a/code/XFileHelper.h +++ b/code/XFileHelper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileImporter.cpp b/code/XFileImporter.cpp index 6d1316194..93ae6173b 100644 --- a/code/XFileImporter.cpp +++ b/code/XFileImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileImporter.h b/code/XFileImporter.h index 1b591b875..b3c06eab1 100644 --- a/code/XFileImporter.h +++ b/code/XFileImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 86e749aec..c7efb83c4 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XFileParser.h b/code/XFileParser.h index ec823bac0..050ecb9ca 100644 --- a/code/XFileParser.h +++ b/code/XFileParser.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XGLLoader.cpp b/code/XGLLoader.cpp index ed9b48f0e..2d7a40362 100644 --- a/code/XGLLoader.cpp +++ b/code/XGLLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/XGLLoader.h b/code/XGLLoader.h index 4a30eee94..8ae05836a 100644 --- a/code/XGLLoader.h +++ b/code/XGLLoader.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2Asset.h b/code/glTF2Asset.h index 66379c56e..1ac1d538b 100644 --- a/code/glTF2Asset.h +++ b/code/glTF2Asset.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2Asset.inl b/code/glTF2Asset.inl index 857f9bb4e..520785081 100644 --- a/code/glTF2Asset.inl +++ b/code/glTF2Asset.inl @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2AssetWriter.h b/code/glTF2AssetWriter.h index b4e7ffc2e..e2b97e8c4 100644 --- a/code/glTF2AssetWriter.h +++ b/code/glTF2AssetWriter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2AssetWriter.inl b/code/glTF2AssetWriter.inl index 3c465d2d2..6be012676 100644 --- a/code/glTF2AssetWriter.inl +++ b/code/glTF2AssetWriter.inl @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2Exporter.cpp b/code/glTF2Exporter.cpp index 530ab0cc5..b873d9d22 100644 --- a/code/glTF2Exporter.cpp +++ b/code/glTF2Exporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2Exporter.h b/code/glTF2Exporter.h index e9f7c113a..ff94be9e9 100644 --- a/code/glTF2Exporter.h +++ b/code/glTF2Exporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index 92328ec2d..11dc57856 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTF2Importer.h b/code/glTF2Importer.h index e6e6067a2..31d935da4 100644 --- a/code/glTF2Importer.h +++ b/code/glTF2Importer.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFAsset.h b/code/glTFAsset.h index 419e6fb23..018106309 100644 --- a/code/glTFAsset.h +++ b/code/glTFAsset.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFAsset.inl b/code/glTFAsset.inl index e4e7cb361..b31846abd 100644 --- a/code/glTFAsset.inl +++ b/code/glTFAsset.inl @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFAssetWriter.h b/code/glTFAssetWriter.h index 186d32a15..bbe89fc77 100644 --- a/code/glTFAssetWriter.h +++ b/code/glTFAssetWriter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFAssetWriter.inl b/code/glTFAssetWriter.inl index 485abc4f6..fd29a96b4 100644 --- a/code/glTFAssetWriter.inl +++ b/code/glTFAssetWriter.inl @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFExporter.cpp b/code/glTFExporter.cpp index 2ab74187d..ccbbd7fa2 100644 --- a/code/glTFExporter.cpp +++ b/code/glTFExporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFExporter.h b/code/glTFExporter.h index 752072604..061dac5e8 100644 --- a/code/glTFExporter.h +++ b/code/glTFExporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFImporter.cpp b/code/glTFImporter.cpp index 8fd5a41ec..2c3fa2046 100644 --- a/code/glTFImporter.cpp +++ b/code/glTFImporter.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/glTFImporter.h b/code/glTFImporter.h index 2518f9fa4..064d6dc1a 100644 --- a/code/glTFImporter.h +++ b/code/glTFImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/code/scene.cpp b/code/scene.cpp index 467a2895d..676051163 100644 --- a/code/scene.cpp +++ b/code/scene.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index b424d2f83..0c0fd110b 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Bitmap.h b/include/assimp/Bitmap.h index 02b598c49..209116863 100644 --- a/include/assimp/Bitmap.h +++ b/include/assimp/Bitmap.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/BlobIOSystem.h b/include/assimp/BlobIOSystem.h index f406ea0fe..3c1691d5b 100644 --- a/include/assimp/BlobIOSystem.h +++ b/include/assimp/BlobIOSystem.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/ByteSwapper.h b/include/assimp/ByteSwapper.h index e5c7569f1..136944f24 100644 --- a/include/assimp/ByteSwapper.h +++ b/include/assimp/ByteSwapper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/CreateAnimMesh.h b/include/assimp/CreateAnimMesh.h index 0115b6baa..ad625cb9f 100644 --- a/include/assimp/CreateAnimMesh.h +++ b/include/assimp/CreateAnimMesh.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/DefaultIOStream.h b/include/assimp/DefaultIOStream.h index 3668b27ec..fcd6061b3 100644 --- a/include/assimp/DefaultIOStream.h +++ b/include/assimp/DefaultIOStream.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/DefaultIOSystem.h b/include/assimp/DefaultIOSystem.h index 718f5f4a5..23471d25a 100644 --- a/include/assimp/DefaultIOSystem.h +++ b/include/assimp/DefaultIOSystem.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/DefaultLogger.hpp b/include/assimp/DefaultLogger.hpp index 4f1a7e1f4..d6a88b0f3 100644 --- a/include/assimp/DefaultLogger.hpp +++ b/include/assimp/DefaultLogger.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index c6a6f684a..e7e43d8b7 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/GenericProperty.h b/include/assimp/GenericProperty.h index 454f4952b..96c74b4c4 100644 --- a/include/assimp/GenericProperty.h +++ b/include/assimp/GenericProperty.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Hash.h b/include/assimp/Hash.h index a567adbc3..eb5df757d 100644 --- a/include/assimp/Hash.h +++ b/include/assimp/Hash.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/IOStream.hpp b/include/assimp/IOStream.hpp index 2d7ac52af..eb2a0f21c 100644 --- a/include/assimp/IOStream.hpp +++ b/include/assimp/IOStream.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index d7528de7e..a503b3874 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/IOSystem.hpp b/include/assimp/IOSystem.hpp index f4fbb6023..1530492c0 100644 --- a/include/assimp/IOSystem.hpp +++ b/include/assimp/IOSystem.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index f42a2deaf..1263868bc 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/LineSplitter.h b/include/assimp/LineSplitter.h index 003b42d52..e5ac98d85 100644 --- a/include/assimp/LineSplitter.h +++ b/include/assimp/LineSplitter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/LogAux.h b/include/assimp/LogAux.h index df1c8ba35..b8aa2e2d2 100644 --- a/include/assimp/LogAux.h +++ b/include/assimp/LogAux.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/LogStream.hpp b/include/assimp/LogStream.hpp index 1052f1fda..00a979da3 100644 --- a/include/assimp/LogStream.hpp +++ b/include/assimp/LogStream.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Logger.hpp b/include/assimp/Logger.hpp index 0875b6d7d..56516ca4d 100644 --- a/include/assimp/Logger.hpp +++ b/include/assimp/Logger.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 9bd245337..0e9b23447 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/NullLogger.hpp b/include/assimp/NullLogger.hpp index 191db1aaa..776f301ab 100644 --- a/include/assimp/NullLogger.hpp +++ b/include/assimp/NullLogger.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/ParsingUtils.h b/include/assimp/ParsingUtils.h index 7da664374..555b2a309 100644 --- a/include/assimp/ParsingUtils.h +++ b/include/assimp/ParsingUtils.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Profiler.h b/include/assimp/Profiler.h index 1c9ca60b5..272085ea5 100644 --- a/include/assimp/Profiler.h +++ b/include/assimp/Profiler.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/ProgressHandler.hpp b/include/assimp/ProgressHandler.hpp index 2c5b2f4c5..b1d095b7f 100644 --- a/include/assimp/ProgressHandler.hpp +++ b/include/assimp/ProgressHandler.hpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/RemoveComments.h b/include/assimp/RemoveComments.h index 0a00a8f0f..08299f22b 100644 --- a/include/assimp/RemoveComments.h +++ b/include/assimp/RemoveComments.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/SGSpatialSort.h b/include/assimp/SGSpatialSort.h index f087ad8b5..d8b4b418b 100644 --- a/include/assimp/SGSpatialSort.h +++ b/include/assimp/SGSpatialSort.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/SceneCombiner.h b/include/assimp/SceneCombiner.h index aa57406b9..ec2788245 100644 --- a/include/assimp/SceneCombiner.h +++ b/include/assimp/SceneCombiner.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/SkeletonMeshBuilder.h b/include/assimp/SkeletonMeshBuilder.h index cc6731e5c..993d9c84d 100644 --- a/include/assimp/SkeletonMeshBuilder.h +++ b/include/assimp/SkeletonMeshBuilder.h @@ -4,7 +4,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/SmoothingGroups.h b/include/assimp/SmoothingGroups.h index 7a7e2e429..cdae578df 100644 --- a/include/assimp/SmoothingGroups.h +++ b/include/assimp/SmoothingGroups.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/SpatialSort.h b/include/assimp/SpatialSort.h index 9fdebf025..323c2970f 100644 --- a/include/assimp/SpatialSort.h +++ b/include/assimp/SpatialSort.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/StandardShapes.h b/include/assimp/StandardShapes.h index 7bea88a94..fdf1b034d 100644 --- a/include/assimp/StandardShapes.h +++ b/include/assimp/StandardShapes.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/StreamReader.h b/include/assimp/StreamReader.h index b70ee7eca..90cc65fee 100644 --- a/include/assimp/StreamReader.h +++ b/include/assimp/StreamReader.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/StreamWriter.h b/include/assimp/StreamWriter.h index 26873fb5b..7ee0944a7 100644 --- a/include/assimp/StreamWriter.h +++ b/include/assimp/StreamWriter.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/StringComparison.h b/include/assimp/StringComparison.h index ed5f4bd6a..1fada49dd 100644 --- a/include/assimp/StringComparison.h +++ b/include/assimp/StringComparison.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/StringUtils.h b/include/assimp/StringUtils.h index 64f66e6b9..3c3afd264 100644 --- a/include/assimp/StringUtils.h +++ b/include/assimp/StringUtils.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Subdivision.h b/include/assimp/Subdivision.h index d06bc09d6..84aff68f1 100644 --- a/include/assimp/Subdivision.h +++ b/include/assimp/Subdivision.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/TinyFormatter.h b/include/assimp/TinyFormatter.h index 1612282fb..2ddc227e9 100644 --- a/include/assimp/TinyFormatter.h +++ b/include/assimp/TinyFormatter.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/Vertex.h b/include/assimp/Vertex.h index 1f1685ae9..02ae3c0f4 100644 --- a/include/assimp/Vertex.h +++ b/include/assimp/Vertex.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/XMLTools.h b/include/assimp/XMLTools.h index 5d31f885e..4b76c4483 100644 --- a/include/assimp/XMLTools.h +++ b/include/assimp/XMLTools.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/ai_assert.h b/include/assimp/ai_assert.h index d8dbac8d2..7752763db 100644 --- a/include/assimp/ai_assert.h +++ b/include/assimp/ai_assert.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/anim.h b/include/assimp/anim.h index f8774b8fd..9156aac06 100644 --- a/include/assimp/anim.h +++ b/include/assimp/anim.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/camera.h b/include/assimp/camera.h index 7b7bd0922..8073d84ae 100644 --- a/include/assimp/camera.h +++ b/include/assimp/camera.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/cfileio.h b/include/assimp/cfileio.h index 63eeb59b0..a7a56f81c 100644 --- a/include/assimp/cfileio.h +++ b/include/assimp/cfileio.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/cimport.h b/include/assimp/cimport.h index 8aa125c67..eb1e6e0d4 100644 --- a/include/assimp/cimport.h +++ b/include/assimp/cimport.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/color4.h b/include/assimp/color4.h index 48e7aad30..ced470b28 100644 --- a/include/assimp/color4.h +++ b/include/assimp/color4.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/color4.inl b/include/assimp/color4.inl index b242c4e77..6e27292b9 100644 --- a/include/assimp/color4.inl +++ b/include/assimp/color4.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index ad08a04b6..071d58cd2 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/defs.h b/include/assimp/defs.h index 0adea90e8..b587396bf 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. @@ -51,26 +52,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include - ////////////////////////////////////////////////////////////////////////// - /* Define ASSIMP_BUILD_NO_XX_IMPORTER to disable a specific - * file format loader. The loader is be excluded from the - * build in this case. 'XX' stands for the most common file - * extension of the file format. E.g.: - * ASSIMP_BUILD_NO_X_IMPORTER disables the X loader. - * - * If you're unsure about that, take a look at the implementation of the - * import plugin you wish to disable. You'll find the right define in the - * first lines of the corresponding unit. - * - * Other (mixed) configuration switches are listed here: - * ASSIMP_BUILD_NO_COMPRESSED_X - * - Disable support for compressed X files (zip) - * ASSIMP_BUILD_NO_COMPRESSED_BLEND - * - Disable support for compressed Blender files (zip) - * ASSIMP_BUILD_NO_COMPRESSED_IFC - * - Disable support for IFCZIP files (unzip) - */ - ////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +/* Define ASSIMP_BUILD_NO_XX_IMPORTER to disable a specific + * file format loader. The loader is be excluded from the + * build in this case. 'XX' stands for the most common file + * extension of the file format. E.g.: + * ASSIMP_BUILD_NO_X_IMPORTER disables the X loader. + * + * If you're unsure about that, take a look at the implementation of the + * import plugin you wish to disable. You'll find the right define in the + * first lines of the corresponding unit. + * + * Other (mixed) configuration switches are listed here: + * ASSIMP_BUILD_NO_COMPRESSED_X + * - Disable support for compressed X files (zip) + * ASSIMP_BUILD_NO_COMPRESSED_BLEND + * - Disable support for compressed Blender files (zip) + * ASSIMP_BUILD_NO_COMPRESSED_IFC + * - Disable support for IFCZIP files (unzip) + */ +////////////////////////////////////////////////////////////////////////// #ifndef ASSIMP_BUILD_NO_COMPRESSED_X # define ASSIMP_BUILD_NEED_Z_INFLATE @@ -90,38 +91,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # define ASSIMP_BUILD_NEED_UNZIP #endif - ////////////////////////////////////////////////////////////////////////// - /* Define ASSIMP_BUILD_NO_XX_PROCESS to disable a specific - * post processing step. This is the current list of process names ('XX'): - * CALCTANGENTS - * JOINVERTICES - * TRIANGULATE - * GENFACENORMALS - * GENVERTEXNORMALS - * REMOVEVC - * SPLITLARGEMESHES - * PRETRANSFORMVERTICES - * LIMITBONEWEIGHTS - * VALIDATEDS - * IMPROVECACHELOCALITY - * FIXINFACINGNORMALS - * REMOVE_REDUNDANTMATERIALS - * OPTIMIZEGRAPH - * SORTBYPTYPE - * FINDINVALIDDATA - * TRANSFORMTEXCOORDS - * GENUVCOORDS - * ENTITYMESHBUILDER - * EMBEDTEXTURES - * MAKELEFTHANDED - * FLIPUVS - * FLIPWINDINGORDER - * OPTIMIZEMESHES - * OPTIMIZEANIMS - * OPTIMIZEGRAPH - * GENENTITYMESHES - * FIXTEXTUREPATHS */ - ////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +/* Define ASSIMP_BUILD_NO_XX_PROCESS to disable a specific + * post processing step. This is the current list of process names ('XX'): + * CALCTANGENTS + * JOINVERTICES + * TRIANGULATE + * GENFACENORMALS + * GENVERTEXNORMALS + * REMOVEVC + * SPLITLARGEMESHES + * PRETRANSFORMVERTICES + * LIMITBONEWEIGHTS + * VALIDATEDS + * IMPROVECACHELOCALITY + * FIXINFACINGNORMALS + * REMOVE_REDUNDANTMATERIALS + * OPTIMIZEGRAPH + * SORTBYPTYPE + * FINDINVALIDDATA + * TRANSFORMTEXCOORDS + * GENUVCOORDS + * ENTITYMESHBUILDER + * EMBEDTEXTURES + * MAKELEFTHANDED + * FLIPUVS + * FLIPWINDINGORDER + * OPTIMIZEMESHES + * OPTIMIZEANIMS + * OPTIMIZEGRAPH + * GENENTITYMESHES + * FIXTEXTUREPATHS */ +////////////////////////////////////////////////////////////////////////// #ifdef _MSC_VER # undef ASSIMP_API diff --git a/include/assimp/importerdesc.h b/include/assimp/importerdesc.h index 6b83b8aa2..36b773e45 100644 --- a/include/assimp/importerdesc.h +++ b/include/assimp/importerdesc.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/irrXMLWrapper.h b/include/assimp/irrXMLWrapper.h index bbda7c0f0..70b20ebd3 100644 --- a/include/assimp/irrXMLWrapper.h +++ b/include/assimp/irrXMLWrapper.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/light.h b/include/assimp/light.h index 324339a97..8a306009f 100644 --- a/include/assimp/light.h +++ b/include/assimp/light.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/material.h b/include/assimp/material.h index 502b89746..83244af37 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 2c31fd571..b52b9befc 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/matrix3x3.h b/include/assimp/matrix3x3.h index 3cf575e38..3f50a0bc2 100644 --- a/include/assimp/matrix3x3.h +++ b/include/assimp/matrix3x3.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/matrix3x3.inl b/include/assimp/matrix3x3.inl index 14f2cd2fc..aaf62eb0f 100644 --- a/include/assimp/matrix3x3.inl +++ b/include/assimp/matrix3x3.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/matrix4x4.h b/include/assimp/matrix4x4.h index 4311fa118..851050316 100644 --- a/include/assimp/matrix4x4.h +++ b/include/assimp/matrix4x4.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/matrix4x4.inl b/include/assimp/matrix4x4.inl index b15d50a09..67edd6c14 100644 --- a/include/assimp/matrix4x4.inl +++ b/include/assimp/matrix4x4.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index c8648c778..a532e2b46 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/metadata.h b/include/assimp/metadata.h index 92db9b59a..2dba61abc 100644 --- a/include/assimp/metadata.h +++ b/include/assimp/metadata.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/postprocess.h b/include/assimp/postprocess.h index 06bebabc8..ebb6728f3 100644 --- a/include/assimp/postprocess.h +++ b/include/assimp/postprocess.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/qnan.h b/include/assimp/qnan.h index fcff16b74..6ee3b7ce5 100644 --- a/include/assimp/qnan.h +++ b/include/assimp/qnan.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/quaternion.h b/include/assimp/quaternion.h index a5cb67a9a..3c8ab50af 100644 --- a/include/assimp/quaternion.h +++ b/include/assimp/quaternion.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/quaternion.inl b/include/assimp/quaternion.inl index d0bf5831c..0a2c92937 100644 --- a/include/assimp/quaternion.inl +++ b/include/assimp/quaternion.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/scene.h b/include/assimp/scene.h index 2533f1a66..867e87de0 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/texture.h b/include/assimp/texture.h index ec65e4655..e55c8bc41 100644 --- a/include/assimp/texture.h +++ b/include/assimp/texture.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/types.h b/include/assimp/types.h index e7bec2f85..f0d9b2428 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/vector2.h b/include/assimp/vector2.h index 73f765359..d290945c9 100644 --- a/include/assimp/vector2.h +++ b/include/assimp/vector2.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/vector2.inl b/include/assimp/vector2.inl index 43694a8ff..46c6c9d27 100644 --- a/include/assimp/vector2.inl +++ b/include/assimp/vector2.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/vector3.h b/include/assimp/vector3.h index 641dab795..292da8248 100644 --- a/include/assimp/vector3.h +++ b/include/assimp/vector3.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/vector3.inl b/include/assimp/vector3.inl index dc2676a40..ebe2f82e9 100644 --- a/include/assimp/vector3.inl +++ b/include/assimp/vector3.inl @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/include/assimp/version.h b/include/assimp/version.h index 20ece7fa0..470166edf 100644 --- a/include/assimp/version.h +++ b/include/assimp/version.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a1bb5fd35..a9dfaf83f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,8 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2017, assimp team +# Copyright (c) 2006-2018, assimp team + # All rights reserved. # diff --git a/test/unit/AbstractImportExportBase.cpp b/test/unit/AbstractImportExportBase.cpp index f3d49b85d..f75ba4ea2 100644 --- a/test/unit/AbstractImportExportBase.cpp +++ b/test/unit/AbstractImportExportBase.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/AssimpAPITest.cpp b/test/unit/AssimpAPITest.cpp index a284d385e..faf551f7c 100644 --- a/test/unit/AssimpAPITest.cpp +++ b/test/unit/AssimpAPITest.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/SceneDiffer.cpp b/test/unit/SceneDiffer.cpp index 401a655cc..30b6e9086 100644 --- a/test/unit/SceneDiffer.cpp +++ b/test/unit/SceneDiffer.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/SceneDiffer.h b/test/unit/SceneDiffer.h index 3e37e6c21..5c9ce2c3b 100644 --- a/test/unit/SceneDiffer.h +++ b/test/unit/SceneDiffer.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/TestIOSystem.h b/test/unit/TestIOSystem.h index 40d894a21..f984baa13 100644 --- a/test/unit/TestIOSystem.h +++ b/test/unit/TestIOSystem.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/TestModelFactory.h b/test/unit/TestModelFactory.h index 950374112..6afbe5685 100644 --- a/test/unit/TestModelFactory.h +++ b/test/unit/TestModelFactory.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/UTLogStream.h b/test/unit/UTLogStream.h index 87ebea91d..6e24fc5ed 100644 --- a/test/unit/UTLogStream.h +++ b/test/unit/UTLogStream.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/ut3DImportExport.cpp b/test/unit/ut3DImportExport.cpp index 6becbd866..1268fa360 100644 --- a/test/unit/ut3DImportExport.cpp +++ b/test/unit/ut3DImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/ut3DSImportExport.cpp b/test/unit/ut3DSImportExport.cpp index 69e889ae6..b40694132 100644 --- a/test/unit/ut3DSImportExport.cpp +++ b/test/unit/ut3DSImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utACImportExport.cpp b/test/unit/utACImportExport.cpp index 178816532..937c0afb4 100644 --- a/test/unit/utACImportExport.cpp +++ b/test/unit/utACImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utAMFImportExport.cpp b/test/unit/utAMFImportExport.cpp index 35afd375c..b045a5fe8 100644 --- a/test/unit/utAMFImportExport.cpp +++ b/test/unit/utAMFImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utASEImportExport.cpp b/test/unit/utASEImportExport.cpp index 1f62d3385..28c498dca 100644 --- a/test/unit/utASEImportExport.cpp +++ b/test/unit/utASEImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utAnim.cpp b/test/unit/utAnim.cpp index 643730f1b..04ee8c96d 100644 --- a/test/unit/utAnim.cpp +++ b/test/unit/utAnim.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utB3DImportExport.cpp b/test/unit/utB3DImportExport.cpp index eaa56beed..6795f8cba 100644 --- a/test/unit/utB3DImportExport.cpp +++ b/test/unit/utB3DImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utBVHImportExport.cpp b/test/unit/utBVHImportExport.cpp index a080ca3a4..eebfe1439 100644 --- a/test/unit/utBVHImportExport.cpp +++ b/test/unit/utBVHImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utBatchLoader.cpp b/test/unit/utBatchLoader.cpp index 56862f912..ce95727ee 100644 --- a/test/unit/utBatchLoader.cpp +++ b/test/unit/utBatchLoader.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utBlendImportAreaLight.cpp b/test/unit/utBlendImportAreaLight.cpp index 55a68b040..c2f6c0be3 100644 --- a/test/unit/utBlendImportAreaLight.cpp +++ b/test/unit/utBlendImportAreaLight.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utBlendImportMaterials.cpp b/test/unit/utBlendImportMaterials.cpp index 4387243c4..16f64611e 100644 --- a/test/unit/utBlendImportMaterials.cpp +++ b/test/unit/utBlendImportMaterials.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utBlenderImportExport.cpp b/test/unit/utBlenderImportExport.cpp index 6d7ca8dd7..5634b33a8 100644 --- a/test/unit/utBlenderImportExport.cpp +++ b/test/unit/utBlenderImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utBlenderIntermediate.cpp b/test/unit/utBlenderIntermediate.cpp index 9c9436574..9146d6d1e 100644 --- a/test/unit/utBlenderIntermediate.cpp +++ b/test/unit/utBlenderIntermediate.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utCSMImportExport.cpp b/test/unit/utCSMImportExport.cpp index 74cdfcf94..4da51f089 100644 --- a/test/unit/utCSMImportExport.cpp +++ b/test/unit/utCSMImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utColladaExportCamera.cpp b/test/unit/utColladaExportCamera.cpp index cbb491204..3219dbf0c 100644 --- a/test/unit/utColladaExportCamera.cpp +++ b/test/unit/utColladaExportCamera.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utColladaExportLight.cpp b/test/unit/utColladaExportLight.cpp index 5c4801d32..71f404c29 100644 --- a/test/unit/utColladaExportLight.cpp +++ b/test/unit/utColladaExportLight.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utColladaImportExport.cpp b/test/unit/utColladaImportExport.cpp index 97cb5c2ca..c7ad6f906 100644 --- a/test/unit/utColladaImportExport.cpp +++ b/test/unit/utColladaImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utD3MFImportExport.cpp b/test/unit/utD3MFImportExport.cpp index d344f0a3f..3aefeba84 100644 --- a/test/unit/utD3MFImportExport.cpp +++ b/test/unit/utD3MFImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utDXFImporterExporter.cpp b/test/unit/utDXFImporterExporter.cpp index b75db3ec4..1cb23cccf 100644 --- a/test/unit/utDXFImporterExporter.cpp +++ b/test/unit/utDXFImporterExporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utDefaultIOStream.cpp b/test/unit/utDefaultIOStream.cpp index 128e4e6ef..cf51ed56a 100644 --- a/test/unit/utDefaultIOStream.cpp +++ b/test/unit/utDefaultIOStream.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 56590f494..d5a6e4354 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utFastAtof.cpp b/test/unit/utFastAtof.cpp index 55ad16890..10284a1de 100644 --- a/test/unit/utFastAtof.cpp +++ b/test/unit/utFastAtof.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utFindDegenerates.cpp b/test/unit/utFindDegenerates.cpp index dce42732c..5fd016b2c 100644 --- a/test/unit/utFindDegenerates.cpp +++ b/test/unit/utFindDegenerates.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utFindInvalidData.cpp b/test/unit/utFindInvalidData.cpp index adba32256..2313555b8 100644 --- a/test/unit/utFindInvalidData.cpp +++ b/test/unit/utFindInvalidData.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utFixInfacingNormals.cpp b/test/unit/utFixInfacingNormals.cpp index 66be19807..742b12013 100644 --- a/test/unit/utFixInfacingNormals.cpp +++ b/test/unit/utFixInfacingNormals.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utGenNormals.cpp b/test/unit/utGenNormals.cpp index ec3469f14..253d76742 100644 --- a/test/unit/utGenNormals.cpp +++ b/test/unit/utGenNormals.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utHMPImportExport.cpp b/test/unit/utHMPImportExport.cpp index 35bc0bb01..1e1a4bcd2 100644 --- a/test/unit/utHMPImportExport.cpp +++ b/test/unit/utHMPImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utIFCImportExport.cpp b/test/unit/utIFCImportExport.cpp index 20a11ca57..fa27bb7a8 100644 --- a/test/unit/utIFCImportExport.cpp +++ b/test/unit/utIFCImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utIOStreamBuffer.cpp b/test/unit/utIOStreamBuffer.cpp index bbd029a3e..41575fa59 100644 --- a/test/unit/utIOStreamBuffer.cpp +++ b/test/unit/utIOStreamBuffer.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utIOSystem.cpp b/test/unit/utIOSystem.cpp index 5e3e98031..c5c02bd45 100644 --- a/test/unit/utIOSystem.cpp +++ b/test/unit/utIOSystem.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 4549fdd3d..b76c96d2a 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utImproveCacheLocality.cpp b/test/unit/utImproveCacheLocality.cpp index 0f08d462c..01f99ebb9 100644 --- a/test/unit/utImproveCacheLocality.cpp +++ b/test/unit/utImproveCacheLocality.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utIssues.cpp b/test/unit/utIssues.cpp index a05adc856..e526c2b82 100644 --- a/test/unit/utIssues.cpp +++ b/test/unit/utIssues.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utJoinVertices.cpp b/test/unit/utJoinVertices.cpp index d2add2b90..522cec4af 100644 --- a/test/unit/utJoinVertices.cpp +++ b/test/unit/utJoinVertices.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utLWSImportExport.cpp b/test/unit/utLWSImportExport.cpp index f0252e211..dcf456b56 100644 --- a/test/unit/utLWSImportExport.cpp +++ b/test/unit/utLWSImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utLimitBoneWeights.cpp b/test/unit/utLimitBoneWeights.cpp index 022e4bda1..1ce1cff1b 100644 --- a/test/unit/utLimitBoneWeights.cpp +++ b/test/unit/utLimitBoneWeights.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utMaterialSystem.cpp b/test/unit/utMaterialSystem.cpp index 80408db00..529282393 100644 --- a/test/unit/utMaterialSystem.cpp +++ b/test/unit/utMaterialSystem.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utMatrix3x3.cpp b/test/unit/utMatrix3x3.cpp index 47c20acf6..bc15f780d 100644 --- a/test/unit/utMatrix3x3.cpp +++ b/test/unit/utMatrix3x3.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utMatrix4x4.cpp b/test/unit/utMatrix4x4.cpp index 92d430c0f..b11f0b43d 100644 --- a/test/unit/utMatrix4x4.cpp +++ b/test/unit/utMatrix4x4.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utMetadata.cpp b/test/unit/utMetadata.cpp index 4109b068c..7fda143b7 100644 --- a/test/unit/utMetadata.cpp +++ b/test/unit/utMetadata.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index a6c91fed6..5a2e42350 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utObjTools.cpp b/test/unit/utObjTools.cpp index 2d9e2779f..093244eb1 100644 --- a/test/unit/utObjTools.cpp +++ b/test/unit/utObjTools.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utOpenGEXImportExport.cpp b/test/unit/utOpenGEXImportExport.cpp index 021a7bf81..9a860f514 100644 --- a/test/unit/utOpenGEXImportExport.cpp +++ b/test/unit/utOpenGEXImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index dbb7f4292..fdd20008d 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utPretransformVertices.cpp b/test/unit/utPretransformVertices.cpp index 437cbdba5..d8f7de165 100644 --- a/test/unit/utPretransformVertices.cpp +++ b/test/unit/utPretransformVertices.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utProfiler.cpp b/test/unit/utProfiler.cpp index 5a42e5884..49c9a855c 100644 --- a/test/unit/utProfiler.cpp +++ b/test/unit/utProfiler.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utQ3DImportExport.cpp b/test/unit/utQ3DImportExport.cpp index e656bc53c..6f840cfc9 100644 --- a/test/unit/utQ3DImportExport.cpp +++ b/test/unit/utQ3DImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utRemoveComments.cpp b/test/unit/utRemoveComments.cpp index 76a63a39f..e236b1d30 100644 --- a/test/unit/utRemoveComments.cpp +++ b/test/unit/utRemoveComments.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utRemoveComponent.cpp b/test/unit/utRemoveComponent.cpp index 31e47b77c..7905ff565 100644 --- a/test/unit/utRemoveComponent.cpp +++ b/test/unit/utRemoveComponent.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utRemoveRedundantMaterials.cpp b/test/unit/utRemoveRedundantMaterials.cpp index 072ca6060..312302846 100644 --- a/test/unit/utRemoveRedundantMaterials.cpp +++ b/test/unit/utRemoveRedundantMaterials.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utRemoveVCProcess.cpp b/test/unit/utRemoveVCProcess.cpp index 6caa72c11..8c726de4a 100644 --- a/test/unit/utRemoveVCProcess.cpp +++ b/test/unit/utRemoveVCProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSIBImporter.cpp b/test/unit/utSIBImporter.cpp index affa3c9ad..da51b14af 100644 --- a/test/unit/utSIBImporter.cpp +++ b/test/unit/utSIBImporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSMDImportExport.cpp b/test/unit/utSMDImportExport.cpp index 610d0c5d4..ea315db83 100644 --- a/test/unit/utSMDImportExport.cpp +++ b/test/unit/utSMDImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSTLImportExport.cpp b/test/unit/utSTLImportExport.cpp index 2a3cceaf0..0cb9f73ee 100644 --- a/test/unit/utSTLImportExport.cpp +++ b/test/unit/utSTLImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utScaleProcess.cpp b/test/unit/utScaleProcess.cpp index 7ab44dd15..e01f822b9 100644 --- a/test/unit/utScaleProcess.cpp +++ b/test/unit/utScaleProcess.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSceneCombiner.cpp b/test/unit/utSceneCombiner.cpp index 99d483769..600d7ba9d 100644 --- a/test/unit/utSceneCombiner.cpp +++ b/test/unit/utSceneCombiner.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utScenePreprocessor.cpp b/test/unit/utScenePreprocessor.cpp index ce3716baf..788ee1d34 100644 --- a/test/unit/utScenePreprocessor.cpp +++ b/test/unit/utScenePreprocessor.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSharedPPData.cpp b/test/unit/utSharedPPData.cpp index 495faa7ac..a7c3043a5 100644 --- a/test/unit/utSharedPPData.cpp +++ b/test/unit/utSharedPPData.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSortByPType.cpp b/test/unit/utSortByPType.cpp index 13c46bd42..7affd56f1 100644 --- a/test/unit/utSortByPType.cpp +++ b/test/unit/utSortByPType.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utSplitLargeMeshes.cpp b/test/unit/utSplitLargeMeshes.cpp index af6ed14ef..496049d65 100644 --- a/test/unit/utSplitLargeMeshes.cpp +++ b/test/unit/utSplitLargeMeshes.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utStringUtils.cpp b/test/unit/utStringUtils.cpp index 933d9143b..ab053fd6f 100644 --- a/test/unit/utStringUtils.cpp +++ b/test/unit/utStringUtils.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utTargetAnimation.cpp b/test/unit/utTargetAnimation.cpp index 6742543a6..6bbc1f418 100644 --- a/test/unit/utTargetAnimation.cpp +++ b/test/unit/utTargetAnimation.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utTextureTransform.cpp b/test/unit/utTextureTransform.cpp index 6742543a6..6bbc1f418 100644 --- a/test/unit/utTextureTransform.cpp +++ b/test/unit/utTextureTransform.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utTriangulate.cpp b/test/unit/utTriangulate.cpp index 8908b9703..e421d40b1 100644 --- a/test/unit/utTriangulate.cpp +++ b/test/unit/utTriangulate.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utTypes.cpp b/test/unit/utTypes.cpp index 70a734082..a67154f7c 100644 --- a/test/unit/utTypes.cpp +++ b/test/unit/utTypes.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utVector3.cpp b/test/unit/utVector3.cpp index 1492281a1..387b4614d 100644 --- a/test/unit/utVector3.cpp +++ b/test/unit/utVector3.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utVersion.cpp b/test/unit/utVersion.cpp index af16211a1..4886377f8 100644 --- a/test/unit/utVersion.cpp +++ b/test/unit/utVersion.cpp @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utVertexTriangleAdjacency.cpp b/test/unit/utVertexTriangleAdjacency.cpp index 29067fead..046ce25f0 100644 --- a/test/unit/utVertexTriangleAdjacency.cpp +++ b/test/unit/utVertexTriangleAdjacency.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utX3DImportExport.cpp b/test/unit/utX3DImportExport.cpp index cb53b3292..aeee72318 100644 --- a/test/unit/utX3DImportExport.cpp +++ b/test/unit/utX3DImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utXImporterExporter.cpp b/test/unit/utXImporterExporter.cpp index 4a6300d19..770e2be47 100644 --- a/test/unit/utXImporterExporter.cpp +++ b/test/unit/utXImporterExporter.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 865159d0d..91b8917a8 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/test/unit/utglTFImportExport.cpp b/test/unit/utglTFImportExport.cpp index 4e1f765a1..17aa94d31 100644 --- a/test/unit/utglTFImportExport.cpp +++ b/test/unit/utglTFImportExport.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_cmd/CMakeLists.txt b/tools/assimp_cmd/CMakeLists.txt index cb78942d7..4a1a73d7c 100644 --- a/tools/assimp_cmd/CMakeLists.txt +++ b/tools/assimp_cmd/CMakeLists.txt @@ -1,7 +1,8 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2017, assimp team +# Copyright (c) 2006-2018, assimp team + # All rights reserved. # diff --git a/tools/assimp_cmd/CompareDump.cpp b/tools/assimp_cmd/CompareDump.cpp index 2db11ef25..d8304f020 100644 --- a/tools/assimp_cmd/CompareDump.cpp +++ b/tools/assimp_cmd/CompareDump.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_cmd/Export.cpp b/tools/assimp_cmd/Export.cpp index 3752db5e5..55c017e33 100644 --- a/tools/assimp_cmd/Export.cpp +++ b/tools/assimp_cmd/Export.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_cmd/ImageExtractor.cpp b/tools/assimp_cmd/ImageExtractor.cpp index ad7cfc6b5..ce472dcb3 100644 --- a/tools/assimp_cmd/ImageExtractor.cpp +++ b/tools/assimp_cmd/ImageExtractor.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_cmd/Info.cpp b/tools/assimp_cmd/Info.cpp index d116f04d2..e19746db6 100644 --- a/tools/assimp_cmd/Info.cpp +++ b/tools/assimp_cmd/Info.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_cmd/Main.cpp b/tools/assimp_cmd/Main.cpp index 587e111d5..1b4e5db45 100644 --- a/tools/assimp_cmd/Main.cpp +++ b/tools/assimp_cmd/Main.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_cmd/WriteDumb.cpp b/tools/assimp_cmd/WriteDumb.cpp index e1b104d40..3fbfab824 100644 --- a/tools/assimp_cmd/WriteDumb.cpp +++ b/tools/assimp_cmd/WriteDumb.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_view/CMakeLists.txt b/tools/assimp_view/CMakeLists.txt index adf2ae877..f75937eff 100644 --- a/tools/assimp_view/CMakeLists.txt +++ b/tools/assimp_view/CMakeLists.txt @@ -1,7 +1,8 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2017, assimp team +# Copyright (c) 2006-2018, assimp team + # All rights reserved. # diff --git a/tools/assimp_view/assimp_view.cpp b/tools/assimp_view/assimp_view.cpp index 5980c58c0..e68b20a00 100644 --- a/tools/assimp_view/assimp_view.cpp +++ b/tools/assimp_view/assimp_view.cpp @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. diff --git a/tools/assimp_view/assimp_view.h b/tools/assimp_view/assimp_view.h index b971c92b9..70bce2ce4 100644 --- a/tools/assimp_view/assimp_view.h +++ b/tools/assimp_view/assimp_view.h @@ -3,7 +3,8 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2017, assimp team +Copyright (c) 2006-2018, assimp team + All rights reserved. From be33feba44009f035c409ae563cd34a0a6c04a50 Mon Sep 17 00:00:00 2001 From: Sergio Acereda Date: Mon, 29 Jan 2018 12:39:40 +0100 Subject: [PATCH 056/106] Warning LNK4221 when not building exporter. --- code/AssbinExporter.cpp | 8 ++++---- code/AssxmlExporter.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/code/AssbinExporter.cpp b/code/AssbinExporter.cpp index 398eb5bba..cc404396b 100644 --- a/code/AssbinExporter.cpp +++ b/code/AssbinExporter.cpp @@ -42,6 +42,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file AssbinExporter.cpp * ASSBIN exporter main code */ + +#ifndef ASSIMP_BUILD_NO_EXPORT +#ifndef ASSIMP_BUILD_NO_ASSBIN_EXPORTER + #include "assbin_chunks.h" #include #include @@ -58,10 +62,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include - -#ifndef ASSIMP_BUILD_NO_EXPORT -#ifndef ASSIMP_BUILD_NO_ASSBIN_EXPORTER - using namespace Assimp; namespace Assimp { diff --git a/code/AssxmlExporter.cpp b/code/AssxmlExporter.cpp index 27e77383b..c9e125d0d 100644 --- a/code/AssxmlExporter.cpp +++ b/code/AssxmlExporter.cpp @@ -42,6 +42,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file AssxmlExporter.cpp * ASSXML exporter main code */ + +#ifndef ASSIMP_BUILD_NO_EXPORT +#ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER + #include #include #include "ProcessHelper.h" @@ -58,9 +62,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#ifndef ASSIMP_BUILD_NO_EXPORT -#ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER - using namespace Assimp; namespace Assimp { From 12396d0ce3786f7cc9f1289a674a37c7f0158a5d Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 30 Jan 2018 19:42:58 +0200 Subject: [PATCH 057/106] Ogre: Change OgreXmlSerializer::HasAttribute parameter from std::string to pointer It's immediately passed via string pointer and in most places it's already a raw string constant. --- code/OgreXmlSerializer.cpp | 16 ++++++++-------- code/OgreXmlSerializer.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/OgreXmlSerializer.cpp b/code/OgreXmlSerializer.cpp index a7e6b5a09..bcfe2d185 100644 --- a/code/OgreXmlSerializer.cpp +++ b/code/OgreXmlSerializer.cpp @@ -171,9 +171,9 @@ bool OgreXmlSerializer::ReadAttribute(const std::string &name) const } } -bool OgreXmlSerializer::HasAttribute(const std::string &name) const +bool OgreXmlSerializer::HasAttribute(const char *name) const { - return (m_reader->getAttributeValue(name.c_str()) != 0); + return (m_reader->getAttributeValue(name) != 0); } std::string &OgreXmlSerializer::NextNode() @@ -548,10 +548,10 @@ void OgreXmlSerializer::ReadSubMesh(MeshXml *mesh) SubMeshXml* submesh = new SubMeshXml(); - if (HasAttribute(anMaterial)) { + if (HasAttribute(anMaterial.c_str())) { submesh->materialRef = ReadAttribute(anMaterial); } - if (HasAttribute(anUseSharedVertices)) { + if (HasAttribute(anUseSharedVertices.c_str())) { submesh->usesSharedVertexData = ReadAttribute(anUseSharedVertices); } @@ -587,7 +587,7 @@ void OgreXmlSerializer::ReadSubMesh(MeshXml *mesh) face.mIndices[2] = ReadAttribute(anV3); /// @todo Support quads if Ogre even supports them in XML (I'm not sure but I doubt it) - if (!quadWarned && HasAttribute(anV4)) { + if (!quadWarned && HasAttribute(anV4.c_str())) { DefaultLogger::get()->warn("Submesh has quads with , only triangles are supported at the moment!"); quadWarned = true; } @@ -968,11 +968,11 @@ void OgreXmlSerializer::ReadBones(Skeleton *skeleton) } else { - if (HasAttribute(anX)) + if (HasAttribute(anX.c_str())) bone->scale.x = ReadAttribute(anX); - if (HasAttribute(anY)) + if (HasAttribute(anY.c_str())) bone->scale.y = ReadAttribute(anY); - if (HasAttribute(anZ)) + if (HasAttribute(anZ.c_str())) bone->scale.z = ReadAttribute(anZ); } } diff --git a/code/OgreXmlSerializer.h b/code/OgreXmlSerializer.h index 1ad46f95f..487bb65fa 100644 --- a/code/OgreXmlSerializer.h +++ b/code/OgreXmlSerializer.h @@ -99,7 +99,7 @@ private: template T ReadAttribute(const std::string &name) const; - bool HasAttribute(const std::string &name) const; + bool HasAttribute(const char *name) const; std::string &NextNode(); std::string &SkipCurrentNode(); From 0c66b3902eaf165daf92ab29dd408deb2240356a Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 30 Jan 2018 19:47:15 +0200 Subject: [PATCH 058/106] Ogre: Avoid creating static std::strings They're causing false positive race condition messages from Helgrind --- code/OgreXmlSerializer.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/OgreXmlSerializer.cpp b/code/OgreXmlSerializer.cpp index bcfe2d185..bf2680dcb 100644 --- a/code/OgreXmlSerializer.cpp +++ b/code/OgreXmlSerializer.cpp @@ -538,20 +538,20 @@ void OgreXmlSerializer::ReadGeometryVertexBuffer(VertexDataXml *dest) void OgreXmlSerializer::ReadSubMesh(MeshXml *mesh) { - static const std::string anMaterial = "material"; - static const std::string anUseSharedVertices = "usesharedvertices"; - static const std::string anCount = "count"; - static const std::string anV1 = "v1"; - static const std::string anV2 = "v2"; - static const std::string anV3 = "v3"; - static const std::string anV4 = "v4"; + static const char *anMaterial = "material"; + static const char *anUseSharedVertices = "usesharedvertices"; + static const char *anCount = "count"; + static const char *anV1 = "v1"; + static const char *anV2 = "v2"; + static const char *anV3 = "v3"; + static const char *anV4 = "v4"; SubMeshXml* submesh = new SubMeshXml(); - if (HasAttribute(anMaterial.c_str())) { + if (HasAttribute(anMaterial)) { submesh->materialRef = ReadAttribute(anMaterial); } - if (HasAttribute(anUseSharedVertices.c_str())) { + if (HasAttribute(anUseSharedVertices)) { submesh->usesSharedVertexData = ReadAttribute(anUseSharedVertices); } @@ -587,7 +587,7 @@ void OgreXmlSerializer::ReadSubMesh(MeshXml *mesh) face.mIndices[2] = ReadAttribute(anV3); /// @todo Support quads if Ogre even supports them in XML (I'm not sure but I doubt it) - if (!quadWarned && HasAttribute(anV4.c_str())) { + if (!quadWarned && HasAttribute(anV4)) { DefaultLogger::get()->warn("Submesh has quads with , only triangles are supported at the moment!"); quadWarned = true; } @@ -635,9 +635,9 @@ void OgreXmlSerializer::ReadBoneAssignments(VertexDataXml *dest) throw DeadlyImportError("Cannot read bone assignments, vertex data is null."); } - static const std::string anVertexIndex = "vertexindex"; - static const std::string anBoneIndex = "boneindex"; - static const std::string anWeight = "weight"; + static const char *anVertexIndex = "vertexindex"; + static const char *anBoneIndex = "boneindex"; + static const char *anWeight = "weight"; std::set influencedVertices; From cfc9a695121056c85a530bf8dc5b6b04e4fdf9ef Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 30 Jan 2018 20:03:28 +0200 Subject: [PATCH 059/106] Ogre: Don't create std::strings in global scope where char pointer will do --- code/OgreXmlSerializer.cpp | 94 +++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/code/OgreXmlSerializer.cpp b/code/OgreXmlSerializer.cpp index bf2680dcb..51a7c293b 100644 --- a/code/OgreXmlSerializer.cpp +++ b/code/OgreXmlSerializer.cpp @@ -231,75 +231,75 @@ std::string &OgreXmlSerializer::SkipCurrentNode() // Mesh XML constants // -const std::string nnMesh = "mesh"; -const std::string nnSharedGeometry = "sharedgeometry"; -const std::string nnSubMeshes = "submeshes"; -const std::string nnSubMesh = "submesh"; -const std::string nnSubMeshNames = "submeshnames"; -const std::string nnSkeletonLink = "skeletonlink"; -const std::string nnLOD = "levelofdetail"; -const std::string nnExtremes = "extremes"; -const std::string nnPoses = "poses"; -const std::string nnAnimations = "animations"; +const char *nnMesh = "mesh"; +const char *nnSharedGeometry = "sharedgeometry"; +const char *nnSubMeshes = "submeshes"; +const char *nnSubMesh = "submesh"; +const char *nnSubMeshNames = "submeshnames"; +const char *nnSkeletonLink = "skeletonlink"; +const char *nnLOD = "levelofdetail"; +const char *nnExtremes = "extremes"; +const char *nnPoses = "poses"; +const char *nnAnimations = "animations"; // -const std::string nnFaces = "faces"; -const std::string nnFace = "face"; -const std::string nnGeometry = "geometry"; -const std::string nnTextures = "textures"; +const char *nnFaces = "faces"; +const char *nnFace = "face"; +const char *nnGeometry = "geometry"; +const char *nnTextures = "textures"; // -const std::string nnBoneAssignments = "boneassignments"; +const char *nnBoneAssignments = "boneassignments"; // -const std::string nnVertexBuffer = "vertexbuffer"; +const char *nnVertexBuffer = "vertexbuffer"; // -const std::string nnVertex = "vertex"; -const std::string nnPosition = "position"; -const std::string nnNormal = "normal"; -const std::string nnTangent = "tangent"; -const std::string nnBinormal = "binormal"; -const std::string nnTexCoord = "texcoord"; -const std::string nnColorDiffuse = "colour_diffuse"; -const std::string nnColorSpecular = "colour_specular"; +const char *nnVertex = "vertex"; +const char *nnPosition = "position"; +const char *nnNormal = "normal"; +const char *nnTangent = "tangent"; +const char *nnBinormal = "binormal"; +const char *nnTexCoord = "texcoord"; +const char *nnColorDiffuse = "colour_diffuse"; +const char *nnColorSpecular = "colour_specular"; // -const std::string nnVertexBoneAssignment = "vertexboneassignment"; +const char *nnVertexBoneAssignment = "vertexboneassignment"; // Skeleton XML constants // -const std::string nnSkeleton = "skeleton"; -const std::string nnBones = "bones"; -const std::string nnBoneHierarchy = "bonehierarchy"; -const std::string nnAnimationLinks = "animationlinks"; +const char *nnSkeleton = "skeleton"; +const char *nnBones = "bones"; +const char *nnBoneHierarchy = "bonehierarchy"; +const char *nnAnimationLinks = "animationlinks"; // -const std::string nnBone = "bone"; -const std::string nnRotation = "rotation"; -const std::string nnAxis = "axis"; -const std::string nnScale = "scale"; +const char *nnBone = "bone"; +const char *nnRotation = "rotation"; +const char *nnAxis = "axis"; +const char *nnScale = "scale"; // -const std::string nnBoneParent = "boneparent"; +const char *nnBoneParent = "boneparent"; // -const std::string nnAnimation = "animation"; -const std::string nnTracks = "tracks"; +const char *nnAnimation = "animation"; +const char *nnTracks = "tracks"; // -const std::string nnTrack = "track"; -const std::string nnKeyFrames = "keyframes"; -const std::string nnKeyFrame = "keyframe"; -const std::string nnTranslate = "translate"; -const std::string nnRotate = "rotate"; +const char *nnTrack = "track"; +const char *nnKeyFrames = "keyframes"; +const char *nnKeyFrame = "keyframe"; +const char *nnTranslate = "translate"; +const char *nnRotate = "rotate"; // Common XML constants -const std::string anX = "x"; -const std::string anY = "y"; -const std::string anZ = "z"; +const char *anX = "x"; +const char *anY = "y"; +const char *anZ = "z"; // Mesh @@ -968,11 +968,11 @@ void OgreXmlSerializer::ReadBones(Skeleton *skeleton) } else { - if (HasAttribute(anX.c_str())) + if (HasAttribute(anX)) bone->scale.x = ReadAttribute(anX); - if (HasAttribute(anY.c_str())) + if (HasAttribute(anY)) bone->scale.y = ReadAttribute(anY); - if (HasAttribute(anZ.c_str())) + if (HasAttribute(anZ)) bone->scale.z = ReadAttribute(anZ); } } From 388ec8461caba97f06546b281e408a73c08097a5 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 30 Jan 2018 20:12:46 +0200 Subject: [PATCH 060/106] Ogre: Change OgreXmlSerializer::ReadAttribute parameter from std::string to pointer --- code/OgreXmlSerializer.cpp | 26 +++++++++++++------------- code/OgreXmlSerializer.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/code/OgreXmlSerializer.cpp b/code/OgreXmlSerializer.cpp index 51a7c293b..51b3a5607 100644 --- a/code/OgreXmlSerializer.cpp +++ b/code/OgreXmlSerializer.cpp @@ -72,11 +72,11 @@ AI_WONT_RETURN void ThrowAttibuteError(const XmlReader* reader, const std::strin } template<> -int32_t OgreXmlSerializer::ReadAttribute(const std::string &name) const +int32_t OgreXmlSerializer::ReadAttribute(const char *name) const { - if (HasAttribute(name.c_str())) + if (HasAttribute(name)) { - return static_cast(m_reader->getAttributeValueAsInt(name.c_str())); + return static_cast(m_reader->getAttributeValueAsInt(name)); } else { @@ -86,9 +86,9 @@ int32_t OgreXmlSerializer::ReadAttribute(const std::string &name) const } template<> -uint32_t OgreXmlSerializer::ReadAttribute(const std::string &name) const +uint32_t OgreXmlSerializer::ReadAttribute(const char *name) const { - if (HasAttribute(name.c_str())) + if (HasAttribute(name)) { /** @note This is hackish. But we are never expecting unsigned values that go outside the int32_t range. Just monitor for negative numbers and kill the import. */ @@ -110,9 +110,9 @@ uint32_t OgreXmlSerializer::ReadAttribute(const std::string &name) con } template<> -uint16_t OgreXmlSerializer::ReadAttribute(const std::string &name) const +uint16_t OgreXmlSerializer::ReadAttribute(const char *name) const { - if (HasAttribute(name.c_str())) + if (HasAttribute(name)) { return static_cast(ReadAttribute(name)); } @@ -124,11 +124,11 @@ uint16_t OgreXmlSerializer::ReadAttribute(const std::string &name) con } template<> -float OgreXmlSerializer::ReadAttribute(const std::string &name) const +float OgreXmlSerializer::ReadAttribute(const char *name) const { - if (HasAttribute(name.c_str())) + if (HasAttribute(name)) { - return m_reader->getAttributeValueAsFloat(name.c_str()); + return m_reader->getAttributeValueAsFloat(name); } else { @@ -138,9 +138,9 @@ float OgreXmlSerializer::ReadAttribute(const std::string &name) const } template<> -std::string OgreXmlSerializer::ReadAttribute(const std::string &name) const +std::string OgreXmlSerializer::ReadAttribute(const char *name) const { - const char* value = m_reader->getAttributeValue(name.c_str()); + const char* value = m_reader->getAttributeValue(name); if (value) { return std::string(value); @@ -153,7 +153,7 @@ std::string OgreXmlSerializer::ReadAttribute(const std::string &nam } template<> -bool OgreXmlSerializer::ReadAttribute(const std::string &name) const +bool OgreXmlSerializer::ReadAttribute(const char *name) const { std::string value = Ogre::ToLower(ReadAttribute(name)); if (ASSIMP_stricmp(value, "true") == 0) diff --git a/code/OgreXmlSerializer.h b/code/OgreXmlSerializer.h index 487bb65fa..c0f09096c 100644 --- a/code/OgreXmlSerializer.h +++ b/code/OgreXmlSerializer.h @@ -98,7 +98,7 @@ private: void ReadAnimationKeyFrames(Animation *anim, VertexAnimationTrack *dest); template - T ReadAttribute(const std::string &name) const; + T ReadAttribute(const char *name) const; bool HasAttribute(const char *name) const; std::string &NextNode(); From 8f99c1a0be78262110637593af43fa331ae0c231 Mon Sep 17 00:00:00 2001 From: Sergio Acereda Date: Tue, 30 Jan 2018 22:13:44 +0100 Subject: [PATCH 061/106] including instead of --- code/D3MFImporter.cpp | 2 +- code/D3MFOpcPackage.cpp | 2 +- code/Importer/IFC/IFCLoader.cpp | 2 +- code/Q3BSPZipArchive.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/D3MFImporter.cpp b/code/D3MFImporter.cpp index 3c1f7ba68..0777a55fa 100644 --- a/code/D3MFImporter.cpp +++ b/code/D3MFImporter.cpp @@ -58,7 +58,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "D3MFOpcPackage.h" -#include +#include #include #include "3MFXmlTags.h" diff --git a/code/D3MFOpcPackage.cpp b/code/D3MFOpcPackage.cpp index b6abc0b98..a7039d34e 100644 --- a/code/D3MFOpcPackage.cpp +++ b/code/D3MFOpcPackage.cpp @@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include +#include #include "3MFXmlTags.h" namespace Assimp { diff --git a/code/Importer/IFC/IFCLoader.cpp b/code/Importer/IFC/IFCLoader.cpp index 0849e01d5..de7a37037 100644 --- a/code/Importer/IFC/IFCLoader.cpp +++ b/code/Importer/IFC/IFCLoader.cpp @@ -52,7 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #ifndef ASSIMP_BUILD_NO_COMPRESSED_IFC -# include +# include #endif #include "IFCLoader.h" diff --git a/code/Q3BSPZipArchive.h b/code/Q3BSPZipArchive.h index db1303d19..606f7b183 100644 --- a/code/Q3BSPZipArchive.h +++ b/code/Q3BSPZipArchive.h @@ -42,7 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_Q3BSP_ZIPARCHIVE_H_INC #define AI_Q3BSP_ZIPARCHIVE_H_INC -#include +#include #include #include #include From 2714e146e07cce4e9d509d3ab280c9af2cff8581 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 31 Jan 2018 09:57:34 +0100 Subject: [PATCH 062/106] Update OgreXmlSerializer.cpp - Make constats static - add asserts to check against nullptr dereferencing --- code/OgreXmlSerializer.cpp | 95 ++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/code/OgreXmlSerializer.cpp b/code/OgreXmlSerializer.cpp index 51b3a5607..c777cf363 100644 --- a/code/OgreXmlSerializer.cpp +++ b/code/OgreXmlSerializer.cpp @@ -231,75 +231,75 @@ std::string &OgreXmlSerializer::SkipCurrentNode() // Mesh XML constants // -const char *nnMesh = "mesh"; -const char *nnSharedGeometry = "sharedgeometry"; -const char *nnSubMeshes = "submeshes"; -const char *nnSubMesh = "submesh"; -const char *nnSubMeshNames = "submeshnames"; -const char *nnSkeletonLink = "skeletonlink"; -const char *nnLOD = "levelofdetail"; -const char *nnExtremes = "extremes"; -const char *nnPoses = "poses"; -const char *nnAnimations = "animations"; +static const char *nnMesh = "mesh"; +static const char *nnSharedGeometry = "sharedgeometry"; +static const char *nnSubMeshes = "submeshes"; +static const char *nnSubMesh = "submesh"; +static const char *nnSubMeshNames = "submeshnames"; +static const char *nnSkeletonLink = "skeletonlink"; +static const char *nnLOD = "levelofdetail"; +static const char *nnExtremes = "extremes"; +static const char *nnPoses = "poses"; +static const char *nnAnimations = "animations"; // -const char *nnFaces = "faces"; -const char *nnFace = "face"; -const char *nnGeometry = "geometry"; -const char *nnTextures = "textures"; +static const char *nnFaces = "faces"; +static const char *nnFace = "face"; +static const char *nnGeometry = "geometry"; +static const char *nnTextures = "textures"; // -const char *nnBoneAssignments = "boneassignments"; +static const char *nnBoneAssignments = "boneassignments"; // -const char *nnVertexBuffer = "vertexbuffer"; +static const char *nnVertexBuffer = "vertexbuffer"; // -const char *nnVertex = "vertex"; -const char *nnPosition = "position"; -const char *nnNormal = "normal"; -const char *nnTangent = "tangent"; -const char *nnBinormal = "binormal"; -const char *nnTexCoord = "texcoord"; -const char *nnColorDiffuse = "colour_diffuse"; -const char *nnColorSpecular = "colour_specular"; +static const char *nnVertex = "vertex"; +static const char *nnPosition = "position"; +static const char *nnNormal = "normal"; +static const char *nnTangent = "tangent"; +static const char *nnBinormal = "binormal"; +static const char *nnTexCoord = "texcoord"; +static const char *nnColorDiffuse = "colour_diffuse"; +static const char *nnColorSpecular = "colour_specular"; // -const char *nnVertexBoneAssignment = "vertexboneassignment"; +static const char *nnVertexBoneAssignment = "vertexboneassignment"; // Skeleton XML constants // -const char *nnSkeleton = "skeleton"; -const char *nnBones = "bones"; -const char *nnBoneHierarchy = "bonehierarchy"; -const char *nnAnimationLinks = "animationlinks"; +static const char *nnSkeleton = "skeleton"; +static const char *nnBones = "bones"; +static const char *nnBoneHierarchy = "bonehierarchy"; +static const char *nnAnimationLinks = "animationlinks"; // -const char *nnBone = "bone"; -const char *nnRotation = "rotation"; -const char *nnAxis = "axis"; -const char *nnScale = "scale"; +static const char *nnBone = "bone"; +static const char *nnRotation = "rotation"; +static const char *nnAxis = "axis"; +static const char *nnScale = "scale"; // -const char *nnBoneParent = "boneparent"; +static const char *nnBoneParent = "boneparent"; // -const char *nnAnimation = "animation"; -const char *nnTracks = "tracks"; +static const char *nnAnimation = "animation"; +static const char *nnTracks = "tracks"; // -const char *nnTrack = "track"; -const char *nnKeyFrames = "keyframes"; -const char *nnKeyFrame = "keyframe"; -const char *nnTranslate = "translate"; -const char *nnRotate = "rotate"; +static const char *nnTrack = "track"; +static const char *nnKeyFrames = "keyframes"; +static const char *nnKeyFrame = "keyframe"; +static const char *nnTranslate = "translate"; +static const char *nnRotate = "rotate"; // Common XML constants -const char *anX = "x"; -const char *anY = "y"; -const char *anZ = "z"; +static const char *anX = "x"; +static const char *anY = "y"; +static const char *anZ = "z"; // Mesh @@ -835,7 +835,7 @@ void OgreXmlSerializer::ReadAnimationTracks(Animation *dest) void OgreXmlSerializer::ReadAnimationKeyFrames(Animation *anim, VertexAnimationTrack *dest) { - const aiVector3D zeroVec(0.f, 0.f, 0.f); + static const aiVector3D zeroVec(0.f, 0.f, 0.f); NextNode(); while(m_currentNodeName == nnKeyFrame) @@ -916,8 +916,11 @@ void OgreXmlSerializer::ReadBoneHierarchy(Skeleton *skeleton) } } -bool BoneCompare(Bone *a, Bone *b) +static bool BoneCompare(Bone *a, Bone *b) { + ai_assert( nullptr != a ); + ai_assert( nullptr != b ); + return (a->id < b->id); } From 280c9951917be58e08fd6ab526f205b2f9b14bc2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 31 Jan 2018 22:55:05 +0100 Subject: [PATCH 063/106] closes https://github.com/assimp/assimp/issues/905: add missing contrib source from zlib. --- contrib/zlib/contrib/README.contrib | 78 + contrib/zlib/contrib/ada/buffer_demo.adb | 106 + contrib/zlib/contrib/ada/mtest.adb | 156 ++ contrib/zlib/contrib/ada/read.adb | 156 ++ contrib/zlib/contrib/ada/readme.txt | 65 + contrib/zlib/contrib/ada/test.adb | 463 ++++ contrib/zlib/contrib/ada/zlib-streams.adb | 225 ++ contrib/zlib/contrib/ada/zlib-streams.ads | 114 + contrib/zlib/contrib/ada/zlib-thin.adb | 141 ++ contrib/zlib/contrib/ada/zlib-thin.ads | 450 ++++ contrib/zlib/contrib/ada/zlib.adb | 701 ++++++ contrib/zlib/contrib/ada/zlib.ads | 328 +++ contrib/zlib/contrib/ada/zlib.gpr | 20 + contrib/zlib/contrib/amd64/amd64-match.S | 452 ++++ contrib/zlib/contrib/asm686/README.686 | 51 + contrib/zlib/contrib/asm686/match.S | 357 +++ contrib/zlib/contrib/blast/README | 4 + contrib/zlib/contrib/blast/blast.c | 466 ++++ contrib/zlib/contrib/blast/blast.h | 83 + contrib/zlib/contrib/blast/test.pk | Bin 0 -> 8 bytes contrib/zlib/contrib/blast/test.txt | 1 + contrib/zlib/contrib/delphi/ZLib.pas | 557 +++++ contrib/zlib/contrib/delphi/ZLibConst.pas | 11 + contrib/zlib/contrib/delphi/readme.txt | 76 + contrib/zlib/contrib/delphi/zlibd32.mak | 99 + contrib/zlib/contrib/dotzlib/DotZLib.build | 33 + contrib/zlib/contrib/dotzlib/DotZLib.chm | Bin 0 -> 72726 bytes .../contrib/dotzlib/DotZLib/AssemblyInfo.cs | 58 + .../contrib/dotzlib/DotZLib/ChecksumImpl.cs | 202 ++ .../contrib/dotzlib/DotZLib/CircularBuffer.cs | 83 + .../zlib/contrib/dotzlib/DotZLib/CodecBase.cs | 198 ++ .../zlib/contrib/dotzlib/DotZLib/Deflater.cs | 106 + .../zlib/contrib/dotzlib/DotZLib/DotZLib.cs | 288 +++ .../contrib/dotzlib/DotZLib/DotZLib.csproj | 141 ++ .../contrib/dotzlib/DotZLib/GZipStream.cs | 301 +++ .../zlib/contrib/dotzlib/DotZLib/Inflater.cs | 105 + .../zlib/contrib/dotzlib/DotZLib/UnitTests.cs | 274 +++ contrib/zlib/contrib/dotzlib/LICENSE_1_0.txt | 23 + contrib/zlib/contrib/dotzlib/readme.txt | 58 + contrib/zlib/contrib/gcc_gvmat64/gvmat64.S | 574 +++++ contrib/zlib/contrib/infback9/README | 1 + contrib/zlib/contrib/infback9/infback9.c | 615 +++++ contrib/zlib/contrib/infback9/infback9.h | 37 + contrib/zlib/contrib/infback9/inffix9.h | 107 + contrib/zlib/contrib/infback9/inflate9.h | 47 + contrib/zlib/contrib/infback9/inftree9.c | 324 +++ contrib/zlib/contrib/infback9/inftree9.h | 61 + contrib/zlib/contrib/inflate86/inffas86.c | 1157 +++++++++ contrib/zlib/contrib/inflate86/inffast.S | 1368 +++++++++++ contrib/zlib/contrib/iostream/test.cpp | 24 + contrib/zlib/contrib/iostream/zfstream.cpp | 329 +++ contrib/zlib/contrib/iostream/zfstream.h | 128 + contrib/zlib/contrib/iostream2/zstream.h | 307 +++ .../zlib/contrib/iostream2/zstream_test.cpp | 25 + contrib/zlib/contrib/iostream3/README | 35 + contrib/zlib/contrib/iostream3/TODO | 17 + contrib/zlib/contrib/iostream3/test.cc | 50 + contrib/zlib/contrib/iostream3/zfstream.cc | 479 ++++ contrib/zlib/contrib/iostream3/zfstream.h | 466 ++++ contrib/zlib/contrib/masmx64/bld_ml64.bat | 2 + contrib/zlib/contrib/masmx64/gvmat64.asm | 553 +++++ contrib/zlib/contrib/masmx64/inffas8664.c | 186 ++ contrib/zlib/contrib/masmx64/inffasx64.asm | 396 +++ contrib/zlib/contrib/masmx64/readme.txt | 31 + contrib/zlib/contrib/masmx86/bld_ml32.bat | 2 + contrib/zlib/contrib/masmx86/inffas32.asm | 1080 +++++++++ contrib/zlib/contrib/masmx86/match686.asm | 479 ++++ contrib/zlib/contrib/masmx86/readme.txt | 27 + contrib/zlib/contrib/minizip/Makefile.am | 45 + .../contrib/minizip/MiniZip64_Changes.txt | 6 + .../zlib/contrib/minizip/MiniZip64_info.txt | 74 + contrib/zlib/contrib/minizip/configure.ac | 32 + contrib/zlib/contrib/minizip/crypt.h | 131 + contrib/zlib/contrib/minizip/ioapi.c | 247 ++ contrib/zlib/contrib/minizip/ioapi.h | 208 ++ contrib/zlib/contrib/minizip/iowin32.c | 462 ++++ contrib/zlib/contrib/minizip/iowin32.h | 28 + contrib/zlib/contrib/minizip/make_vms.com | 25 + contrib/zlib/contrib/minizip/miniunz.c | 660 +++++ contrib/zlib/contrib/minizip/miniunzip.1 | 63 + contrib/zlib/contrib/minizip/minizip.1 | 46 + contrib/zlib/contrib/minizip/minizip.c | 520 ++++ contrib/zlib/contrib/minizip/minizip.pc.in | 12 + contrib/zlib/contrib/minizip/mztools.c | 291 +++ contrib/zlib/contrib/minizip/mztools.h | 37 + contrib/zlib/contrib/minizip/unzip.c | 2125 +++++++++++++++++ contrib/zlib/contrib/minizip/unzip.h | 437 ++++ contrib/zlib/contrib/minizip/zip.c | 2007 ++++++++++++++++ contrib/zlib/contrib/minizip/zip.h | 362 +++ contrib/zlib/contrib/pascal/example.pas | 599 +++++ contrib/zlib/contrib/pascal/readme.txt | 76 + contrib/zlib/contrib/pascal/zlibd32.mak | 99 + contrib/zlib/contrib/pascal/zlibpas.pas | 276 +++ contrib/zlib/contrib/puff/README | 63 + contrib/zlib/contrib/puff/puff.c | 840 +++++++ contrib/zlib/contrib/puff/puff.h | 35 + contrib/zlib/contrib/puff/pufftest.c | 165 ++ contrib/zlib/contrib/puff/zeros.raw | Bin 0 -> 2517 bytes contrib/zlib/contrib/testzlib/testzlib.c | 275 +++ contrib/zlib/contrib/testzlib/testzlib.txt | 10 + contrib/zlib/contrib/untgz/Makefile.msc | 17 + contrib/zlib/contrib/untgz/untgz.c | 674 ++++++ contrib/zlib/contrib/vstudio/readme.txt | 78 + contrib/zlib/contrib/vstudio/vc10/zlib.rc | 32 + contrib/zlib/contrib/vstudio/vc10/zlibvc.def | 153 ++ contrib/zlib/contrib/vstudio/vc11/zlib.rc | 32 + contrib/zlib/contrib/vstudio/vc11/zlibvc.def | 153 ++ contrib/zlib/contrib/vstudio/vc12/zlib.rc | 32 + contrib/zlib/contrib/vstudio/vc12/zlibvc.def | 153 ++ contrib/zlib/contrib/vstudio/vc14/zlib.rc | 32 + contrib/zlib/contrib/vstudio/vc14/zlibvc.def | 153 ++ contrib/zlib/contrib/vstudio/vc9/zlib.rc | 32 + contrib/zlib/contrib/vstudio/vc9/zlibvc.def | 153 ++ 113 files changed, 27887 insertions(+) create mode 100644 contrib/zlib/contrib/README.contrib create mode 100644 contrib/zlib/contrib/ada/buffer_demo.adb create mode 100644 contrib/zlib/contrib/ada/mtest.adb create mode 100644 contrib/zlib/contrib/ada/read.adb create mode 100644 contrib/zlib/contrib/ada/readme.txt create mode 100644 contrib/zlib/contrib/ada/test.adb create mode 100644 contrib/zlib/contrib/ada/zlib-streams.adb create mode 100644 contrib/zlib/contrib/ada/zlib-streams.ads create mode 100644 contrib/zlib/contrib/ada/zlib-thin.adb create mode 100644 contrib/zlib/contrib/ada/zlib-thin.ads create mode 100644 contrib/zlib/contrib/ada/zlib.adb create mode 100644 contrib/zlib/contrib/ada/zlib.ads create mode 100644 contrib/zlib/contrib/ada/zlib.gpr create mode 100644 contrib/zlib/contrib/amd64/amd64-match.S create mode 100644 contrib/zlib/contrib/asm686/README.686 create mode 100644 contrib/zlib/contrib/asm686/match.S create mode 100644 contrib/zlib/contrib/blast/README create mode 100644 contrib/zlib/contrib/blast/blast.c create mode 100644 contrib/zlib/contrib/blast/blast.h create mode 100644 contrib/zlib/contrib/blast/test.pk create mode 100644 contrib/zlib/contrib/blast/test.txt create mode 100644 contrib/zlib/contrib/delphi/ZLib.pas create mode 100644 contrib/zlib/contrib/delphi/ZLibConst.pas create mode 100644 contrib/zlib/contrib/delphi/readme.txt create mode 100644 contrib/zlib/contrib/delphi/zlibd32.mak create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib.build create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib.chm create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/CodecBase.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/Deflater.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/GZipStream.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/Inflater.cs create mode 100644 contrib/zlib/contrib/dotzlib/DotZLib/UnitTests.cs create mode 100644 contrib/zlib/contrib/dotzlib/LICENSE_1_0.txt create mode 100644 contrib/zlib/contrib/dotzlib/readme.txt create mode 100644 contrib/zlib/contrib/gcc_gvmat64/gvmat64.S create mode 100644 contrib/zlib/contrib/infback9/README create mode 100644 contrib/zlib/contrib/infback9/infback9.c create mode 100644 contrib/zlib/contrib/infback9/infback9.h create mode 100644 contrib/zlib/contrib/infback9/inffix9.h create mode 100644 contrib/zlib/contrib/infback9/inflate9.h create mode 100644 contrib/zlib/contrib/infback9/inftree9.c create mode 100644 contrib/zlib/contrib/infback9/inftree9.h create mode 100644 contrib/zlib/contrib/inflate86/inffas86.c create mode 100644 contrib/zlib/contrib/inflate86/inffast.S create mode 100644 contrib/zlib/contrib/iostream/test.cpp create mode 100644 contrib/zlib/contrib/iostream/zfstream.cpp create mode 100644 contrib/zlib/contrib/iostream/zfstream.h create mode 100644 contrib/zlib/contrib/iostream2/zstream.h create mode 100644 contrib/zlib/contrib/iostream2/zstream_test.cpp create mode 100644 contrib/zlib/contrib/iostream3/README create mode 100644 contrib/zlib/contrib/iostream3/TODO create mode 100644 contrib/zlib/contrib/iostream3/test.cc create mode 100644 contrib/zlib/contrib/iostream3/zfstream.cc create mode 100644 contrib/zlib/contrib/iostream3/zfstream.h create mode 100644 contrib/zlib/contrib/masmx64/bld_ml64.bat create mode 100644 contrib/zlib/contrib/masmx64/gvmat64.asm create mode 100644 contrib/zlib/contrib/masmx64/inffas8664.c create mode 100644 contrib/zlib/contrib/masmx64/inffasx64.asm create mode 100644 contrib/zlib/contrib/masmx64/readme.txt create mode 100644 contrib/zlib/contrib/masmx86/bld_ml32.bat create mode 100644 contrib/zlib/contrib/masmx86/inffas32.asm create mode 100644 contrib/zlib/contrib/masmx86/match686.asm create mode 100644 contrib/zlib/contrib/masmx86/readme.txt create mode 100644 contrib/zlib/contrib/minizip/Makefile.am create mode 100644 contrib/zlib/contrib/minizip/MiniZip64_Changes.txt create mode 100644 contrib/zlib/contrib/minizip/MiniZip64_info.txt create mode 100644 contrib/zlib/contrib/minizip/configure.ac create mode 100644 contrib/zlib/contrib/minizip/crypt.h create mode 100644 contrib/zlib/contrib/minizip/ioapi.c create mode 100644 contrib/zlib/contrib/minizip/ioapi.h create mode 100644 contrib/zlib/contrib/minizip/iowin32.c create mode 100644 contrib/zlib/contrib/minizip/iowin32.h create mode 100644 contrib/zlib/contrib/minizip/make_vms.com create mode 100644 contrib/zlib/contrib/minizip/miniunz.c create mode 100644 contrib/zlib/contrib/minizip/miniunzip.1 create mode 100644 contrib/zlib/contrib/minizip/minizip.1 create mode 100644 contrib/zlib/contrib/minizip/minizip.c create mode 100644 contrib/zlib/contrib/minizip/minizip.pc.in create mode 100644 contrib/zlib/contrib/minizip/mztools.c create mode 100644 contrib/zlib/contrib/minizip/mztools.h create mode 100644 contrib/zlib/contrib/minizip/unzip.c create mode 100644 contrib/zlib/contrib/minizip/unzip.h create mode 100644 contrib/zlib/contrib/minizip/zip.c create mode 100644 contrib/zlib/contrib/minizip/zip.h create mode 100644 contrib/zlib/contrib/pascal/example.pas create mode 100644 contrib/zlib/contrib/pascal/readme.txt create mode 100644 contrib/zlib/contrib/pascal/zlibd32.mak create mode 100644 contrib/zlib/contrib/pascal/zlibpas.pas create mode 100644 contrib/zlib/contrib/puff/README create mode 100644 contrib/zlib/contrib/puff/puff.c create mode 100644 contrib/zlib/contrib/puff/puff.h create mode 100644 contrib/zlib/contrib/puff/pufftest.c create mode 100644 contrib/zlib/contrib/puff/zeros.raw create mode 100644 contrib/zlib/contrib/testzlib/testzlib.c create mode 100644 contrib/zlib/contrib/testzlib/testzlib.txt create mode 100644 contrib/zlib/contrib/untgz/Makefile.msc create mode 100644 contrib/zlib/contrib/untgz/untgz.c create mode 100644 contrib/zlib/contrib/vstudio/readme.txt create mode 100644 contrib/zlib/contrib/vstudio/vc10/zlib.rc create mode 100644 contrib/zlib/contrib/vstudio/vc10/zlibvc.def create mode 100644 contrib/zlib/contrib/vstudio/vc11/zlib.rc create mode 100644 contrib/zlib/contrib/vstudio/vc11/zlibvc.def create mode 100644 contrib/zlib/contrib/vstudio/vc12/zlib.rc create mode 100644 contrib/zlib/contrib/vstudio/vc12/zlibvc.def create mode 100644 contrib/zlib/contrib/vstudio/vc14/zlib.rc create mode 100644 contrib/zlib/contrib/vstudio/vc14/zlibvc.def create mode 100644 contrib/zlib/contrib/vstudio/vc9/zlib.rc create mode 100644 contrib/zlib/contrib/vstudio/vc9/zlibvc.def diff --git a/contrib/zlib/contrib/README.contrib b/contrib/zlib/contrib/README.contrib new file mode 100644 index 000000000..a411d5c39 --- /dev/null +++ b/contrib/zlib/contrib/README.contrib @@ -0,0 +1,78 @@ +All files under this contrib directory are UNSUPPORTED. There were +provided by users of zlib and were not tested by the authors of zlib. +Use at your own risk. Please contact the authors of the contributions +for help about these, not the zlib authors. Thanks. + + +ada/ by Dmitriy Anisimkov + Support for Ada + See http://zlib-ada.sourceforge.net/ + +amd64/ by Mikhail Teterin + asm code for AMD64 + See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393 + +asm686/ by Brian Raiter + asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax + See http://www.muppetlabs.com/~breadbox/software/assembly.html + +blast/ by Mark Adler + Decompressor for output of PKWare Data Compression Library (DCL) + +delphi/ by Cosmin Truta + Support for Delphi and C++ Builder + +dotzlib/ by Henrik Ravn + Support for Microsoft .Net and Visual C++ .Net + +gcc_gvmat64/by Gilles Vollant + GCC Version of x86 64-bit (AMD64 and Intel EM64t) code for x64 + assembler to replace longest_match() and inflate_fast() + +infback9/ by Mark Adler + Unsupported diffs to infback to decode the deflate64 format + +inflate86/ by Chris Anderson + Tuned x86 gcc asm code to replace inflate_fast() + +iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + +iostream2/ by Tyge Løvset + Another C++ I/O streams interface + +iostream3/ by Ludwig Schwardt + and Kevin Ruland + Yet another C++ I/O streams interface + +masmx64/ by Gilles Vollant + x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to + replace longest_match() and inflate_fast(), also masm x86 + 64-bits translation of Chris Anderson inflate_fast() + +masmx86/ by Gilles Vollant + x86 asm code to replace longest_match() and inflate_fast(), + for Visual C++ and MASM (32 bits). + Based on Brian Raiter (asm686) and Chris Anderson (inflate86) + +minizip/ by Gilles Vollant + Mini zip and unzip based on zlib + Includes Zip64 support by Mathias Svensson + See http://www.winimage.com/zLibDll/minizip.html + +pascal/ by Bob Dellaca et al. + Support for Pascal + +puff/ by Mark Adler + Small, low memory usage inflate. Also serves to provide an + unambiguous description of the deflate format. + +testzlib/ by Gilles Vollant + Example of the use of zlib + +untgz/ by Pedro A. Aranda Gutierrez + A very simple tar.gz file extractor using zlib + +vstudio/ by Gilles Vollant + Building a minizip-enhanced zlib with Microsoft Visual Studio + Includes vc11 from kreuzerkrieg and vc12 from davispuh diff --git a/contrib/zlib/contrib/ada/buffer_demo.adb b/contrib/zlib/contrib/ada/buffer_demo.adb new file mode 100644 index 000000000..46b863810 --- /dev/null +++ b/contrib/zlib/contrib/ada/buffer_demo.adb @@ -0,0 +1,106 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- +-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $ + +-- This demo program provided by Dr Steve Sangwine +-- +-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer +-- of exactly the correct size is used for decompressed data, and the last +-- few bytes passed in to Zlib are checksum bytes. + +-- This program compresses a string of text, and then decompresses the +-- compressed text into a buffer of the same size as the original text. + +with Ada.Streams; use Ada.Streams; +with Ada.Text_IO; + +with ZLib; use ZLib; + +procedure Buffer_Demo is + EOL : Character renames ASCII.LF; + Text : constant String + := "Four score and seven years ago our fathers brought forth," & EOL & + "upon this continent, a new nation, conceived in liberty," & EOL & + "and dedicated to the proposition that `all men are created equal'."; + + Source : Stream_Element_Array (1 .. Text'Length); + for Source'Address use Text'Address; + +begin + Ada.Text_IO.Put (Text); + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes"); + + declare + Compressed_Data : Stream_Element_Array (1 .. Text'Length); + L : Stream_Element_Offset; + begin + Compress : declare + Compressor : Filter_Type; + I : Stream_Element_Offset; + begin + Deflate_Init (Compressor); + + -- Compress the whole of T at once. + + Translate (Compressor, Source, I, Compressed_Data, L, Finish); + pragma Assert (I = Source'Last); + + Close (Compressor); + + Ada.Text_IO.Put_Line + ("Compressed size : " + & Stream_Element_Offset'Image (L) & " bytes"); + end Compress; + + -- Now we decompress the data, passing short blocks of data to Zlib + -- (because this demonstrates the problem - the last block passed will + -- contain checksum information and there will be no output, only a + -- check inside Zlib that the checksum is correct). + + Decompress : declare + Decompressor : Filter_Type; + + Uncompressed_Data : Stream_Element_Array (1 .. Text'Length); + + Block_Size : constant := 4; + -- This makes sure that the last block contains + -- only Adler checksum data. + + P : Stream_Element_Offset := Compressed_Data'First - 1; + O : Stream_Element_Offset; + begin + Inflate_Init (Decompressor); + + loop + Translate + (Decompressor, + Compressed_Data + (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)), + P, + Uncompressed_Data + (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last), + O, + No_Flush); + + Ada.Text_IO.Put_Line + ("Total in : " & Count'Image (Total_In (Decompressor)) & + ", out : " & Count'Image (Total_Out (Decompressor))); + + exit when P = L; + end loop; + + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Decompressed text matches original text : " + & Boolean'Image (Uncompressed_Data = Source)); + end Decompress; + end; +end Buffer_Demo; diff --git a/contrib/zlib/contrib/ada/mtest.adb b/contrib/zlib/contrib/ada/mtest.adb new file mode 100644 index 000000000..c4dfd080f --- /dev/null +++ b/contrib/zlib/contrib/ada/mtest.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- Continuous test for ZLib multithreading. If the test would fail +-- we should provide thread safe allocation routines for the Z_Stream. +-- +-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $ + +with ZLib; +with Ada.Streams; +with Ada.Numerics.Discrete_Random; +with Ada.Text_IO; +with Ada.Exceptions; +with Ada.Task_Identification; + +procedure MTest is + use Ada.Streams; + use ZLib; + + Stop : Boolean := False; + + pragma Atomic (Stop); + + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + task type Test_Task; + + task body Test_Task is + Buffer : Stream_Element_Array (1 .. 100_000); + Gen : Random_Elements.Generator; + + Buffer_First : Stream_Element_Offset; + Compare_First : Stream_Element_Offset; + + Deflate : Filter_Type; + Inflate : Filter_Type; + + procedure Further (Item : in Stream_Element_Array); + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + ------------- + -- Further -- + ------------- + + procedure Further (Item : in Stream_Element_Array) is + + procedure Compare (Item : in Stream_Element_Array); + + ------------- + -- Compare -- + ------------- + + procedure Compare (Item : in Stream_Element_Array) is + Next_First : Stream_Element_Offset := Compare_First + Item'Length; + begin + if Buffer (Compare_First .. Next_First - 1) /= Item then + raise Program_Error; + end if; + + Compare_First := Next_First; + end Compare; + + procedure Compare_Write is new ZLib.Write (Write => Compare); + begin + Compare_Write (Inflate, Item, No_Flush); + end Further; + + ----------------- + -- Read_Buffer -- + ----------------- + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset) + is + Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First; + Next_First : Stream_Element_Offset; + begin + if Item'Length <= Buff_Diff then + Last := Item'Last; + + Next_First := Buffer_First + Item'Length; + + Item := Buffer (Buffer_First .. Next_First - 1); + + Buffer_First := Next_First; + else + Last := Item'First + Buff_Diff; + Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); + Buffer_First := Buffer'Last + 1; + end if; + end Read_Buffer; + + procedure Translate is new Generic_Translate + (Data_In => Read_Buffer, + Data_Out => Further); + + begin + Random_Elements.Reset (Gen); + + Buffer := (others => 20); + + Main : loop + for J in Buffer'Range loop + Buffer (J) := Random_Elements.Random (Gen); + + Deflate_Init (Deflate); + Inflate_Init (Inflate); + + Buffer_First := Buffer'First; + Compare_First := Buffer'First; + + Translate (Deflate); + + if Compare_First /= Buffer'Last + 1 then + raise Program_Error; + end if; + + Ada.Text_IO.Put_Line + (Ada.Task_Identification.Image + (Ada.Task_Identification.Current_Task) + & Stream_Element_Offset'Image (J) + & ZLib.Count'Image (Total_Out (Deflate))); + + Close (Deflate); + Close (Inflate); + + exit Main when Stop; + end loop; + end loop Main; + exception + when E : others => + Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); + Stop := True; + end Test_Task; + + Test : array (1 .. 4) of Test_Task; + + pragma Unreferenced (Test); + + Dummy : Character; + +begin + Ada.Text_IO.Get_Immediate (Dummy); + Stop := True; +end MTest; diff --git a/contrib/zlib/contrib/ada/read.adb b/contrib/zlib/contrib/ada/read.adb new file mode 100644 index 000000000..1f2efbfeb --- /dev/null +++ b/contrib/zlib/contrib/ada/read.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $ + +-- Test/demo program for the generic read interface. + +with Ada.Numerics.Discrete_Random; +with Ada.Streams; +with Ada.Text_IO; + +with ZLib; + +procedure Read is + + use Ada.Streams; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Stream_Element_Offset := 100_000; + + Continuous : constant Boolean := False; + -- If this constant is True, the test would be repeated again and again, + -- with increment File_Size for every iteration. + + Header : constant ZLib.Header_Type := ZLib.Default; + -- Do not use Header other than Default in ZLib versions 1.1.4 and older. + + Init_Random : constant := 8; + -- We are using the same random sequence, in case of we catch bug, + -- so we would be able to reproduce it. + + -- End -- + + Pack_Size : Stream_Element_Offset; + Offset : Stream_Element_Offset; + + Filter : ZLib.Filter_Type; + + subtype Visible_Symbols + is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is new + Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Period : constant Stream_Element_Offset := 200; + -- Period constant variable for random generator not to be very random. + -- Bigger period, harder random. + + Read_Buffer : Stream_Element_Array (1 .. 2048); + Read_First : Stream_Element_Offset; + Read_Last : Stream_Element_Offset; + + procedure Reset; + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Read + -- reading data from the File_In. + + procedure Read is new ZLib.Read + (Read, + Read_Buffer, + Rest_First => Read_First, + Rest_Last => Read_Last); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Last := Stream_Element_Offset'Min + (Item'Last, + Item'First + File_Size - Offset); + + for J in Item'First .. Last loop + if J < Item'First + Period then + Item (J) := Random_Elements.Random (Gen); + else + Item (J) := Item (J - Period); + end if; + + Offset := Offset + 1; + end loop; + end Read; + + ----------- + -- Reset -- + ----------- + + procedure Reset is + begin + Random_Elements.Reset (Gen, Init_Random); + Pack_Size := 0; + Offset := 1; + Read_First := Read_Buffer'Last + 1; + Read_Last := Read_Buffer'Last; + end Reset; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter, + Level, + Header => Header); + + Reset; + + Ada.Text_IO.Put + (Stream_Element_Offset'Image (File_Size) & " ->"); + + loop + declare + Buffer : Stream_Element_Array (1 .. 1024); + Last : Stream_Element_Offset; + begin + Read (Filter, Buffer, Last); + + Pack_Size := Pack_Size + Last - Buffer'First + 1; + + exit when Last < Buffer'Last; + end; + end loop; + + Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size)); + + ZLib.Close (Filter); + end loop; + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Read; diff --git a/contrib/zlib/contrib/ada/readme.txt b/contrib/zlib/contrib/ada/readme.txt new file mode 100644 index 000000000..ce4d2cadf --- /dev/null +++ b/contrib/zlib/contrib/ada/readme.txt @@ -0,0 +1,65 @@ + ZLib for Ada thick binding (ZLib.Ada) + Release 1.3 + +ZLib.Ada is a thick binding interface to the popular ZLib data +compression library, available at http://www.gzip.org/zlib/. +It provides Ada-style access to the ZLib C library. + + + Here are the main changes since ZLib.Ada 1.2: + +- Attension: ZLib.Read generic routine have a initialization requirement + for Read_Last parameter now. It is a bit incompartible with previous version, + but extends functionality, we could use new parameters Allow_Read_Some and + Flush now. + +- Added Is_Open routines to ZLib and ZLib.Streams packages. + +- Add pragma Assert to check Stream_Element is 8 bit. + +- Fix extraction to buffer with exact known decompressed size. Error reported by + Steve Sangwine. + +- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits + computers. Patch provided by Pascal Obry. + +- Add Status_Error exception definition. + +- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit. + + + How to build ZLib.Ada under GNAT + +You should have the ZLib library already build on your computer, before +building ZLib.Ada. Make the directory of ZLib.Ada sources current and +issue the command: + + gnatmake test -largs -L -lz + +Or use the GNAT project file build for GNAT 3.15 or later: + + gnatmake -Pzlib.gpr -L + + + How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2 + +1. Make a project with all *.ads and *.adb files from the distribution. +2. Build the libz.a library from the ZLib C sources. +3. Rename libz.a to z.lib. +4. Add the library z.lib to the project. +5. Add the libc.lib library from the ObjectAda distribution to the project. +6. Build the executable using test.adb as a main procedure. + + + How to use ZLib.Ada + +The source files test.adb and read.adb are small demo programs that show +the main functionality of ZLib.Ada. + +The routines from the package specifications are commented. + + +Homepage: http://zlib-ada.sourceforge.net/ +Author: Dmitriy Anisimkov + +Contributors: Pascal Obry , Steve Sangwine diff --git a/contrib/zlib/contrib/ada/test.adb b/contrib/zlib/contrib/ada/test.adb new file mode 100644 index 000000000..90773acfa --- /dev/null +++ b/contrib/zlib/contrib/ada/test.adb @@ -0,0 +1,463 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ + +-- The program has a few aims. +-- 1. Test ZLib.Ada95 thick binding functionality. +-- 2. Show the example of use main functionality of the ZLib.Ada95 binding. +-- 3. Build this program automatically compile all ZLib.Ada95 packages under +-- GNAT Ada95 compiler. + +with ZLib.Streams; +with Ada.Streams.Stream_IO; +with Ada.Numerics.Discrete_Random; + +with Ada.Text_IO; + +with Ada.Calendar; + +procedure Test is + + use Ada.Streams; + use Stream_IO; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Count := 100_000; + Continuous : constant Boolean := False; + + Header : constant ZLib.Header_Type := ZLib.Default; + -- ZLib.None; + -- ZLib.Auto; + -- ZLib.GZip; + -- Do not use Header other then Default in ZLib versions 1.1.4 + -- and older. + + Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy; + Init_Random : constant := 10; + + -- End -- + + In_File_Name : constant String := "testzlib.in"; + -- Name of the input file + + Z_File_Name : constant String := "testzlib.zlb"; + -- Name of the compressed file. + + Out_File_Name : constant String := "testzlib.out"; + -- Name of the decompressed file. + + File_In : File_Type; + File_Out : File_Type; + File_Back : File_Type; + File_Z : ZLib.Streams.Stream_Type; + + Filter : ZLib.Filter_Type; + + Time_Stamp : Ada.Calendar.Time; + + procedure Generate_File; + -- Generate file of spetsified size with some random data. + -- The random data is repeatable, for the good compression. + + procedure Compare_Streams + (Left, Right : in out Root_Stream_Type'Class); + -- The procedure compearing data in 2 streams. + -- It is for compare data before and after compression/decompression. + + procedure Compare_Files (Left, Right : String); + -- Compare files. Based on the Compare_Streams. + + procedure Copy_Streams + (Source, Target : in out Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024); + -- Copying data from one stream to another. It is for test stream + -- interface of the library. + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- reading data from the File_In. + + procedure Data_Out (Item : in Stream_Element_Array); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- writing data to the File_Out. + + procedure Stamp; + -- Store the timestamp to the local variable. + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count); + -- Print the time statistic with the message. + + procedure Translate is new ZLib.Generic_Translate + (Data_In => Data_In, + Data_Out => Data_Out); + -- This procedure is moving data from File_In to File_Out + -- with compression or decompression, depend on initialization of + -- Filter parameter. + + ------------------- + -- Compare_Files -- + ------------------- + + procedure Compare_Files (Left, Right : String) is + Left_File, Right_File : File_Type; + begin + Open (Left_File, In_File, Left); + Open (Right_File, In_File, Right); + Compare_Streams (Stream (Left_File).all, Stream (Right_File).all); + Close (Left_File); + Close (Right_File); + end Compare_Files; + + --------------------- + -- Compare_Streams -- + --------------------- + + procedure Compare_Streams + (Left, Right : in out Ada.Streams.Root_Stream_Type'Class) + is + Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#); + Left_Last, Right_Last : Stream_Element_Offset; + begin + loop + Read (Left, Left_Buffer, Left_Last); + Read (Right, Right_Buffer, Right_Last); + + if Left_Last /= Right_Last then + Ada.Text_IO.Put_Line ("Compare error :" + & Stream_Element_Offset'Image (Left_Last) + & " /= " + & Stream_Element_Offset'Image (Right_Last)); + + raise Constraint_Error; + + elsif Left_Buffer (0 .. Left_Last) + /= Right_Buffer (0 .. Right_Last) + then + Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal."); + raise Constraint_Error; + + end if; + + exit when Left_Last < Left_Buffer'Last; + end loop; + end Compare_Streams; + + ------------------ + -- Copy_Streams -- + ------------------ + + procedure Copy_Streams + (Source, Target : in out Ada.Streams.Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Read (Source, Buffer, Last); + Write (Target, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Copy_Streams; + + ------------- + -- Data_In -- + ------------- + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Read (File_In, Item, Last); + end Data_In; + + -------------- + -- Data_Out -- + -------------- + + procedure Data_Out (Item : in Stream_Element_Array) is + begin + Write (File_Out, Item); + end Data_Out; + + ------------------- + -- Generate_File -- + ------------------- + + procedure Generate_File is + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10; + + Buffer_Count : constant Count := File_Size / Buffer'Length; + -- Number of same buffers in the packet. + + Density : constant Count := 30; -- from 0 to Buffer'Length - 2; + + procedure Fill_Buffer (J, D : in Count); + -- Change the part of the buffer. + + ----------------- + -- Fill_Buffer -- + ----------------- + + procedure Fill_Buffer (J, D : in Count) is + begin + for K in 0 .. D loop + Buffer + (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1)) + := Random_Elements.Random (Gen); + + end loop; + end Fill_Buffer; + + begin + Random_Elements.Reset (Gen, Init_Random); + + Create (File_In, Out_File, In_File_Name); + + Fill_Buffer (1, Buffer'Length - 2); + + for J in 1 .. Buffer_Count loop + Write (File_In, Buffer); + + Fill_Buffer (J, Density); + end loop; + + -- fill remain size. + + Write + (File_In, + Buffer + (1 .. Stream_Element_Offset + (File_Size - Buffer'Length * Buffer_Count))); + + Flush (File_In); + Close (File_In); + end Generate_File; + + --------------------- + -- Print_Statistic -- + --------------------- + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is + use Ada.Calendar; + use Ada.Text_IO; + + package Count_IO is new Integer_IO (ZLib.Count); + + Curr_Dur : Duration := Clock - Time_Stamp; + begin + Put (Msg); + + Set_Col (20); + Ada.Text_IO.Put ("size ="); + + Count_IO.Put + (Data_Size, + Width => Stream_IO.Count'Image (File_Size)'Length); + + Put_Line (" duration =" & Duration'Image (Curr_Dur)); + end Print_Statistic; + + ----------- + -- Stamp -- + ----------- + + procedure Stamp is + begin + Time_Stamp := Ada.Calendar.Clock; + end Stamp; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + Generate_File; + + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put_Line ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Test generic interface. + Open (File_In, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + Stamp; + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter => Filter, + Level => Level, + Strategy => Strategy, + Header => Header); + + Translate (Filter); + Print_Statistic ("Generic compress", ZLib.Total_Out (Filter)); + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Open (File_In, In_File, Z_File_Name); + Create (File_Out, Out_File, Out_File_Name); + + Stamp; + + -- Inflate using generic instantiation. + + ZLib.Inflate_Init (Filter, Header => Header); + + Translate (Filter); + Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter)); + + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Compare_Files (In_File_Name, Out_File_Name); + + -- Test stream interface. + + -- Compress to the back stream. + + Open (File_In, In_File, In_File_Name); + Create (File_Back, Out_File, Z_File_Name); + + Stamp; + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Level => Level, + Strategy => Strategy, + Header => Header); + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + -- Flushing internal buffers to the back stream. + + ZLib.Streams.Flush (File_Z, ZLib.Finish); + + Print_Statistic ("Write compress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_In); + Close (File_Back); + + -- Compare reading from original file and from + -- decompression stream. + + Open (File_In, In_File, In_File_Name); + Open (File_Back, In_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Header => Header); + + Stamp; + Compare_Streams (Stream (File_In).all, File_Z); + + Print_Statistic ("Read decompress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + -- Compress by reading from compression stream. + + Open (File_Back, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Level => Level, + Strategy => Strategy, + Header => Header); + + Stamp; + Copy_Streams + (Source => File_Z, + Target => Stream (File_Out).all); + + Print_Statistic ("Read compress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_Out); + Close (File_Back); + + -- Decompress to decompression stream. + + Open (File_In, In_File, Z_File_Name); + Create (File_Back, Out_File, Out_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Header => Header); + + Stamp; + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + Print_Statistic ("Write decompress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + Compare_Files (In_File_Name, Out_File_Name); + end loop; + + Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok."); + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Test; diff --git a/contrib/zlib/contrib/ada/zlib-streams.adb b/contrib/zlib/contrib/ada/zlib-streams.adb new file mode 100644 index 000000000..b6497bae2 --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib-streams.adb @@ -0,0 +1,225 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ + +with Ada.Unchecked_Deallocation; + +package body ZLib.Streams is + + ----------- + -- Close -- + ----------- + + procedure Close (Stream : in out Stream_Type) is + procedure Free is new Ada.Unchecked_Deallocation + (Stream_Element_Array, Buffer_Access); + begin + if Stream.Mode = Out_Stream or Stream.Mode = Duplex then + -- We should flush the data written by the writer. + + Flush (Stream, Finish); + + Close (Stream.Writer); + end if; + + if Stream.Mode = In_Stream or Stream.Mode = Duplex then + Close (Stream.Reader); + Free (Stream.Buffer); + end if; + end Close; + + ------------ + -- Create -- + ------------ + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size) + is + + subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean); + + ----------------- + -- Init_Filter -- + ----------------- + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean) is + begin + if Compress then + Deflate_Init + (Filter, Level, Strategy, Header => Header); + else + Inflate_Init (Filter, Header => Header); + end if; + end Init_Filter; + + begin + Stream.Back := Back; + Stream.Mode := Mode; + + if Mode = Out_Stream or Mode = Duplex then + Init_Filter (Stream.Writer, Back_Compressed); + Stream.Buffer_Size := Write_Buffer_Size; + else + Stream.Buffer_Size := 0; + end if; + + if Mode = In_Stream or Mode = Duplex then + Init_Filter (Stream.Reader, not Back_Compressed); + + Stream.Buffer := new Buffer_Subtype; + Stream.Rest_First := Stream.Buffer'Last + 1; + Stream.Rest_Last := Stream.Buffer'Last; + end if; + end Create; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush) + is + Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Flush (Stream.Writer, Buffer, Last, Mode); + + Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Flush; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Stream : Stream_Type) return Boolean is + begin + return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); + end Is_Open; + + ---------- + -- Read -- + ---------- + + procedure Read + (Stream : in out Stream_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) + is + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Ada.Streams.Read (Stream.Back.all, Item, Last); + end Read; + + procedure Read is new ZLib.Read + (Read => Read, + Buffer => Stream.Buffer.all, + Rest_First => Stream.Rest_First, + Rest_Last => Stream.Rest_Last); + + begin + Read (Stream.Reader, Item, Last); + end Read; + + ------------------- + -- Read_Total_In -- + ------------------- + + function Read_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Reader); + end Read_Total_In; + + -------------------- + -- Read_Total_Out -- + -------------------- + + function Read_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Reader); + end Read_Total_Out; + + ----------- + -- Write -- + ----------- + + procedure Write + (Stream : in out Stream_Type; + Item : in Stream_Element_Array) + is + + procedure Write (Item : in Stream_Element_Array); + + ----------- + -- Write -- + ----------- + + procedure Write (Item : in Stream_Element_Array) is + begin + Ada.Streams.Write (Stream.Back.all, Item); + end Write; + + procedure Write is new ZLib.Write + (Write => Write, + Buffer_Size => Stream.Buffer_Size); + + begin + Write (Stream.Writer, Item, No_Flush); + end Write; + + -------------------- + -- Write_Total_In -- + -------------------- + + function Write_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Writer); + end Write_Total_In; + + --------------------- + -- Write_Total_Out -- + --------------------- + + function Write_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Writer); + end Write_Total_Out; + +end ZLib.Streams; diff --git a/contrib/zlib/contrib/ada/zlib-streams.ads b/contrib/zlib/contrib/ada/zlib-streams.ads new file mode 100644 index 000000000..8e26cd450 --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib-streams.ads @@ -0,0 +1,114 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $ + +package ZLib.Streams is + + type Stream_Mode is (In_Stream, Out_Stream, Duplex); + + type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class; + + type Stream_Type is + new Ada.Streams.Root_Stream_Type with private; + + procedure Read + (Stream : in out Stream_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + procedure Write + (Stream : in out Stream_Type; + Item : in Ada.Streams.Stream_Element_Array); + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush); + -- Flush the written data to the back stream, + -- all data placed to the compressor is flushing to the Back stream. + -- Should not be used until necessary, because it is decreasing + -- compression. + + function Read_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_In); + -- Return total number of bytes read from back stream so far. + + function Read_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_Out); + -- Return total number of bytes read so far. + + function Write_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_In); + -- Return total number of bytes written so far. + + function Write_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_Out); + -- Return total number of bytes written to the back stream. + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size); + -- Create the Comression/Decompression stream. + -- If mode is In_Stream then Write operation is disabled. + -- If mode is Out_Stream then Read operation is disabled. + + -- If Back_Compressed is true then + -- Data written to the Stream is compressing to the Back stream + -- and data read from the Stream is decompressed data from the Back stream. + + -- If Back_Compressed is false then + -- Data written to the Stream is decompressing to the Back stream + -- and data read from the Stream is compressed data from the Back stream. + + -- !!! When the Need_Header is False ZLib-Ada is using undocumented + -- ZLib 1.1.4 functionality to do not create/wait for ZLib headers. + + function Is_Open (Stream : Stream_Type) return Boolean; + + procedure Close (Stream : in out Stream_Type); + +private + + use Ada.Streams; + + type Buffer_Access is access all Stream_Element_Array; + + type Stream_Type + is new Root_Stream_Type with + record + Mode : Stream_Mode; + + Buffer : Buffer_Access; + Rest_First : Stream_Element_Offset; + Rest_Last : Stream_Element_Offset; + -- Buffer for Read operation. + -- We need to have this buffer in the record + -- because not all read data from back stream + -- could be processed during the read operation. + + Buffer_Size : Stream_Element_Offset; + -- Buffer size for write operation. + -- We do not need to have this buffer + -- in the record because all data could be + -- processed in the write operation. + + Back : Stream_Access; + Reader : Filter_Type; + Writer : Filter_Type; + end record; + +end ZLib.Streams; diff --git a/contrib/zlib/contrib/ada/zlib-thin.adb b/contrib/zlib/contrib/ada/zlib-thin.adb new file mode 100644 index 000000000..0ca4a7120 --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib-thin.adb @@ -0,0 +1,141 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $ + +package body ZLib.Thin is + + ZLIB_VERSION : constant Chars_Ptr := zlibVersion; + + Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit; + + -------------- + -- Avail_In -- + -------------- + + function Avail_In (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_In; + end Avail_In; + + --------------- + -- Avail_Out -- + --------------- + + function Avail_Out (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_Out; + end Avail_Out; + + ------------------ + -- Deflate_Init -- + ------------------ + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int is + begin + return deflateInit2 + (strm, + level, + method, + windowBits, + memLevel, + strategy, + ZLIB_VERSION, + Z_Stream_Size); + end Deflate_Init; + + ------------------ + -- Inflate_Init -- + ------------------ + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is + begin + return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size); + end Inflate_Init; + + ------------------------ + -- Last_Error_Message -- + ------------------------ + + function Last_Error_Message (Strm : in Z_Stream) return String is + use Interfaces.C.Strings; + begin + if Strm.msg = Null_Ptr then + return ""; + else + return Value (Strm.msg); + end if; + end Last_Error_Message; + + ------------ + -- Set_In -- + ------------ + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_In := Buffer; + Strm.Avail_In := Size; + end Set_In; + + ------------------ + -- Set_Mem_Func -- + ------------------ + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func) is + begin + Strm.opaque := Opaque; + Strm.zalloc := Alloc; + Strm.zfree := Free; + end Set_Mem_Func; + + ------------- + -- Set_Out -- + ------------- + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_Out := Buffer; + Strm.Avail_Out := Size; + end Set_Out; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_In; + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_Out; + end Total_Out; + +end ZLib.Thin; diff --git a/contrib/zlib/contrib/ada/zlib-thin.ads b/contrib/zlib/contrib/ada/zlib-thin.ads new file mode 100644 index 000000000..810173cff --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib-thin.ads @@ -0,0 +1,450 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $ + +with Interfaces.C.Strings; + +with System; + +private package ZLib.Thin is + + -- From zconf.h + + MAX_MEM_LEVEL : constant := 9; -- zconf.h:105 + -- zconf.h:105 + MAX_WBITS : constant := 15; -- zconf.h:115 + -- 32K LZ77 window + -- zconf.h:115 + SEEK_SET : constant := 8#0000#; -- zconf.h:244 + -- Seek from beginning of file. + -- zconf.h:244 + SEEK_CUR : constant := 1; -- zconf.h:245 + -- Seek from current position. + -- zconf.h:245 + SEEK_END : constant := 2; -- zconf.h:246 + -- Set file pointer to EOF plus "offset" + -- zconf.h:246 + + type Byte is new Interfaces.C.unsigned_char; -- 8 bits + -- zconf.h:214 + type UInt is new Interfaces.C.unsigned; -- 16 bits or more + -- zconf.h:216 + type Int is new Interfaces.C.int; + + type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more + -- zconf.h:217 + subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr; + + type ULong_Access is access ULong; + type Int_Access is access Int; + + subtype Voidp is System.Address; -- zconf.h:232 + + subtype Byte_Access is Voidp; + + Nul : constant Voidp := System.Null_Address; + -- end from zconf + + Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125 + -- zlib.h:125 + Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126 + -- will be removed, use + -- Z_SYNC_FLUSH instead + -- zlib.h:126 + Z_SYNC_FLUSH : constant := 2; -- zlib.h:127 + -- zlib.h:127 + Z_FULL_FLUSH : constant := 3; -- zlib.h:128 + -- zlib.h:128 + Z_FINISH : constant := 4; -- zlib.h:129 + -- zlib.h:129 + Z_OK : constant := 8#0000#; -- zlib.h:132 + -- zlib.h:132 + Z_STREAM_END : constant := 1; -- zlib.h:133 + -- zlib.h:133 + Z_NEED_DICT : constant := 2; -- zlib.h:134 + -- zlib.h:134 + Z_ERRNO : constant := -1; -- zlib.h:135 + -- zlib.h:135 + Z_STREAM_ERROR : constant := -2; -- zlib.h:136 + -- zlib.h:136 + Z_DATA_ERROR : constant := -3; -- zlib.h:137 + -- zlib.h:137 + Z_MEM_ERROR : constant := -4; -- zlib.h:138 + -- zlib.h:138 + Z_BUF_ERROR : constant := -5; -- zlib.h:139 + -- zlib.h:139 + Z_VERSION_ERROR : constant := -6; -- zlib.h:140 + -- zlib.h:140 + Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145 + -- zlib.h:145 + Z_BEST_SPEED : constant := 1; -- zlib.h:146 + -- zlib.h:146 + Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147 + -- zlib.h:147 + Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148 + -- zlib.h:148 + Z_FILTERED : constant := 1; -- zlib.h:151 + -- zlib.h:151 + Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152 + -- zlib.h:152 + Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153 + -- zlib.h:153 + Z_BINARY : constant := 8#0000#; -- zlib.h:156 + -- zlib.h:156 + Z_ASCII : constant := 1; -- zlib.h:157 + -- zlib.h:157 + Z_UNKNOWN : constant := 2; -- zlib.h:158 + -- zlib.h:158 + Z_DEFLATED : constant := 8; -- zlib.h:161 + -- zlib.h:161 + Z_NULL : constant := 8#0000#; -- zlib.h:164 + -- for initializing zalloc, zfree, opaque + -- zlib.h:164 + type gzFile is new Voidp; -- zlib.h:646 + + type Z_Stream is private; + + type Z_Streamp is access all Z_Stream; -- zlib.h:89 + + type alloc_func is access function + (Opaque : Voidp; + Items : UInt; + Size : UInt) + return Voidp; -- zlib.h:63 + + type free_func is access procedure (opaque : Voidp; address : Voidp); + + function zlibVersion return Chars_Ptr; + + function Deflate (strm : Z_Streamp; flush : Int) return Int; + + function DeflateEnd (strm : Z_Streamp) return Int; + + function Inflate (strm : Z_Streamp; flush : Int) return Int; + + function InflateEnd (strm : Z_Streamp) return Int; + + function deflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; + + function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int; + -- zlib.h:478 + + function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495 + + function deflateParams + (strm : Z_Streamp; + level : Int; + strategy : Int) + return Int; -- zlib.h:506 + + function inflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; -- zlib.h:548 + + function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565 + + function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580 + + function compress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; -- zlib.h:601 + + function compress2 + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong; + level : Int) + return Int; -- zlib.h:615 + + function uncompress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; + + function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile; + + function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile; + + function gzsetparams + (file : gzFile; + level : Int; + strategy : Int) + return Int; + + function gzread + (file : gzFile; + buf : Voidp; + len : UInt) + return Int; + + function gzwrite + (file : in gzFile; + buf : in Voidp; + len : in UInt) + return Int; + + function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int; + + function gzputs (file : in gzFile; s : in Chars_Ptr) return Int; + + function gzgets + (file : gzFile; + buf : Chars_Ptr; + len : Int) + return Chars_Ptr; + + function gzputc (file : gzFile; char : Int) return Int; + + function gzgetc (file : gzFile) return Int; + + function gzflush (file : gzFile; flush : Int) return Int; + + function gzseek + (file : gzFile; + offset : Int; + whence : Int) + return Int; + + function gzrewind (file : gzFile) return Int; + + function gztell (file : gzFile) return Int; + + function gzeof (file : gzFile) return Int; + + function gzclose (file : gzFile) return Int; + + function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr; + + function adler32 + (adler : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function crc32 + (crc : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function deflateInit + (strm : Z_Streamp; + level : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function deflateInit2 + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int; + pragma Inline (Deflate_Init); + + function inflateInit + (strm : Z_Streamp; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function inflateInit2 + (strm : in Z_Streamp; + windowBits : in Int; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + + function inflateBackInit + (strm : in Z_Streamp; + windowBits : in Int; + window : in Byte_Access; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + -- Size of window have to be 2**windowBits. + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int; + pragma Inline (Inflate_Init); + + function zError (err : Int) return Chars_Ptr; + + function inflateSyncPoint (z : Z_Streamp) return Int; + + function get_crc_table return ULong_Access; + + -- Interface to the available fields of the z_stream structure. + -- The application must update next_in and avail_in when avail_in has + -- dropped to zero. It must update next_out and avail_out when avail_out + -- has dropped to zero. The application must initialize zalloc, zfree and + -- opaque before calling the init function. + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_In); + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_Out); + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func); + pragma Inline (Set_Mem_Func); + + function Last_Error_Message (Strm : in Z_Stream) return String; + pragma Inline (Last_Error_Message); + + function Avail_Out (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_Out); + + function Avail_In (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_In); + + function Total_In (Strm : in Z_Stream) return ULong; + pragma Inline (Total_In); + + function Total_Out (Strm : in Z_Stream) return ULong; + pragma Inline (Total_Out); + + function inflateCopy + (dest : in Z_Streamp; + Source : in Z_Streamp) + return Int; + + function compressBound (Source_Len : in ULong) return ULong; + + function deflateBound + (Strm : in Z_Streamp; + Source_Len : in ULong) + return ULong; + + function gzungetc (C : in Int; File : in gzFile) return Int; + + function zlibCompileFlags return ULong; + +private + + type Z_Stream is record -- zlib.h:68 + Next_In : Voidp := Nul; -- next input byte + Avail_In : UInt := 0; -- number of bytes available at next_in + Total_In : ULong := 0; -- total nb of input bytes read so far + Next_Out : Voidp := Nul; -- next output byte should be put there + Avail_Out : UInt := 0; -- remaining free space at next_out + Total_Out : ULong := 0; -- total nb of bytes output so far + msg : Chars_Ptr; -- last error message, NULL if no error + state : Voidp; -- not visible by applications + zalloc : alloc_func := null; -- used to allocate the internal state + zfree : free_func := null; -- used to free the internal state + opaque : Voidp; -- private data object passed to + -- zalloc and zfree + data_type : Int; -- best guess about the data type: + -- ascii or binary + adler : ULong; -- adler32 value of the uncompressed + -- data + reserved : ULong; -- reserved for future use + end record; + + pragma Convention (C, Z_Stream); + + pragma Import (C, zlibVersion, "zlibVersion"); + pragma Import (C, Deflate, "deflate"); + pragma Import (C, DeflateEnd, "deflateEnd"); + pragma Import (C, Inflate, "inflate"); + pragma Import (C, InflateEnd, "inflateEnd"); + pragma Import (C, deflateSetDictionary, "deflateSetDictionary"); + pragma Import (C, deflateCopy, "deflateCopy"); + pragma Import (C, deflateReset, "deflateReset"); + pragma Import (C, deflateParams, "deflateParams"); + pragma Import (C, inflateSetDictionary, "inflateSetDictionary"); + pragma Import (C, inflateSync, "inflateSync"); + pragma Import (C, inflateReset, "inflateReset"); + pragma Import (C, compress, "compress"); + pragma Import (C, compress2, "compress2"); + pragma Import (C, uncompress, "uncompress"); + pragma Import (C, gzopen, "gzopen"); + pragma Import (C, gzdopen, "gzdopen"); + pragma Import (C, gzsetparams, "gzsetparams"); + pragma Import (C, gzread, "gzread"); + pragma Import (C, gzwrite, "gzwrite"); + pragma Import (C, gzprintf, "gzprintf"); + pragma Import (C, gzputs, "gzputs"); + pragma Import (C, gzgets, "gzgets"); + pragma Import (C, gzputc, "gzputc"); + pragma Import (C, gzgetc, "gzgetc"); + pragma Import (C, gzflush, "gzflush"); + pragma Import (C, gzseek, "gzseek"); + pragma Import (C, gzrewind, "gzrewind"); + pragma Import (C, gztell, "gztell"); + pragma Import (C, gzeof, "gzeof"); + pragma Import (C, gzclose, "gzclose"); + pragma Import (C, gzerror, "gzerror"); + pragma Import (C, adler32, "adler32"); + pragma Import (C, crc32, "crc32"); + pragma Import (C, deflateInit, "deflateInit_"); + pragma Import (C, inflateInit, "inflateInit_"); + pragma Import (C, deflateInit2, "deflateInit2_"); + pragma Import (C, inflateInit2, "inflateInit2_"); + pragma Import (C, zError, "zError"); + pragma Import (C, inflateSyncPoint, "inflateSyncPoint"); + pragma Import (C, get_crc_table, "get_crc_table"); + + -- since zlib 1.2.0: + + pragma Import (C, inflateCopy, "inflateCopy"); + pragma Import (C, compressBound, "compressBound"); + pragma Import (C, deflateBound, "deflateBound"); + pragma Import (C, gzungetc, "gzungetc"); + pragma Import (C, zlibCompileFlags, "zlibCompileFlags"); + + pragma Import (C, inflateBackInit, "inflateBackInit_"); + + -- I stopped binding the inflateBack routines, because realize that + -- it does not support zlib and gzip headers for now, and have no + -- symmetric deflateBack routines. + -- ZLib-Ada is symmetric regarding deflate/inflate data transformation + -- and has a similar generic callback interface for the + -- deflate/inflate transformation based on the regular Deflate/Inflate + -- routines. + + -- pragma Import (C, inflateBack, "inflateBack"); + -- pragma Import (C, inflateBackEnd, "inflateBackEnd"); + +end ZLib.Thin; diff --git a/contrib/zlib/contrib/ada/zlib.adb b/contrib/zlib/contrib/ada/zlib.adb new file mode 100644 index 000000000..8b6fd686a --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib.adb @@ -0,0 +1,701 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Exceptions; +with Ada.Unchecked_Conversion; +with Ada.Unchecked_Deallocation; + +with Interfaces.C.Strings; + +with ZLib.Thin; + +package body ZLib is + + use type Thin.Int; + + type Z_Stream is new Thin.Z_Stream; + + type Return_Code_Enum is + (OK, + STREAM_END, + NEED_DICT, + ERRNO, + STREAM_ERROR, + DATA_ERROR, + MEM_ERROR, + BUF_ERROR, + VERSION_ERROR); + + type Flate_Step_Function is access + function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int; + pragma Convention (C, Flate_Step_Function); + + type Flate_End_Function is access + function (Ctrm : in Thin.Z_Streamp) return Thin.Int; + pragma Convention (C, Flate_End_Function); + + type Flate_Type is record + Step : Flate_Step_Function; + Done : Flate_End_Function; + end record; + + subtype Footer_Array is Stream_Element_Array (1 .. 8); + + Simple_GZip_Header : constant Stream_Element_Array (1 .. 10) + := (16#1f#, 16#8b#, -- Magic header + 16#08#, -- Z_DEFLATED + 16#00#, -- Flags + 16#00#, 16#00#, 16#00#, 16#00#, -- Time + 16#00#, -- XFlags + 16#03# -- OS code + ); + -- The simplest gzip header is not for informational, but just for + -- gzip format compatibility. + -- Note that some code below is using assumption + -- Simple_GZip_Header'Last > Footer_Array'Last, so do not make + -- Simple_GZip_Header'Last <= Footer_Array'Last. + + Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum + := (0 => OK, + 1 => STREAM_END, + 2 => NEED_DICT, + -1 => ERRNO, + -2 => STREAM_ERROR, + -3 => DATA_ERROR, + -4 => MEM_ERROR, + -5 => BUF_ERROR, + -6 => VERSION_ERROR); + + Flate : constant array (Boolean) of Flate_Type + := (True => (Step => Thin.Deflate'Access, + Done => Thin.DeflateEnd'Access), + False => (Step => Thin.Inflate'Access, + Done => Thin.InflateEnd'Access)); + + Flush_Finish : constant array (Boolean) of Flush_Mode + := (True => Finish, False => No_Flush); + + procedure Raise_Error (Stream : in Z_Stream); + pragma Inline (Raise_Error); + + procedure Raise_Error (Message : in String); + pragma Inline (Raise_Error); + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int); + + procedure Free is new Ada.Unchecked_Deallocation + (Z_Stream, Z_Stream_Access); + + function To_Thin_Access is new Ada.Unchecked_Conversion + (Z_Stream_Access, Thin.Z_Streamp); + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Separate translate routine for make gzip header. + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- translate routine without additional headers. + + ----------------- + -- Check_Error -- + ----------------- + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is + use type Thin.Int; + begin + if Code /= Thin.Z_OK then + Raise_Error + (Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Last_Error_Message (Stream)); + end if; + end Check_Error; + + ----------- + -- Close -- + ----------- + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False) + is + Code : Thin.Int; + begin + if not Ignore_Error and then not Is_Open (Filter) then + raise Status_Error; + end if; + + Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm)); + + if Ignore_Error or else Code = Thin.Z_OK then + Free (Filter.Strm); + else + declare + Error_Message : constant String + := Last_Error_Message (Filter.Strm.all); + begin + Free (Filter.Strm); + Ada.Exceptions.Raise_Exception + (ZLib_Error'Identity, + Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Error_Message); + end; + end if; + end Close; + + ----------- + -- CRC32 -- + ----------- + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32 + is + use Thin; + begin + return Unsigned_32 (crc32 (ULong (CRC), + Data'Address, + Data'Length)); + end CRC32; + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) is + begin + CRC := CRC32 (CRC, Data); + end CRC32; + + ------------------ + -- Deflate_Init -- + ------------------ + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + -- We allow ZLib to make header only in case of default header type. + -- Otherwise we would either do header by ourselfs, or do not do + -- header at all. + + if Header = None or else Header = GZip then + Win_Bits := -Win_Bits; + end if; + + -- For the GZip CRC calculation and make headers. + + if Header = GZip then + Filter.CRC := 0; + Filter.Offset := Simple_GZip_Header'First; + else + Filter.Offset := Simple_GZip_Header'Last + 1; + end if; + + Filter.Strm := new Z_Stream; + Filter.Compression := True; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Deflate_Init + (To_Thin_Access (Filter.Strm), + Level => Thin.Int (Level), + method => Thin.Int (Method), + windowBits => Win_Bits, + memLevel => Thin.Int (Memory_Level), + strategy => Thin.Int (Strategy)) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Deflate_Init; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + No_Data : Stream_Element_Array := (1 .. 0 => 0); + Last : Stream_Element_Offset; + begin + Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush); + end Flush; + + ----------------------- + -- Generic_Translate -- + ----------------------- + + procedure Generic_Translate + (Filter : in out ZLib.Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size) + is + In_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (In_Buffer_Size)); + Out_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (Out_Buffer_Size)); + Last : Stream_Element_Offset; + In_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + begin + Main : loop + Data_In (In_Buffer, Last); + + In_First := In_Buffer'First; + + loop + Translate + (Filter => Filter, + In_Data => In_Buffer (In_First .. Last), + In_Last => In_Last, + Out_Data => Out_Buffer, + Out_Last => Out_Last, + Flush => Flush_Finish (Last < In_Buffer'First)); + + if Out_Buffer'First <= Out_Last then + Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last)); + end if; + + exit Main when Stream_End (Filter); + + -- The end of in buffer. + + exit when In_Last = Last; + + In_First := In_Last + 1; + end loop; + end loop Main; + + end Generic_Translate; + + ------------------ + -- Inflate_Init -- + ------------------ + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + + procedure Check_Version; + -- Check the latest header types compatibility. + + procedure Check_Version is + begin + if Version <= "1.1.4" then + Raise_Error + ("Inflate header type " & Header_Type'Image (Header) + & " incompatible with ZLib version " & Version); + end if; + end Check_Version; + + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + case Header is + when None => + Check_Version; + + -- Inflate data without headers determined + -- by negative Win_Bits. + + Win_Bits := -Win_Bits; + when GZip => + Check_Version; + + -- Inflate gzip data defined by flag 16. + + Win_Bits := Win_Bits + 16; + when Auto => + Check_Version; + + -- Inflate with automatic detection + -- of gzip or native header defined by flag 32. + + Win_Bits := Win_Bits + 32; + when Default => null; + end case; + + Filter.Strm := new Z_Stream; + Filter.Compression := False; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Inflate_Init + (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Inflate_Init; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Filter : in Filter_Type) return Boolean is + begin + return Filter.Strm /= null; + end Is_Open; + + ----------------- + -- Raise_Error -- + ----------------- + + procedure Raise_Error (Message : in String) is + begin + Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message); + end Raise_Error; + + procedure Raise_Error (Stream : in Z_Stream) is + begin + Raise_Error (Last_Error_Message (Stream)); + end Raise_Error; + + ---------- + -- Read -- + ---------- + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush) + is + In_Last : Stream_Element_Offset; + Item_First : Ada.Streams.Stream_Element_Offset := Item'First; + V_Flush : Flush_Mode := Flush; + + begin + pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1); + pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last); + + loop + if Rest_Last = Buffer'First - 1 then + V_Flush := Finish; + + elsif Rest_First > Rest_Last then + Read (Buffer, Rest_Last); + Rest_First := Buffer'First; + + if Rest_Last < Buffer'First then + V_Flush := Finish; + end if; + end if; + + Translate + (Filter => Filter, + In_Data => Buffer (Rest_First .. Rest_Last), + In_Last => In_Last, + Out_Data => Item (Item_First .. Item'Last), + Out_Last => Last, + Flush => V_Flush); + + Rest_First := In_Last + 1; + + exit when Stream_End (Filter) + or else Last = Item'Last + or else (Last >= Item'First and then Allow_Read_Some); + + Item_First := Last + 1; + end loop; + end Read; + + ---------------- + -- Stream_End -- + ---------------- + + function Stream_End (Filter : in Filter_Type) return Boolean is + begin + if Filter.Header = GZip and Filter.Compression then + return Filter.Stream_End + and then Filter.Offset = Footer_Array'Last + 1; + else + return Filter.Stream_End; + end if; + end Stream_End; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all)); + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all)); + end Total_Out; + + --------------- + -- Translate -- + --------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) is + begin + if Filter.Header = GZip and then Filter.Compression then + Translate_GZip + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + else + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + end if; + end Translate; + + -------------------- + -- Translate_Auto -- + -------------------- + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + use type Thin.Int; + Code : Thin.Int; + + begin + if not Is_Open (Filter) then + raise Status_Error; + end if; + + if Out_Data'Length = 0 and then In_Data'Length = 0 then + raise Constraint_Error; + end if; + + Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length); + Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length); + + Code := Flate (Filter.Compression).Step + (To_Thin_Access (Filter.Strm), + Thin.Int (Flush)); + + if Code = Thin.Z_STREAM_END then + Filter.Stream_End := True; + else + Check_Error (Filter.Strm.all, Code); + end if; + + In_Last := In_Data'Last + - Stream_Element_Offset (Avail_In (Filter.Strm.all)); + Out_Last := Out_Data'Last + - Stream_Element_Offset (Avail_Out (Filter.Strm.all)); + end Translate_Auto; + + -------------------- + -- Translate_GZip -- + -------------------- + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + Out_First : Stream_Element_Offset; + + procedure Add_Data (Data : in Stream_Element_Array); + -- Add data to stream from the Filter.Offset till necessary, + -- used for add gzip headr/footer. + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32); + pragma Inline (Put_32); + + -------------- + -- Add_Data -- + -------------- + + procedure Add_Data (Data : in Stream_Element_Array) is + Data_First : Stream_Element_Offset renames Filter.Offset; + Data_Last : Stream_Element_Offset; + Data_Len : Stream_Element_Offset; -- -1 + Out_Len : Stream_Element_Offset; -- -1 + begin + Out_First := Out_Last + 1; + + if Data_First > Data'Last then + return; + end if; + + Data_Len := Data'Last - Data_First; + Out_Len := Out_Data'Last - Out_First; + + if Data_Len <= Out_Len then + Out_Last := Out_First + Data_Len; + Data_Last := Data'Last; + else + Out_Last := Out_Data'Last; + Data_Last := Data_First + Out_Len; + end if; + + Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last); + + Data_First := Data_Last + 1; + Out_First := Out_Last + 1; + end Add_Data; + + ------------ + -- Put_32 -- + ------------ + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32) + is + D : Unsigned_32 := Data; + begin + for J in Item'First .. Item'First + 3 loop + Item (J) := Stream_Element (D and 16#FF#); + D := Shift_Right (D, 8); + end loop; + end Put_32; + + begin + Out_Last := Out_Data'First - 1; + + if not Filter.Stream_End then + Add_Data (Simple_GZip_Header); + + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data (Out_First .. Out_Data'Last), + Out_Last => Out_Last, + Flush => Flush); + + CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last)); + end if; + + if Filter.Stream_End and then Out_Last <= Out_Data'Last then + -- This detection method would work only when + -- Simple_GZip_Header'Last > Footer_Array'Last + + if Filter.Offset = Simple_GZip_Header'Last + 1 then + Filter.Offset := Footer_Array'First; + end if; + + declare + Footer : Footer_Array; + begin + Put_32 (Footer, Filter.CRC); + Put_32 (Footer (Footer'First + 4 .. Footer'Last), + Unsigned_32 (Total_In (Filter))); + Add_Data (Footer); + end; + end if; + end Translate_GZip; + + ------------- + -- Version -- + ------------- + + function Version return String is + begin + return Interfaces.C.Strings.Value (Thin.zlibVersion); + end Version; + + ----------- + -- Write -- + ----------- + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + In_Last : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset := Item'First; + begin + if Item'Length = 0 and Flush = No_Flush then + return; + end if; + + loop + Translate + (Filter => Filter, + In_Data => Item (In_First .. Item'Last), + In_Last => In_Last, + Out_Data => Buffer, + Out_Last => Out_Last, + Flush => Flush); + + if Out_Last >= Buffer'First then + Write (Buffer (1 .. Out_Last)); + end if; + + exit when In_Last = Item'Last or Stream_End (Filter); + + In_First := In_Last + 1; + end loop; + end Write; + +end ZLib; diff --git a/contrib/zlib/contrib/ada/zlib.ads b/contrib/zlib/contrib/ada/zlib.ads new file mode 100644 index 000000000..79ffc4095 --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib.ads @@ -0,0 +1,328 @@ +------------------------------------------------------------------------------ +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- This library is free software; you can redistribute it and/or modify -- +-- it under the terms of the GNU General Public License as published by -- +-- the Free Software Foundation; either version 2 of the License, or (at -- +-- your option) any later version. -- +-- -- +-- This library is distributed in the hope that it will be useful, but -- +-- WITHOUT ANY WARRANTY; without even the implied warranty of -- +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- +-- General Public License for more details. -- +-- -- +-- You should have received a copy of the GNU General Public License -- +-- along with this library; if not, write to the Free Software Foundation, -- +-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +------------------------------------------------------------------------------ + +-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Streams; + +with Interfaces; + +package ZLib is + + ZLib_Error : exception; + Status_Error : exception; + + type Compression_Level is new Integer range -1 .. 9; + + type Flush_Mode is private; + + type Compression_Method is private; + + type Window_Bits_Type is new Integer range 8 .. 15; + + type Memory_Level_Type is new Integer range 1 .. 9; + + type Unsigned_32 is new Interfaces.Unsigned_32; + + type Strategy_Type is private; + + type Header_Type is (None, Auto, Default, GZip); + -- Header type usage have a some limitation for inflate. + -- See comment for Inflate_Init. + + subtype Count is Ada.Streams.Stream_Element_Count; + + Default_Memory_Level : constant Memory_Level_Type := 8; + Default_Window_Bits : constant Window_Bits_Type := 15; + + ---------------------------------- + -- Compression method constants -- + ---------------------------------- + + Deflated : constant Compression_Method; + -- Only one method allowed in this ZLib version + + --------------------------------- + -- Compression level constants -- + --------------------------------- + + No_Compression : constant Compression_Level := 0; + Best_Speed : constant Compression_Level := 1; + Best_Compression : constant Compression_Level := 9; + Default_Compression : constant Compression_Level := -1; + + -------------------------- + -- Flush mode constants -- + -------------------------- + + No_Flush : constant Flush_Mode; + -- Regular way for compression, no flush + + Partial_Flush : constant Flush_Mode; + -- Will be removed, use Z_SYNC_FLUSH instead + + Sync_Flush : constant Flush_Mode; + -- All pending output is flushed to the output buffer and the output + -- is aligned on a byte boundary, so that the decompressor can get all + -- input data available so far. (In particular avail_in is zero after the + -- call if enough output space has been provided before the call.) + -- Flushing may degrade compression for some compression algorithms and so + -- it should be used only when necessary. + + Block_Flush : constant Flush_Mode; + -- Z_BLOCK requests that inflate() stop + -- if and when it get to the next deflate block boundary. When decoding the + -- zlib or gzip format, this will cause inflate() to return immediately + -- after the header and before the first block. When doing a raw inflate, + -- inflate() will go ahead and process the first block, and will return + -- when it gets to the end of that block, or when it runs out of data. + + Full_Flush : constant Flush_Mode; + -- All output is flushed as with SYNC_FLUSH, and the compression state + -- is reset so that decompression can restart from this point if previous + -- compressed data has been damaged or if random access is desired. Using + -- Full_Flush too often can seriously degrade the compression. + + Finish : constant Flush_Mode; + -- Just for tell the compressor that input data is complete. + + ------------------------------------ + -- Compression strategy constants -- + ------------------------------------ + + -- RLE stategy could be used only in version 1.2.0 and later. + + Filtered : constant Strategy_Type; + Huffman_Only : constant Strategy_Type; + RLE : constant Strategy_Type; + Default_Strategy : constant Strategy_Type; + + Default_Buffer_Size : constant := 4096; + + type Filter_Type is tagged limited private; + -- The filter is for compression and for decompression. + -- The usage of the type is depend of its initialization. + + function Version return String; + pragma Inline (Version); + -- Return string representation of the ZLib version. + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default); + -- Compressor initialization. + -- When Header parameter is Auto or Default, then default zlib header + -- would be provided for compressed data. + -- When Header is GZip, then gzip header would be set instead of + -- default header. + -- When Header is None, no header would be set for compressed data. + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default); + -- Decompressor initialization. + -- Default header type mean that ZLib default header is expecting in the + -- input compressed stream. + -- Header type None mean that no header is expecting in the input stream. + -- GZip header type mean that GZip header is expecting in the + -- input compressed stream. + -- Auto header type mean that header type (GZip or Native) would be + -- detected automatically in the input stream. + -- Note that header types parameter values None, GZip and Auto are + -- supported for inflate routine only in ZLib versions 1.2.0.2 and later. + -- Deflate_Init is supporting all header types. + + function Is_Open (Filter : in Filter_Type) return Boolean; + pragma Inline (Is_Open); + -- Is the filter opened for compression or decompression. + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False); + -- Closing the compression or decompressor. + -- If stream is closing before the complete and Ignore_Error is False, + -- The exception would be raised. + + generic + with procedure Data_In + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + with procedure Data_Out + (Item : in Ada.Streams.Stream_Element_Array); + procedure Generic_Translate + (Filter : in out Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size); + -- Compress/decompress data fetch from Data_In routine and pass the result + -- to the Data_Out routine. User should provide Data_In and Data_Out + -- for compression/decompression data flow. + -- Compression or decompression depend on Filter initialization. + + function Total_In (Filter : in Filter_Type) return Count; + pragma Inline (Total_In); + -- Returns total number of input bytes read so far + + function Total_Out (Filter : in Filter_Type) return Count; + pragma Inline (Total_Out); + -- Returns total number of bytes output so far + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32; + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array); + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + ------------------------------------------------- + -- Below is more complex low level routines. -- + ------------------------------------------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Compress/decompress the In_Data buffer and place the result into + -- Out_Data. In_Last is the index of last element from In_Data accepted by + -- the Filter. Out_Last is the last element of the received data from + -- Filter. To tell the filter that incoming data are complete put the + -- Flush parameter to Finish. + + function Stream_End (Filter : in Filter_Type) return Boolean; + pragma Inline (Stream_End); + -- Return the true when the stream is complete. + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + pragma Inline (Flush); + -- Flushing the data from the compressor. + + generic + with procedure Write + (Item : in Ada.Streams.Stream_Element_Array); + -- User should provide this routine for accept + -- compressed/decompressed data. + + Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + -- Buffer size for Write user routine. + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from Item to the generic parameter procedure + -- Write. Output buffer size could be set in Buffer_Size generic parameter. + + generic + with procedure Read + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + -- User should provide data for compression/decompression + -- thru this routine. + + Buffer : in out Ada.Streams.Stream_Element_Array; + -- Buffer for keep remaining data from the previous + -- back read. + + Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset; + -- Rest_First have to be initialized to Buffer'Last + 1 + -- Rest_Last have to be initialized to Buffer'Last + -- before usage. + + Allow_Read_Some : in Boolean := False; + -- Is it allowed to return Last < Item'Last before end of data. + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from generic parameter procedure Read to the + -- Item. User should provide Buffer and initialized Rest_First, Rest_Last + -- indicators. If Allow_Read_Some is True, Read routines could return + -- Last < Item'Last only at end of stream. + +private + + use Ada.Streams; + + pragma Assert (Ada.Streams.Stream_Element'Size = 8); + pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8); + + type Flush_Mode is new Integer range 0 .. 5; + + type Compression_Method is new Integer range 8 .. 8; + + type Strategy_Type is new Integer range 0 .. 3; + + No_Flush : constant Flush_Mode := 0; + Partial_Flush : constant Flush_Mode := 1; + Sync_Flush : constant Flush_Mode := 2; + Full_Flush : constant Flush_Mode := 3; + Finish : constant Flush_Mode := 4; + Block_Flush : constant Flush_Mode := 5; + + Filtered : constant Strategy_Type := 1; + Huffman_Only : constant Strategy_Type := 2; + RLE : constant Strategy_Type := 3; + Default_Strategy : constant Strategy_Type := 0; + + Deflated : constant Compression_Method := 8; + + type Z_Stream; + + type Z_Stream_Access is access all Z_Stream; + + type Filter_Type is tagged limited record + Strm : Z_Stream_Access; + Compression : Boolean; + Stream_End : Boolean; + Header : Header_Type; + CRC : Unsigned_32; + Offset : Stream_Element_Offset; + -- Offset for gzip header/footer output. + end record; + +end ZLib; diff --git a/contrib/zlib/contrib/ada/zlib.gpr b/contrib/zlib/contrib/ada/zlib.gpr new file mode 100644 index 000000000..296b22aa9 --- /dev/null +++ b/contrib/zlib/contrib/ada/zlib.gpr @@ -0,0 +1,20 @@ +project Zlib is + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Object_Dir use "."; + for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo"); + + package Compiler is + for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst"); + end Compiler; + + package Linker is + for Default_Switches ("ada") use ("-lz"); + end Linker; + + package Builder is + for Default_Switches ("ada") use ("-s", "-gnatQ"); + end Builder; + +end Zlib; diff --git a/contrib/zlib/contrib/amd64/amd64-match.S b/contrib/zlib/contrib/amd64/amd64-match.S new file mode 100644 index 000000000..81d4a1c94 --- /dev/null +++ b/contrib/zlib/contrib/amd64/amd64-match.S @@ -0,0 +1,452 @@ +/* + * match.S -- optimized version of longest_match() + * based on the similar work by Gilles Vollant, and Brian Raiter, written 1998 + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the BSD License. Use by owners of Che Guevarra + * parafernalia is prohibited, where possible, and highly discouraged + * elsewhere. + */ + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +#define scanend ebx +#define scanendw bx +#define chainlenwmask edx /* high word: current chain len low word: s->wmask */ +#define curmatch rsi +#define curmatchd esi +#define windowbestlen r8 +#define scanalign r9 +#define scanalignd r9d +#define window r10 +#define bestlen r11 +#define bestlend r11d +#define scanstart r12d +#define scanstartw r12w +#define scan r13 +#define nicematch r14d +#define limit r15 +#define limitd r15d +#define prev rcx + +/* + * The 258 is a "magic number, not a parameter -- changing it + * breaks the hell loose + */ +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ +#define LocalVarsSize (112) +#define _chainlenwmask ( 8-LocalVarsSize)(%rsp) +#define _windowbestlen (16-LocalVarsSize)(%rsp) +#define save_r14 (24-LocalVarsSize)(%rsp) +#define save_rsi (32-LocalVarsSize)(%rsp) +#define save_rbx (40-LocalVarsSize)(%rsp) +#define save_r12 (56-LocalVarsSize)(%rsp) +#define save_r13 (64-LocalVarsSize)(%rsp) +#define save_r15 (80-LocalVarsSize)(%rsp) + + +.globl match_init, longest_match + +/* + * On AMD64 the first argument of a function (in our case -- the pointer to + * deflate_state structure) is passed in %rdi, hence our offsets below are + * all off of that. + */ + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} + +*/ + + +/* + to compile for XCode 3.2 on MacOSX x86_64 + - run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S" + */ + + +#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE +#define dsWSize ( 68)(%rdi) +#define dsWMask ( 76)(%rdi) +#define dsWindow ( 80)(%rdi) +#define dsPrev ( 96)(%rdi) +#define dsMatchLen (144)(%rdi) +#define dsPrevMatch (148)(%rdi) +#define dsStrStart (156)(%rdi) +#define dsMatchStart (160)(%rdi) +#define dsLookahead (164)(%rdi) +#define dsPrevLen (168)(%rdi) +#define dsMaxChainLen (172)(%rdi) +#define dsGoodMatch (188)(%rdi) +#define dsNiceMatch (192)(%rdi) + +#else + +#ifndef STRUCT_OFFSET +# define STRUCT_OFFSET (0) +#endif + + +#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi) +#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi) +#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi) +#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi) +#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi) +#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi) +#define dsStrStart (148 + STRUCT_OFFSET)(%rdi) +#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi) +#define dsLookahead (156 + STRUCT_OFFSET)(%rdi) +#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi) +#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi) +#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi) +#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi) + +#endif + + + + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ + +longest_match: +/* + * Retrieve the function arguments. %curmatch will hold cur_match + * throughout the entire function (passed via rsi on amd64). + * rdi will hold the pointer to the deflate_state (first arg on amd64) + */ + mov %rsi, save_rsi + mov %rbx, save_rbx + mov %r12, save_r12 + mov %r13, save_r13 + mov %r14, save_r14 + mov %r15, save_r15 + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen, %eax + movl dsGoodMatch, %ebx + cmpl %ebx, %eax + movl dsWMask, %eax + movl dsMaxChainLen, %chainlenwmask + jl LastMatchGood + shrl $2, %chainlenwmask +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %chainlenwmask + shll $16, %chainlenwmask + orl %eax, %chainlenwmask + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch, %eax + movl dsLookahead, %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, %nicematch + +/* register Bytef *scan = s->window + s->strstart; */ + + mov dsWindow, %window + movl dsStrStart, %limitd + lea (%limit, %window), %scan + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + mov %scan, %scanalign + negl %scanalignd + andl $3, %scanalignd + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize, %eax + subl $MIN_LOOKAHEAD, %eax + xorl %ecx, %ecx + subl %eax, %limitd + cmovng %ecx, %limitd + +/* int best_len = s->prev_length; */ + + movl dsPrevLen, %bestlend + +/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */ + + lea (%window, %bestlen), %windowbestlen + mov %windowbestlen, _windowbestlen + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%scan), %scanstart + movzwl -1(%scan, %bestlen), %scanend + mov dsPrev, %prev + +/* Jump into the main loop. */ + + movl %chainlenwmask, _chainlenwmask + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + */ +LookupLoop: + andl %chainlenwmask, %curmatchd + movzwl (%prev, %curmatch, 2), %curmatchd + cmpl %limitd, %curmatchd + jbe LeaveNow + subl $0x00010000, %chainlenwmask + js LeaveNow +LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw + jne LookupLoop + cmpw %scanstartw, (%window, %curmatch) + jne LookupLoop + +/* Store the current value of chainlen. */ + movl %chainlenwmask, _chainlenwmask + +/* %scan is the string under scrutiny, and %prev to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + mov $(-MAX_MATCH_8), %rdx + lea (%curmatch, %window), %windowbestlen + lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen + lea MAX_MATCH_8(%scan, %scanalign), %prev + +/* the prefetching below makes very little difference... */ + prefetcht1 (%windowbestlen, %rdx) + prefetcht1 (%prev, %rdx) + +/* + * Test the strings for equality, 8 bytes at a time. At the end, + * adjust %rdx so that it is offset to the exact byte that mismatched. + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance -- unrolling it, for example, makes no difference. + */ + +#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */ + +LoopCmps: +#ifdef USE_SSE + /* Preload the SSE registers */ + movdqu (%windowbestlen, %rdx), %xmm1 + movdqu (%prev, %rdx), %xmm2 + pcmpeqb %xmm2, %xmm1 + movdqu 16(%windowbestlen, %rdx), %xmm3 + movdqu 16(%prev, %rdx), %xmm4 + pcmpeqb %xmm4, %xmm3 + movdqu 32(%windowbestlen, %rdx), %xmm5 + movdqu 32(%prev, %rdx), %xmm6 + pcmpeqb %xmm6, %xmm5 + movdqu 48(%windowbestlen, %rdx), %xmm7 + movdqu 48(%prev, %rdx), %xmm8 + pcmpeqb %xmm8, %xmm7 + + /* Check the comparisions' results */ + pmovmskb %xmm1, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + /* this is the only iteration of the loop with a possibility of having + incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40 + and (0x40*4)+8=0x108 */ + add $8, %rdx + jz LenMaximum + add $8, %rdx + + + pmovmskb %xmm3, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + + add $16, %rdx + + + pmovmskb %xmm5, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + add $16, %rdx + + + pmovmskb %xmm7, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + add $16, %rdx + + jmp LoopCmps +LeaveLoopCmps: add %rax, %rdx +#else + mov (%windowbestlen, %rdx), %rax + xor (%prev, %rdx), %rax + jnz LeaveLoopCmps + + mov 8(%windowbestlen, %rdx), %rax + xor 8(%prev, %rdx), %rax + jnz LeaveLoopCmps8 + + mov 16(%windowbestlen, %rdx), %rax + xor 16(%prev, %rdx), %rax + jnz LeaveLoopCmps16 + + add $24, %rdx + jnz LoopCmps + jmp LenMaximum +# if 0 +/* + * This three-liner is tantalizingly simple, but bsf is a slow instruction, + * and the complicated alternative down below is quite a bit faster. Sad... + */ + +LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */ + shrl $3, %eax /* divide by 8 to get the byte */ + add %rax, %rdx +# else +LeaveLoopCmps16: + add $8, %rdx +LeaveLoopCmps8: + add $8, %rdx +LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */ + jnz Check16 + add $4, %rdx + shr $32, %rax +Check16: testw $0xFFFF, %ax + jnz LenLower + add $2, %rdx + shrl $16, %eax +LenLower: subb $1, %al + adc $0, %rdx +# endif +#endif + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%prev, %rdx), %rax + sub %scan, %rax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + cmpl %bestlend, %eax + jg LongerMatch + mov _windowbestlen, %windowbestlen + mov dsPrev, %prev + movl _chainlenwmask, %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: + movl %eax, %bestlend + movl %curmatchd, dsMatchStart + cmpl %nicematch, %eax + jge LeaveNow + + lea (%window, %bestlen), %windowbestlen + mov %windowbestlen, _windowbestlen + + movzwl -1(%scan, %rax), %scanend + mov dsPrev, %prev + movl _chainlenwmask, %chainlenwmask + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: + movl $MAX_MATCH, %bestlend + movl %curmatchd, dsMatchStart + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl dsLookahead, %eax + cmpl %eax, %bestlend + cmovngl %bestlend, %eax +LookaheadRet: + +/* Restore the registers and return from whence we came. */ + + mov save_rsi, %rsi + mov save_rbx, %rbx + mov save_r12, %r12 + mov save_r13, %r13 + mov save_r14, %r14 + mov save_r15, %r15 + + ret + +match_init: ret diff --git a/contrib/zlib/contrib/asm686/README.686 b/contrib/zlib/contrib/asm686/README.686 new file mode 100644 index 000000000..a0bf3bea4 --- /dev/null +++ b/contrib/zlib/contrib/asm686/README.686 @@ -0,0 +1,51 @@ +This is a patched version of zlib, modified to use +Pentium-Pro-optimized assembly code in the deflation algorithm. The +files changed/added by this patch are: + +README.686 +match.S + +The speedup that this patch provides varies, depending on whether the +compiler used to build the original version of zlib falls afoul of the +PPro's speed traps. My own tests show a speedup of around 10-20% at +the default compression level, and 20-30% using -9, against a version +compiled using gcc 2.7.2.3. Your mileage may vary. + +Note that this code has been tailored for the PPro/PII in particular, +and will not perform particuarly well on a Pentium. + +If you are using an assembler other than GNU as, you will have to +translate match.S to use your assembler's syntax. (Have fun.) + +Brian Raiter +breadbox@muppetlabs.com +April, 1998 + + +Added for zlib 1.1.3: + +The patches come from +http://www.muppetlabs.com/~breadbox/software/assembly.html + +To compile zlib with this asm file, copy match.S to the zlib directory +then do: + +CFLAGS="-O3 -DASMV" ./configure +make OBJA=match.o + + +Update: + +I've been ignoring these assembly routines for years, believing that +gcc's generated code had caught up with it sometime around gcc 2.95 +and the major rearchitecting of the Pentium 4. However, I recently +learned that, despite what I believed, this code still has some life +in it. On the Pentium 4 and AMD64 chips, it continues to run about 8% +faster than the code produced by gcc 4.1. + +In acknowledgement of its continuing usefulness, I've altered the +license to match that of the rest of zlib. Share and Enjoy! + +Brian Raiter +breadbox@muppetlabs.com +April, 2007 diff --git a/contrib/zlib/contrib/asm686/match.S b/contrib/zlib/contrib/asm686/match.S new file mode 100644 index 000000000..fa4210927 --- /dev/null +++ b/contrib/zlib/contrib/asm686/match.S @@ -0,0 +1,357 @@ +/* match.S -- x86 assembly version of the zlib longest_match() function. + * Optimized for the Intel 686 chips (PPro and later). + * + * Copyright (C) 1998, 2007 Brian Raiter + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the author 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 NO_UNDERLINE +#define match_init _match_init +#define longest_match _longest_match +#endif + +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ + +#define chainlenwmask 0 /* high word: current chain len */ + /* low word: s->wmask */ +#define window 4 /* local copy of s->window */ +#define windowbestlen 8 /* s->window + bestlen */ +#define scanstart 16 /* first two bytes of string */ +#define scanend 12 /* last two bytes of string */ +#define scanalign 20 /* dword-misalignment of string */ +#define nicematch 24 /* a good enough match size */ +#define bestlen 28 /* size of best match so far */ +#define scan 32 /* ptr to string wanting match */ + +#define LocalVarsSize (36) +/* saved ebx 36 */ +/* saved edi 40 */ +/* saved esi 44 */ +/* saved ebp 48 */ +/* return address 52 */ +#define deflatestate 56 /* the function arguments */ +#define curmatch 60 + +/* All the +zlib1222add offsets are due to the addition of fields + * in zlib in the deflate_state structure since the asm code was first written + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + */ + +#define zlib1222add (8) + +#define dsWSize (36+zlib1222add) +#define dsWMask (44+zlib1222add) +#define dsWindow (48+zlib1222add) +#define dsPrev (56+zlib1222add) +#define dsMatchLen (88+zlib1222add) +#define dsPrevMatch (92+zlib1222add) +#define dsStrStart (100+zlib1222add) +#define dsMatchStart (104+zlib1222add) +#define dsLookahead (108+zlib1222add) +#define dsPrevLen (112+zlib1222add) +#define dsMaxChainLen (116+zlib1222add) +#define dsGoodMatch (132+zlib1222add) +#define dsNiceMatch (136+zlib1222add) + + +.file "match.S" + +.globl match_init, longest_match + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ +.cfi_sections .debug_frame + +longest_match: + +.cfi_startproc +/* Save registers that the compiler may be using, and adjust %esp to */ +/* make room for our stack frame. */ + + pushl %ebp + .cfi_def_cfa_offset 8 + .cfi_offset ebp, -8 + pushl %edi + .cfi_def_cfa_offset 12 + pushl %esi + .cfi_def_cfa_offset 16 + pushl %ebx + .cfi_def_cfa_offset 20 + subl $LocalVarsSize, %esp + .cfi_def_cfa_offset LocalVarsSize+20 + +/* Retrieve the function arguments. %ecx will hold cur_match */ +/* throughout the entire function. %edx will hold the pointer to the */ +/* deflate_state structure during the function's setup (before */ +/* entering the main loop). */ + + movl deflatestate(%esp), %edx + movl curmatch(%esp), %ecx + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen(%edx), %eax + movl dsGoodMatch(%edx), %ebx + cmpl %ebx, %eax + movl dsWMask(%edx), %eax + movl dsMaxChainLen(%edx), %ebx + jl LastMatchGood + shrl $2, %ebx +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %ebx + shll $16, %ebx + orl %eax, %ebx + movl %ebx, chainlenwmask(%esp) + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch(%edx), %eax + movl dsLookahead(%edx), %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, nicematch(%esp) + +/* register Bytef *scan = s->window + s->strstart; */ + + movl dsWindow(%edx), %esi + movl %esi, window(%esp) + movl dsStrStart(%edx), %ebp + lea (%esi,%ebp), %edi + movl %edi, scan(%esp) + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + movl %edi, %eax + negl %eax + andl $3, %eax + movl %eax, scanalign(%esp) + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize(%edx), %eax + subl $MIN_LOOKAHEAD, %eax + subl %eax, %ebp + jg LimitPositive + xorl %ebp, %ebp +LimitPositive: + +/* int best_len = s->prev_length; */ + + movl dsPrevLen(%edx), %eax + movl %eax, bestlen(%esp) + +/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ + + addl %eax, %esi + movl %esi, windowbestlen(%esp) + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%edi), %ebx + movl %ebx, scanstart(%esp) + movzwl -1(%edi,%eax), %ebx + movl %ebx, scanend(%esp) + movl dsPrev(%edx), %edi + +/* Jump into the main loop. */ + + movl chainlenwmask(%esp), %edx + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + * + * Within this loop: + * %ebx = scanend + * %ecx = curmatch + * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) + * %esi = windowbestlen - i.e., (window + bestlen) + * %edi = prev + * %ebp = limit + */ +LookupLoop: + andl %edx, %ecx + movzwl (%edi,%ecx,2), %ecx + cmpl %ebp, %ecx + jbe LeaveNow + subl $0x00010000, %edx + js LeaveNow +LoopEntry: movzwl -1(%esi,%ecx), %eax + cmpl %ebx, %eax + jnz LookupLoop + movl window(%esp), %eax + movzwl (%eax,%ecx), %eax + cmpl scanstart(%esp), %eax + jnz LookupLoop + +/* Store the current value of chainlen. */ + + movl %edx, chainlenwmask(%esp) + +/* Point %edi to the string under scrutiny, and %esi to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + movl window(%esp), %esi + movl scan(%esp), %edi + addl %ecx, %esi + movl scanalign(%esp), %eax + movl $(-MAX_MATCH_8), %edx + lea MAX_MATCH_8(%edi,%eax), %edi + lea MAX_MATCH_8(%esi,%eax), %esi + +/* Test the strings for equality, 8 bytes at a time. At the end, + * adjust %edx so that it is offset to the exact byte that mismatched. + * + * We already know at this point that the first three bytes of the + * strings match each other, and they can be safely passed over before + * starting the compare loop. So what this code does is skip over 0-3 + * bytes, as much as necessary in order to dword-align the %edi + * pointer. (%esi will still be misaligned three times out of four.) + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance. + */ +LoopCmps: + movl (%esi,%edx), %eax + xorl (%edi,%edx), %eax + jnz LeaveLoopCmps + movl 4(%esi,%edx), %eax + xorl 4(%edi,%edx), %eax + jnz LeaveLoopCmps4 + addl $8, %edx + jnz LoopCmps + jmp LenMaximum +LeaveLoopCmps4: addl $4, %edx +LeaveLoopCmps: testl $0x0000FFFF, %eax + jnz LenLower + addl $2, %edx + shrl $16, %eax +LenLower: subb $1, %al + adcl $0, %edx + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%edi,%edx), %eax + movl scan(%esp), %edi + subl %edi, %eax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + cmpl %ebx, %eax + jg LongerMatch + movl windowbestlen(%esp), %esi + movl dsPrev(%edx), %edi + movl scanend(%esp), %ebx + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: movl nicematch(%esp), %ebx + movl %eax, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + cmpl %ebx, %eax + jge LeaveNow + movl window(%esp), %esi + addl %eax, %esi + movl %esi, windowbestlen(%esp) + movzwl -1(%edi,%eax), %ebx + movl dsPrev(%edx), %edi + movl %ebx, scanend(%esp) + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: movl deflatestate(%esp), %edx + movl $MAX_MATCH, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + movl dsLookahead(%edx), %eax + cmpl %eax, %ebx + jg LookaheadRet + movl %ebx, %eax +LookaheadRet: + +/* Restore the stack and return from whence we came. */ + + addl $LocalVarsSize, %esp + .cfi_def_cfa_offset 20 + popl %ebx + .cfi_def_cfa_offset 16 + popl %esi + .cfi_def_cfa_offset 12 + popl %edi + .cfi_def_cfa_offset 8 + popl %ebp + .cfi_def_cfa_offset 4 +.cfi_endproc +match_init: ret diff --git a/contrib/zlib/contrib/blast/README b/contrib/zlib/contrib/blast/README new file mode 100644 index 000000000..e3a60b3f5 --- /dev/null +++ b/contrib/zlib/contrib/blast/README @@ -0,0 +1,4 @@ +Read blast.h for purpose and usage. + +Mark Adler +madler@alumni.caltech.edu diff --git a/contrib/zlib/contrib/blast/blast.c b/contrib/zlib/contrib/blast/blast.c new file mode 100644 index 000000000..e6e659073 --- /dev/null +++ b/contrib/zlib/contrib/blast/blast.c @@ -0,0 +1,466 @@ +/* blast.c + * Copyright (C) 2003, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in blast.h + * version 1.3, 24 Aug 2013 + * + * blast.c decompresses data compressed by the PKWare Compression Library. + * This function provides functionality similar to the explode() function of + * the PKWare library, hence the name "blast". + * + * This decompressor is based on the excellent format description provided by + * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the + * example Ben provided in the post is incorrect. The distance 110001 should + * instead be 111000. When corrected, the example byte stream becomes: + * + * 00 04 82 24 25 8f 80 7f + * + * which decompresses to "AIAIAIAIAIAIA" (without the quotes). + */ + +/* + * Change history: + * + * 1.0 12 Feb 2003 - First version + * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data + * 1.2 24 Oct 2012 - Add note about using binary mode in stdio + * - Fix comparisons of differently signed integers + * 1.3 24 Aug 2013 - Return unused input from blast() + * - Fix test code to correctly report unused input + * - Enable the provision of initial input to blast() + */ + +#include /* for NULL */ +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "blast.h" /* prototype for blast() */ + +#define local static /* for local function definitions */ +#define MAXBITS 13 /* maximum code length */ +#define MAXWIN 4096 /* maximum window size */ + +/* input and output state */ +struct state { + /* input state */ + blast_in infun; /* input function provided by user */ + void *inhow; /* opaque information passed to infun() */ + unsigned char *in; /* next input location */ + unsigned left; /* available input at in */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; + + /* output state */ + blast_out outfun; /* output function provided by user */ + void *outhow; /* opaque information passed to outfun() */ + unsigned next; /* index of next write location in out[] */ + int first; /* true to check distances (for first 4K) */ + unsigned char out[MAXWIN]; /* output buffer and sliding window */ +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + int val; /* bit accumulator */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */ + s->left--; + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = val >> need; + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return val & ((1 << need) - 1); +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -9 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. + * + * - The first code for the shortest length is all ones. Subsequent codes of + * the same length are simply integer decrements of the previous code. When + * moving up a length, a one bit is appended to the code. For a complete + * code, the last code of the longest length will be all zeros. To support + * this ordering, the bits pulled during decoding are inverted to apply the + * more "natural" ordering starting with all zeros and incrementing. + */ +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= (bitbuf & 1) ^ 1; /* invert code */ + bitbuf >>= 1; + count = *next++; + if (code < first + count) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + bitbuf = *(s->in)++; + s->left--; + if (left > 8) left = 8; + } + return -9; /* ran out of codes */ +} + +/* + * Given a list of repeated code lengths rep[0..n-1], where each byte is a + * count (high four bits + 1) and a code length (low four bits), generate the + * list of code lengths. This compaction reduces the size of the object code. + * Then given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + */ +local int construct(struct huffman *h, const unsigned char *rep, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + short length[256]; /* code lengths */ + + /* convert compact repeat counts into symbol bit length list */ + symbol = 0; + do { + len = *rep++; + left = (len >> 4) + 1; + len &= 15; + do { + length[symbol++] = len; + } while (--left); + } while (--n); + n = symbol; + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode PKWare Compression Library stream. + * + * Format notes: + * + * - First byte is 0 if literals are uncoded or 1 if they are coded. Second + * byte is 4, 5, or 6 for the number of extra bits in the distance code. + * This is the base-2 logarithm of the dictionary size minus six. + * + * - Compressed data is a combination of literals and length/distance pairs + * terminated by an end code. Literals are either Huffman coded or + * uncoded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - A bit preceding a literal or length/distance pair indicates which comes + * next, 0 for literals, 1 for length/distance. + * + * - If literals are uncoded, then the next eight bits are the literal, in the + * normal bit order in the stream, i.e. no bit-reversal is needed. Similarly, + * no bit reversal is needed for either the length extra bits or the distance + * extra bits. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 518 + * simply copies the last byte 518 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. + */ +local int decomp(struct state *s) +{ + int lit; /* true if literals are coded */ + int dict; /* log2(dictionary size) - 6 */ + int symbol; /* decoded symbol, extra bits for distance */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + int copy; /* copy counter */ + unsigned char *from, *to; /* copy pointers */ + static int virgin = 1; /* build tables once */ + static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */ + static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */ + static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */ + static struct huffman litcode = {litcnt, litsym}; /* length code */ + static struct huffman lencode = {lencnt, lensym}; /* length code */ + static struct huffman distcode = {distcnt, distsym};/* distance code */ + /* bit lengths of literal codes */ + static const unsigned char litlen[] = { + 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8, + 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5, + 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12, + 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27, + 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45, + 44, 173}; + /* bit lengths of length codes 0..15 */ + static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23}; + /* bit lengths of distance codes 0..63 */ + static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248}; + static const short base[16] = { /* base for length codes */ + 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264}; + static const char extra[16] = { /* extra bits for length codes */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; + + /* set up decoding tables (once--might not be thread-safe) */ + if (virgin) { + construct(&litcode, litlen, sizeof(litlen)); + construct(&lencode, lenlen, sizeof(lenlen)); + construct(&distcode, distlen, sizeof(distlen)); + virgin = 0; + } + + /* read header */ + lit = bits(s, 8); + if (lit > 1) return -1; + dict = bits(s, 8); + if (dict < 4 || dict > 6) return -2; + + /* decode literals and length/distance pairs */ + do { + if (bits(s, 1)) { + /* get length */ + symbol = decode(s, &lencode); + len = base[symbol] + bits(s, extra[symbol]); + if (len == 519) break; /* end code */ + + /* get distance */ + symbol = len == 2 ? 2 : dict; + dist = decode(s, &distcode) << symbol; + dist += bits(s, symbol); + dist++; + if (s->first && dist > s->next) + return -3; /* distance too far back */ + + /* copy length bytes from distance bytes back */ + do { + to = s->out + s->next; + from = to - dist; + copy = MAXWIN; + if (s->next < dist) { + from += copy; + copy = dist; + } + copy -= s->next; + if (copy > len) copy = len; + len -= copy; + s->next += copy; + do { + *to++ = *from++; + } while (--copy); + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } while (len != 0); + } + else { + /* get literal and write it */ + symbol = lit ? decode(s, &litcode) : bits(s, 8); + s->out[s->next++] = symbol; + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } + } while (1); + return 0; +} + +/* See comments in blast.h */ +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, + unsigned *left, unsigned char **in) +{ + struct state s; /* input/output state */ + int err; /* return value */ + + /* initialize input state */ + s.infun = infun; + s.inhow = inhow; + if (left != NULL && *left) { + s.left = *left; + s.in = *in; + } + else + s.left = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* initialize output state */ + s.outfun = outfun; + s.outhow = outhow; + s.next = 0; + s.first = 1; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp(), */ + err = 2; /* then skip decomp(), return error */ + else + err = decomp(&s); /* decompress */ + + /* return unused input */ + if (left != NULL) + *left = s.left; + if (in != NULL) + *in = s.left ? s.in : NULL; + + /* write any leftover output and update the error code if needed */ + if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0) + err = 1; + return err; +} + +#ifdef TEST +/* Example of how to use blast() */ +#include +#include + +#define CHUNK 16384 + +local unsigned inf(void *how, unsigned char **buf) +{ + static unsigned char hold[CHUNK]; + + *buf = hold; + return fread(hold, 1, CHUNK, (FILE *)how); +} + +local int outf(void *how, unsigned char *buf, unsigned len) +{ + return fwrite(buf, 1, len, (FILE *)how) != len; +} + +/* Decompress a PKWare Compression Library stream from stdin to stdout */ +int main(void) +{ + int ret; + unsigned left; + + /* decompress to stdout */ + left = 0; + ret = blast(inf, stdin, outf, stdout, &left, NULL); + if (ret != 0) + fprintf(stderr, "blast error: %d\n", ret); + + /* count any leftover bytes */ + while (getchar() != EOF) + left++; + if (left) + fprintf(stderr, "blast warning: %u unused bytes of input\n", left); + + /* return blast() error code */ + return ret; +} +#endif diff --git a/contrib/zlib/contrib/blast/blast.h b/contrib/zlib/contrib/blast/blast.h new file mode 100644 index 000000000..6cf65eda1 --- /dev/null +++ b/contrib/zlib/contrib/blast/blast.h @@ -0,0 +1,83 @@ +/* blast.h -- interface for blast.c + Copyright (C) 2003, 2012, 2013 Mark Adler + version 1.3, 24 Aug 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author 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. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * blast() decompresses the PKWare Data Compression Library (DCL) compressed + * format. It provides the same functionality as the explode() function in + * that library. (Note: PKWare overused the "implode" verb, and the format + * used by their library implode() function is completely different and + * incompatible with the implode compression method supported by PKZIP.) + * + * The binary mode for stdio functions should be used to assure that the + * compressed data is not corrupted when read or written. For example: + * fopen(..., "rb") and fopen(..., "wb"). + */ + + +typedef unsigned (*blast_in)(void *how, unsigned char **buf); +typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len); +/* Definitions for input/output functions passed to blast(). See below for + * what the provided functions need to do. + */ + + +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, + unsigned *left, unsigned char **in); +/* Decompress input to output using the provided infun() and outfun() calls. + * On success, the return value of blast() is zero. If there is an error in + * the source data, i.e. it is not in the proper format, then a negative value + * is returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. + * + * The input function is invoked: len = infun(how, &buf), where buf is set by + * infun() to point to the input buffer, and infun() returns the number of + * available bytes there. If infun() returns zero, then blast() returns with + * an input error. (blast() only asks for input if it needs it.) inhow is for + * use by the application to pass an input descriptor to infun(), if desired. + * + * If left and in are not NULL and *left is not zero when blast() is called, + * then the *left bytes are *in are consumed for input before infun() is used. + * + * The output function is invoked: err = outfun(how, buf, len), where the bytes + * to be written are buf[0..len-1]. If err is not zero, then blast() returns + * with an output error. outfun() is always called with len <= 4096. outhow + * is for use by the application to pass an output descriptor to outfun(), if + * desired. + * + * If there is any unused input, *left is set to the number of bytes that were + * read and *in points to them. Otherwise *left is set to zero and *in is set + * to NULL. If left or in are NULL, then they are not set. + * + * The return codes are: + * + * 2: ran out of input before completing decompression + * 1: output error before completing decompression + * 0: successful decompression + * -1: literal flag not zero or one + * -2: dictionary size not in 4..6 + * -3: distance is too far back + * + * At the bottom of blast.c is an example program that uses blast() that can be + * compiled to produce a command-line decompression filter by defining TEST. + */ diff --git a/contrib/zlib/contrib/blast/test.pk b/contrib/zlib/contrib/blast/test.pk new file mode 100644 index 0000000000000000000000000000000000000000..be10b2bbb251759ffdf6da49fadd1a3f137a54c1 GIT binary patch literal 8 PcmZQzX;M+`Z>R?V2c!aC literal 0 HcmV?d00001 diff --git a/contrib/zlib/contrib/blast/test.txt b/contrib/zlib/contrib/blast/test.txt new file mode 100644 index 000000000..bfdf1c5dc --- /dev/null +++ b/contrib/zlib/contrib/blast/test.txt @@ -0,0 +1 @@ +AIAIAIAIAIAIA \ No newline at end of file diff --git a/contrib/zlib/contrib/delphi/ZLib.pas b/contrib/zlib/contrib/delphi/ZLib.pas new file mode 100644 index 000000000..060e19911 --- /dev/null +++ b/contrib/zlib/contrib/delphi/ZLib.pas @@ -0,0 +1,557 @@ +{*******************************************************} +{ } +{ Borland Delphi Supplemental Components } +{ ZLIB Data Compression Interface Unit } +{ } +{ Copyright (c) 1997,99 Borland Corporation } +{ } +{*******************************************************} + +{ Updated for zlib 1.2.x by Cosmin Truta } + +unit ZLib; + +interface + +uses SysUtils, Classes; + +type + TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl; + TFree = procedure (AppData, Block: Pointer); cdecl; + + // Internal structure. Ignore. + TZStreamRec = packed record + next_in: PChar; // next input byte + avail_in: Integer; // number of bytes available at next_in + total_in: Longint; // total nb of input bytes read so far + + next_out: PChar; // next output byte should be put here + avail_out: Integer; // remaining free space at next_out + total_out: Longint; // total nb of bytes output so far + + msg: PChar; // last error message, NULL if no error + internal: Pointer; // not visible by applications + + zalloc: TAlloc; // used to allocate the internal state + zfree: TFree; // used to free the internal state + AppData: Pointer; // private data object passed to zalloc and zfree + + data_type: Integer; // best guess about the data type: ascii or binary + adler: Longint; // adler32 value of the uncompressed data + reserved: Longint; // reserved for future use + end; + + // Abstract ancestor class + TCustomZlibStream = class(TStream) + private + FStrm: TStream; + FStrmPos: Integer; + FOnProgress: TNotifyEvent; + FZRec: TZStreamRec; + FBuffer: array [Word] of Char; + protected + procedure Progress(Sender: TObject); dynamic; + property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; + constructor Create(Strm: TStream); + end; + +{ TCompressionStream compresses data on the fly as data is written to it, and + stores the compressed data to another stream. + + TCompressionStream is write-only and strictly sequential. Reading from the + stream will raise an exception. Using Seek to move the stream pointer + will raise an exception. + + Output data is cached internally, written to the output stream only when + the internal output buffer is full. All pending output data is flushed + when the stream is destroyed. + + The Position property returns the number of uncompressed bytes of + data that have been written to the stream so far. + + CompressionRate returns the on-the-fly percentage by which the original + data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100 + If raw data size = 100 and compressed data size = 25, the CompressionRate + is 75% + + The OnProgress event is called each time the output buffer is filled and + written to the output stream. This is useful for updating a progress + indicator when you are writing a large chunk of data to the compression + stream in a single call.} + + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + TCompressionStream = class(TCustomZlibStream) + private + function GetCompressionRate: Single; + public + constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property CompressionRate: Single read GetCompressionRate; + property OnProgress; + end; + +{ TDecompressionStream decompresses data on the fly as data is read from it. + + Compressed data comes from a separate source stream. TDecompressionStream + is read-only and unidirectional; you can seek forward in the stream, but not + backwards. The special case of setting the stream position to zero is + allowed. Seeking forward decompresses data until the requested position in + the uncompressed data has been reached. Seeking backwards, seeking relative + to the end of the stream, requesting the size of the stream, and writing to + the stream will raise an exception. + + The Position property returns the number of bytes of uncompressed data that + have been read from the stream so far. + + The OnProgress event is called each time the internal input buffer of + compressed data is exhausted and the next block is read from the input stream. + This is useful for updating a progress indicator when you are reading a + large chunk of data from the decompression stream in a single call.} + + TDecompressionStream = class(TCustomZlibStream) + public + constructor Create(Source: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property OnProgress; + end; + + + +{ CompressBuf compresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); + + +{ DecompressBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + OutEstimate = zero, or est. size of the decompressed data + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); + +{ DecompressToUserBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to user-allocated buffer to contain decompressed data + BufSize = number of bytes in OutBuf } +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); + +const + zlib_version = '1.2.11'; + +type + EZlibError = class(Exception); + ECompressionError = class(EZlibError); + EDecompressionError = class(EZlibError); + +implementation + +uses ZLibConst; + +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = (-1); + Z_STREAM_ERROR = (-2); + Z_DATA_ERROR = (-3); + Z_MEM_ERROR = (-4); + Z_BUF_ERROR = (-5); + Z_VERSION_ERROR = (-6); + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = (-1); + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +procedure adler32; external; +procedure compressBound; external; +procedure crc32; external; +procedure deflateInit2_; external; +procedure deflateParams; external; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + Result := AllocMem(Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + + + +// deflate compresses data +function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; + recsize: Integer): Integer; external; +function deflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function deflateEnd(var strm: TZStreamRec): Integer; external; + +// inflate decompresses data +function inflateInit_(var strm: TZStreamRec; version: PChar; + recsize: Integer): Integer; external; +function inflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function inflateEnd(var strm: TZStreamRec): Integer; external; +function inflateReset(var strm: TZStreamRec): Integer; external; + + +function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl; +begin +// GetMem(Result, Items*Size); + Result := AllocMem(Items * Size); +end; + +procedure zlibFreeMem(AppData, Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +{function zlibCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EZlibError.Create('error'); //!! +end;} + +function CCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise ECompressionError.Create('error'); //!! +end; + +function DCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EDecompressionError.Create('error'); //!! +end; + +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm))); + try + while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, 256); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := 256; + end; + finally + CCheck(deflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + + +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; + BufInc: Integer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + BufInc := (InBytes + 255) and not 255; + if OutEstimate = 0 then + OutBytes := BufInc + else + OutBytes := OutEstimate; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, BufInc); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := BufInc; + end; + finally + DCheck(inflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); +var + strm: TZStreamRec; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := BufSize; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then + raise EZlibError.CreateRes(@sTargetBufferTooSmall); + finally + DCheck(inflateEnd(strm)); + end; +end; + +// TCustomZlibStream + +constructor TCustomZLibStream.Create(Strm: TStream); +begin + inherited Create; + FStrm := Strm; + FStrmPos := Strm.Position; + FZRec.zalloc := zlibAllocMem; + FZRec.zfree := zlibFreeMem; +end; + +procedure TCustomZLibStream.Progress(Sender: TObject); +begin + if Assigned(FOnProgress) then FOnProgress(Sender); +end; + + +// TCompressionStream + +constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel; + Dest: TStream); +const + Levels: array [TCompressionLevel] of ShortInt = + (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION); +begin + inherited Create(Dest); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec))); +end; + +destructor TCompressionStream.Destroy; +begin + FZRec.next_in := nil; + FZRec.avail_in := 0; + try + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END) + and (FZRec.avail_out = 0) do + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + end; + if FZRec.avail_out < sizeof(FBuffer) then + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out); + finally + deflateEnd(FZRec); + end; + inherited Destroy; +end; + +function TCompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + FZRec.next_in := @Buffer; + FZRec.avail_in := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_in > 0) do + begin + CCheck(deflate(FZRec, 0)); + if FZRec.avail_out = 0 then + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + FStrmPos := FStrm.Position; + Progress(Self); + end; + end; + Result := Count; +end; + +function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + if (Offset = 0) and (Origin = soFromCurrent) then + Result := FZRec.total_in + else + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.GetCompressionRate: Single; +begin + if FZRec.total_in = 0 then + Result := 0 + else + Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0; +end; + + +// TDecompressionStream + +constructor TDecompressionStream.Create(Source: TStream); +begin + inherited Create(Source); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec))); +end; + +destructor TDecompressionStream.Destroy; +begin + FStrm.Seek(-FZRec.avail_in, 1); + inflateEnd(FZRec); + inherited Destroy; +end; + +function TDecompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + FZRec.next_out := @Buffer; + FZRec.avail_out := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_out > 0) do + begin + if FZRec.avail_in = 0 then + begin + FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); + if FZRec.avail_in = 0 then + begin + Result := Count - FZRec.avail_out; + Exit; + end; + FZRec.next_in := FBuffer; + FStrmPos := FStrm.Position; + Progress(Self); + end; + CCheck(inflate(FZRec, 0)); + end; + Result := Count; +end; + +function TDecompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + raise EDecompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +var + I: Integer; + Buf: array [0..4095] of Char; +begin + if (Offset = 0) and (Origin = soFromBeginning) then + begin + DCheck(inflateReset(FZRec)); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + FStrm.Position := 0; + FStrmPos := 0; + end + else if ( (Offset >= 0) and (Origin = soFromCurrent)) or + ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then + begin + if Origin = soFromBeginning then Dec(Offset, FZRec.total_out); + if Offset > 0 then + begin + for I := 1 to Offset div sizeof(Buf) do + ReadBuffer(Buf, sizeof(Buf)); + ReadBuffer(Buf, Offset mod sizeof(Buf)); + end; + end + else + raise EDecompressionError.CreateRes(@sInvalidStreamOp); + Result := FZRec.total_out; +end; + + +end. diff --git a/contrib/zlib/contrib/delphi/ZLibConst.pas b/contrib/zlib/contrib/delphi/ZLibConst.pas new file mode 100644 index 000000000..cdfe13671 --- /dev/null +++ b/contrib/zlib/contrib/delphi/ZLibConst.pas @@ -0,0 +1,11 @@ +unit ZLibConst; + +interface + +resourcestring + sTargetBufferTooSmall = 'ZLib error: target buffer may be too small'; + sInvalidStreamOp = 'Invalid stream operation'; + +implementation + +end. diff --git a/contrib/zlib/contrib/delphi/readme.txt b/contrib/zlib/contrib/delphi/readme.txt new file mode 100644 index 000000000..2dc9a8bba --- /dev/null +++ b/contrib/zlib/contrib/delphi/readme.txt @@ -0,0 +1,76 @@ + +Overview +======== + +This directory contains an update to the ZLib interface unit, +distributed by Borland as a Delphi supplemental component. + +The original ZLib unit is Copyright (c) 1997,99 Borland Corp., +and is based on zlib version 1.0.4. There are a series of bugs +and security problems associated with that old zlib version, and +we recommend the users to update their ZLib unit. + + +Summary of modifications +======================== + +- Improved makefile, adapted to zlib version 1.2.1. + +- Some field types from TZStreamRec are changed from Integer to + Longint, for consistency with the zlib.h header, and for 64-bit + readiness. + +- The zlib_version constant is updated. + +- The new Z_RLE strategy has its corresponding symbolic constant. + +- The allocation and deallocation functions and function types + (TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl, + and _malloc and _free are added as C RTL stubs. As a result, + the original C sources of zlib can be compiled out of the box, + and linked to the ZLib unit. + + +Suggestions for improvements +============================ + +Currently, the ZLib unit provides only a limited wrapper around +the zlib library, and much of the original zlib functionality is +missing. Handling compressed file formats like ZIP/GZIP or PNG +cannot be implemented without having this functionality. +Applications that handle these formats are either using their own, +duplicated code, or not using the ZLib unit at all. + +Here are a few suggestions: + +- Checksum class wrappers around adler32() and crc32(), similar + to the Java classes that implement the java.util.zip.Checksum + interface. + +- The ability to read and write raw deflate streams, without the + zlib stream header and trailer. Raw deflate streams are used + in the ZIP file format. + +- The ability to read and write gzip streams, used in the GZIP + file format, and normally produced by the gzip program. + +- The ability to select a different compression strategy, useful + to PNG and MNG image compression, and to multimedia compression + in general. Besides the compression level + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + which, in fact, could have used the 'z' prefix and avoided + TColor-like symbols + + TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax); + + there could be a compression strategy + + TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle); + +- ZIP and GZIP stream handling via TStreams. + + +-- +Cosmin Truta diff --git a/contrib/zlib/contrib/delphi/zlibd32.mak b/contrib/zlib/contrib/delphi/zlibd32.mak new file mode 100644 index 000000000..9bb00b7cc --- /dev/null +++ b/contrib/zlib/contrib/delphi/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/contrib/zlib/contrib/dotzlib/DotZLib.build b/contrib/zlib/contrib/dotzlib/DotZLib.build new file mode 100644 index 000000000..e69630cec --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib.build @@ -0,0 +1,33 @@ + + + A .Net wrapper library around ZLib1.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contrib/zlib/contrib/dotzlib/DotZLib.chm b/contrib/zlib/contrib/dotzlib/DotZLib.chm new file mode 100644 index 0000000000000000000000000000000000000000..f214a444aebb20950fb3e8499b36731e1f12be95 GIT binary patch literal 72726 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

%dT8#&n9#M4$?9@Y?VN*Gm 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. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/contrib/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs new file mode 100644 index 000000000..b110dae6a --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs @@ -0,0 +1,202 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + #region ChecksumGeneratorBase + ///

+ /// Implements the common functionality needed for all s + /// + /// + public abstract class ChecksumGeneratorBase : ChecksumGenerator + { + /// + /// The value of the current checksum + /// + protected uint _current; + + /// + /// Initializes a new instance of the checksum generator base - the current checksum is + /// set to zero + /// + public ChecksumGeneratorBase() + { + _current = 0; + } + + /// + /// Initializes a new instance of the checksum generator basewith a specified value + /// + /// The value to set the current checksum to + public ChecksumGeneratorBase(uint initialValue) + { + _current = initialValue; + } + + /// + /// Resets the current checksum to zero + /// + public void Reset() { _current = 0; } + + /// + /// Gets the current checksum value + /// + public uint Value { get { return _current; } } + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + /// All the other Update methods are implmeneted in terms of this one. + /// This is therefore the only method a derived class has to implement + public abstract void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with an array of bytes. + /// + /// The data to update the checksum with + public void Update(byte[] data) + { + Update(data, 0, data.Length); + } + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + public void Update(string data) + { + Update(Encoding.UTF8.GetBytes(data)); + } + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + public void Update(string data, Encoding encoding) + { + Update(encoding.GetBytes(data)); + } + + } + #endregion + + #region CRC32 + /// + /// Implements a CRC32 checksum generator + /// + public sealed class CRC32Checksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint crc32(uint crc, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the CRC32 checksum generator + /// + public CRC32Checksum() : base() {} + + /// + /// Initializes a new instance of the CRC32 checksum generator with a specified value + /// + /// The value to set the current checksum to + public CRC32Checksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + + #region Adler + /// + /// Implements a checksum generator that computes the Adler checksum on data + /// + public sealed class AdlerChecksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint adler32(uint adler, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the Adler checksum generator + /// + public AdlerChecksum() : base() {} + + /// + /// Initializes a new instance of the Adler checksum generator with a specified value + /// + /// The value to set the current checksum to + public AdlerChecksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + +} \ No newline at end of file diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs b/contrib/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 000000000..9c8d60195 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs @@ -0,0 +1,83 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; + +namespace DotZLib +{ + + /// + /// This class implements a circular buffer + /// + internal class CircularBuffer + { + #region Private data + private int _capacity; + private int _head; + private int _tail; + private int _size; + private byte[] _buffer; + #endregion + + public CircularBuffer(int capacity) + { + Debug.Assert( capacity > 0 ); + _buffer = new byte[capacity]; + _capacity = capacity; + _head = 0; + _tail = 0; + _size = 0; + } + + public int Size { get { return _size; } } + + public int Put(byte[] source, int offset, int count) + { + Debug.Assert( count > 0 ); + int trueCount = Math.Min(count, _capacity - Size); + for (int i = 0; i < trueCount; ++i) + _buffer[(_tail+i) % _capacity] = source[offset+i]; + _tail += trueCount; + _tail %= _capacity; + _size += trueCount; + return trueCount; + } + + public bool Put(byte b) + { + if (Size == _capacity) // no room + return false; + _buffer[_tail++] = b; + _tail %= _capacity; + ++_size; + return true; + } + + public int Get(byte[] destination, int offset, int count) + { + int trueCount = Math.Min(count,Size); + for (int i = 0; i < trueCount; ++i) + destination[offset + i] = _buffer[(_head+i) % _capacity]; + _head += trueCount; + _head %= _capacity; + _size -= trueCount; + return trueCount; + } + + public int Get() + { + if (Size == 0) + return -1; + + int result = (int)_buffer[_head++ % _capacity]; + --_size; + return result; + } + + } +} diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/CodecBase.cs b/contrib/zlib/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 000000000..b0eb78a02 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/CodecBase.cs @@ -0,0 +1,198 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements the common functionality needed for all s + /// + public abstract class CodecBase : Codec, IDisposable + { + + #region Data members + + /// + /// Instance of the internal zlib buffer structure that is + /// passed to all functions in the zlib dll + /// + internal ZStream _ztream = new ZStream(); + + /// + /// True if the object instance has been disposed, false otherwise + /// + protected bool _isDisposed = false; + + /// + /// The size of the internal buffers + /// + protected const int kBufferSize = 16384; + + private byte[] _outBuffer = new byte[kBufferSize]; + private byte[] _inBuffer = new byte[kBufferSize]; + + private GCHandle _hInput; + private GCHandle _hOutput; + + private uint _checksum = 0; + + #endregion + + /// + /// Initializes a new instance of the CodeBase class. + /// + public CodecBase() + { + try + { + _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); + _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); + } + catch (Exception) + { + CleanUp(false); + throw; + } + } + + + #region Codec Members + + /// + /// Occurs when more processed data are available. + /// + public event DataAvailableHandler DataAvailable; + + /// + /// Fires the event + /// + protected void OnDataAvailable() + { + if (_ztream.total_out > 0) + { + if (DataAvailable != null) + DataAvailable( _outBuffer, 0, (int)_ztream.total_out); + resetOutput(); + } + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + public void Add(byte[] data) + { + Add(data,0,data.Length); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + /// This must be implemented by a derived class + public abstract void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + /// This must be implemented by a derived class + public abstract void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + public uint Checksum { get { return _checksum; } } + + #endregion + + #region Destructor & IDisposable stuff + + /// + /// Destroys this instance + /// + ~CodecBase() + { + CleanUp(false); + } + + /// + /// Releases any unmanaged resources and calls the method of the derived class + /// + public void Dispose() + { + CleanUp(true); + } + + /// + /// Performs any codec specific cleanup + /// + /// This must be implemented by a derived class + protected abstract void CleanUp(); + + // performs the release of the handles and calls the dereived CleanUp() + private void CleanUp(bool isDisposing) + { + if (!_isDisposed) + { + CleanUp(); + if (_hInput.IsAllocated) + _hInput.Free(); + if (_hOutput.IsAllocated) + _hOutput.Free(); + + _isDisposed = true; + } + } + + + #endregion + + #region Helper methods + + /// + /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// + /// The byte array that contains the data to copy + /// The index of the first byte to copy + /// The number of bytes to copy from data + protected void copyInput(byte[] data, int startIndex, int count) + { + Array.Copy(data, startIndex, _inBuffer,0, count); + _ztream.next_in = _hInput.AddrOfPinnedObject(); + _ztream.total_in = 0; + _ztream.avail_in = (uint)count; + + } + + /// + /// Resets the internal output buffers to a known state - ready for processing + /// + protected void resetOutput() + { + _ztream.total_out = 0; + _ztream.avail_out = kBufferSize; + _ztream.next_out = _hOutput.AddrOfPinnedObject(); + } + + /// + /// Updates the running checksum property + /// + /// The new checksum value + protected void setChecksum(uint newSum) + { + _checksum = newSum; + } + #endregion + + } +} diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/Deflater.cs b/contrib/zlib/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 000000000..9039f41f6 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/Deflater.cs @@ -0,0 +1,106 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data compressor, using the deflate algorithm in the ZLib dll + /// + public sealed class Deflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Deflater + /// + /// The compression level to use for this Deflater + public Deflater(CompressLevel level) : base() + { + int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize deflater"); + + resetOutput(); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + while (err >= 0 && _ztream.avail_in > 0) + { + err = deflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = deflate(ref _ztream, (int)FlushTypes.None); + } + inputIndex += (int)_ztream.total_in; + } + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = deflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + deflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib deflate stream + /// + protected override void CleanUp() { deflateEnd(ref _ztream); } + + } +} diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.cs b/contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 000000000..90c7c3b38 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.cs @@ -0,0 +1,288 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + + #region Internal types + + /// + /// Defines constants for the various flush types used with zlib + /// + internal enum FlushTypes + { + None, Partial, Sync, Full, Finish, Block + } + + #region ZStream structure + // internal mapping of the zlib zstream structure for marshalling + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + internal struct ZStream + { + public IntPtr next_in; + public uint avail_in; + public uint total_in; + + public IntPtr next_out; + public uint avail_out; + public uint total_out; + + [MarshalAs(UnmanagedType.LPStr)] + string msg; + uint state; + + uint zalloc; + uint zfree; + uint opaque; + + int data_type; + public uint adler; + uint reserved; + } + + #endregion + + #endregion + + #region Public enums + /// + /// Defines constants for the available compression levels in zlib + /// + public enum CompressLevel : int + { + /// + /// The default compression level with a reasonable compromise between compression and speed + /// + Default = -1, + /// + /// No compression at all. The data are passed straight through. + /// + None = 0, + /// + /// The maximum compression rate available. + /// + Best = 9, + /// + /// The fastest available compression level. + /// + Fastest = 1 + } + #endregion + + #region Exception classes + /// + /// The exception that is thrown when an error occurs on the zlib dll + /// + public class ZLibException : ApplicationException + { + /// + /// Initializes a new instance of the class with a specified + /// error message and error code + /// + /// The zlib error code that caused the exception + /// A message that (hopefully) describes the error + public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg)) + { + } + + /// + /// Initializes a new instance of the class with a specified + /// error code + /// + /// The zlib error code that caused the exception + public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode)) + { + } + } + #endregion + + #region Interfaces + + /// + /// Declares methods and properties that enables a running checksum to be calculated + /// + public interface ChecksumGenerator + { + /// + /// Gets the current value of the checksum + /// + uint Value { get; } + + /// + /// Clears the current checksum to 0 + /// + void Reset(); + + /// + /// Updates the current checksum with an array of bytes + /// + /// The data to update the checksum with + void Update(byte[] data); + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + void Update(string data); + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + void Update(string data, Encoding encoding); + } + + + /// + /// Represents the method that will be called from a codec when new data + /// are available. + /// + /// The byte array containing the processed data + /// The index of the first processed byte in data + /// The number of processed bytes available + /// On return from this method, the data may be overwritten, so grab it while you can. + /// You cannot assume that startIndex will be zero. + /// + public delegate void DataAvailableHandler(byte[] data, int startIndex, int count); + + /// + /// Declares methods and events for implementing compressors/decompressors + /// + public interface Codec + { + /// + /// Occurs when more processed data are available. + /// + event DataAvailableHandler DataAvailable; + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data); + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + uint Checksum { get; } + + + } + + #endregion + + #region Classes + /// + /// Encapsulates general information about the ZLib library + /// + public class Info + { + #region DLL imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint zlibCompileFlags(); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern string zlibVersion(); + #endregion + + #region Private stuff + private uint _flags; + + // helper function that unpacks a bitsize mask + private static int bitSize(uint bits) + { + switch (bits) + { + case 0: return 16; + case 1: return 32; + case 2: return 64; + } + return -1; + } + #endregion + + /// + /// Constructs an instance of the Info class. + /// + public Info() + { + _flags = zlibCompileFlags(); + } + + /// + /// True if the library is compiled with debug info + /// + public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } } + + /// + /// True if the library is compiled with assembly optimizations + /// + public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } } + + /// + /// Gets the size of the unsigned int that was compiled into Zlib + /// + public int SizeOfUInt { get { return bitSize(_flags & 3); } } + + /// + /// Gets the size of the unsigned long that was compiled into Zlib + /// + public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } } + + /// + /// Gets the size of the pointers that were compiled into Zlib + /// + public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } } + + /// + /// Gets the size of the z_off_t type that was compiled into Zlib + /// + public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } } + + /// + /// Gets the version of ZLib as a string, e.g. "1.2.1" + /// + public static string Version { get { return zlibVersion(); } } + } + + #endregion + +} diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj b/contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 000000000..dea7fb16a --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/GZipStream.cs b/contrib/zlib/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 000000000..f0eada1d2 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/GZipStream.cs @@ -0,0 +1,301 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements a compressed , in GZip (.gz) format. + /// + public class GZipStream : Stream, IDisposable + { + #region Dll Imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern IntPtr gzopen(string name, string mode); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzclose(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzwrite(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzread(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzgetc(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzputc(IntPtr gzFile, int c); + + #endregion + + #region Private data + private IntPtr _gzFile; + private bool _isDisposed = false; + private bool _isWriting; + #endregion + + #region Constructors + /// + /// Creates a new file as a writeable GZipStream + /// + /// The name of the compressed file to create + /// The compression level to use when adding data + /// If an error occurred in the internal zlib function + public GZipStream(string fileName, CompressLevel level) + { + _isWriting = true; + _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + } + + /// + /// Opens an existing file as a readable GZipStream + /// + /// The name of the file to open + /// If an error occurred in the internal zlib function + public GZipStream(string fileName) + { + _isWriting = false; + _gzFile = gzopen(fileName, "rb"); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + + } + #endregion + + #region Access properties + /// + /// Returns true of this stream can be read from, false otherwise + /// + public override bool CanRead + { + get + { + return !_isWriting; + } + } + + + /// + /// Returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Returns true if this tsream is writeable, false otherwise + /// + public override bool CanWrite + { + get + { + return _isWriting; + } + } + #endregion + + #region Destructor & IDispose stuff + + /// + /// Destroys this instance + /// + ~GZipStream() + { + cleanUp(false); + } + + /// + /// Closes the external file handle + /// + public void Dispose() + { + cleanUp(true); + } + + // Does the actual closing of the file handle. + private void cleanUp(bool isDisposing) + { + if (!_isDisposed) + { + gzclose(_gzFile); + _isDisposed = true; + } + } + #endregion + + #region Basic reading and writing + /// + /// Attempts to read a number of bytes from the stream. + /// + /// The destination data buffer + /// The index of the first destination byte in buffer + /// The number of bytes requested + /// The number of bytes read + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not readable. + /// If this stream has been disposed. + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + int result; + try + { + result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + return result; + } + + /// + /// Attempts to read a single byte from the stream. + /// + /// The byte that was read, or -1 in case of error or End-Of-File + public override int ReadByte() + { + if (!CanRead) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + return gzgetc(_gzFile); + } + + /// + /// Writes a number of bytes to the stream + /// + /// + /// + /// + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void Write(byte[] buffer, int offset, int count) + { + if (!CanWrite) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + } + + /// + /// Writes a single byte to the stream + /// + /// The byte to add to the stream. + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void WriteByte(byte value) + { + if (!CanWrite) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + int result = gzputc(_gzFile, (int)value); + if (result < 0) + throw new IOException(); + } + #endregion + + #region Position & length stuff + /// + /// Not supported. + /// + /// + /// Always thrown + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Not suppported. + /// + /// + /// + /// + /// Always thrown + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Flushes the GZipStream. + /// + /// In this implementation, this method does nothing. This is because excessive + /// flushing may degrade the achievable compression rates. + public override void Flush() + { + // left empty on purpose + } + + /// + /// Gets/sets the current position in the GZipStream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + /// + /// Gets the size of the stream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + #endregion + } +} diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/Inflater.cs b/contrib/zlib/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 000000000..d295f2680 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/Inflater.cs @@ -0,0 +1,105 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data decompressor, using the inflate algorithm in the ZLib dll + /// + public class Inflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int inflateInit_(ref ZStream sz, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Inflater + /// + public Inflater() : base() + { + int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize inflater"); + + resetOutput(); + } + + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + err = inflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = inflate(ref _ztream, (int)FlushTypes.None); + } + + inputIndex += (int)_ztream.total_in; + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = inflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + inflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib inflate stream + /// + protected override void CleanUp() { inflateEnd(ref _ztream); } + + + } +} diff --git a/contrib/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/contrib/zlib/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 000000000..6d8aebb79 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/DotZLib/UnitTests.cs @@ -0,0 +1,274 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Collections; +using System.IO; + +// uncomment the define below to include unit tests +//#define nunit +#if nunit +using NUnit.Framework; + +// Unit tests for the DotZLib class library +// ---------------------------------------- +// +// Use this with NUnit 2 from http://www.nunit.org +// + +namespace DotZLibTests +{ + using DotZLib; + + // helper methods + internal class Utils + { + public static bool byteArrEqual( byte[] lhs, byte[] rhs ) + { + if (lhs.Length != rhs.Length) + return false; + for (int i = lhs.Length-1; i >= 0; --i) + if (lhs[i] != rhs[i]) + return false; + return true; + } + + } + + + [TestFixture] + public class CircBufferTests + { + #region Circular buffer tests + [Test] + public void SinglePutGet() + { + CircularBuffer buf = new CircularBuffer(10); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + + Assert.IsTrue(buf.Put( 1 )); + Assert.AreEqual( 1, buf.Size ); + Assert.AreEqual( 1, buf.Get() ); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + } + + [Test] + public void BlockPutGet() + { + CircularBuffer buf = new CircularBuffer(10); + byte[] arr = {1,2,3,4,5,6,7,8,9,10}; + Assert.AreEqual( 10, buf.Put(arr,0,10) ); + Assert.AreEqual( 10, buf.Size ); + Assert.IsFalse( buf.Put(11) ); + Assert.AreEqual( 1, buf.Get() ); + Assert.IsTrue( buf.Put(11) ); + + byte[] arr2 = (byte[])arr.Clone(); + Assert.AreEqual( 9, buf.Get(arr2,1,9) ); + Assert.IsTrue( Utils.byteArrEqual(arr,arr2) ); + } + + #endregion + } + + [TestFixture] + public class ChecksumTests + { + #region CRC32 Tests + [Test] + public void CRC32_Null() + { + CRC32Checksum crc32 = new CRC32Checksum(); + Assert.AreEqual( 0, crc32.Value ); + + crc32 = new CRC32Checksum(1); + Assert.AreEqual( 1, crc32.Value ); + + crc32 = new CRC32Checksum(556); + Assert.AreEqual( 556, crc32.Value ); + } + + [Test] + public void CRC32_Data() + { + CRC32Checksum crc32 = new CRC32Checksum(); + byte[] data = { 1,2,3,4,5,6,7 }; + crc32.Update(data); + Assert.AreEqual( 0x70e46888, crc32.Value ); + + crc32 = new CRC32Checksum(); + crc32.Update("penguin"); + Assert.AreEqual( 0x0e5c1a120, crc32.Value ); + + crc32 = new CRC32Checksum(1); + crc32.Update("penguin"); + Assert.AreEqual(0x43b6aa94, crc32.Value); + + } + #endregion + + #region Adler tests + + [Test] + public void Adler_Null() + { + AdlerChecksum adler = new AdlerChecksum(); + Assert.AreEqual(0, adler.Value); + + adler = new AdlerChecksum(1); + Assert.AreEqual( 1, adler.Value ); + + adler = new AdlerChecksum(556); + Assert.AreEqual( 556, adler.Value ); + } + + [Test] + public void Adler_Data() + { + AdlerChecksum adler = new AdlerChecksum(1); + byte[] data = { 1,2,3,4,5,6,7 }; + adler.Update(data); + Assert.AreEqual( 0x5b001d, adler.Value ); + + adler = new AdlerChecksum(); + adler.Update("penguin"); + Assert.AreEqual(0x0bcf02f6, adler.Value ); + + adler = new AdlerChecksum(1); + adler.Update("penguin"); + Assert.AreEqual(0x0bd602f7, adler.Value); + + } + #endregion + } + + [TestFixture] + public class InfoTests + { + #region Info tests + [Test] + public void Info_Version() + { + Info info = new Info(); + Assert.AreEqual("1.2.11", Info.Version); + Assert.AreEqual(32, info.SizeOfUInt); + Assert.AreEqual(32, info.SizeOfULong); + Assert.AreEqual(32, info.SizeOfPointer); + Assert.AreEqual(32, info.SizeOfOffset); + } + #endregion + } + + [TestFixture] + public class DeflateInflateTests + { + #region Deflate tests + [Test] + public void Deflate_Init() + { + using (Deflater def = new Deflater(CompressLevel.Default)) + { + } + } + + private ArrayList compressedData = new ArrayList(); + private uint adler1; + + private ArrayList uncompressedData = new ArrayList(); + private uint adler2; + + public void CDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + compressedData.Add(data[i+startIndex]); + } + + [Test] + public void Deflate_Compress() + { + compressedData.Clear(); + + byte[] testData = new byte[35000]; + for (int i = 0; i < testData.Length; ++i) + testData[i] = 5; + + using (Deflater def = new Deflater((CompressLevel)5)) + { + def.DataAvailable += new DataAvailableHandler(CDataAvail); + def.Add(testData); + def.Finish(); + adler1 = def.Checksum; + } + } + #endregion + + #region Inflate tests + [Test] + public void Inflate_Init() + { + using (Inflater inf = new Inflater()) + { + } + } + + private void DDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + uncompressedData.Add(data[i+startIndex]); + } + + [Test] + public void Inflate_Expand() + { + uncompressedData.Clear(); + + using (Inflater inf = new Inflater()) + { + inf.DataAvailable += new DataAvailableHandler(DDataAvail); + inf.Add((byte[])compressedData.ToArray(typeof(byte))); + inf.Finish(); + adler2 = inf.Checksum; + } + Assert.AreEqual( adler1, adler2 ); + } + #endregion + } + + [TestFixture] + public class GZipStreamTests + { + #region GZipStream test + [Test] + public void GZipStream_WriteRead() + { + using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best)) + { + BinaryWriter writer = new BinaryWriter(gzOut); + writer.Write("hi there"); + writer.Write(Math.PI); + writer.Write(42); + } + + using (GZipStream gzIn = new GZipStream("gzstream.gz")) + { + BinaryReader reader = new BinaryReader(gzIn); + string s = reader.ReadString(); + Assert.AreEqual("hi there",s); + double d = reader.ReadDouble(); + Assert.AreEqual(Math.PI, d); + int i = reader.ReadInt32(); + Assert.AreEqual(42,i); + } + + } + #endregion + } +} + +#endif diff --git a/contrib/zlib/contrib/dotzlib/LICENSE_1_0.txt b/contrib/zlib/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 000000000..127a5bc39 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/contrib/zlib/contrib/dotzlib/readme.txt b/contrib/zlib/contrib/dotzlib/readme.txt new file mode 100644 index 000000000..4d8c2dd93 --- /dev/null +++ b/contrib/zlib/contrib/dotzlib/readme.txt @@ -0,0 +1,58 @@ +This directory contains a .Net wrapper class library for the ZLib1.dll + +The wrapper includes support for inflating/deflating memory buffers, +.Net streaming wrappers for the gz streams part of zlib, and wrappers +for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples. + +Directory structure: +-------------------- + +LICENSE_1_0.txt - License file. +readme.txt - This file. +DotZLib.chm - Class library documentation +DotZLib.build - NAnt build file +DotZLib.sln - Microsoft Visual Studio 2003 solution file + +DotZLib\*.cs - Source files for the class library + +Unit tests: +----------- +The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher. +To include unit tests in the build, define nunit before building. + + +Build instructions: +------------------- + +1. Using Visual Studio.Net 2003: + Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll) + will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on + you are building the release or debug version of the library. Check + DotZLib/UnitTests.cs for instructions on how to include unit tests in the + build. + +2. Using NAnt: + Open a command prompt with access to the build environment and run nant + in the same directory as the DotZLib.build file. + You can define 2 properties on the nant command-line to control the build: + debug={true|false} to toggle between release/debug builds (default=true). + nunit={true|false} to include or esclude unit tests (default=true). + Also the target clean will remove binaries. + Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release + or ./DotZLib/bin/debug, depending on whether you are building the release + or debug version of the library. + + Examples: + nant -D:debug=false -D:nunit=false + will build a release mode version of the library without unit tests. + nant + will build a debug version of the library with unit tests + nant clean + will remove all previously built files. + + +--------------------------------- +Copyright (c) Henrik Ravn 2004 + +Use, modification and distribution are subject to the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/contrib/zlib/contrib/gcc_gvmat64/gvmat64.S b/contrib/zlib/contrib/gcc_gvmat64/gvmat64.S new file mode 100644 index 000000000..23309fa28 --- /dev/null +++ b/contrib/zlib/contrib/gcc_gvmat64/gvmat64.S @@ -0,0 +1,574 @@ +/* +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); // current match + +; gvmat64.S -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; this file is translation from gvmat64.asm to GCC 4.x (for Linux, Mac XCode) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; 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. +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for zLib, I use option: +; gcc -c -arch x86_64 gvmat64.S + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; // current match / +; +; with XCode for Mac, I had strange error with some jump on intel syntax +; this is why BEFORE_JMP and AFTER_JMP are used + */ + + +#define BEFORE_JMP .att_syntax +#define AFTER_JMP .intel_syntax noprefix + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +.intel_syntax noprefix + +.globl match_init, longest_match +.text +longest_match: + + + +#define LocalVarsSize 96 +/* +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp +*/ + +#define chainlenwmask (rsp + 8 - LocalVarsSize) +#define nicematch (rsp + 16 - LocalVarsSize) + +#define save_rdi (rsp + 24 - LocalVarsSize) +#define save_rsi (rsp + 32 - LocalVarsSize) +#define save_rbx (rsp + 40 - LocalVarsSize) +#define save_rbp (rsp + 48 - LocalVarsSize) +#define save_r12 (rsp + 56 - LocalVarsSize) +#define save_r13 (rsp + 64 - LocalVarsSize) +#define save_r14 (rsp + 72 - LocalVarsSize) +#define save_r15 (rsp + 80 - LocalVarsSize) + + +/* +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure +*/ + +#define MAX_MATCH 258 +#define MIN_MATCH 3 +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) + +/* +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). +*/ + + + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize %u\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask %u\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow %u\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev %u\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen %u\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch %u\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart %u\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart %u\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead %u\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen %u\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen %u\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch %u\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch %u\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} +*/ + +#define dsWSize 68 +#define dsWMask 76 +#define dsWindow 80 +#define dsPrev 96 +#define dsMatchLen 144 +#define dsPrevMatch 148 +#define dsStrStart 156 +#define dsMatchStart 160 +#define dsLookahead 164 +#define dsPrevLen 168 +#define dsMaxChainLen 172 +#define dsGoodMatch 188 +#define dsNiceMatch 192 + +#define window_size [ rcx + dsWSize] +#define WMask [ rcx + dsWMask] +#define window_ad [ rcx + dsWindow] +#define prev_ad [ rcx + dsPrev] +#define strstart [ rcx + dsStrStart] +#define match_start [ rcx + dsMatchStart] +#define Lookahead [ rcx + dsLookahead] //; 0ffffffffh on infozip +#define prev_length [ rcx + dsPrevLen] +#define max_chain_length [ rcx + dsMaxChainLen] +#define good_match [ rcx + dsGoodMatch] +#define nice_match [ rcx + dsNiceMatch] + +/* +; windows: +; parameter 1 in rcx(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + +; +; gcc on macosx-linux: +; see http://www.x86-64.org/documentation/abi-0.99.pdf +; param 1 in rdi, param 2 in rsi +; rbx, rsp, rbp, r12 to r15 must be preserved + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; ms: parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) +; mac: param 1 in rdi, param 2 rsi +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx +*/ + mov [save_rbx],rbx + mov [save_rbp],rbp + + + mov rcx,rdi + + mov r8d,esi + + + mov [save_r12],r12 + mov [save_r13],r13 + mov [save_r14],r14 + mov [save_r15],r15 + + +//;;; uInt wmask = s->w_mask; +//;;; unsigned chain_length = s->max_chain_length; +//;;; if (s->prev_length >= s->good_match) { +//;;; chain_length >>= 2; +//;;; } + + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +//;;; chainlen is decremented once beforehand so that the function can +//;;; use the sign flag instead of the zero flag for the exit test. +//;;; It is then shifted into the high word, to make room for the wmask +//;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +//;;; on zlib only +//;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + + + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d + + + +//;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +//;;; Determine how many bytes the scan ptr is off from being +//;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +//;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +//;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + + mov eax, window_size + sub eax, MIN_LOOKAHEAD + + + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +//;;; int best_len = s->prev_length; + + +//;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +//;;; register ush scan_start = *(ushf*)scan; +//;;; register ush scan_end = *(ushf*)(scan+best_len-1); +//;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +//;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + + + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + + + + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + jmp LookupLoopIsZero + AFTER_JMP +/* +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit +*/ +.balign 16 +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP + + +//;;; Store the current value of chainlen. + mov [chainlenwmask], edx +/* +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). +*/ + lea rsi,[r8+r10] + mov rdx, 0xfffffffffffffef8 //; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0x0108] //;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0x0108] //;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + +/* +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. +*/ + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + BEFORE_JMP + jnz LoopCmps + jmp LenMaximum + AFTER_JMP + +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0x0000FFFF + jnz LenLower + + test eax,0xffffffff + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + BEFORE_JMP + jnz LenLower + AFTER_JMP + +LenLower32: + shr eax,16 + add rdx,2 + +LenLower: + sub al, 1 + adc rdx, 0 +//;;; Calculate the length of the match. If it is longer than MAX_MATCH, +//;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + BEFORE_JMP + jge LenMaximum + AFTER_JMP +/* +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// +*/ + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP +/* +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); +*/ +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + BEFORE_JMP + jge LeaveNow + AFTER_JMP + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP + +//;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +//;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +//;;; return s->lookahead; + +LeaveNow: + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d + + + +//;;; Restore the stack and return from whence we came. + + +// mov rsi,[save_rsi] +// mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] + mov r14,[save_r14] + mov r15,[save_r15] + + + ret 0 +//; please don't remove this string ! +//; Your can freely use gvmat64 in any free or commercial app +//; but it is far better don't remove the string in the binary! + // db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 + + +match_init: + ret 0 + + diff --git a/contrib/zlib/contrib/infback9/README b/contrib/zlib/contrib/infback9/README new file mode 100644 index 000000000..e75ed1329 --- /dev/null +++ b/contrib/zlib/contrib/infback9/README @@ -0,0 +1 @@ +See infback9.h for what this is and how to use it. diff --git a/contrib/zlib/contrib/infback9/infback9.c b/contrib/zlib/contrib/infback9/infback9.c new file mode 100644 index 000000000..05fb3e338 --- /dev/null +++ b/contrib/zlib/contrib/infback9/infback9.c @@ -0,0 +1,615 @@ +/* infback9.c -- inflate deflate64 data using a call-back interface + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infback9.h" +#include "inftree9.h" +#include "inflate9.h" + +#define WSIZE 65536UL + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + window is a user-supplied window and output buffer that is 64K bytes. + */ +int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) +z_stream FAR *strm; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + state->window = window; + return Z_OK; +} + +/* + Build and output length and distance decoding tables for fixed code + decoding. + */ +#ifdef MAKEFIXED +#include + +void makefixed9(void) +{ + unsigned sym, bits, low, size; + code *next, *lenfix, *distfix; + struct inflate_state state; + code fixed[544]; + + /* literal/length table */ + sym = 0; + while (sym < 144) state.lens[sym++] = 8; + while (sym < 256) state.lens[sym++] = 9; + while (sym < 280) state.lens[sym++] = 7; + while (sym < 288) state.lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work); + + /* distance table */ + sym = 0; + while (sym < 32) state.lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work); + + /* write tables */ + puts(" /* inffix9.h -- table for decoding deflate64 fixed codes"); + puts(" * Generated automatically by makefixed9()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits, + lenfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 5) == 0) printf("\n "); + printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits, + distfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* Macros for inflateBack(): */ + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n <= 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = window; \ + left = WSIZE; \ + wrap = 1; \ + if (out(out_desc, put, (unsigned)left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) +z_stream FAR *strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have; /* available input */ + unsigned long left; /* available output */ + inflate_mode mode; /* current inflate mode */ + int lastblock; /* true if processing last block */ + int wrap; /* true if the window has wrapped */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned extra; /* extra bits needed */ + unsigned long length; /* literal or length of data to copy */ + unsigned long offset; /* distance back to copy string from */ + unsigned long copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +#include "inffix9.h" + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + mode = TYPE; + lastblock = 0; + wrap = 0; + window = state->window; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = window; + left = WSIZE; + lencode = Z_NULL; + distcode = Z_NULL; + + /* Inflate until end of block marked as last */ + for (;;) + switch (mode) { + case TYPE: + /* determine and dispatch block type */ + if (lastblock) { + BYTEBITS(); + mode = DONE; + break; + } + NEEDBITS(3); + lastblock = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + lastblock ? " (last)" : "")); + mode = STORED; + break; + case 1: /* fixed block */ + lencode = lenfix; + lenbits = 9; + distcode = distfix; + distbits = 5; + Tracev((stderr, "inflate: fixed codes block%s\n", + lastblock ? " (last)" : "")); + mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + lastblock ? " (last)" : "")); + mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + mode = BAD; + break; + } + length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %lu\n", + length)); + INITBITS(); + + /* copy stored block from input to output */ + while (length != 0) { + copy = length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); + if (state->nlen > 286) { + strm->msg = (char *)"too many length symbols"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 7; + ret = inflate_table9(CODES, state->lens, 19, &(state->next), + &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftree9.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 9; + ret = inflate_table9(LENS, state->lens, state->nlen, + &(state->next), &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + mode = BAD; + break; + } + distcode = (code const FAR *)(state->next); + distbits = 6; + ret = inflate_table9(DISTS, state->lens + state->nlen, + state->ndist, &(state->next), &(distbits), + state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + mode = LEN; + + case LEN: + /* get a literal, length, or end-of-block code */ + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(length); + left--; + mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + extra = (unsigned)(here.op) & 31; + if (extra != 0) { + NEEDBITS(extra); + length += BITS(extra); + DROPBITS(extra); + } + Tracevv((stderr, "inflate: length %lu\n", length)); + + /* get distance code */ + for (;;) { + here = distcode[BITS(distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + mode = BAD; + break; + } + offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + extra = (unsigned)(here.op) & 15; + if (extra != 0) { + NEEDBITS(extra); + offset += BITS(extra); + DROPBITS(extra); + } + if (offset > WSIZE - (wrap ? 0: left)) { + strm->msg = (char *)"invalid distance too far back"; + mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %lu\n", offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = WSIZE - offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - offset; + copy = left; + } + if (copy > length) copy = length; + length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < WSIZE) { + if (out(out_desc, window, (unsigned)(WSIZE - left))) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBack9End(strm) +z_stream FAR *strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/contrib/zlib/contrib/infback9/infback9.h b/contrib/zlib/contrib/infback9/infback9.h new file mode 100644 index 000000000..1073c0a38 --- /dev/null +++ b/contrib/zlib/contrib/infback9/infback9.h @@ -0,0 +1,37 @@ +/* infback9.h -- header for using inflateBack9 functions + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * This header file and associated patches provide a decoder for PKWare's + * undocumented deflate64 compression method (method 9). Use with infback9.c, + * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported. + * This should be compiled with zlib, since it uses zutil.h and zutil.o. + * This code has not yet been tested on 16-bit architectures. See the + * comments in zlib.h for inflateBack() usage. These functions are used + * identically, except that there is no windowBits parameter, and a 64K + * window must be provided. Also if int's are 16 bits, then a zero for + * the third parameter of the "out" function actually means 65536UL. + * zlib.h must be included before this header file. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); +ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define inflateBack9Init(strm, window) \ + inflateBack9Init_((strm), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef __cplusplus +} +#endif diff --git a/contrib/zlib/contrib/infback9/inffix9.h b/contrib/zlib/contrib/infback9/inffix9.h new file mode 100644 index 000000000..ee5671d2d --- /dev/null +++ b/contrib/zlib/contrib/infback9/inffix9.h @@ -0,0 +1,107 @@ + /* inffix9.h -- table for decoding deflate64 fixed codes + * Generated automatically by makefixed9(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112}, + {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160}, + {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88}, + {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208}, + {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136}, + {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227}, + {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232}, + {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124}, + {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184}, + {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82}, + {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196}, + {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130}, + {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148}, + {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106}, + {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244}, + {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118}, + {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172}, + {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94}, + {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220}, + {130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131}, + {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97}, + {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226}, + {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121}, + {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178}, + {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85}, + {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202}, + {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133}, + {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154}, + {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109}, + {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250}, + {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115}, + {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166}, + {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91}, + {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214}, + {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139}, + {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0}, + {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103}, + {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238}, + {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127}, + {0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80}, + {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193}, + {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128}, + {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145}, + {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104}, + {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241}, + {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116}, + {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169}, + {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92}, + {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217}, + {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140}, + {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163}, + {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98}, + {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122}, + {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181}, + {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86}, + {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205}, + {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134}, + {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157}, + {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253}, + {96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113}, + {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163}, + {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89}, + {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211}, + {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137}, + {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3}, + {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101}, + {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235}, + {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125}, + {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187}, + {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83}, + {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199}, + {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151}, + {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107}, + {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247}, + {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119}, + {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175}, + {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95}, + {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223}, + {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143}, + {0,8,79},{0,9,255} + }; + + static const code distfix[32] = { + {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5}, + {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513}, + {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129}, + {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145}, + {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4}, + {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073}, + {134,5,193},{142,5,49153} + }; diff --git a/contrib/zlib/contrib/infback9/inflate9.h b/contrib/zlib/contrib/infback9/inflate9.h new file mode 100644 index 000000000..ee9a79394 --- /dev/null +++ b/contrib/zlib/contrib/infback9/inflate9.h @@ -0,0 +1,47 @@ +/* inflate9.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + TYPE, /* i: waiting for type bits, including last-flag bit */ + STORED, /* i: waiting for stored size (length and complement) */ + TABLE, /* i: waiting for dynamic block table lengths */ + LEN, /* i: waiting for length/lit code */ + DONE, /* finished check, done -- remain here until reset */ + BAD /* got a data error -- remain here until reset */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD mode -- not shown for clarity) + + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or DONE + STORED -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LEN or TYPE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + /* sliding window */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/contrib/zlib/contrib/infback9/inftree9.c b/contrib/zlib/contrib/infback9/inftree9.c new file mode 100644 index 000000000..5f4a76798 --- /dev/null +++ b/contrib/zlib/contrib/infback9/inftree9.c @@ -0,0 +1,324 @@ +/* inftree9.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftree9.h" + +#define MAXBITS 15 + +const char inflate9_copyright[] = + " inflate9 1.2.11 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table9(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 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, 3, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, + 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, + 133, 133, 133, 133, 144, 77, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ + 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, 32769, 49153}; + static const unsigned short dext[32] = { /* Distance codes 0..31 extra */ + 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 141, 141, 142, 142}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) return -1; /* no codes! */ + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftree9.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + curr = root; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/contrib/zlib/contrib/infback9/inftree9.h b/contrib/zlib/contrib/infback9/inftree9.h new file mode 100644 index 000000000..5ab21f0c6 --- /dev/null +++ b/contrib/zlib/contrib/infback9/inftree9.h @@ -0,0 +1,61 @@ +/* inftree9.h -- header to use inftree9.c + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 100eeeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1446, which is the sum of 852 for literal/length codes and 594 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 32 6 15" for distance codes returns 594. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in infback9.c. If the root table size is changed, + then these maximum sizes would be need to be recalculated and updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 594 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table9() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/contrib/zlib/contrib/inflate86/inffas86.c b/contrib/zlib/contrib/inflate86/inffas86.c new file mode 100644 index 000000000..7292f67b7 --- /dev/null +++ b/contrib/zlib/contrib/inflate86/inffas86.c @@ -0,0 +1,1157 @@ +/* inffas86.c is a hand tuned assembler version of + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } ar; + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) + __asm__ __volatile__ ( +" leaq %0, %%rax\n" +" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ +" movq %%rsp, (%%rax)\n" +" movq %%rax, %%rsp\n" /* make rsp point to &ar */ +" movq 16(%%rsp), %%rsi\n" /* rsi = in */ +" movq 32(%%rsp), %%rdi\n" /* rdi = out */ +" movq 24(%%rsp), %%r9\n" /* r9 = last */ +" movq 48(%%rsp), %%r10\n" /* r10 = end */ +" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ +" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ +" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ +" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ +" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ +" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ + /* r14d = len */ + /* r15d = dist */ +" cld\n" +" cmpq %%rdi, %%r10\n" +" je .L_one_time\n" /* if only one decode left */ +" cmpq %%rsi, %%r9\n" +" je .L_one_time\n" +" jmp .L_do_loop\n" + +".L_one_time:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code_one_time\n" + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ +" jmp .L_get_length_code_one_time\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpq %%rdi, %%r10\n" +" jbe .L_break_loop\n" +" cmpq %%rsi, %%r9\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_length_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" movq %%r12, %%r8\n" /* r8 = lmask */ +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" + +".L_get_length_code_one_time:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%r14d\n" /* len = this */ +" shrl $16, %%r14d\n" /* len = this.val */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" movq %%r13, %%r8\n" /* r8 = dmask */ +" cmpb $32, %%bl\n" +" ja .L_get_distance_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_distance_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%r15d\n" /* dist = this */ +" shrl $16, %%r15d\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ +" movq %%rdi, %%rax\n" +" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ + +" cmpl %%r15d, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%rsi), %%al\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ +" je .L_check_window\n" + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movb -1(%%rdi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +".L_set_two:\n" +" rep stosw\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r14d, %%eax\n" /* eax += len */ +" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r15d, %%eax\n" /* eax += dist */ +" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" /* ecx = nbytes */ +" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ +" negl %%ecx\n" /* nbytes = -nbytes */ + +" cmpl %%r15d, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 96(%%rsp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%r14d\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 96(%%rsp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" movl 92(%%rsp), %%esi\n" /* from = wsize */ +" addq 56(%%rsp), %%rsi\n" /* from += window */ +" addq %%rax, %%rsi\n" /* from += write */ +" subq %%rcx, %%rsi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" movq 56(%%rsp), %%rsi\n" /* rsi = window */ +" addq %%rax, %%rsi\n" +" subq %%rcx, %%rsi\n" /* from += write - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" /* ecx = len */ +" rep movsb\n" + +" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl $4, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 116(%%rsp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movq %%rsi, 16(%%rsp)\n" /* in */ +" movq %%rdi, 32(%%rsp)\n" /* out */ +" movl %%ebx, 88(%%rsp)\n" /* bits */ +" movq %%rdx, 80(%%rsp)\n" /* hold */ +" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ +" movq 8(%%rsp), %%rbp\n" +" movq %%rax, %%rsp\n" + : + : "m" (ar) + : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" + ); +#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" movl %%esp, (%%eax)\n" /* save esp, ebp */ +" movl %%ebp, 4(%%eax)\n" +" movl %%eax, %%esp\n" +" movl 8(%%esp), %%esi\n" /* esi = in */ +" movl 16(%%esp), %%edi\n" /* edi = out */ +" movl 40(%%esp), %%edx\n" /* edx = hold */ +" movl 44(%%esp), %%ebx\n" /* ebx = bits */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpl %%edi, 24(%%esp)\n" /* out < end */ +" jbe .L_break_loop\n" +" cmpl %%esi, 12(%%esp)\n" /* in < last */ +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 64(%%esp)\n" /* save len */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 60(%%esp), %%eax\n" /* eax = dmask */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 20(%%esp)\n" +" je .L_check_window\n" /* out == beg, if outside window */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movb -1(%%edi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +".L_set_two:\n" +" rep stosw\n" +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 64(%%esp), %%eax\n" /* eax += len */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += dist */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 48(%%esp), %%eax\n" /* eax = wsize */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 28(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 52(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 52(%%esp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 48(%%esp), %%esi\n" /* from += wsize */ +" addl %%eax, %%esi\n" /* from += write */ +" subl %%ecx, %%esi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 28(%%esp), %%esi\n" /* from = window */ +" movl 52(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 8(%%esp), %%esi\n" +" movl $4, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 72(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 8(%%esp)\n" /* save in */ +" movl %%edi, 16(%%esp)\n" /* save out */ +" movl %%ebx, 44(%%esp)\n" /* save bits */ +" movl %%edx, 40(%%esp)\n" /* save hold */ +" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ +" movl (%%esp), %%esp\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); +#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) + __asm { + lea eax, ar + mov [eax], esp /* save esp, ebp */ + mov [eax+4], ebp + mov esp, eax + mov esi, [esp+8] /* esi = in */ + mov edi, [esp+16] /* edi = out */ + mov edx, [esp+40] /* edx = hold */ + mov ebx, [esp+44] /* ebx = bits */ + mov ebp, [esp+32] /* ebp = lcode */ + + cld + jmp L_do_loop + +ALIGN 4 +L_while_test: + cmp [esp+24], edi + jbe L_break_loop + cmp [esp+12], esi + jbe L_break_loop + +L_do_loop: + cmp bl, 15 + ja L_get_length_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_length_code: + mov eax, [esp+56] /* eax = lmask */ + and eax, edx /* eax &= hold */ + mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah /* cl = this.bits */ + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base /* if (op != 0) 45.7% */ + + shr eax, 16 /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov ecx, eax /* len = this */ + shr ecx, 16 /* len = this.val */ + mov [esp+64], ecx /* save len */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + and cl, 15 /* op &= 15 */ + jz L_decode_distance /* if (!op) */ + cmp bl, cl + jae L_add_bits_to_len /* if (op <= bits) */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + shr edx, cl + add [esp+64], eax /* len += hold & mask[op] */ + +L_decode_distance: + cmp bl, 15 + ja L_get_distance_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_distance_code: + mov eax, [esp+60] /* eax = dmask */ + mov ecx, [esp+36] /* ecx = dcode */ + and eax, edx /* eax &= hold */ + mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ + +L_dodist: + mov ebp, eax /* dist = this */ + shr ebp, 16 /* dist = this.val */ + mov cl, ah + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + mov cl, al /* cl = this.op */ + + test al, 16 /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 /* op &= 15 */ + jz L_check_dist_one + cmp bl, cl + jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax /* (1 << op) - 1 */ + and eax, edx /* eax &= hold */ + shr edx, cl + add ebp, eax /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov [esp+8], esi /* save in so from can use it's reg */ + mov eax, edi + sub eax, [esp+20] /* nbytes = out - beg */ + + cmp eax, ebp + jb L_clip_window /* if (dist > nbytes) 4.2% */ + + mov ecx, [esp+64] /* ecx = len */ + mov esi, edi + sub esi, ebp /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two + + rep movsw + mov al, [esi] + mov [edi], al + inc edi + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_copy_two: + rep movsw + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp ebp, 1 /* if dist 1, is a memset */ + jne L_check_window + cmp [esp+20], edi + je L_check_window /* out == beg, if outside window */ + + mov ecx, [esp+64] /* ecx = len */ + mov al, [edi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [edi], al /* memset out with from[-1] */ + inc edi + +L_set_two: + rep stosw + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, [esp+64] /* eax += len */ + mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, ebp /* eax += dist */ + mov ecx, [esp+36] /* ecx = dcode */ + mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax + mov eax, [esp+48] /* eax = wsize */ + neg ecx /* nbytes = -nbytes */ + mov esi, [esp+28] /* from = window */ + + cmp eax, ebp + jb L_invalid_distance_too_far /* if (dist > wsize) */ + + add ecx, ebp /* nbytes = dist - nbytes */ + cmp dword ptr [esp+52], 0 + jne L_wrap_around_window /* if (write != 0) */ + + sub eax, ecx + add esi, eax /* from += wsize - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [esp+52] /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window /* if (write >= nbytes) */ + + add esi, [esp+48] /* from += wsize */ + add esi, eax /* from += write */ + sub esi, ecx /* from -= nbytes */ + sub ecx, eax /* nbytes -= write */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, [esp+28] /* from = window */ + mov ecx, [esp+52] /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + add esi, eax + sub esi, ecx /* from += write - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_do_copy: + mov ecx, eax + rep movsb + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [esp+72], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [esp+72], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [esp+72], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov esi, [esp+4] + mov dword ptr [esp+72], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [esp+72], 0 + +L_break_loop_with_status: +/* put in, out, bits, and hold back into ar and pop esp */ + mov [esp+8], esi /* save in */ + mov [esp+16], edi /* save out */ + mov [esp+44], ebx /* save bits */ + mov [esp+40], edx /* save hold */ + mov ebp, [esp+4] /* restore esp, ebp */ + mov esp, [esp] + } +#else +#error "x86 architecture not defined" +#endif + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + diff --git a/contrib/zlib/contrib/inflate86/inffast.S b/contrib/zlib/contrib/inflate86/inffast.S new file mode 100644 index 000000000..2245a2905 --- /dev/null +++ b/contrib/zlib/contrib/inflate86/inffast.S @@ -0,0 +1,1368 @@ +/* + * inffast.S is a hand tuned assembler version of: + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * This version (Jan-23-2003) of inflate_fast was coded and tested under + * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that + * machine, I found that gzip style archives decompressed about 20% faster than + * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will + * depend on how large of a buffer is used for z_stream.next_in & next_out + * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in + * stream processing I/O and crc32/addler32. In my case, this routine used + * 70% of the cpu time and crc32 used 20%. + * + * I am confident that this version will work in the general case, but I have + * not tested a wide variety of datasets or a wide variety of platforms. + * + * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. + * It should be a runtime flag instead of compile time flag... + * + * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. + * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code + * is compiled. Without either option, runtime detection is enabled. Runtime + * detection should work on all modern cpus and the recomended algorithm (flip + * ID bit on eflags and then use the cpuid instruction) is used in many + * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 + * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o + * inffast.obj generates a COFF object which can then be linked with MSVC++ + * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. + * + * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and + * slower than compiler generated code). Adjusted cpuid check to use the MMX + * code only for Pentiums < P4 until I have more data on the P4. Speed + * improvment is only about 15% on the Athlon when compared with code generated + * with MSVC++. Not sure yet, but I think the P4 will also be slower using the + * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and + * have less latency than MMX ops. Added code to buffer the last 11 bytes of + * the input stream since the MMX code grabs bits in chunks of 32, which + * differs from the inffast.c algorithm. I don't think there would have been + * read overruns where a page boundary was crossed (a segfault), but there + * could have been overruns when next_in ends on unaligned memory (unintialized + * memory read). + * + * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C + * version of the non-MMX code so that it doesn't depend on zstrm and zstate + * structure offsets which are hard coded in this file. This was last tested + * with zlib-1.2.0 which is currently in beta testing, newer versions of this + * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and + * http://www.charm.net/~christop/zlib/ + */ + + +/* + * if you have underscore linking problems (_inflate_fast undefined), try + * using -DGAS_COFF + */ +#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) + +#if defined( WIN32 ) || defined( __CYGWIN__ ) +#define GAS_COFF /* windows object format */ +#else +#define GAS_ELF +#endif + +#endif /* ! GAS_COFF && ! GAS_ELF */ + + +#if defined( GAS_COFF ) + +/* coff externals have underscores */ +#define inflate_fast _inflate_fast +#define inflate_fast_use_mmx _inflate_fast_use_mmx + +#endif /* GAS_COFF */ + + +.file "inffast.S" + +.globl inflate_fast + +.text +.align 4,0 +.L_invalid_literal_length_code_msg: +.string "invalid literal/length code" + +.align 4,0 +.L_invalid_distance_code_msg: +.string "invalid distance code" + +.align 4,0 +.L_invalid_distance_too_far_msg: +.string "invalid distance too far back" + +#if ! defined( NO_MMX ) +.align 4,0 +.L_mask: /* mask[N] = ( 1 << N ) - 1 */ +.long 0 +.long 1 +.long 3 +.long 7 +.long 15 +.long 31 +.long 63 +.long 127 +.long 255 +.long 511 +.long 1023 +.long 2047 +.long 4095 +.long 8191 +.long 16383 +.long 32767 +.long 65535 +.long 131071 +.long 262143 +.long 524287 +.long 1048575 +.long 2097151 +.long 4194303 +.long 8388607 +.long 16777215 +.long 33554431 +.long 67108863 +.long 134217727 +.long 268435455 +.long 536870911 +.long 1073741823 +.long 2147483647 +.long 4294967295 +#endif /* NO_MMX */ + +.text + +/* + * struct z_stream offsets, in zlib.h + */ +#define next_in_strm 0 /* strm->next_in */ +#define avail_in_strm 4 /* strm->avail_in */ +#define next_out_strm 12 /* strm->next_out */ +#define avail_out_strm 16 /* strm->avail_out */ +#define msg_strm 24 /* strm->msg */ +#define state_strm 28 /* strm->state */ + +/* + * struct inflate_state offsets, in inflate.h + */ +#define mode_state 0 /* state->mode */ +#define wsize_state 32 /* state->wsize */ +#define write_state 40 /* state->write */ +#define window_state 44 /* state->window */ +#define hold_state 48 /* state->hold */ +#define bits_state 52 /* state->bits */ +#define lencode_state 68 /* state->lencode */ +#define distcode_state 72 /* state->distcode */ +#define lenbits_state 76 /* state->lenbits */ +#define distbits_state 80 /* state->distbits */ + +/* + * inflate_fast's activation record + */ +#define local_var_size 64 /* how much local space for vars */ +#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ +#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ + +/* + * offsets for local vars on stack + */ +#define out 60 /* unsigned char* */ +#define window 56 /* unsigned char* */ +#define wsize 52 /* unsigned int */ +#define write 48 /* unsigned int */ +#define in 44 /* unsigned char* */ +#define beg 40 /* unsigned char* */ +#define buf 28 /* char[ 12 ] */ +#define len 24 /* unsigned int */ +#define last 20 /* unsigned char* */ +#define end 16 /* unsigned char* */ +#define dcode 12 /* code* */ +#define lcode 8 /* code* */ +#define dmask 4 /* unsigned int */ +#define lmask 0 /* unsigned int */ + +/* + * typedef enum inflate_mode consts, in inflate.h + */ +#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ +#define INFLATE_MODE_BAD 26 + + +#if ! defined( USE_MMX ) && ! defined( NO_MMX ) + +#define RUN_TIME_MMX + +#define CHECK_MMX 1 +#define DO_USE_MMX 2 +#define DONT_USE_MMX 3 + +.globl inflate_fast_use_mmx + +.data + +.align 4,0 +inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ +.long CHECK_MMX + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast_use_mmx,@object +.size inflate_fast_use_mmx,4 +#endif + +#endif /* RUN_TIME_MMX */ + +#if defined( GAS_COFF ) +/* coff info: scl 2 = extern, type 32 = function */ +.def inflate_fast; .scl 2; .type 32; .endef +#endif + +.text + +.align 32,0x90 +inflate_fast: + pushl %edi + pushl %esi + pushl %ebp + pushl %ebx + pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ + subl $local_var_size, %esp + cld + +#define strm_r %esi +#define state_r %edi + + movl strm_sp(%esp), strm_r + movl state_strm(strm_r), state_r + + /* in = strm->next_in; + * out = strm->next_out; + * last = in + strm->avail_in - 11; + * beg = out - (start - strm->avail_out); + * end = out + (strm->avail_out - 257); + */ + movl avail_in_strm(strm_r), %edx + movl next_in_strm(strm_r), %eax + + addl %eax, %edx /* avail_in += next_in */ + subl $11, %edx /* avail_in -= 11 */ + + movl %eax, in(%esp) + movl %edx, last(%esp) + + movl start_sp(%esp), %ebp + movl avail_out_strm(strm_r), %ecx + movl next_out_strm(strm_r), %ebx + + subl %ecx, %ebp /* start -= avail_out */ + negl %ebp /* start = -start */ + addl %ebx, %ebp /* start += next_out */ + + subl $257, %ecx /* avail_out -= 257 */ + addl %ebx, %ecx /* avail_out += out */ + + movl %ebx, out(%esp) + movl %ebp, beg(%esp) + movl %ecx, end(%esp) + + /* wsize = state->wsize; + * write = state->write; + * window = state->window; + * hold = state->hold; + * bits = state->bits; + * lcode = state->lencode; + * dcode = state->distcode; + * lmask = ( 1 << state->lenbits ) - 1; + * dmask = ( 1 << state->distbits ) - 1; + */ + + movl lencode_state(state_r), %eax + movl distcode_state(state_r), %ecx + + movl %eax, lcode(%esp) + movl %ecx, dcode(%esp) + + movl $1, %eax + movl lenbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, lmask(%esp) + + movl $1, %eax + movl distbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, dmask(%esp) + + movl wsize_state(state_r), %eax + movl write_state(state_r), %ecx + movl window_state(state_r), %edx + + movl %eax, wsize(%esp) + movl %ecx, write(%esp) + movl %edx, window(%esp) + + movl hold_state(state_r), %ebp + movl bits_state(state_r), %ebx + +#undef strm_r +#undef state_r + +#define in_r %esi +#define from_r %esi +#define out_r %edi + + movl in(%esp), in_r + movl last(%esp), %ecx + cmpl in_r, %ecx + ja .L_align_long /* if in < last */ + + addl $11, %ecx /* ecx = &in[ avail_in ] */ + subl in_r, %ecx /* ecx = avail_in */ + movl $12, %eax + subl %ecx, %eax /* eax = 12 - avail_in */ + leal buf(%esp), %edi + rep movsb /* memcpy( buf, in, avail_in ) */ + movl %eax, %ecx + xorl %eax, %eax + rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ + leal buf(%esp), in_r /* in = buf */ + movl in_r, last(%esp) /* last = in, do just one iteration */ + jmp .L_is_aligned + + /* align in_r on long boundary */ +.L_align_long: + testl $3, in_r + jz .L_is_aligned + xorl %eax, %eax + movb (in_r), %al + incl in_r + movl %ebx, %ecx + addl $8, %ebx + shll %cl, %eax + orl %eax, %ebp + jmp .L_align_long + +.L_is_aligned: + movl out(%esp), out_r + +#if defined( NO_MMX ) + jmp .L_do_loop +#endif + +#if defined( USE_MMX ) + jmp .L_init_mmx +#endif + +/*** Runtime MMX check ***/ + +#if defined( RUN_TIME_MMX ) +.L_check_mmx: + cmpl $DO_USE_MMX, inflate_fast_use_mmx + je .L_init_mmx + ja .L_do_loop /* > 2 */ + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushf + movl (%esp), %eax /* copy eflags to eax */ + xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) + * to see if cpu supports cpuid... + * ID bit method not supported by NexGen but + * bios may load a cpuid instruction and + * cpuid may be disabled on Cyrix 5-6x86 */ + popf + pushf + popl %edx /* copy new eflags to edx */ + xorl %eax, %edx /* test if ID bit is flipped */ + jz .L_dont_use_mmx /* not flipped if zero */ + xorl %eax, %eax + cpuid + cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ + jne .L_dont_use_mmx + cmpl $0x6c65746e, %ecx + jne .L_dont_use_mmx + cmpl $0x49656e69, %edx + jne .L_dont_use_mmx + movl $1, %eax + cpuid /* get cpu features */ + shrl $8, %eax + andl $15, %eax + cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ + jne .L_dont_use_mmx + testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ + jnz .L_use_mmx + jmp .L_dont_use_mmx +.L_use_mmx: + movl $DO_USE_MMX, inflate_fast_use_mmx + jmp .L_check_mmx_pop +.L_dont_use_mmx: + movl $DONT_USE_MMX, inflate_fast_use_mmx +.L_check_mmx_pop: + popl %edx + popl %ecx + popl %ebx + popl %eax + jmp .L_check_mmx +#endif + + +/*** Non-MMX code ***/ + +#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) + +#define hold_r %ebp +#define bits_r %bl +#define bitslong_r %ebx + +.align 32,0x90 +.L_while_test: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * do { + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = lcode[hold & lmask] + */ + cmpb $15, bits_r + ja .L_get_length_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_length_code: + movl lmask(%esp), %edx /* edx = lmask */ + movl lcode(%esp), %ecx /* ecx = lcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * dolen: + * bits -= this.bits; + * hold >>= this.bits + */ + movb %ah, %cl /* cl = this.bits */ + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* check if op is a literal + * if (op == 0) { + * PUP(out) = this.val; + * } + */ + testb %al, %al + jnz .L_test_for_length_base /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test + +.L_test_for_length_base: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len + * + * else if (op & 16) { + * len = this.val + * op &= 15 + * if (op) { + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * len += hold & mask[op]; + * bits -= op; + * hold >>= op; + * } + */ +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + movb %al, %cl + + testb $16, %al + jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + andb $15, %cl /* op &= 15 */ + jz .L_save_len /* if (!op) */ + cmpb %cl, bits_r + jae .L_add_bits_to_len /* if (op <= bits) */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_len: + movl $1, %eax + shll %cl, %eax + decl %eax + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, len_r /* len += hold & mask[op] */ + +.L_save_len: + movl len_r, len(%esp) /* save len */ +#undef len_r + +.L_decode_distance: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = dcode[hold & dmask]; + * dodist: + * bits -= this.bits; + * hold >>= this.bits; + * op = this.op; + */ + + cmpb $15, bits_r + ja .L_get_distance_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_distance_code: + movl dmask(%esp), %edx /* edx = dmask */ + movl dcode(%esp), %ecx /* ecx = dcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ + +#define dist_r %edx +.L_dodist: + movl %eax, dist_r /* dist = this */ + shrl $16, dist_r /* dist = this.val */ + movb %ah, %cl + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* if (op & 16) { + * dist = this.val + * op &= 15 + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * dist += hold & mask[op]; + * bits -= op; + * hold >>= op; + */ + movb %al, %cl /* cl = this.op */ + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist + andb $15, %cl /* op &= 15 */ + jz .L_check_dist_one + cmpb %cl, bits_r + jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_dist: + movl $1, %eax + shll %cl, %eax + decl %eax /* (1 << op) - 1 */ + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ + jmp .L_check_window + +.L_check_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * nbytes = out - beg; + * if (dist <= nbytes) { + * from = out - dist; + * do { + * PUP(out) = PUP(from); + * } while (--len > 0) { + * } + */ + + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window /* if (dist > nbytes) 4.2% */ + + movl len(%esp), %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +.align 16,0x90 +.L_check_dist_one: + cmpl $1, dist_r + jne .L_check_window + cmpl out_r, beg(%esp) + je .L_check_window + + decl out_r + movl len(%esp), %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + jmp .L_while_test + +.align 16,0x90 +.L_test_for_second_level_length: + /* else if ((op & 64) == 0) { + * this = lcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl lcode(%esp), %edx /* edx = lcode */ + movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ + jmp .L_dolen + +.align 16,0x90 +.L_test_for_second_level_dist: + /* else if ((op & 64) == 0) { + * this = dcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl dcode(%esp), %edx /* edx = dcode */ + movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ + jmp .L_dodist + +.align 16,0x90 +.L_clip_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * else { + * if (dist > wsize) { + * invalid distance + * } + * from = window; + * nbytes = dist - nbytes; + * if (write == 0) { + * from += wsize - nbytes; + */ +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = len + * + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define len_r %eax + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_wrap_around_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else if (write < nbytes) { + * from += wsize + write - nbytes; + * nbytes -= write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = window; + * nbytes = write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while(--nbytes); + * from = out - dist; + * } + * } + * } + */ +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_contiguous_in_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else { + * from += write - nbytes; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1: + /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out + * %eax = len + * + * while (len > 0) { + * PUP(out) = PUP(from); + * len--; + * } + * } + * } while (in < last && out < end); + */ +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +#undef len_r +#undef dist_r + +#endif /* NO_MMX || RUN_TIME_MMX */ + + +/*** MMX code ***/ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +.align 32,0x90 +.L_init_mmx: + emms + +#undef bits_r +#undef bitslong_r +#define bitslong_r %ebp +#define hold_mm %mm0 + movd %ebp, hold_mm + movl %ebx, bitslong_r + +#define used_mm %mm1 +#define dmask2_mm %mm2 +#define lmask2_mm %mm3 +#define lmask_mm %mm4 +#define dmask_mm %mm5 +#define tmp_mm %mm6 + + movd lmask(%esp), lmask_mm + movq lmask_mm, lmask2_mm + movd dmask(%esp), dmask_mm + movq dmask_mm, dmask2_mm + pxor used_mm, used_mm + movl lcode(%esp), %ebx /* ebx = lcode */ + jmp .L_do_loop_mmx + +.align 32,0x90 +.L_while_test_mmx: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_length_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_length_code_mmx: + pand hold_mm, lmask_mm + movd lmask_mm, %eax + movq lmask2_mm, lmask_mm + movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen_mmx: + movzbl %ah, %ecx /* ecx = this.bits */ + movd %ecx, used_mm + subl %ecx, bitslong_r /* bits -= this.bits */ + + testb %al, %al + jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test_mmx + +.L_test_for_length_base_mmx: +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + + testb $16, %al + jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ + andl $15, %eax /* op &= 15 */ + jz .L_decode_distance_mmx /* if (!op) */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm + movd hold_mm, %ecx + subl %eax, bitslong_r + andl .L_mask(,%eax,4), %ecx + addl %ecx, len_r /* len += hold & mask[op] */ + +.L_decode_distance_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_dist_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_dist_code_mmx: + movl dcode(%esp), %ebx /* ebx = dcode */ + pand hold_mm, dmask_mm + movd dmask_mm, %eax + movq dmask2_mm, dmask_mm + movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ + +.L_dodist_mmx: +#define dist_r %ebx + movzbl %ah, %ecx /* ecx = this.bits */ + movl %eax, dist_r + shrl $16, dist_r /* dist = this.val */ + subl %ecx, bitslong_r /* bits -= this.bits */ + movd %ecx, used_mm + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist_mmx + andl $15, %eax /* op &= 15 */ + jz .L_check_dist_one_mmx + +.L_add_bits_to_dist_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm /* save bit length of current op */ + movd hold_mm, %ecx /* get the next bits on input stream */ + subl %eax, bitslong_r /* bits -= op bits */ + andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ + addl %ecx, dist_r /* dist += hold & mask[op] */ + +.L_check_window_mmx: + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ + + movl len_r, %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_check_dist_one_mmx: + cmpl $1, dist_r + jne .L_check_window_mmx + cmpl out_r, beg(%esp) + je .L_check_window_mmx + + decl out_r + movl len_r, %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_test_for_second_level_length_mmx: + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + addl len_r, %ecx + movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dolen_mmx + +.align 16,0x90 +.L_test_for_second_level_dist_mmx: + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + movl dcode(%esp), %eax /* ecx = dcode */ + addl dist_r, %ecx + movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dodist_mmx + +.align 16,0x90 +.L_clip_window_mmx: +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window_mmx /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_wrap_around_window_mmx: +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_contiguous_in_window_mmx: +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1_mmx: +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +#undef hold_r +#undef bitslong_r + +#endif /* USE_MMX || RUN_TIME_MMX */ + + +/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ + +.L_invalid_distance_code: + /* else { + * strm->msg = "invalid distance code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_distance_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_test_for_end_of_block: + /* else if (op & 32) { + * state->mode = TYPE; + * break; + * } + */ + testb $32, %al + jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ + + movl $0, %ecx + movl $INFLATE_MODE_TYPE, %edx + jmp .L_update_stream_state + +.L_invalid_literal_length_code: + /* else { + * strm->msg = "invalid literal/length code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_literal_length_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_invalid_distance_too_far: + /* strm->msg = "invalid distance too far back"; + * state->mode = BAD; + */ + movl in(%esp), in_r /* from_r has in's reg, put in back */ + movl $.L_invalid_distance_too_far_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_update_stream_state: + /* set strm->msg = %ecx, strm->state->mode = %edx */ + movl strm_sp(%esp), %eax + testl %ecx, %ecx /* if (msg != NULL) */ + jz .L_skip_msg + movl %ecx, msg_strm(%eax) /* strm->msg = msg */ +.L_skip_msg: + movl state_strm(%eax), %eax /* state = strm->state */ + movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ + jmp .L_break_loop + +.align 32,0x90 +.L_break_loop: + +/* + * Regs: + * + * bits = %ebp when mmx, and in %ebx when non-mmx + * hold = %hold_mm when mmx, and in %ebp when non-mmx + * in = %esi + * out = %edi + */ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_next_in + +#endif /* RUN_TIME_MMX */ + + movl %ebp, %ebx + +.L_update_next_in: + +#endif + +#define strm_r %eax +#define state_r %edx + + /* len = bits >> 3; + * in -= len; + * bits -= len << 3; + * hold &= (1U << bits) - 1; + * state->hold = hold; + * state->bits = bits; + * strm->next_in = in; + * strm->next_out = out; + */ + movl strm_sp(%esp), strm_r + movl %ebx, %ecx + movl state_strm(strm_r), state_r + shrl $3, %ecx + subl %ecx, in_r + shll $3, %ecx + subl %ecx, %ebx + movl out_r, next_out_strm(strm_r) + movl %ebx, bits_state(state_r) + movl %ebx, %ecx + + leal buf(%esp), %ebx + cmpl %ebx, last(%esp) + jne .L_buf_not_used /* if buf != last */ + + subl %ebx, in_r /* in -= buf */ + movl next_in_strm(strm_r), %ebx + movl %ebx, last(%esp) /* last = strm->next_in */ + addl %ebx, in_r /* in += strm->next_in */ + movl avail_in_strm(strm_r), %ebx + subl $11, %ebx + addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ + +.L_buf_not_used: + movl in_r, next_in_strm(strm_r) + + movl $1, %ebx + shll %cl, %ebx + decl %ebx + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_hold + +#endif /* RUN_TIME_MMX */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ebp + + emms + +.L_update_hold: + +#endif /* USE_MMX || RUN_TIME_MMX */ + + andl %ebx, %ebp + movl %ebp, hold_state(state_r) + +#define last_r %ebx + + /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ + movl last(%esp), last_r + cmpl in_r, last_r + jbe .L_last_is_smaller /* if (in >= last) */ + + subl in_r, last_r /* last -= in */ + addl $11, last_r /* last += 11 */ + movl last_r, avail_in_strm(strm_r) + jmp .L_fixup_out +.L_last_is_smaller: + subl last_r, in_r /* in -= last */ + negl in_r /* in = -in */ + addl $11, in_r /* in += 11 */ + movl in_r, avail_in_strm(strm_r) + +#undef last_r +#define end_r %ebx + +.L_fixup_out: + /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ + movl end(%esp), end_r + cmpl out_r, end_r + jbe .L_end_is_smaller /* if (out >= end) */ + + subl out_r, end_r /* end -= out */ + addl $257, end_r /* end += 257 */ + movl end_r, avail_out_strm(strm_r) + jmp .L_done +.L_end_is_smaller: + subl end_r, out_r /* out -= end */ + negl out_r /* out = -out */ + addl $257, out_r /* out += 257 */ + movl out_r, avail_out_strm(strm_r) + +#undef end_r +#undef strm_r +#undef state_r + +.L_done: + addl $local_var_size, %esp + popf + popl %ebx + popl %ebp + popl %esi + popl %edi + ret + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast,@function +.size inflate_fast,.-inflate_fast +#endif diff --git a/contrib/zlib/contrib/iostream/test.cpp b/contrib/zlib/contrib/iostream/test.cpp new file mode 100644 index 000000000..7d265b3b5 --- /dev/null +++ b/contrib/zlib/contrib/iostream/test.cpp @@ -0,0 +1,24 @@ + +#include "zfstream.h" + +int main() { + + // Construct a stream object with this filebuffer. Anything sent + // to this stream will go to standard out. + gzofstream os( 1, ios::out ); + + // This text is getting compressed and sent to stdout. + // To prove this, run 'test | zcat'. + os << "Hello, Mommy" << endl; + + os << setcompressionlevel( Z_NO_COMPRESSION ); + os << "hello, hello, hi, ho!" << endl; + + setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) + << "I'm compressing again" << endl; + + os.close(); + + return 0; + +} diff --git a/contrib/zlib/contrib/iostream/zfstream.cpp b/contrib/zlib/contrib/iostream/zfstream.cpp new file mode 100644 index 000000000..d0cd85faa --- /dev/null +++ b/contrib/zlib/contrib/iostream/zfstream.cpp @@ -0,0 +1,329 @@ + +#include "zfstream.h" + +gzfilebuf::gzfilebuf() : + file(NULL), + mode(0), + own_file_descriptor(0) +{ } + +gzfilebuf::~gzfilebuf() { + + sync(); + if ( own_file_descriptor ) + close(); + +} + +gzfilebuf *gzfilebuf::open( const char *name, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzopen(name, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 1; + + return this; + +} + +gzfilebuf *gzfilebuf::attach( int file_descriptor, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 0; + + return this; + +} + +gzfilebuf *gzfilebuf::close() { + + if ( is_open() ) { + + sync(); + gzclose( file ); + file = NULL; + + } + + return this; + +} + +int gzfilebuf::setcompressionlevel( int comp_level ) { + + return gzsetparams(file, comp_level, -2); + +} + +int gzfilebuf::setcompressionstrategy( int comp_strategy ) { + + return gzsetparams(file, -2, comp_strategy); + +} + + +streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { + + return streampos(EOF); + +} + +int gzfilebuf::underflow() { + + // If the file hasn't been opened for reading, error. + if ( !is_open() || !(mode & ios::in) ) + return EOF; + + // if a buffer doesn't exists, allocate one. + if ( !base() ) { + + if ( (allocate()) == EOF ) + return EOF; + setp(0,0); + + } else { + + if ( in_avail() ) + return (unsigned char) *gptr(); + + if ( out_waiting() ) { + if ( flushbuf() == EOF ) + return EOF; + } + + } + + // Attempt to fill the buffer. + + int result = fillbuf(); + if ( result == EOF ) { + // disable get area + setg(0,0,0); + return EOF; + } + + return (unsigned char) *gptr(); + +} + +int gzfilebuf::overflow( int c ) { + + if ( !is_open() || !(mode & ios::out) ) + return EOF; + + if ( !base() ) { + if ( allocate() == EOF ) + return EOF; + setg(0,0,0); + } else { + if (in_avail()) { + return EOF; + } + if (out_waiting()) { + if (flushbuf() == EOF) + return EOF; + } + } + + int bl = blen(); + setp( base(), base() + bl); + + if ( c != EOF ) { + + *pptr() = c; + pbump(1); + + } + + return 0; + +} + +int gzfilebuf::sync() { + + if ( !is_open() ) + return EOF; + + if ( out_waiting() ) + return flushbuf(); + + return 0; + +} + +int gzfilebuf::flushbuf() { + + int n; + char *q; + + q = pbase(); + n = pptr() - q; + + if ( gzwrite( file, q, n) < n ) + return EOF; + + setp(0,0); + + return 0; + +} + +int gzfilebuf::fillbuf() { + + int required; + char *p; + + p = base(); + + required = blen(); + + int t = gzread( file, p, required ); + + if ( t <= 0) return EOF; + + setg( base(), base(), base()+t); + + return t; + +} + +gzfilestream_common::gzfilestream_common() : + ios( gzfilestream_common::rdbuf() ) +{ } + +gzfilestream_common::~gzfilestream_common() +{ } + +void gzfilestream_common::attach( int fd, int io_mode ) { + + if ( !buffer.attach( fd, io_mode) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::open( const char *name, int io_mode ) { + + if ( !buffer.open( name, io_mode ) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::close() { + + if ( !buffer.close() ) + clear( ios::failbit | ios::badbit ); + +} + +gzfilebuf *gzfilestream_common::rdbuf() +{ + return &buffer; +} + +gzifstream::gzifstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzifstream::gzifstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzifstream::gzifstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzifstream::~gzifstream() { } + +gzofstream::gzofstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzofstream::gzofstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzofstream::gzofstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzofstream::~gzofstream() { } diff --git a/contrib/zlib/contrib/iostream/zfstream.h b/contrib/zlib/contrib/iostream/zfstream.h new file mode 100644 index 000000000..ed79098a3 --- /dev/null +++ b/contrib/zlib/contrib/iostream/zfstream.h @@ -0,0 +1,128 @@ + +#ifndef zfstream_h +#define zfstream_h + +#include +#include "zlib.h" + +class gzfilebuf : public streambuf { + +public: + + gzfilebuf( ); + virtual ~gzfilebuf(); + + gzfilebuf *open( const char *name, int io_mode ); + gzfilebuf *attach( int file_descriptor, int io_mode ); + gzfilebuf *close(); + + int setcompressionlevel( int comp_level ); + int setcompressionstrategy( int comp_strategy ); + + inline int is_open() const { return (file !=NULL); } + + virtual streampos seekoff( streamoff, ios::seek_dir, int ); + + virtual int sync(); + +protected: + + virtual int underflow(); + virtual int overflow( int = EOF ); + +private: + + gzFile file; + short mode; + short own_file_descriptor; + + int flushbuf(); + int fillbuf(); + +}; + +class gzfilestream_common : virtual public ios { + + friend class gzifstream; + friend class gzofstream; + friend gzofstream &setcompressionlevel( gzofstream &, int ); + friend gzofstream &setcompressionstrategy( gzofstream &, int ); + +public: + virtual ~gzfilestream_common(); + + void attach( int fd, int io_mode ); + void open( const char *name, int io_mode ); + void close(); + +protected: + gzfilestream_common(); + +private: + gzfilebuf *rdbuf(); + + gzfilebuf buffer; + +}; + +class gzifstream : public gzfilestream_common, public istream { + +public: + + gzifstream(); + gzifstream( const char *name, int io_mode = ios::in ); + gzifstream( int fd, int io_mode = ios::in ); + + virtual ~gzifstream(); + +}; + +class gzofstream : public gzfilestream_common, public ostream { + +public: + + gzofstream(); + gzofstream( const char *name, int io_mode = ios::out ); + gzofstream( int fd, int io_mode = ios::out ); + + virtual ~gzofstream(); + +}; + +template class gzomanip { + friend gzofstream &operator<<(gzofstream &, const gzomanip &); +public: + gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } +private: + gzofstream &(*func)(gzofstream &, T); + T val; +}; + +template gzofstream &operator<<(gzofstream &s, const gzomanip &m) +{ + return (*m.func)(s, m.val); +} + +inline gzofstream &setcompressionlevel( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionlevel(l); + return s; +} + +inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionstrategy(l); + return s; +} + +inline gzomanip setcompressionlevel(int l) +{ + return gzomanip(&setcompressionlevel,l); +} + +inline gzomanip setcompressionstrategy(int l) +{ + return gzomanip(&setcompressionstrategy,l); +} + +#endif diff --git a/contrib/zlib/contrib/iostream2/zstream.h b/contrib/zlib/contrib/iostream2/zstream.h new file mode 100644 index 000000000..43d2332b7 --- /dev/null +++ b/contrib/zlib/contrib/iostream2/zstream.h @@ -0,0 +1,307 @@ +/* + * + * Copyright (c) 1997 + * Christian Michelsen Research AS + * Advanced Computing + * Fantoftvegen 38, 5036 BERGEN, Norway + * http://www.cmr.no + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Christian Michelsen Research AS makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef ZSTREAM__H +#define ZSTREAM__H + +/* + * zstream.h - C++ interface to the 'zlib' general purpose compression library + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(_WIN32) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +class zstringlen { +public: + zstringlen(class izstream&); + zstringlen(class ozstream&, const char*); + size_t value() const { return val.word; } +private: + struct Val { unsigned char byte; size_t word; } val; +}; + +// ----------------------------- izstream ----------------------------- + +class izstream +{ + public: + izstream() : m_fp(0) {} + izstream(FILE* fp) : m_fp(0) { open(fp); } + izstream(const char* name) : m_fp(0) { open(name); } + ~izstream() { close(); } + + /* Opens a gzip (.gz) file for reading. + * open() can be used to read a file which is not in gzip format; + * in this case read() will directly read from the file without + * decompression. errno can be checked to distinguish two error + * cases (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name) { + if (m_fp) close(); + m_fp = ::gzopen(name, "rb"); + } + + void open(FILE* fp) { + SET_BINARY_MODE(fp); + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), "rb"); + } + + /* Flushes all pending input if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + int r = ::gzclose(m_fp); + m_fp = 0; return r; + } + + /* Binary read the given number of bytes from the compressed file. + */ + int read(void* buf, size_t len) { + return ::gzread(m_fp, buf, len); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + private: + gzFile m_fp; +}; + +/* + * Binary read the given (array of) object(s) from the compressed file. + * If the input file was not in gzip format, read() copies the objects number + * of bytes into the buffer. + * returns the number of uncompressed bytes actually read + * (0 for end of file, -1 for error). + */ +template +inline int read(izstream& zs, T* x, Items items) { + return ::gzread(zs.fp(), x, items*sizeof(T)); +} + +/* + * Binary input with the '>' operator. + */ +template +inline izstream& operator>(izstream& zs, T& x) { + ::gzread(zs.fp(), &x, sizeof(T)); + return zs; +} + + +inline zstringlen::zstringlen(izstream& zs) { + zs > val.byte; + if (val.byte == 255) zs > val.word; + else val.word = val.byte; +} + +/* + * Read length of string + the string with the '>' operator. + */ +inline izstream& operator>(izstream& zs, char* x) { + zstringlen len(zs); + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return zs; +} + +inline char* read_string(izstream& zs) { + zstringlen len(zs); + char* x = new char[len.value()+1]; + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return x; +} + +// ----------------------------- ozstream ----------------------------- + +class ozstream +{ + public: + ozstream() : m_fp(0), m_os(0) { + } + ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(fp, level); + } + ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(name, level); + } + ~ozstream() { + close(); + } + + /* Opens a gzip (.gz) file for writing. + * The compression level parameter should be in 0..9 + * errno can be checked to distinguish two error cases + * (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzopen(name, mode); + } + + /* open from a FILE pointer. + */ + void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { + SET_BINARY_MODE(fp); + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), mode); + } + + /* Flushes all pending output if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + if (m_os) { + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = 0; + } + int r = ::gzclose(m_fp); m_fp = 0; return r; + } + + /* Binary write the given number of bytes into the compressed file. + */ + int write(const void* buf, size_t len) { + return ::gzwrite(m_fp, (voidp) buf, len); + } + + /* Flushes all pending output into the compressed file. The parameter + * _flush is as in the deflate() function. The return value is the zlib + * error number (see function gzerror below). flush() returns Z_OK if + * the flush_ parameter is Z_FINISH and all output could be flushed. + * flush() should be called only when strictly necessary because it can + * degrade compression. + */ + int flush(int _flush) { + os_flush(); + return ::gzflush(m_fp, _flush); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + ostream& os() { + if (m_os == 0) m_os = new ostrstream; + return *m_os; + } + + void os_flush() { + if (m_os && m_os->pcount()>0) { + ostrstream* oss = new ostrstream; + oss->fill(m_os->fill()); + oss->flags(m_os->flags()); + oss->precision(m_os->precision()); + oss->width(m_os->width()); + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = oss; + } + } + + private: + gzFile m_fp; + ostrstream* m_os; +}; + +/* + * Binary write the given (array of) object(s) into the compressed file. + * returns the number of uncompressed bytes actually written + * (0 in case of error). + */ +template +inline int write(ozstream& zs, const T* x, Items items) { + return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); +} + +/* + * Binary output with the '<' operator. + */ +template +inline ozstream& operator<(ozstream& zs, const T& x) { + ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); + return zs; +} + +inline zstringlen::zstringlen(ozstream& zs, const char* x) { + val.byte = 255; val.word = ::strlen(x); + if (val.word < 255) zs < (val.byte = val.word); + else zs < val; +} + +/* + * Write length of string + the string with the '<' operator. + */ +inline ozstream& operator<(ozstream& zs, const char* x) { + zstringlen len(zs, x); + ::gzwrite(zs.fp(), (voidp) x, len.value()); + return zs; +} + +#ifdef _MSC_VER +inline ozstream& operator<(ozstream& zs, char* const& x) { + return zs < (const char*) x; +} +#endif + +/* + * Ascii write with the << operator; + */ +template +inline ostream& operator<<(ozstream& zs, const T& x) { + zs.os_flush(); + return zs.os() << x; +} + +#endif diff --git a/contrib/zlib/contrib/iostream2/zstream_test.cpp b/contrib/zlib/contrib/iostream2/zstream_test.cpp new file mode 100644 index 000000000..6273f62d6 --- /dev/null +++ b/contrib/zlib/contrib/iostream2/zstream_test.cpp @@ -0,0 +1,25 @@ +#include "zstream.h" +#include +#include +#include + +void main() { + char h[256] = "Hello"; + char* g = "Goodbye"; + ozstream out("temp.gz"); + out < "This works well" < h < g; + out.close(); + + izstream in("temp.gz"); // read it back + char *x = read_string(in), *y = new char[256], z[256]; + in > y > z; + in.close(); + cout << x << endl << y << endl << z << endl; + + out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results + out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; + out << z << endl << y << endl << x << endl; + out << 1.1234567890123456789 << endl; + + delete[] x; delete[] y; +} diff --git a/contrib/zlib/contrib/iostream3/README b/contrib/zlib/contrib/iostream3/README new file mode 100644 index 000000000..f7b319ab9 --- /dev/null +++ b/contrib/zlib/contrib/iostream3/README @@ -0,0 +1,35 @@ +These classes provide a C++ stream interface to the zlib library. It allows you +to do things like: + + gzofstream outf("blah.gz"); + outf << "These go into the gzip file " << 123 << endl; + +It does this by deriving a specialized stream buffer for gzipped files, which is +the way Stroustrup would have done it. :-> + +The gzifstream and gzofstream classes were originally written by Kevin Ruland +and made available in the zlib contrib/iostream directory. The older version still +compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of +this version. + +The new classes are as standard-compliant as possible, closely following the +approach of the standard library's fstream classes. It compiles under gcc versions +3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard +library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs +from the previous one in the following respects: +- added showmanyc +- added setbuf, with support for unbuffered output via setbuf(0,0) +- a few bug fixes of stream behavior +- gzipped output file opened with default compression level instead of maximum level +- setcompressionlevel()/strategy() members replaced by single setcompression() + +The code is provided "as is", with the permission to use, copy, modify, distribute +and sell it for any purpose without fee. + +Ludwig Schwardt + + +DSP Lab +Electrical & Electronic Engineering Department +University of Stellenbosch +South Africa diff --git a/contrib/zlib/contrib/iostream3/TODO b/contrib/zlib/contrib/iostream3/TODO new file mode 100644 index 000000000..7032f97be --- /dev/null +++ b/contrib/zlib/contrib/iostream3/TODO @@ -0,0 +1,17 @@ +Possible upgrades to gzfilebuf: + +- The ability to do putback (e.g. putbackfail) + +- The ability to seek (zlib supports this, but could be slow/tricky) + +- Simultaneous read/write access (does it make sense?) + +- Support for ios_base::ate open mode + +- Locale support? + +- Check public interface to see which calls give problems + (due to dependence on library internals) + +- Override operator<<(ostream&, gzfilebuf*) to allow direct copying + of stream buffer to stream ( i.e. os << is.rdbuf(); ) diff --git a/contrib/zlib/contrib/iostream3/test.cc b/contrib/zlib/contrib/iostream3/test.cc new file mode 100644 index 000000000..94235334f --- /dev/null +++ b/contrib/zlib/contrib/iostream3/test.cc @@ -0,0 +1,50 @@ +/* + * Test program for gzifstream and gzofstream + * + * by Ludwig Schwardt + * original version by Kevin Ruland + */ + +#include "zfstream.h" +#include // for cout + +int main() { + + gzofstream outf; + gzifstream inf; + char buf[80]; + + outf.open("test1.txt.gz"); + outf << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + + std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; + inf.open("test1.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + outf.rdbuf()->pubsetbuf(0,0); + outf.open("test2.txt.gz"); + outf << setcompression(Z_NO_COMPRESSION) + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form"; + + std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n"; + inf.rdbuf()->pubsetbuf(0,0); + inf.open("test2.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + return 0; + +} diff --git a/contrib/zlib/contrib/iostream3/zfstream.cc b/contrib/zlib/contrib/iostream3/zfstream.cc new file mode 100644 index 000000000..94eb93344 --- /dev/null +++ b/contrib/zlib/contrib/iostream3/zfstream.cc @@ -0,0 +1,479 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#include "zfstream.h" +#include // for strcpy, strcat, strlen (mode strings) +#include // for BUFSIZ + +// Internal buffer sizes (default and "unbuffered" versions) +#define BIGBUFSIZE BUFSIZ +#define SMALLBUFSIZE 1 + +/*****************************************************************************/ + +// Default constructor +gzfilebuf::gzfilebuf() +: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), + buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) +{ + // No buffers to start with + this->disable_buffer(); +} + +// Destructor +gzfilebuf::~gzfilebuf() +{ + // Sync output buffer and close only if responsible for file + // (i.e. attached streams should be left open at this stage) + this->sync(); + if (own_fd) + this->close(); + // Make sure internal buffer is deallocated + this->disable_buffer(); +} + +// Set compression level and strategy +int +gzfilebuf::setcompression(int comp_level, + int comp_strategy) +{ + return gzsetparams(file, comp_level, comp_strategy); +} + +// Open gzipped file +gzfilebuf* +gzfilebuf::open(const char *name, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to open file + if ((file = gzopen(name, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = true; + return this; +} + +// Attach to gzipped file +gzfilebuf* +gzfilebuf::attach(int fd, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzdopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to attach to file + if ((file = gzdopen(fd, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = false; + return this; +} + +// Close gzipped file +gzfilebuf* +gzfilebuf::close() +{ + // Fail immediately if no file is open + if (!this->is_open()) + return NULL; + // Assume success + gzfilebuf* retval = this; + // Attempt to sync and close gzipped file + if (this->sync() == -1) + retval = NULL; + if (gzclose(file) < 0) + retval = NULL; + // File is now gone anyway (postcondition [27.8.1.3.8]) + file = NULL; + own_fd = false; + // Destroy internal buffer if it exists + this->disable_buffer(); + return retval; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Convert int open mode to mode string +bool +gzfilebuf::open_mode(std::ios_base::openmode mode, + char* c_mode) const +{ + bool testb = mode & std::ios_base::binary; + bool testi = mode & std::ios_base::in; + bool testo = mode & std::ios_base::out; + bool testt = mode & std::ios_base::trunc; + bool testa = mode & std::ios_base::app; + + // Check for valid flag combinations - see [27.8.1.3.2] (Table 92) + // Original zfstream hardcoded the compression level to maximum here... + // Double the time for less than 1% size improvement seems + // excessive though - keeping it at the default level + // To change back, just append "9" to the next three mode strings + if (!testi && testo && !testt && !testa) + strcpy(c_mode, "w"); + if (!testi && testo && !testt && testa) + strcpy(c_mode, "a"); + if (!testi && testo && testt && !testa) + strcpy(c_mode, "w"); + if (testi && !testo && !testt && !testa) + strcpy(c_mode, "r"); + // No read/write mode yet +// if (testi && testo && !testt && !testa) +// strcpy(c_mode, "r+"); +// if (testi && testo && testt && !testa) +// strcpy(c_mode, "w+"); + + // Mode string should be empty for invalid combination of flags + if (strlen(c_mode) == 0) + return false; + if (testb) + strcat(c_mode, "b"); + return true; +} + +// Determine number of characters in internal get buffer +std::streamsize +gzfilebuf::showmanyc() +{ + // Calls to underflow will fail if file not opened for reading + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return -1; + // Make sure get area is in use + if (this->gptr() && (this->gptr() < this->egptr())) + return std::streamsize(this->egptr() - this->gptr()); + else + return 0; +} + +// Fill get area from gzipped file +gzfilebuf::int_type +gzfilebuf::underflow() +{ + // If something is left in the get area by chance, return it + // (this shouldn't normally happen, as underflow is only supposed + // to be called when gptr >= egptr, but it serves as error check) + if (this->gptr() && (this->gptr() < this->egptr())) + return traits_type::to_int_type(*(this->gptr())); + + // If the file hasn't been opened for reading, produce error + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return traits_type::eof(); + + // Attempt to fill internal buffer from gzipped file + // (buffer must be guaranteed to exist...) + int bytes_read = gzread(file, buffer, buffer_size); + // Indicates error or EOF + if (bytes_read <= 0) + { + // Reset get area + this->setg(buffer, buffer, buffer); + return traits_type::eof(); + } + // Make all bytes read from file available as get area + this->setg(buffer, buffer, buffer + bytes_read); + + // Return next character in get area + return traits_type::to_int_type(*(this->gptr())); +} + +// Write put area to gzipped file +gzfilebuf::int_type +gzfilebuf::overflow(int_type c) +{ + // Determine whether put area is in use + if (this->pbase()) + { + // Double-check pointer range + if (this->pptr() > this->epptr() || this->pptr() < this->pbase()) + return traits_type::eof(); + // Add extra character to buffer if not EOF + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *(this->pptr()) = traits_type::to_char_type(c); + this->pbump(1); + } + // Number of characters to write to file + int bytes_to_write = this->pptr() - this->pbase(); + // Overflow doesn't fail if nothing is to be written + if (bytes_to_write > 0) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // If gzipped file won't accept all bytes written to it, fail + if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) + return traits_type::eof(); + // Reset next pointer to point to pbase on success + this->pbump(-bytes_to_write); + } + } + // Write extra character to file if not EOF + else if (!traits_type::eq_int_type(c, traits_type::eof())) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // Impromptu char buffer (allows "unbuffered" output) + char_type last_char = traits_type::to_char_type(c); + // If gzipped file won't accept this character, fail + if (gzwrite(file, &last_char, 1) != 1) + return traits_type::eof(); + } + + // If you got here, you have succeeded (even if c was EOF) + // The return value should therefore be non-EOF + if (traits_type::eq_int_type(c, traits_type::eof())) + return traits_type::not_eof(c); + else + return c; +} + +// Assign new buffer +std::streambuf* +gzfilebuf::setbuf(char_type* p, + std::streamsize n) +{ + // First make sure stuff is sync'ed, for safety + if (this->sync() == -1) + return NULL; + // If buffering is turned off on purpose via setbuf(0,0), still allocate one... + // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at + // least a buffer of size 1 (very inefficient though, therefore make it bigger?) + // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems) + if (!p || !n) + { + // Replace existing buffer (if any) with small internal buffer + this->disable_buffer(); + buffer = NULL; + buffer_size = 0; + own_buffer = true; + this->enable_buffer(); + } + else + { + // Replace existing buffer (if any) with external buffer + this->disable_buffer(); + buffer = p; + buffer_size = n; + own_buffer = false; + this->enable_buffer(); + } + return this; +} + +// Write put area to gzipped file (i.e. ensures that put area is empty) +int +gzfilebuf::sync() +{ + return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Allocate internal buffer +void +gzfilebuf::enable_buffer() +{ + // If internal buffer required, allocate one + if (own_buffer && !buffer) + { + // Check for buffered vs. "unbuffered" + if (buffer_size > 0) + { + // Allocate internal buffer + buffer = new char_type[buffer_size]; + // Get area starts empty and will be expanded by underflow as need arises + this->setg(buffer, buffer, buffer); + // Setup entire internal buffer as put area. + // The one-past-end pointer actually points to the last element of the buffer, + // so that overflow(c) can safely add the extra character c to the sequence. + // These pointers remain in place for the duration of the buffer + this->setp(buffer, buffer + buffer_size - 1); + } + else + { + // Even in "unbuffered" case, (small?) get buffer is still required + buffer_size = SMALLBUFSIZE; + buffer = new char_type[buffer_size]; + this->setg(buffer, buffer, buffer); + // "Unbuffered" means no put buffer + this->setp(0, 0); + } + } + else + { + // If buffer already allocated, reset buffer pointers just to make sure no + // stale chars are lying around + this->setg(buffer, buffer, buffer); + this->setp(buffer, buffer + buffer_size - 1); + } +} + +// Destroy internal buffer +void +gzfilebuf::disable_buffer() +{ + // If internal buffer exists, deallocate it + if (own_buffer && buffer) + { + // Preserve unbuffered status by zeroing size + if (!this->pbase()) + buffer_size = 0; + delete[] buffer; + buffer = NULL; + this->setg(0, 0, 0); + this->setp(0, 0); + } + else + { + // Reset buffer pointers to initial state if external buffer exists + this->setg(buffer, buffer, buffer); + if (buffer) + this->setp(buffer, buffer + buffer_size - 1); + else + this->setp(0, 0); + } +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzifstream::gzifstream() +: std::istream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzifstream::gzifstream(const char* name, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzifstream::gzifstream(int fd, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzifstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzifstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzifstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzofstream::gzofstream() +: std::ostream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzofstream::gzofstream(const char* name, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzofstream::gzofstream(int fd, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzofstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzofstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzofstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} diff --git a/contrib/zlib/contrib/iostream3/zfstream.h b/contrib/zlib/contrib/iostream3/zfstream.h new file mode 100644 index 000000000..8574479ae --- /dev/null +++ b/contrib/zlib/contrib/iostream3/zfstream.h @@ -0,0 +1,466 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#ifndef ZFSTREAM_H +#define ZFSTREAM_H + +#include // not iostream, since we don't need cin/cout +#include +#include "zlib.h" + +/*****************************************************************************/ + +/** + * @brief Gzipped file stream buffer class. + * + * This class implements basic_filebuf for gzipped files. It doesn't yet support + * seeking (allowed by zlib but slow/limited), putback and read/write access + * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard + * file streambuf. +*/ +class gzfilebuf : public std::streambuf +{ +public: + // Default constructor. + gzfilebuf(); + + // Destructor. + virtual + ~gzfilebuf(); + + /** + * @brief Set compression level and strategy on the fly. + * @param comp_level Compression level (see zlib.h for allowed values) + * @param comp_strategy Compression strategy (see zlib.h for allowed values) + * @return Z_OK on success, Z_STREAM_ERROR otherwise. + * + * Unfortunately, these parameters cannot be modified separately, as the + * previous zfstream version assumed. Since the strategy is seldom changed, + * it can default and setcompression(level) then becomes like the old + * setcompressionlevel(level). + */ + int + setcompression(int comp_level, + int comp_strategy = Z_DEFAULT_STRATEGY); + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() const { return (file != NULL); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + open(const char* name, + std::ios_base::openmode mode); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + attach(int fd, + std::ios_base::openmode mode); + + /** + * @brief Close gzipped file. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + close(); + +protected: + /** + * @brief Convert ios open mode int to mode string used by zlib. + * @return True if valid mode flag combination. + */ + bool + open_mode(std::ios_base::openmode mode, + char* c_mode) const; + + /** + * @brief Number of characters available in stream buffer. + * @return Number of characters. + * + * This indicates number of characters in get area of stream buffer. + * These characters can be read without accessing the gzipped file. + */ + virtual std::streamsize + showmanyc(); + + /** + * @brief Fill get area from gzipped file. + * @return First character in get area on success, EOF on error. + * + * This actually reads characters from gzipped file to stream + * buffer. Always buffered. + */ + virtual int_type + underflow(); + + /** + * @brief Write put area to gzipped file. + * @param c Extra character to add to buffer contents. + * @return Non-EOF on success, EOF on error. + * + * This actually writes characters in stream buffer to + * gzipped file. With unbuffered output this is done one + * character at a time. + */ + virtual int_type + overflow(int_type c = traits_type::eof()); + + /** + * @brief Installs external stream buffer. + * @param p Pointer to char buffer. + * @param n Size of external buffer. + * @return @c this on success, NULL on failure. + * + * Call setbuf(0,0) to enable unbuffered output. + */ + virtual std::streambuf* + setbuf(char_type* p, + std::streamsize n); + + /** + * @brief Flush stream buffer to file. + * @return 0 on success, -1 on error. + * + * This calls underflow(EOF) to do the job. + */ + virtual int + sync(); + +// +// Some future enhancements +// +// virtual int_type uflow(); +// virtual int_type pbackfail(int_type c = traits_type::eof()); +// virtual pos_type +// seekoff(off_type off, +// std::ios_base::seekdir way, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); +// virtual pos_type +// seekpos(pos_type sp, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); + +private: + /** + * @brief Allocate internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that a proper internal buffer exists if it is required. If the + * buffer already exists or is external, the buffer pointers will be + * reset to their original state. + */ + void + enable_buffer(); + + /** + * @brief Destroy internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that the internal buffer is deallocated if it exists. In any + * case, it will also reset the buffer pointers. + */ + void + disable_buffer(); + + /** + * Underlying file pointer. + */ + gzFile file; + + /** + * Mode in which file was opened. + */ + std::ios_base::openmode io_mode; + + /** + * @brief True if this object owns file descriptor. + * + * This makes the class responsible for closing the file + * upon destruction. + */ + bool own_fd; + + /** + * @brief Stream buffer. + * + * For simplicity this remains allocated on the free store for the + * entire life span of the gzfilebuf object, unless replaced by setbuf. + */ + char_type* buffer; + + /** + * @brief Stream buffer size. + * + * Defaults to system default buffer size (typically 8192 bytes). + * Modified by setbuf. + */ + std::streamsize buffer_size; + + /** + * @brief True if this object owns stream buffer. + * + * This makes the class responsible for deleting the buffer + * upon destruction. + */ + bool own_buffer; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file input stream class. + * + * This class implements ifstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzifstream : public std::istream +{ +public: + // Default constructor + gzifstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ifstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream class. + * + * This class implements ofstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzofstream : public std::ostream +{ +public: + // Default constructor + gzofstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ofstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream manipulator class. + * + * This class defines a two-argument manipulator for gzofstream. It is used + * as base for the setcompression(int,int) manipulator. +*/ +template + class gzomanip2 + { + public: + // Allows insertor to peek at internals + template + friend gzofstream& + operator<<(gzofstream&, + const gzomanip2&); + + // Constructor + gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), + T1 v1, + T2 v2); + private: + // Underlying manipulator function + gzofstream& + (*func)(gzofstream&, T1, T2); + + // Arguments for manipulator function + T1 val1; + T2 val2; + }; + +/*****************************************************************************/ + +// Manipulator function thunks through to stream buffer +inline gzofstream& +setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) +{ + (gzs.rdbuf())->setcompression(l, s); + return gzs; +} + +// Manipulator constructor stores arguments +template + inline + gzomanip2::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), + T1 v1, + T2 v2) + : func(f), val1(v1), val2(v2) + { } + +// Insertor applies underlying manipulator function to stream +template + inline gzofstream& + operator<<(gzofstream& s, const gzomanip2& m) + { return (*m.func)(s, m.val1, m.val2); } + +// Insert this onto stream to simplify setting of compression level +inline gzomanip2 +setcompression(int l, int s = Z_DEFAULT_STRATEGY) +{ return gzomanip2(&setcompression, l, s); } + +#endif // ZFSTREAM_H diff --git a/contrib/zlib/contrib/masmx64/bld_ml64.bat b/contrib/zlib/contrib/masmx64/bld_ml64.bat new file mode 100644 index 000000000..f74bcef5b --- /dev/null +++ b/contrib/zlib/contrib/masmx64/bld_ml64.bat @@ -0,0 +1,2 @@ +ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/contrib/zlib/contrib/masmx64/gvmat64.asm b/contrib/zlib/contrib/masmx64/gvmat64.asm new file mode 100644 index 000000000..c1817f1be --- /dev/null +++ b/contrib/zlib/contrib/masmx64/gvmat64.asm @@ -0,0 +1,553 @@ +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); /* current match */ + +; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; 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. +; +; +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for infozip Zip, I use option: +; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm +; +; to compile this file for zLib, I use option: +; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm +; Be carrefull to adapt zlib1222add below to your version of zLib +; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change +; value of zlib1222add later) +; +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ +.code +longest_match PROC + + +;LocalVarsSize equ 88 + LocalVarsSize equ 72 + +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp + + chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len + ; low word: s->wmask +;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 +;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 +;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w +;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx +;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 +;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d +;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 +IFDEF INFOZIP +ELSE + nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size +ENDIF + +save_rdi equ rsp + 24 - LocalVarsSize +save_rsi equ rsp + 32 - LocalVarsSize +save_rbx equ rsp + 40 - LocalVarsSize +save_rbp equ rsp + 48 - LocalVarsSize +save_r12 equ rsp + 56 - LocalVarsSize +save_r13 equ rsp + 64 - LocalVarsSize +;save_r14 equ rsp + 72 - LocalVarsSize +;save_r15 equ rsp + 80 - LocalVarsSize + + +; summary of register usage +; scanend ebx +; scanendw bx +; chainlenwmask edx +; curmatch rsi +; curmatchd esi +; windowbestlen r8 +; scanalign r9 +; scanalignd r9d +; window r10 +; bestlen r11 +; bestlend r11d +; scanstart r12d +; scanstartw r12w +; scan r13 +; nicematch r14d +; limit r15 +; limitd r15d +; prev rcx + +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure + + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + +IFDEF INFOZIP + +_DATA SEGMENT +COMM window_size:DWORD +; WMask ; 7fff +COMM window:BYTE:010040H +COMM prev:WORD:08000H +; MatchLen : unused +; PrevMatch : unused +COMM strstart:DWORD +COMM match_start:DWORD +; Lookahead : ignore +COMM prev_length:DWORD ; PrevLen +COMM max_chain_length:DWORD +COMM good_match:DWORD +COMM nice_match:DWORD +prev_ad equ OFFSET prev +window_ad equ OFFSET window +nicematch equ nice_match +_DATA ENDS +WMask equ 07fffh + +ELSE + + IFNDEF zlib1222add + zlib1222add equ 8 + ENDIF +dsWSize equ 56+zlib1222add+(zlib1222add/2) +dsWMask equ 64+zlib1222add+(zlib1222add/2) +dsWindow equ 72+zlib1222add +dsPrev equ 88+zlib1222add +dsMatchLen equ 128+zlib1222add +dsPrevMatch equ 132+zlib1222add +dsStrStart equ 140+zlib1222add +dsMatchStart equ 144+zlib1222add +dsLookahead equ 148+zlib1222add +dsPrevLen equ 152+zlib1222add +dsMaxChainLen equ 156+zlib1222add +dsGoodMatch equ 172+zlib1222add +dsNiceMatch equ 176+zlib1222add + +window_size equ [ rcx + dsWSize] +WMask equ [ rcx + dsWMask] +window_ad equ [ rcx + dsWindow] +prev_ad equ [ rcx + dsPrev] +strstart equ [ rcx + dsStrStart] +match_start equ [ rcx + dsMatchStart] +Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip +prev_length equ [ rcx + dsPrevLen] +max_chain_length equ [ rcx + dsMaxChainLen] +good_match equ [ rcx + dsGoodMatch] +nice_match equ [ rcx + dsNiceMatch] +ENDIF + +; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + + + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) + +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx + + mov [save_rdi],rdi + mov [save_rsi],rsi + mov [save_rbx],rbx + mov [save_rbp],rbp +IFDEF INFOZIP + mov r8d,ecx +ELSE + mov r8d,edx +ENDIF + mov [save_r12],r12 + mov [save_r13],r13 +; mov [save_r14],r14 +; mov [save_r15],r15 + + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +;;; on zlib only +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + +IFDEF INFOZIP + mov [chainlenwmask], ebx +; on infozip nice_match = [nice_match] +ELSE + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d +ENDIF + +;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; +IFDEF INFOZIP + mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) +ELSE + mov eax, window_size + sub eax, MIN_LOOKAHEAD +ENDIF + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +;;; int best_len = s->prev_length; + + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 + jmp LookupLoopIsZero + + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + jnz LookupLoop1 + + +;;; Store the current value of chainlen. + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + lea rsi,[r8+r10] + mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + jnz short LoopCmps + jmp short LenMaximum +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0000FFFFh + jnz LenLower + + test eax,0ffffffffh + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + jnz LenLower + +LenLower32: + shr eax,16 + add rdx,2 +LenLower: sub al, 1 + adc rdx, 0 +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// + + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + jge LeaveNow + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: +IFDEF INFOZIP + mov eax,r11d +ELSE + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d +ENDIF + +;;; Restore the stack and return from whence we came. + + + mov rsi,[save_rsi] + mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] +; mov r14,[save_r14] +; mov r15,[save_r15] + + + ret 0 +; please don't remove this string ! +; Your can freely use gvmat64 in any free or commercial app +; but it is far better don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 +longest_match ENDP + +match_init PROC + ret 0 +match_init ENDP + + +END diff --git a/contrib/zlib/contrib/masmx64/inffas8664.c b/contrib/zlib/contrib/masmx64/inffas8664.c new file mode 100644 index 000000000..aa861a333 --- /dev/null +++ b/contrib/zlib/contrib/masmx64/inffas8664.c @@ -0,0 +1,186 @@ +/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding + * version for AMD64 on Windows using Microsoft C compiler + * + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant + * + * inffas8664.c call function inffas8664fnc in inffasx64.asm + * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + * + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ + + + + typedef struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } type_ar; +#ifdef ASMINF + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + type_ar ar; + void inffas8664fnc(struct inffast_ar * par); + + + +#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + inffas8664fnc(&ar); + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = (unsigned long)ar.hold; + state->bits = ar.bits; + return; +} + +#endif diff --git a/contrib/zlib/contrib/masmx64/inffasx64.asm b/contrib/zlib/contrib/masmx64/inffasx64.asm new file mode 100644 index 000000000..41ec82392 --- /dev/null +++ b/contrib/zlib/contrib/masmx64/inffasx64.asm @@ -0,0 +1,396 @@ +; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding +; version for AMD64 on Windows using Microsoft C compiler +; +; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c +; inffasx64.asm is called by inffas8664.c, which contain more info. + + +; to compile this file, I use option +; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; + +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +.code +inffas8664fnc PROC + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + + mov [rsp-8],rsi + mov [rsp-16],rdi + mov [rsp-24],r12 + mov [rsp-32],r13 + mov [rsp-40],r14 + mov [rsp-48],r15 + mov [rsp-56],rbx + + mov rax,rcx + + mov [rax+8], rbp ; /* save regs rbp and rsp */ + mov [rax], rsp + + mov rsp, rax ; /* make rsp point to &ar */ + + mov rsi, [rsp+16] ; /* rsi = in */ + mov rdi, [rsp+32] ; /* rdi = out */ + mov r9, [rsp+24] ; /* r9 = last */ + mov r10, [rsp+48] ; /* r10 = end */ + mov rbp, [rsp+64] ; /* rbp = lcode */ + mov r11, [rsp+72] ; /* r11 = dcode */ + mov rdx, [rsp+80] ; /* rdx = hold */ + mov ebx, [rsp+88] ; /* ebx = bits */ + mov r12d, [rsp+100] ; /* r12d = lmask */ + mov r13d, [rsp+104] ; /* r13d = dmask */ + ; /* r14d = len */ + ; /* r15d = dist */ + + + cld + cmp r10, rdi + je L_one_time ; /* if only one decode left */ + cmp r9, rsi + + jne L_do_loop + + +L_one_time: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code_one_time + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + jmp L_get_length_code_one_time + +ALIGN 4 +L_while_test: + cmp r10, rdi + jbe L_break_loop + cmp r9, rsi + jbe L_break_loop + +L_do_loop: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_length_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + mov r8, r12 ; /* r8 = lmask */ + shr eax, 16 ; /* output this.val char */ + stosb + +L_get_length_code_one_time: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + shr eax, 16 ; /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov r14d, eax ; /* len = this */ + shr r14d, 16 ; /* len = this.val */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ + and cl, 15 ; /* op &= 15 */ + jz L_decode_distance ; /* if (!op) */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r14d, eax ; /* len += hold & mask[op] */ + +L_decode_distance: + mov r8, r13 ; /* r8 = dmask */ + cmp bl, 32 + ja L_get_distance_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_distance_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ + +L_dodist: + mov r15d, eax ; /* dist = this */ + shr r15d, 16 ; /* dist = this.val */ + mov cl, ah + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + mov cl, al ; /* cl = this.op */ + + test al, 16 ; /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 ; /* op &= 15 */ + jz L_check_dist_one + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax ; /* (1 << op) - 1 */ + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov r8, rsi ; /* save in so from can use it's reg */ + mov rax, rdi + sub rax, [rsp+40] ; /* nbytes = out - beg */ + + cmp eax, r15d + jb L_clip_window ; /* if (dist > nbytes) 4.2% */ + + mov ecx, r14d ; /* ecx = len */ + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two ; /* if len % 2 == 0 */ + + rep movsw + mov al, [rsi] + mov [rdi], al + inc rdi + + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +L_copy_two: + rep movsw + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp r15d, 1 ; /* if dist 1, is a memset */ + jne L_check_window + cmp [rsp+40], rdi ; /* if out == beg, outside window */ + je L_check_window + + mov ecx, r14d ; /* ecx = len */ + mov al, [rdi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [rdi], al + inc rdi + +L_set_two: + rep stosw + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r14d ; /* eax += len */ + mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r15d ; /* eax += dist */ + mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax ; /* ecx = nbytes */ + mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ + neg ecx ; /* nbytes = -nbytes */ + + cmp eax, r15d + jb L_invalid_distance_too_far ; /* if (dist > wsize) */ + + add ecx, r15d ; /* nbytes = dist - nbytes */ + cmp dword ptr [rsp+96], 0 + jne L_wrap_around_window ; /* if (write != 0) */ + + mov rsi, [rsp+56] ; /* from = window */ + sub eax, ecx ; /* eax -= nbytes */ + add rsi, rax ; /* from += wsize - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp r14d, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* eax -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = &out[ -dist ] */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [rsp+96] ; /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window ; /* if (write >= nbytes) */ + + mov esi, [rsp+92] ; /* from = wsize */ + add rsi, [rsp+56] ; /* from += window */ + add rsi, rax ; /* from += write */ + sub rsi, rcx ; /* from -= nbytes */ + sub ecx, eax ; /* nbytes -= write */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, [rsp+56] ; /* from = window */ + mov ecx, [rsp+96] ; /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + mov rsi, [rsp+56] ; /* rsi = window */ + add rsi, rax + sub rsi, rcx ; /* from += write - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy ; /* if (nbytes >= len) */ + +ALIGN 4 +L_do_copy: + mov ecx, eax ; /* ecx = len */ + rep movsb + + mov rsi, r8 ; /* move in back to %esi, toss from */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [rsp+116], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [rsp+116], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [rsp+116], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov dword ptr [rsp+116], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [rsp+116], 0 + +L_break_loop_with_status: +; /* put in, out, bits, and hold back into ar and pop esp */ + mov [rsp+16], rsi ; /* in */ + mov [rsp+32], rdi ; /* out */ + mov [rsp+88], ebx ; /* bits */ + mov [rsp+80], rdx ; /* hold */ + + mov rax, [rsp] ; /* restore rbp and rsp */ + mov rbp, [rsp+8] + mov rsp, rax + + + + mov rsi,[rsp-8] + mov rdi,[rsp-16] + mov r12,[rsp-24] + mov r13,[rsp-32] + mov r14,[rsp-40] + mov r15,[rsp-48] + mov rbx,[rsp-56] + + ret 0 +; : +; : "m" (ar) +; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", +; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +; ); + +inffas8664fnc ENDP +;_TEXT ENDS +END diff --git a/contrib/zlib/contrib/masmx64/readme.txt b/contrib/zlib/contrib/masmx64/readme.txt new file mode 100644 index 000000000..652571c7a --- /dev/null +++ b/contrib/zlib/contrib/masmx64/readme.txt @@ -0,0 +1,31 @@ +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), +for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. + +gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits + assembly optimized version from Jean-loup Gailly original longest_match function + +inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing + original function from Mark Adler + +Use instructions +---------------- +Assemble the .asm files using MASM and put the object files into the zlib source +directory. You can also get object files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, +and inffasx64.obj and gvmat64.obj as object to link. + + +Build instructions +------------------ +run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) + +ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK + +You can get Windows 2003 server DDK with ml64 and cl for AMD64 from + http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/contrib/zlib/contrib/masmx86/bld_ml32.bat b/contrib/zlib/contrib/masmx86/bld_ml32.bat new file mode 100644 index 000000000..fcf5755e4 --- /dev/null +++ b/contrib/zlib/contrib/masmx86/bld_ml32.bat @@ -0,0 +1,2 @@ +ml /coff /Zi /c /Flmatch686.lst match686.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/contrib/zlib/contrib/masmx86/inffas32.asm b/contrib/zlib/contrib/masmx86/inffas32.asm new file mode 100644 index 000000000..cb37a81e4 --- /dev/null +++ b/contrib/zlib/contrib/masmx86/inffas32.asm @@ -0,0 +1,1080 @@ +;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding +; * +; * inffas32.asm is derivated from inffas86.c, with translation of assembly code +; * +; * Copyright (C) 1995-2003 Mark Adler +; * For conditions of distribution and use, see copyright notice in zlib.h +; * +; * Copyright (C) 2003 Chris Anderson +; * Please use the copyright conditions above. +; * +; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from +; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at +; * the moment. I have successfully compiled and tested this code with gcc2.96, +; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S +; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX +; * enabled. I will attempt to merge the MMX code into this version. Newer +; * versions of this and inffast.S can be found at +; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ +; * +; * 2005 : modification by Gilles Vollant +; */ +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; +; compile with command line option +; ml /coff /Zi /c /Flinffas32.lst inffas32.asm + +; if you define NO_GZIP (see inflate.h), compile with +; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm + + +; zlib122sup is 0 fort zlib 1.2.2.1 and lower +; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head +; in inflate_state in inflate.h) +zlib1222sup equ 8 + + +IFDEF GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 +ELSE + IFNDEF NO_GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 + ELSE + INFLATE_MODE_TYPE equ 3 + INFLATE_MODE_BAD equ 17 + ENDIF +ENDIF + + +; 75 "inffast.S" +;FILE "inffast.S" + +;;;GLOBAL _inflate_fast + +;;;SECTION .text + + + + .586p + .mmx + + name inflate_fast_x86 + .MODEL FLAT + +_DATA segment +inflate_fast_use_mmx: + dd 1 + + +_TEXT segment + + + +ALIGN 4 + db 'Fast decoding Code from Chris Anderson' + db 0 + +ALIGN 4 +invalid_literal_length_code_msg: + db 'invalid literal/length code' + db 0 + +ALIGN 4 +invalid_distance_code_msg: + db 'invalid distance code' + db 0 + +ALIGN 4 +invalid_distance_too_far_msg: + db 'invalid distance too far back' + db 0 + + +ALIGN 4 +inflate_fast_mask: +dd 0 +dd 1 +dd 3 +dd 7 +dd 15 +dd 31 +dd 63 +dd 127 +dd 255 +dd 511 +dd 1023 +dd 2047 +dd 4095 +dd 8191 +dd 16383 +dd 32767 +dd 65535 +dd 131071 +dd 262143 +dd 524287 +dd 1048575 +dd 2097151 +dd 4194303 +dd 8388607 +dd 16777215 +dd 33554431 +dd 67108863 +dd 134217727 +dd 268435455 +dd 536870911 +dd 1073741823 +dd 2147483647 +dd 4294967295 + + +mode_state equ 0 ;/* state->mode */ +wsize_state equ (32+zlib1222sup) ;/* state->wsize */ +write_state equ (36+4+zlib1222sup) ;/* state->write */ +window_state equ (40+4+zlib1222sup) ;/* state->window */ +hold_state equ (44+4+zlib1222sup) ;/* state->hold */ +bits_state equ (48+4+zlib1222sup) ;/* state->bits */ +lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ +distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ +lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ +distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ + + +;;SECTION .text +; 205 "inffast.S" +;GLOBAL inflate_fast_use_mmx + +;SECTION .data + + +; GLOBAL inflate_fast_use_mmx:object +;.size inflate_fast_use_mmx, 4 +; 226 "inffast.S" +;SECTION .text + +ALIGN 4 +_inflate_fast proc near +.FPO (16, 4, 0, 0, 1, 0) + push edi + push esi + push ebp + push ebx + pushfd + sub esp,64 + cld + + + + + mov esi, [esp+88] + mov edi, [esi+28] + + + + + + + + mov edx, [esi+4] + mov eax, [esi+0] + + add edx,eax + sub edx,11 + + mov [esp+44],eax + mov [esp+20],edx + + mov ebp, [esp+92] + mov ecx, [esi+16] + mov ebx, [esi+12] + + sub ebp,ecx + neg ebp + add ebp,ebx + + sub ecx,257 + add ecx,ebx + + mov [esp+60],ebx + mov [esp+40],ebp + mov [esp+16],ecx +; 285 "inffast.S" + mov eax, [edi+lencode_state] + mov ecx, [edi+distcode_state] + + mov [esp+8],eax + mov [esp+12],ecx + + mov eax,1 + mov ecx, [edi+lenbits_state] + shl eax,cl + dec eax + mov [esp+0],eax + + mov eax,1 + mov ecx, [edi+distbits_state] + shl eax,cl + dec eax + mov [esp+4],eax + + mov eax, [edi+wsize_state] + mov ecx, [edi+write_state] + mov edx, [edi+window_state] + + mov [esp+52],eax + mov [esp+48],ecx + mov [esp+56],edx + + mov ebp, [edi+hold_state] + mov ebx, [edi+bits_state] +; 321 "inffast.S" + mov esi, [esp+44] + mov ecx, [esp+20] + cmp ecx,esi + ja L_align_long + + add ecx,11 + sub ecx,esi + mov eax,12 + sub eax,ecx + lea edi, [esp+28] + rep movsb + mov ecx,eax + xor eax,eax + rep stosb + lea esi, [esp+28] + mov [esp+20],esi + jmp L_is_aligned + + +L_align_long: + test esi,3 + jz L_is_aligned + xor eax,eax + mov al, [esi] + inc esi + mov ecx,ebx + add ebx,8 + shl eax,cl + or ebp,eax + jmp L_align_long + +L_is_aligned: + mov edi, [esp+60] +; 366 "inffast.S" +L_check_mmx: + cmp dword ptr [inflate_fast_use_mmx],2 + je L_init_mmx + ja L_do_loop + + push eax + push ebx + push ecx + push edx + pushfd + mov eax, [esp] + xor dword ptr [esp],0200000h + + + + + popfd + pushfd + pop edx + xor edx,eax + jz L_dont_use_mmx + xor eax,eax + cpuid + cmp ebx,0756e6547h + jne L_dont_use_mmx + cmp ecx,06c65746eh + jne L_dont_use_mmx + cmp edx,049656e69h + jne L_dont_use_mmx + mov eax,1 + cpuid + shr eax,8 + and eax,15 + cmp eax,6 + jne L_dont_use_mmx + test edx,0800000h + jnz L_use_mmx + jmp L_dont_use_mmx +L_use_mmx: + mov dword ptr [inflate_fast_use_mmx],2 + jmp L_check_mmx_pop +L_dont_use_mmx: + mov dword ptr [inflate_fast_use_mmx],3 +L_check_mmx_pop: + pop edx + pop ecx + pop ebx + pop eax + jmp L_check_mmx +; 426 "inffast.S" +ALIGN 4 +L_do_loop: +; 437 "inffast.S" + cmp bl,15 + ja L_get_length_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_length_code: + mov edx, [esp+0] + mov ecx, [esp+8] + and edx,ebp + mov eax, [ecx+edx*4] + +L_dolen: + + + + + + + mov cl,ah + sub bl,ah + shr ebp,cl + + + + + + + test al,al + jnz L_test_for_length_base + + shr eax,16 + stosb + +L_while_test: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop + jmp L_break_loop + +L_test_for_length_base: +; 502 "inffast.S" + mov edx,eax + shr edx,16 + mov cl,al + + test al,16 + jz L_test_for_second_level_length + and cl,15 + jz L_save_len + cmp bl,cl + jae L_add_bits_to_len + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_len: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + +L_save_len: + mov [esp+24],edx + + +L_decode_distance: +; 549 "inffast.S" + cmp bl,15 + ja L_get_distance_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_distance_code: + mov edx, [esp+4] + mov ecx, [esp+12] + and edx,ebp + mov eax, [ecx+edx*4] + + +L_dodist: + mov edx,eax + shr edx,16 + mov cl,ah + sub bl,ah + shr ebp,cl +; 584 "inffast.S" + mov cl,al + + test al,16 + jz L_test_for_second_level_dist + and cl,15 + jz L_check_dist_one + cmp bl,cl + jae L_add_bits_to_dist + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_dist: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + jmp L_check_window + +L_check_window: +; 625 "inffast.S" + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,edx + jb L_clip_window + + mov ecx, [esp+24] + mov esi,edi + sub esi,edx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp edx,1 + jne L_check_window + cmp [esp+40],edi + je L_check_window + + dec edi + mov ecx, [esp+24] + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + + + + + test al,64 + jnz L_test_for_end_of_block + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + + + + + test al,64 + jnz L_invalid_distance_code + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+12] + mov eax, [edx+eax*4] + jmp L_dodist + +ALIGN 4 +L_clip_window: +; 721 "inffast.S" + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,edx + jb L_invalid_distance_too_far + + add ecx,edx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window + + sub eax,ecx + add esi,eax +; 749 "inffast.S" + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_wrap_around_window: +; 793 "inffast.S" + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_contiguous_in_window: +; 836 "inffast.S" + add esi,eax + sub esi,ecx + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + +L_do_copy1: +; 862 "inffast.S" + mov ecx,eax + rep movsb + + mov esi, [esp+44] + jmp L_while_test +; 878 "inffast.S" +ALIGN 4 +L_init_mmx: + emms + + + + + + movd mm0,ebp + mov ebp,ebx +; 896 "inffast.S" + movd mm4,dword ptr [esp+0] + movq mm3,mm4 + movd mm5,dword ptr [esp+4] + movq mm2,mm5 + pxor mm1,mm1 + mov ebx, [esp+8] + jmp L_do_loop_mmx + +ALIGN 4 +L_do_loop_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_length_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_length_code_mmx: + pand mm4,mm0 + movd eax,mm4 + movq mm4,mm3 + mov eax, [ebx+eax*4] + +L_dolen_mmx: + movzx ecx,ah + movd mm1,ecx + sub ebp,ecx + + test al,al + jnz L_test_for_length_base_mmx + + shr eax,16 + stosb + +L_while_test_mmx: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop_mmx + jmp L_break_loop + +L_test_for_length_base_mmx: + + mov edx,eax + shr edx,16 + + test al,16 + jz L_test_for_second_level_length_mmx + and eax,15 + jz L_decode_distance_mmx + + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add edx,ecx + +L_decode_distance_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_dist_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_dist_code_mmx: + mov ebx, [esp+12] + pand mm5,mm0 + movd eax,mm5 + movq mm5,mm2 + mov eax, [ebx+eax*4] + +L_dodist_mmx: + + movzx ecx,ah + mov ebx,eax + shr ebx,16 + sub ebp,ecx + movd mm1,ecx + + test al,16 + jz L_test_for_second_level_dist_mmx + and eax,15 + jz L_check_dist_one_mmx + +L_add_bits_to_dist_mmx: + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add ebx,ecx + +L_check_window_mmx: + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,ebx + jb L_clip_window_mmx + + mov ecx,edx + mov esi,edi + sub esi,ebx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_check_dist_one_mmx: + cmp ebx,1 + jne L_check_window_mmx + cmp [esp+40],edi + je L_check_window_mmx + + dec edi + mov ecx,edx + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_test_for_second_level_length_mmx: + test al,64 + jnz L_test_for_end_of_block + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + add ecx,edx + mov eax, [ebx+ecx*4] + jmp L_dolen_mmx + +ALIGN 4 +L_test_for_second_level_dist_mmx: + test al,64 + jnz L_invalid_distance_code + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + mov eax, [esp+12] + add ecx,ebx + mov eax, [eax+ecx*4] + jmp L_dodist_mmx + +ALIGN 4 +L_clip_window_mmx: + + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,ebx + jb L_invalid_distance_too_far + + add ecx,ebx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window_mmx + + sub eax,ecx + add esi,eax + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_wrap_around_window_mmx: + + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window_mmx + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_contiguous_in_window_mmx: + + add esi,eax + sub esi,ecx + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + +L_do_copy1_mmx: + + + mov ecx,edx + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx +; 1174 "inffast.S" +L_invalid_distance_code: + + + + + + mov ecx, invalid_distance_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_test_for_end_of_block: + + + + + + test al,32 + jz L_invalid_literal_length_code + + mov ecx,0 + mov edx,INFLATE_MODE_TYPE + jmp L_update_stream_state + +L_invalid_literal_length_code: + + + + + + mov ecx, invalid_literal_length_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_invalid_distance_too_far: + + + + mov esi, [esp+44] + mov ecx, invalid_distance_too_far_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_update_stream_state: + + mov eax, [esp+88] + test ecx,ecx + jz L_skip_msg + mov [eax+24],ecx +L_skip_msg: + mov eax, [eax+28] + mov [eax+mode_state],edx + jmp L_break_loop + +ALIGN 4 +L_break_loop: +; 1243 "inffast.S" + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_next_in + + + + mov ebx,ebp + +L_update_next_in: +; 1266 "inffast.S" + mov eax, [esp+88] + mov ecx,ebx + mov edx, [eax+28] + shr ecx,3 + sub esi,ecx + shl ecx,3 + sub ebx,ecx + mov [eax+12],edi + mov [edx+bits_state],ebx + mov ecx,ebx + + lea ebx, [esp+28] + cmp [esp+20],ebx + jne L_buf_not_used + + sub esi,ebx + mov ebx, [eax+0] + mov [esp+20],ebx + add esi,ebx + mov ebx, [eax+4] + sub ebx,11 + add [esp+20],ebx + +L_buf_not_used: + mov [eax+0],esi + + mov ebx,1 + shl ebx,cl + dec ebx + + + + + + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_hold + + + + psrlq mm0,mm1 + movd ebp,mm0 + + emms + +L_update_hold: + + + + and ebp,ebx + mov [edx+hold_state],ebp + + + + + mov ebx, [esp+20] + cmp ebx,esi + jbe L_last_is_smaller + + sub ebx,esi + add ebx,11 + mov [eax+4],ebx + jmp L_fixup_out +L_last_is_smaller: + sub esi,ebx + neg esi + add esi,11 + mov [eax+4],esi + + + + +L_fixup_out: + + mov ebx, [esp+16] + cmp ebx,edi + jbe L_end_is_smaller + + sub ebx,edi + add ebx,257 + mov [eax+16],ebx + jmp L_done +L_end_is_smaller: + sub edi,ebx + neg edi + add edi,257 + mov [eax+16],edi + + + + + +L_done: + add esp,64 + popfd + pop ebx + pop ebp + pop esi + pop edi + ret +_inflate_fast endp + +_TEXT ends +end diff --git a/contrib/zlib/contrib/masmx86/match686.asm b/contrib/zlib/contrib/masmx86/match686.asm new file mode 100644 index 000000000..69e0eed01 --- /dev/null +++ b/contrib/zlib/contrib/masmx86/match686.asm @@ -0,0 +1,479 @@ +; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; File written by Gilles Vollant, by converting match686.S from Brian Raiter +; for MASM. This is as assembly version of longest_match +; from Jean-loup Gailly in deflate.c +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is distributed in +; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 +; +; this file contain two implementation of longest_match +; +; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro +; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom) +; +; for using an assembly version of longest_match, you need define ASMV in project +; +; compile the asm file running +; ml /coff /Zi /c /Flmatch686.lst match686.asm +; and do not include match686.obj in your project +; +; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for +; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor +; with autoselect (with cpu detection code) +; if you want support the old pentium optimization, you can still use these version +; +; this file is not optimized for old pentium, but it compatible with all x86 32 bits +; processor (starting 80386) +; +; +; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ + + NbStack equ 76 + cur_match equ dword ptr[esp+NbStack-0] + str_s equ dword ptr[esp+NbStack-4] +; 5 dword on top (ret,ebp,esi,edi,ebx) + adrret equ dword ptr[esp+NbStack-8] + pushebp equ dword ptr[esp+NbStack-12] + pushedi equ dword ptr[esp+NbStack-16] + pushesi equ dword ptr[esp+NbStack-20] + pushebx equ dword ptr[esp+NbStack-24] + + chain_length equ dword ptr [esp+NbStack-28] + limit equ dword ptr [esp+NbStack-32] + best_len equ dword ptr [esp+NbStack-36] + window equ dword ptr [esp+NbStack-40] + prev equ dword ptr [esp+NbStack-44] + scan_start equ word ptr [esp+NbStack-48] + wmask equ dword ptr [esp+NbStack-52] + match_start_ptr equ dword ptr [esp+NbStack-56] + nice_match equ dword ptr [esp+NbStack-60] + scan equ dword ptr [esp+NbStack-64] + + windowlen equ dword ptr [esp+NbStack-68] + match_start equ dword ptr [esp+NbStack-72] + strend equ dword ptr [esp+NbStack-76] + NbStackAdd equ (NbStack-24) + + .386p + + name gvmatch + .MODEL FLAT + + + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + zlib1222add equ 8 + +; Note : these value are good with a 8 bytes boundary pack structure + dep_chain_length equ 74h+zlib1222add + dep_window equ 30h+zlib1222add + dep_strstart equ 64h+zlib1222add + dep_prev_length equ 70h+zlib1222add + dep_nice_match equ 88h+zlib1222add + dep_w_size equ 24h+zlib1222add + dep_prev equ 38h+zlib1222add + dep_w_mask equ 2ch+zlib1222add + dep_good_match equ 84h+zlib1222add + dep_match_start equ 68h+zlib1222add + dep_lookahead equ 6ch+zlib1222add + + +_TEXT segment + +IFDEF NOUNDERLINE + public longest_match + public match_init +ELSE + public _longest_match + public _match_init +ENDIF + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + + +MAX_MATCH equ 258 +MIN_MATCH equ 3 +MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) + + +;;; stack frame offsets + +chainlenwmask equ esp + 0 ; high word: current chain len + ; low word: s->wmask +window equ esp + 4 ; local copy of s->window +windowbestlen equ esp + 8 ; s->window + bestlen +scanstart equ esp + 16 ; first two bytes of string +scanend equ esp + 12 ; last two bytes of string +scanalign equ esp + 20 ; dword-misalignment of string +nicematch equ esp + 24 ; a good enough match size +bestlen equ esp + 28 ; size of best match so far +scan equ esp + 32 ; ptr to string wanting match + +LocalVarsSize equ 36 +; saved ebx byte esp + 36 +; saved edi byte esp + 40 +; saved esi byte esp + 44 +; saved ebp byte esp + 48 +; return address byte esp + 52 +deflatestate equ esp + 56 ; the function arguments +curmatch equ esp + 60 + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +dsWSize equ 36+zlib1222add +dsWMask equ 44+zlib1222add +dsWindow equ 48+zlib1222add +dsPrev equ 56+zlib1222add +dsMatchLen equ 88+zlib1222add +dsPrevMatch equ 92+zlib1222add +dsStrStart equ 100+zlib1222add +dsMatchStart equ 104+zlib1222add +dsLookahead equ 108+zlib1222add +dsPrevLen equ 112+zlib1222add +dsMaxChainLen equ 116+zlib1222add +dsGoodMatch equ 132+zlib1222add +dsNiceMatch equ 136+zlib1222add + + +;;; match686.asm -- Pentium-Pro-optimized version of longest_match() +;;; Written for zlib 1.1.2 +;;; Copyright (C) 1998 Brian Raiter +;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html +;;; +;; +;; 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. +;; + +;GLOBAL _longest_match, _match_init + + +;SECTION .text + +;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) + +;_longest_match: + IFDEF NOUNDERLINE + longest_match proc near + ELSE + _longest_match proc near + ENDIF +.FPO (9, 4, 0, 0, 1, 0) + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + push ebp + push edi + push esi + push ebx + sub esp, LocalVarsSize + +;;; Retrieve the function arguments. ecx will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + + mov edx, [deflatestate] + mov ecx, [curmatch] + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov eax, [edx + dsPrevLen] + mov ebx, [edx + dsGoodMatch] + cmp eax, ebx + mov eax, [edx + dsWMask] + mov ebx, [edx + dsMaxChainLen] + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + mov [chainlenwmask], ebx + +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx + dsNiceMatch] + mov ebx, [edx + dsLookahead] + cmp ebx, eax + jl LookaheadLess + mov ebx, eax +LookaheadLess: mov [nicematch], ebx + +;;; register Bytef *scan = s->window + s->strstart; + + mov esi, [edx + dsWindow] + mov [window], esi + mov ebp, [edx + dsStrStart] + lea edi, [esi + ebp] + mov [scan], edi + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov eax, edi + neg eax + and eax, 3 + mov [scanalign], eax + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov eax, [edx + dsWSize] + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg LimitPositive + xor ebp, ebp +LimitPositive: + +;;; int best_len = s->prev_length; + + mov eax, [edx + dsPrevLen] + mov [bestlen], eax + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + add esi, eax + mov [windowbestlen], esi + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx ebx, word ptr [edi] + mov [scanstart], ebx + movzx ebx, word ptr [edi + eax - 1] + mov [scanend], ebx + mov edi, [edx + dsPrev] + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + jmp short LoopEntry + +align 4 + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; ecx = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and ecx, edx + movzx ecx, word ptr [edi + ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow +LoopEntry: movzx eax, word ptr [esi + ecx - 1] + cmp eax, ebx + jnz LookupLoop + mov eax, [window] + movzx eax, word ptr [eax + ecx] + cmp eax, [scanstart] + jnz LookupLoop + +;;; Store the current value of chainlen. + + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + mov esi, [window] + mov edi, [scan] + add esi, ecx + mov eax, [scanalign] + mov edx, 0fffffef8h; -(MAX_MATCH_8) + lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] + lea esi, [esi + eax + 0108h] ;MAX_MATCH_8] + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust edx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (esi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + +LoopCmps: + mov eax, [esi + edx] + xor eax, [edi + edx] + jnz LeaveLoopCmps + mov eax, [esi + edx + 4] + xor eax, [edi + edx + 4] + jnz LeaveLoopCmps4 + add edx, 8 + jnz LoopCmps + jmp short LenMaximum +LeaveLoopCmps4: add edx, 4 +LeaveLoopCmps: test eax, 0000FFFFh + jnz LenLower + add edx, 2 + shr eax, 16 +LenLower: sub al, 1 + adc edx, 0 + +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea eax, [edi + edx] + mov edi, [scan] + sub eax, edi + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. + + mov edx, [deflatestate] + mov ebx, [bestlen] + cmp eax, ebx + jg LongerMatch + mov esi, [windowbestlen] + mov edi, [edx + dsPrev] + mov ebx, [scanend] + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: mov ebx, [nicematch] + mov [bestlen], eax + mov [edx + dsMatchStart], ecx + cmp eax, ebx + jge LeaveNow + mov esi, [window] + add esi, eax + mov [windowbestlen], esi + movzx ebx, word ptr [edi + eax - 1] + mov edi, [edx + dsPrev] + mov [scanend], ebx + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: mov edx, [deflatestate] + mov dword ptr [bestlen], MAX_MATCH + mov [edx + dsMatchStart], ecx + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: + mov edx, [deflatestate] + mov ebx, [bestlen] + mov eax, [edx + dsLookahead] + cmp ebx, eax + jg LookaheadRet + mov eax, ebx +LookaheadRet: + +;;; Restore the stack and return from whence we came. + + add esp, LocalVarsSize + pop ebx + pop esi + pop edi + pop ebp + + ret +; please don't remove this string ! +; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah + + + IFDEF NOUNDERLINE + longest_match endp + ELSE + _longest_match endp + ENDIF + + IFDEF NOUNDERLINE + match_init proc near + ret + match_init endp + ELSE + _match_init proc near + ret + _match_init endp + ENDIF + + +_TEXT ends +end diff --git a/contrib/zlib/contrib/masmx86/readme.txt b/contrib/zlib/contrib/masmx86/readme.txt new file mode 100644 index 000000000..3f8888679 --- /dev/null +++ b/contrib/zlib/contrib/masmx86/readme.txt @@ -0,0 +1,27 @@ + +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(). + + +Use instructions +---------------- +Assemble using MASM, and copy the object files into the zlib source +directory, then run the appropriate makefile, as suggested below. You can +donwload MASM from here: + + http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 + +You can also get objects files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +Build instructions +------------------ +* With Microsoft C and MASM: +nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" + +* With Borland C and TASM: +make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj" + diff --git a/contrib/zlib/contrib/minizip/Makefile.am b/contrib/zlib/contrib/minizip/Makefile.am new file mode 100644 index 000000000..d343011eb --- /dev/null +++ b/contrib/zlib/contrib/minizip/Makefile.am @@ -0,0 +1,45 @@ +lib_LTLIBRARIES = libminizip.la + +if COND_DEMOS +bin_PROGRAMS = miniunzip minizip +endif + +zlib_top_srcdir = $(top_srcdir)/../.. +zlib_top_builddir = $(top_builddir)/../.. + +AM_CPPFLAGS = -I$(zlib_top_srcdir) +AM_LDFLAGS = -L$(zlib_top_builddir) + +if WIN32 +iowin32_src = iowin32.c +iowin32_h = iowin32.h +endif + +libminizip_la_SOURCES = \ + ioapi.c \ + mztools.c \ + unzip.c \ + zip.c \ + ${iowin32_src} + +libminizip_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 -lz + +minizip_includedir = $(includedir)/minizip +minizip_include_HEADERS = \ + crypt.h \ + ioapi.h \ + mztools.h \ + unzip.h \ + zip.h \ + ${iowin32_h} + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = minizip.pc + +EXTRA_PROGRAMS = miniunzip minizip + +miniunzip_SOURCES = miniunz.c +miniunzip_LDADD = libminizip.la + +minizip_SOURCES = minizip.c +minizip_LDADD = libminizip.la -lz diff --git a/contrib/zlib/contrib/minizip/MiniZip64_Changes.txt b/contrib/zlib/contrib/minizip/MiniZip64_Changes.txt new file mode 100644 index 000000000..13a1bd91a --- /dev/null +++ b/contrib/zlib/contrib/minizip/MiniZip64_Changes.txt @@ -0,0 +1,6 @@ + +MiniZip 1.1 was derrived from MiniZip at version 1.01f + +Change in 1.0 (Okt 2009) + - **TODO - Add history** + diff --git a/contrib/zlib/contrib/minizip/MiniZip64_info.txt b/contrib/zlib/contrib/minizip/MiniZip64_info.txt new file mode 100644 index 000000000..57d715242 --- /dev/null +++ b/contrib/zlib/contrib/minizip/MiniZip64_info.txt @@ -0,0 +1,74 @@ +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + 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. + +---------------------------------------------------------- + diff --git a/contrib/zlib/contrib/minizip/configure.ac b/contrib/zlib/contrib/minizip/configure.ac new file mode 100644 index 000000000..5b1197097 --- /dev/null +++ b/contrib/zlib/contrib/minizip/configure.ac @@ -0,0 +1,32 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com]) +AC_CONFIG_SRCDIR([minizip.c]) +AM_INIT_AUTOMAKE([foreign]) +LT_INIT + +AC_MSG_CHECKING([whether to build example programs]) +AC_ARG_ENABLE([demos], AC_HELP_STRING([--enable-demos], [build example programs])) +AM_CONDITIONAL([COND_DEMOS], [test "$enable_demos" = yes]) +if test "$enable_demos" = yes +then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +case "${host}" in + *-mingw* | mingw*) + WIN32="yes" + ;; + *) + ;; +esac +AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"]) + + +AC_SUBST([HAVE_UNISTD_H], [0]) +AC_CHECK_HEADER([unistd.h], [HAVE_UNISTD_H=1], []) +AC_CONFIG_FILES([Makefile minizip.pc]) +AC_OUTPUT diff --git a/contrib/zlib/contrib/minizip/crypt.h b/contrib/zlib/contrib/minizip/crypt.h new file mode 100644 index 000000000..1e9e8200b --- /dev/null +++ b/contrib/zlib/contrib/minizip/crypt.h @@ -0,0 +1,131 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const z_crc_t* pcrc_32_tab, + unsigned long crcForCrypting) +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/contrib/zlib/contrib/minizip/ioapi.c b/contrib/zlib/contrib/minizip/ioapi.c new file mode 100644 index 000000000..7f5c191b2 --- /dev/null +++ b/contrib/zlib/contrib/minizip/ioapi.c @@ -0,0 +1,247 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) || defined(IOAPI_NO_64) +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == MAXU32) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = FOPEN_FUNC((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = FTELLO_FUNC((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/contrib/zlib/contrib/minizip/ioapi.h b/contrib/zlib/contrib/minizip/ioapi.h new file mode 100644 index 000000000..8dcbdb06e --- /dev/null +++ b/contrib/zlib/contrib/minizip/ioapi.h @@ -0,0 +1,208 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif + +#endif + +#include +#include +#include "zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef __FreeBSD__ +#define fopen64 fopen +#define ftello64 ftello +#define fseeko64 fseeko +#endif +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#define MAXU32 0xffffffff + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/contrib/zlib/contrib/minizip/iowin32.c b/contrib/zlib/contrib/minizip/iowin32.c new file mode 100644 index 000000000..274f39eb1 --- /dev/null +++ b/contrib/zlib/contrib/minizip/iowin32.c @@ -0,0 +1,462 @@ +/* iowin32.c -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + +#include "zlib.h" +#include "ioapi.h" +#include "iowin32.h" + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (0xFFFFFFFF) +#endif + +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + + +// see Include/shared/winapifamily.h in the Windows Kit +#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) +#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) +#define IOWIN32_USING_WINRT_API 1 +#endif +#endif + +voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); +uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); +long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); +int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); + +typedef struct +{ + HANDLE hf; + int error; +} WIN32FILE_IOWIN; + + +static void win32_translate_open_mode(int mode, + DWORD* lpdwDesiredAccess, + DWORD* lpdwCreationDisposition, + DWORD* lpdwShareMode, + DWORD* lpdwFlagsAndAttributes) +{ + *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; + + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + { + *lpdwDesiredAccess = GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + *lpdwShareMode = FILE_SHARE_READ; + } + else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + } + else if (mode & ZLIB_FILEFUNC_MODE_CREATE) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = CREATE_ALWAYS; + } +} + +static voidpf win32_build_iowin(HANDLE hFile) +{ + voidpf ret=NULL; + + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) + { + WIN32FILE_IOWIN w32fiow; + w32fiow.hf = hFile; + w32fiow.error = 0; + ret = malloc(sizeof(WIN32FILE_IOWIN)); + + if (ret==NULL) + CloseHandle(hFile); + else + *((WIN32FILE_IOWIN*)ret) = w32fiow; + } + return ret; +} + +voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!ReadFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + + +uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!WriteFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + +static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) +{ +#ifdef IOWIN32_USING_WINRT_API + return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); +#else + LONG lHigh = pos.HighPart; + DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod); + BOOL fOk = TRUE; + if (dwNewPos == 0xFFFFFFFF) + if (GetLastError() != NO_ERROR) + fOk = FALSE; + if ((newPos != NULL) && (fOk)) + { + newPos->LowPart = dwNewPos; + newPos->HighPart = lHigh; + } + return fOk; +#endif +} + +long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) +{ + long ret=-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=(long)pos.LowPart; + } + return ret; +} + +ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret= (ZPOS64_T)-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = (ZPOS64_T)-1; + } + else + ret=pos.QuadPart; + } + return ret; +} + + +long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + + long ret=-1; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + long ret=-1; + + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) +{ + int ret=-1; + + if (stream!=NULL) + { + HANDLE hFile; + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + CloseHandle(hFile); + ret=0; + } + free(stream); + } + return ret; +} + +int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) +{ + int ret=-1; + if (stream!=NULL) + { + ret = ((WIN32FILE_IOWIN*)stream) -> error; + } + return ret; +} + +void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen_file = win32_open_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell_file = win32_tell_file_func; + pzlib_filefunc_def->zseek_file = win32_seek_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/contrib/zlib/contrib/minizip/iowin32.h b/contrib/zlib/contrib/minizip/iowin32.h new file mode 100644 index 000000000..0ca0969a7 --- /dev/null +++ b/contrib/zlib/contrib/minizip/iowin32.h @@ -0,0 +1,28 @@ +/* iowin32.h -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); + +#ifdef __cplusplus +} +#endif diff --git a/contrib/zlib/contrib/minizip/make_vms.com b/contrib/zlib/contrib/minizip/make_vms.com new file mode 100644 index 000000000..9ac13a98f --- /dev/null +++ b/contrib/zlib/contrib/minizip/make_vms.com @@ -0,0 +1,25 @@ +$ if f$search("ioapi.h_orig") .eqs. "" then copy ioapi.h ioapi.h_orig +$ open/write zdef vmsdefs.h +$ copy sys$input: zdef +$ deck +#define unix +#define fill_zlib_filefunc64_32_def_from_filefunc32 fillzffunc64from +#define Write_Zip64EndOfCentralDirectoryLocator Write_Zip64EoDLocator +#define Write_Zip64EndOfCentralDirectoryRecord Write_Zip64EoDRecord +#define Write_EndOfCentralDirectoryRecord Write_EoDRecord +$ eod +$ close zdef +$ copy vmsdefs.h,ioapi.h_orig ioapi.h +$ cc/include=[--]/prefix=all ioapi.c +$ cc/include=[--]/prefix=all miniunz.c +$ cc/include=[--]/prefix=all unzip.c +$ cc/include=[--]/prefix=all minizip.c +$ cc/include=[--]/prefix=all zip.c +$ link miniunz,unzip,ioapi,[--]libz.olb/lib +$ link minizip,zip,ioapi,[--]libz.olb/lib +$ mcr []minizip test minizip_info.txt +$ mcr []miniunz -l test.zip +$ rename minizip_info.txt; minizip_info.txt_old +$ mcr []miniunz test.zip +$ delete test.zip;* +$exit diff --git a/contrib/zlib/contrib/minizip/miniunz.c b/contrib/zlib/contrib/minizip/miniunz.c new file mode 100644 index 000000000..3d65401be --- /dev/null +++ b/contrib/zlib/contrib/minizip/miniunz.c @@ -0,0 +1,660 @@ +/* + miniunz.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +#endif + + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +#ifdef _WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef _WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +#ifdef unix || __APPLE__ + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef _WIN32 + ret = _mkdir(dirname); +#elif unix + ret = mkdir (dirname,0775); +#elif __APPLE__ + ret = mkdir (dirname,0775); +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + if (buffer==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + +void Display64BitsSize(ZPOS64_T n, int size_char) +{ + /* to avoid compatibility problem , we do here the conversion */ + char number[21]; + int offset=19; + int pos_string = 19; + number[20]=0; + for (;;) { + number[offset]=(char)((n%10)+'0'); + if (number[offset] != '0') + pos_string=offset; + n/=10; + if (offset==0) + break; + offset--; + } + { + int size_display_string = 19-pos_string; + while (size_char > size_display_string) + { + size_char--; + printf(" "); + } + } + + printf("%s",&number[pos_string]); +} + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info64 gi; + int err; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i0) + ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + if (file_info.compression_method==Z_BZIP2ED) + { + string_method="BZip2 "; + } + else + string_method="Unkn. "; + + Display64BitsSize(file_info.uncompressed_size,7); + printf(" %6s%c",string_method,charCrypt); + Display64BitsSize(file_info.compressed_size,7); + printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=FOPEN_FUNC(write_filename,"wb"); + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=FOPEN_FUNC(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info64 gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +miniunzip - uncompress and examine ZIP archives +.SH SYNOPSIS +.B miniunzip +.RI [ -exvlo ] +zipfile [ files_to_extract ] [-d tempdir] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the extraction of compressed file +archives in the ZIP format used by the MS-DOS utility PKZIP. It was +written as a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR unzip (1) +program. +.SH OPTIONS +A number of options are supported. With the exception of +.BI \-d\ tempdir +these must be supplied before any +other arguments and are: +.TP +.BI \-l\ ,\ \-\-v +List the files in the archive without extracting them. +.TP +.B \-o +Overwrite files without prompting for confirmation. +.TP +.B \-x +Extract files (default). +.PP +The +.I zipfile +argument is the name of the archive to process. The next argument can be used +to specify a single file to extract from the archive. + +Lastly, the following option can be specified at the end of the command-line: +.TP +.BI \-d\ tempdir +Extract the archive in the directory +.I tempdir +rather than the current directory. +.SH SEE ALSO +.BR minizip (1), +.BR zlib (3), +.BR unzip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . The -d tempdir option +was added by Dirk Eddelbuettel . diff --git a/contrib/zlib/contrib/minizip/minizip.1 b/contrib/zlib/contrib/minizip/minizip.1 new file mode 100644 index 000000000..1154484c1 --- /dev/null +++ b/contrib/zlib/contrib/minizip/minizip.1 @@ -0,0 +1,46 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH minizip 1 "May 2, 2001" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +minizip - create ZIP archives +.SH SYNOPSIS +.B minizip +.RI [ -o ] +zipfile [ " files" ... ] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the creation of compressed file archives +in the ZIP format used by the MS-DOS utility PKZIP. It was written as +a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR zip (1) +program. +.SH OPTIONS +The first argument supplied is the name of the ZIP archive to create or +.RI -o +in which case it is ignored and the second argument treated as the +name of the ZIP file. If the ZIP file already exists it will be +overwritten. +.PP +Subsequent arguments specify a list of files to place in the ZIP +archive. If none are specified then an empty archive will be created. +.SH SEE ALSO +.BR miniunzip (1), +.BR zlib (3), +.BR zip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . + diff --git a/contrib/zlib/contrib/minizip/minizip.c b/contrib/zlib/contrib/minizip/minizip.c new file mode 100644 index 000000000..4288962ec --- /dev/null +++ b/contrib/zlib/contrib/minizip/minizip.c @@ -0,0 +1,520 @@ +/* + minizip.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +# include +# include +#endif + +#include "zip.h" + +#ifdef _WIN32 + #define USEWIN32IOAPI + #include "iowin32.h" +#endif + + + +#define WRITEBUFFERSIZE (16384) +#define MAXFILENAME (256) + +#ifdef _WIN32 +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret = 0; + { + FILETIME ftLocal; + HANDLE hFind; + WIN32_FIND_DATAA ff32; + + hFind = FindFirstFileA(f,&ff32); + if (hFind != INVALID_HANDLE_VALUE) + { + FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); + FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); + FindClose(hFind); + ret = 1; + } + } + return ret; +} +#else +#ifdef unix || __APPLE__ +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret=0; + struct stat s; /* results of stat() */ + struct tm* filedate; + time_t tm_t=0; + + if (strcmp(f,"-")!=0) + { + char name[MAXFILENAME+1]; + int len = strlen(f); + if (len > MAXFILENAME) + len = MAXFILENAME; + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + + if (name[len - 1] == '/') + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (stat(name,&s)==0) + { + tm_t = s.st_mtime; + ret = 1; + } + } + filedate = localtime(&tm_t); + + tmzip->tm_sec = filedate->tm_sec; + tmzip->tm_min = filedate->tm_min; + tmzip->tm_hour = filedate->tm_hour; + tmzip->tm_mday = filedate->tm_mday; + tmzip->tm_mon = filedate->tm_mon ; + tmzip->tm_year = filedate->tm_year; + + return ret; +} +#else +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + return 0; +} +#endif +#endif + + + + +int check_exist_file(filename) + const char* filename; +{ + FILE* ftestexist; + int ret = 1; + ftestexist = FOPEN_FUNC(filename,"rb"); + if (ftestexist==NULL) + ret = 0; + else + fclose(ftestexist); + return ret; +} + +void do_banner() +{ + printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); + printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); +} + +void do_help() +{ + printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ + " -o Overwrite existing file.zip\n" \ + " -a Append to existing file.zip\n" \ + " -0 Store only\n" \ + " -1 Compress faster\n" \ + " -9 Compress better\n\n" \ + " -j exclude path. store only the file name.\n\n"); +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); + + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %lx\n", filenameinzip, calculate_crc); + return err; +} + +int isLargeFile(const char* filename) +{ + int largeFile = 0; + ZPOS64_T pos = 0; + FILE* pFile = FOPEN_FUNC(filename, "rb"); + + if(pFile != NULL) + { + int n = FSEEKO_FUNC(pFile, 0, SEEK_END); + pos = FTELLO_FUNC(pFile); + + printf("File : %s is %lld bytes\n", filename, pos); + + if(pos >= 0xffffffff) + largeFile = 1; + + fclose(pFile); + } + + return largeFile; +} + +int main(argc,argv) + int argc; + char *argv[]; +{ + int i; + int opt_overwrite=0; + int opt_compress_level=Z_DEFAULT_COMPRESSION; + int opt_exclude_path=0; + int zipfilenamearg = 0; + char filename_try[MAXFILENAME+16]; + int zipok; + int err=0; + int size_buf=0; + void* buf=NULL; + const char* password=NULL; + + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i='0') && (c<='9')) + opt_compress_level = c-'0'; + if ((c=='j') || (c=='J')) + opt_exclude_path = 1; + + if (((c=='p') || (c=='P')) && (i+1='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + if (rep=='N') + zipok = 0; + if (rep=='A') + opt_overwrite = 2; + } + } + + if (zipok==1) + { + zipFile zf; + int errclose; +# ifdef USEWIN32IOAPI + zlib_filefunc64_def ffunc; + fill_win32_filefunc64A(&ffunc); + zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); +# else + zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); +# endif + + if (zf == NULL) + { + printf("error opening %s\n",filename_try); + err= ZIP_ERRNO; + } + else + printf("creating %s\n",filename_try); + + for (i=zipfilenamearg+1;(i='0') || (argv[i][1]<='9'))) && + (strlen(argv[i]) == 2))) + { + FILE * fin; + int size_read; + const char* filenameinzip = argv[i]; + const char *savefilenameinzip; + zip_fileinfo zi; + unsigned long crcFile=0; + int zip64 = 0; + + zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = + zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; + zi.dosDate = 0; + zi.internal_fa = 0; + zi.external_fa = 0; + filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); + +/* + err = zipOpenNewFileInZip(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL / * comment * /, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + zip64 = isLargeFile(filenameinzip); + + /* The path name saved, should not include a leading slash. */ + /*if it did, windows/xp and dynazip couldn't read the zip file. */ + savefilenameinzip = filenameinzip; + while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) + { + savefilenameinzip++; + } + + /*should the zip file contain any path at all?*/ + if( opt_exclude_path ) + { + const char *tmpptr; + const char *lastslash = 0; + for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) + { + if( *tmpptr == '\\' || *tmpptr == '/') + { + lastslash = tmpptr; + } + } + if( lastslash != NULL ) + { + savefilenameinzip = lastslash+1; // base filename follows last slash. + } + } + + /**/ + err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, + NULL,0,NULL,0,NULL /* comment*/, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level,0, + /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + password,crcFile, zip64); + + if (err != ZIP_OK) + printf("error in opening %s in zipfile\n",filenameinzip); + else + { + fin = FOPEN_FUNC(filenameinzip,"rb"); + if (fin==NULL) + { + err=ZIP_ERRNO; + printf("error in opening %s for reading\n",filenameinzip); + } + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + { + err = zipWriteInFileInZip (zf,buf,size_read); + if (err<0) + { + printf("error in writing %s in the zipfile\n", + filenameinzip); + } + + } + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + if (err<0) + err=ZIP_ERRNO; + else + { + err = zipCloseFileInZip(zf); + if (err!=ZIP_OK) + printf("error in closing %s in the zipfile\n", + filenameinzip); + } + } + } + errclose = zipClose(zf,NULL); + if (errclose != ZIP_OK) + printf("error in closing %s\n",filename_try); + } + else + { + do_help(); + } + + free(buf); + return 0; +} diff --git a/contrib/zlib/contrib/minizip/minizip.pc.in b/contrib/zlib/contrib/minizip/minizip.pc.in new file mode 100644 index 000000000..69b5b7fdc --- /dev/null +++ b/contrib/zlib/contrib/minizip/minizip.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/minizip + +Name: minizip +Description: Minizip zip file manipulation library +Requires: +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lminizip +Libs.private: -lz +Cflags: -I${includedir} diff --git a/contrib/zlib/contrib/minizip/mztools.c b/contrib/zlib/contrib/minizip/mztools.c new file mode 100644 index 000000000..96891c2e0 --- /dev/null +++ b/contrib/zlib/contrib/minizip/mztools.c @@ -0,0 +1,291 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) + +extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) +const char* file; +const char* fileOut; +const char* fileOutTmp; +uLong* nRecovered; +uLong* bytesRecovered; +{ + int err = Z_OK; + FILE* fpZip = fopen(file, "rb"); + FILE* fpOut = fopen(fileOut, "wb"); + FILE* fpOutCD = fopen(fileOutTmp, "wb"); + if (fpZip != NULL && fpOut != NULL) { + int entries = 0; + uLong totalBytes = 0; + char header[30]; + char filename[1024]; + char extra[1024]; + int offset = 0; + int offsetCD = 0; + while ( fread(header, 1, 30, fpZip) == 30 ) { + int currentOffset = offset; + + /* File entry */ + if (READ_32(header) == 0x04034b50) { + unsigned int version = READ_16(header + 4); + unsigned int gpflag = READ_16(header + 6); + unsigned int method = READ_16(header + 8); + unsigned int filetime = READ_16(header + 10); + unsigned int filedate = READ_16(header + 12); + unsigned int crc = READ_32(header + 14); /* crc */ + unsigned int cpsize = READ_32(header + 18); /* compressed size */ + unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ + unsigned int fnsize = READ_16(header + 26); /* file name length */ + unsigned int extsize = READ_16(header + 28); /* extra field length */ + filename[0] = extra[0] = '\0'; + + /* Header */ + if (fwrite(header, 1, 30, fpOut) == 30) { + offset += 30; + } else { + err = Z_ERRNO; + break; + } + + /* Filename */ + if (fnsize > 0) { + if (fnsize < sizeof(filename)) { + if (fread(filename, 1, fnsize, fpZip) == fnsize) { + if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { + offset += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (extsize < sizeof(extra)) { + if (fread(extra, 1, extsize, fpZip) == extsize) { + if (fwrite(extra, 1, extsize, fpOut) == extsize) { + offset += extsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } + + /* Data */ + { + int dataSize = cpsize; + if (dataSize == 0) { + dataSize = uncpsize; + } + if (dataSize > 0) { + char* data = malloc(dataSize); + if (data != NULL) { + if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { + if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { + offset += dataSize; + totalBytes += dataSize; + } else { + err = Z_ERRNO; + } + } else { + err = Z_ERRNO; + } + free(data); + if (err != Z_OK) { + break; + } + } else { + err = Z_MEM_ERROR; + break; + } + } + } + + /* Central directory entry */ + { + char header[46]; + char* comment = ""; + int comsize = (int) strlen(comment); + WRITE_32(header, 0x02014b50); + WRITE_16(header + 4, version); + WRITE_16(header + 6, version); + WRITE_16(header + 8, gpflag); + WRITE_16(header + 10, method); + WRITE_16(header + 12, filetime); + WRITE_16(header + 14, filedate); + WRITE_32(header + 16, crc); + WRITE_32(header + 20, cpsize); + WRITE_32(header + 24, uncpsize); + WRITE_16(header + 28, fnsize); + WRITE_16(header + 30, extsize); + WRITE_16(header + 32, comsize); + WRITE_16(header + 34, 0); /* disk # */ + WRITE_16(header + 36, 0); /* int attrb */ + WRITE_32(header + 38, 0); /* ext attrb */ + WRITE_32(header + 42, currentOffset); + /* Header */ + if (fwrite(header, 1, 46, fpOutCD) == 46) { + offsetCD += 46; + + /* Filename */ + if (fnsize > 0) { + if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { + offsetCD += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { + offsetCD += extsize; + } else { + err = Z_ERRNO; + break; + } + } + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { + offsetCD += comsize; + } else { + err = Z_ERRNO; + break; + } + } + + + } else { + err = Z_ERRNO; + break; + } + } + + /* Success */ + entries++; + + } else { + break; + } + } + + /* Final central directory */ + { + int entriesZip = entries; + char header[22]; + char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; + int comsize = (int) strlen(comment); + if (entriesZip > 0xffff) { + entriesZip = 0xffff; + } + WRITE_32(header, 0x06054b50); + WRITE_16(header + 4, 0); /* disk # */ + WRITE_16(header + 6, 0); /* disk # */ + WRITE_16(header + 8, entriesZip); /* hack */ + WRITE_16(header + 10, entriesZip); /* hack */ + WRITE_32(header + 12, offsetCD); /* size of CD */ + WRITE_32(header + 16, offset); /* offset to CD */ + WRITE_16(header + 20, comsize); /* comment */ + + /* Header */ + if (fwrite(header, 1, 22, fpOutCD) == 22) { + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { + err = Z_ERRNO; + } + } + + } else { + err = Z_ERRNO; + } + } + + /* Final merge (file + central directory) */ + fclose(fpOutCD); + if (err == Z_OK) { + fpOutCD = fopen(fileOutTmp, "rb"); + if (fpOutCD != NULL) { + int nRead; + char buffer[8192]; + while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { + if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { + err = Z_ERRNO; + break; + } + } + fclose(fpOutCD); + } + } + + /* Close */ + fclose(fpZip); + fclose(fpOut); + + /* Wipe temporary file */ + (void)remove(fileOutTmp); + + /* Number of recovered entries */ + if (err == Z_OK) { + if (nRecovered != NULL) { + *nRecovered = entries; + } + if (bytesRecovered != NULL) { + *bytesRecovered = totalBytes; + } + } + } else { + err = Z_STREAM_ERROR; + } + return err; +} diff --git a/contrib/zlib/contrib/minizip/mztools.h b/contrib/zlib/contrib/minizip/mztools.h new file mode 100644 index 000000000..a49a426ec --- /dev/null +++ b/contrib/zlib/contrib/minizip/mztools.h @@ -0,0 +1,37 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* Repair a ZIP file (missing central directory) + file: file to recover + fileOut: output file after recovery + fileOutTmp: temporary file name used for recovery +*/ +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, + uLong* nRecovered, + uLong* bytesRecovered); + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/contrib/zlib/contrib/minizip/unzip.c b/contrib/zlib/contrib/minizip/unzip.c new file mode 100644 index 000000000..bcfb9416e --- /dev/null +++ b/contrib/zlib/contrib/minizip/unzip.c @@ -0,0 +1,2125 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + +*/ + + +#include +#include +#include + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been successfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if ((err==UNZ_OK) && (pfile_info != NULL)) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} diff --git a/contrib/zlib/contrib/minizip/unzip.h b/contrib/zlib/contrib/minizip/unzip.h new file mode 100644 index 000000000..2104e3915 --- /dev/null +++ b/contrib/zlib/contrib/minizip/unzip.h @@ -0,0 +1,437 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + 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. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzCloseCurrentFile before call unzClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/contrib/zlib/contrib/minizip/zip.c b/contrib/zlib/contrib/minizip/zip.c new file mode 100644 index 000000000..44e88a9cb --- /dev/null +++ b/contrib/zlib/contrib/minizip/zip.c @@ -0,0 +1,2007 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + Oct-2009 - Mathias Svensson - Remove old C style function prototypes + Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives + Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. + Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data + It is used when recreting zip archive with RAW when deleting items from a zip. + ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. + Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (64*1024) //(16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + + +// NOT sure that this work on ALL platform +#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) +#define ZIP64ENDHEADERMAGIC (0x6064b50) +#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignment */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + ZPOS64_T pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralExtra; + uLong size_centralheader; /* size of the central header for cur file */ + uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; + int zip64; /* Add ZIP64 extened information in the extra field */ + ZPOS64_T pos_zip64extrainfo; + ZPOS64_T totalCompressedData; + ZPOS64_T totalUncompressedData; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile64_info; + +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile64_info ci; /* info on the file curretly writing */ + + ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ + ZPOS64_T add_position_when_writing_offset; + ZPOS64_T number_entry; + +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif + +} zip64_internal; + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(linkedlist_datablock_internal* ldi) +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(linkedlist_data* ll) +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(linkedlist_data* ll) +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) +*/ + +local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); +local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) +{ + unsigned char buf[8]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) +{ + uLong year = (uLong)ptm->tm_year; + if (year>=1980) + year-=1980; + else if (year>=80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); + +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); + + +local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) +{ + ZPOS64_T x; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<24; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<32; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<40; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<48; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<56; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* +Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before +the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + { + // Signature "0x07064b50" Zip64 end of central directory locater + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + } + + if (uPosFound!=0) + break; + } + + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK) + return 0; + + /* total number of disks */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto Zip64 end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' + return 0; + + return relativeOffset; +} + +int LoadCentralDirectoryRecord(zip64_internal* pziinit) +{ + int err=ZIP_OK; + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory */ + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry; + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong VersionMadeBy; + uLong VersionNeeded; + uLong size_comment; + + int hasZIP64Record = 0; + + // check first if we find a ZIP64 record + central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); + if(central_pos > 0) + { + hasZIP64Record = 1; + } + else if(central_pos == 0) + { + central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); + } + +/* disable to allow appending to empty ZIP archive + if (central_pos==0) + err=ZIP_ERRNO; +*/ + + if(hasZIP64Record) + { + ZPOS64_T sizeEndOfCentralDirectory; + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* size of zip64 end of central directory record */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version made by */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version needed to extract */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + // TODO.. + // read the comment from the standard central header. + size_comment = 0; + } + else + { + // Read End of central Directory info + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + number_entry = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry = uL; + + /* total number of entries in the central dir */ + number_entry_CD = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry_CD = uL; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + size_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + size_central_dir = uL; + + /* offset of start of central directory with respect to the starting disk number */ + offset_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + offset_central_dir = uL; + + + /* zipfile global comment length */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + } + + if ((central_posz_filefunc, pziinit->filestream); + return ZIP_ERRNO; + } + + if (size_comment>0) + { + pziinit->globalcomment = (char*)ALLOC(size_comment+1); + if (pziinit->globalcomment) + { + size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); + pziinit->globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); + pziinit->add_position_when_writing_offset = byte_before_the_zipfile; + + { + ZPOS64_T size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + ZPOS64_T read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + + if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); + + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + pziinit->begin_pos = byte_before_the_zipfile; + pziinit->number_entry = number_entry_CD; + + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + return err; +} + + +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + + +/************************************************************/ +extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) +{ + zip64_internal ziinit; + zip64_internal* zi; + int err=ZIP_OK; + + ziinit.z_filefunc.zseek32_file = NULL; + ziinit.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + else + ziinit.z_filefunc = *pzlib_filefunc64_32_def; + + ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + + if (append == APPEND_STATUS_CREATEAFTER) + ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + + ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writing_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + + zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); + if (zi==NULL) + { + ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + // Read and Cache Central Directory Records + err = LoadCentralDirectoryRecord(&ziinit); + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + +extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + + + +extern zipFile ZEXPORT zipOpen (const char* pathname, int append) +{ + return zipOpen3((const void*)pathname,append,NULL,NULL); +} + +extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) +{ + return zipOpen3(pathname,append,NULL,NULL); +} + +int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +{ + /* write the local header */ + int err; + uInt size_filename = (uInt)strlen(filename); + uInt size_extrafield = size_extrafield_local; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); + + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + } + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if(zi->ci.zip64) + { + size_extrafield += 20; + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); + + if ((err==ZIP_OK) && (size_filename > 0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + } + + if ((err==ZIP_OK) && (size_extrafield_local > 0)) + { + if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) + err = ZIP_ERRNO; + } + + + if ((err==ZIP_OK) && (zi->ci.zip64)) + { + // write the Zip64 extended info + short HeaderID = 1; + short DataSize = 16; + ZPOS64_T CompressedSize = 0; + ZPOS64_T UncompressedSize = 0; + + // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) + zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); + } + + return err; +} + +/* + NOTE. + When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped + before calling this function it can be done with zipRemoveExtraInfoBlock + + It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize + unnecessary allocations. + */ +extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) +{ + zip64_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + (crcForCrypting); + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + +#ifdef HAVE_BZIP2 + if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED)) + return ZIP_PARAMERROR; +#else + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; +#endif + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else + zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); + } + + zi->ci.flag = flagBase; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if (level==2) + zi->ci.flag |= 4; + if (level==1) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); + + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; + zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data + + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); + + zi->ci.size_centralExtra = size_extrafield_global; + zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + if(zi->ci.pos_local_header >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + zi->ci.zip64 = zip64; + zi->ci.totalCompressedData = 0; + zi->ci.totalUncompressedData = 0; + zi->ci.pos_zip64extrainfo = 0; + + err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); + +#ifdef HAVE_BZIP2 + zi->ci.bstream.avail_in = (uInt)0; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + zi->ci.bstream.total_in_hi32 = 0; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_out_hi32 = 0; + zi->ci.bstream.total_out_lo32 = 0; +#endif + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + zi->ci.stream.data_type = Z_BINARY; + +#ifdef HAVE_BZIP2 + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) +#else + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) +#endif + { + if(zi->ci.method == Z_DEFLATED) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = Z_DEFLATED; + } + else if(zi->ci.method == Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + // Init BZip stuff here + zi->ci.bstream.bzalloc = 0; + zi->ci.bstream.bzfree = 0; + zi->ci.bstream.opaque = (voidpf)0; + + err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); + if(err == BZ_OK) + zi->ci.stream_initialised = Z_BZIP2ED; +#endif + } + + } + +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +local int zip64FlushWriteBuffer(zip64_internal* zi) +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); +#endif + } + + if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + + zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED) + { + zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_in_hi32 = 0; + } + else +#endif + { + zi->ci.totalUncompressedData += zi->ci.stream.total_in; + zi->ci.stream.total_in = 0; + } + + + zi->ci.pos_in_buffered_data = 0; + + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) +{ + zip64_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len); + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) + { + zi->ci.bstream.next_in = (void*)buf; + zi->ci.bstream.avail_in = len; + err = BZ_RUN_OK; + + while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0)) + { + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + + + if(err != BZ_RUN_OK) + break; + + if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; +// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; + } + } + + if(err == BZ_RUN_OK) + err = ZIP_OK; + } + else +#endif + { + zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.avail_in = len; + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + if(uTotalOutBefore > zi->ci.stream.total_out) + { + int bBreak = 0; + bBreak++; + } + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + + for (i = 0; i < copy_this; i++) + *(((char*)zi->ci.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + }// while(...) + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) +{ + return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); +} + +extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) +{ + zip64_internal* zi; + ZPOS64_T compressed_size; + uLong invalidValue = 0xffffffff; + short datasize = 0; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + } + else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { +#ifdef HAVE_BZIP2 + err = BZ_FINISH_OK; + while (err==BZ_FINISH_OK) + { + uLong uTotalOutBefore; + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.bstream.total_out_lo32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); + if(err == BZ_STREAM_END) + err = Z_STREAM_END; + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); + } + + if(err == BZ_FINISH_OK) + err = ZIP_OK; +#endif + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + { + if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + } + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + int tmp_err = deflateEnd(&zi->ci.stream); + if (err == ZIP_OK) + err = tmp_err; + zi->ci.stream_initialised = 0; + } +#ifdef HAVE_BZIP2 + else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); + if (err==ZIP_OK) + err = tmperr; + zi->ci.stream_initialised = 0; + } +#endif + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = zi->ci.totalUncompressedData; + } + compressed_size = zi->ci.totalCompressedData; + +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + // update Current Item crc and sizes, + if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) + { + /*version Made by*/ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); + /*version needed*/ + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); + + } + + zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + + + if(compressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ + + /// set internal file attributes field + if (zi->ci.stream.data_type == Z_ASCII) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + + if(uncompressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ + + // Add ZIP64 extra info field for uncompressed size + if(uncompressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for compressed size + if(compressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for relative offset to local file header of current file + if(zi->ci.pos_local_header >= 0xffffffff) + datasize += 8; + + if(datasize > 0) + { + char* p = NULL; + + if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) + { + // we can not write more data to the buffer that we have room for. + return ZIP_BADZIPFILE; + } + + p = zi->ci.central_header + zi->ci.size_centralheader; + + // Add Extra Information Header for 'ZIP64 information' + zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID + p += 2; + zip64local_putValue_inmemory(p, datasize, 2); // DataSize + p += 2; + + if(uncompressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, uncompressed_size, 8); + p += 8; + } + + if(compressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, compressed_size, 8); + p += 8; + } + + if(zi->ci.pos_local_header >= 0xffffffff) + { + zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); + p += 8; + } + + // Update how much extra free space we got in the memory buffer + // and increase the centralheader size so the new ZIP64 fields are included + // ( 4 below is the size of HeaderID and DataSize field ) + zi->ci.size_centralExtraFree -= datasize + 4; + zi->ci.size_centralheader += datasize + 4; + + // Update the extra info size field + zi->ci.size_centralExtra += datasize + 4; + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); + } + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); + + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + // Update the LocalFileHeader with the new values. + + ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff ) + { + if(zi->ci.pos_zip64extrainfo > 0) + { + // Update the size in the ZIP64 extended field. + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); + } + else + err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal + } + else + { + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + } + + if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (zipFile file) +{ + return zipCloseFileInZipRaw (file,0,0); +} + +int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +{ + int err = ZIP_OK; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); + + /*num disks*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + /*relative offset*/ + if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); + + /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); + + return err; +} + +int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + uLong Zip64DataSize = 44; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? + + if (err==ZIP_OK) /* version made by */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* version needed */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); + } + return err; +} +int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + /*signature*/ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + { + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + } + + if (err==ZIP_OK) /* total number of entries in the central dir */ + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff) + { + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); + } + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4); + } + + return err; +} + +int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +{ + int err = ZIP_OK; + uInt size_global_comment = 0; + + if(global_comment != NULL) + size_global_comment = (uInt)strlen(global_comment); + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if (err == ZIP_OK && size_global_comment > 0) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + } + return err; +} + +extern int ZEXPORT zipClose (zipFile file, const char* global_comment) +{ + zip64_internal* zi; + int err = 0; + uLong size_centraldir = 0; + ZPOS64_T centraldir_pos_inzip; + ZPOS64_T pos; + + if (file == NULL) + return ZIP_PARAMERROR; + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + + centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) + err = ZIP_ERRNO; + } + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_linkedlist(&(zi->central_dir)); + + pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + { + ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); + Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); + } + + if (err==ZIP_OK) + err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + if(err == ZIP_OK) + err = Write_GlobalComment(zi, global_comment); + + if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} + +extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) +{ + char* p = pData; + int size = 0; + char* pNewHeader; + char* pTmp; + short header; + short dataSize; + + int retVal = ZIP_OK; + + if(pData == NULL || *dataLen < 4) + return ZIP_PARAMERROR; + + pNewHeader = (char*)ALLOC(*dataLen); + pTmp = pNewHeader; + + while(p < (pData + *dataLen)) + { + header = *(short*)p; + dataSize = *(((short*)p)+1); + + if( header == sHeader ) // Header found. + { + p += dataSize + 4; // skip it. do not copy to temp buffer + } + else + { + // Extra Info block should not be removed, So copy it to the temp buffer. + memcpy(pTmp, p, dataSize + 4); + p += dataSize + 4; + size += dataSize + 4; + } + + } + + if(size < *dataLen) + { + // clean old extra info block. + memset(pData,0, *dataLen); + + // copy the new extra info block over the old + if(size > 0) + memcpy(pData, pNewHeader, size); + + // set the new extra info size + *dataLen = size; + + retVal = ZIP_OK; + } + else + retVal = ZIP_ERRNO; + + TRYFREE(pNewHeader); + + return retVal; +} diff --git a/contrib/zlib/contrib/minizip/zip.h b/contrib/zlib/contrib/minizip/zip.h new file mode 100644 index 000000000..8aaebb623 --- /dev/null +++ b/contrib/zlib/contrib/minizip/zip.h @@ -0,0 +1,362 @@ +/* zip.h -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + 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. + + --------------------------------------------------------------------------- + + Changes + + See header of zip.h + +*/ + +#ifndef _zip12_H +#define _zip12_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#define HAVE_BZIP2 + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); + +extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64)); + +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + zip64 is set to 1 if a zip64 extended information block should be added to the local file header. + this MUST be '1' if the uncompressed size is >= 0xffffffff. + +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + + +extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64)); +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting)); + +extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64 + )); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCrypting : crc of file to compress (needed for crypting) + */ + +extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase + )); + + +extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64 + )); +/* + Same than zipOpenNewFileInZip4, except + versionMadeBy : value for Version made by field + flag : value for flag field (compression level info will be added) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + +extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32)); + +/* + Close the current file in the zipfile, for file opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + + +extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +/* + zipRemoveExtraInfoBlock - Added by Mathias Svensson + + Remove extra information block from a extra information data for the local file header or central directory header + + It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. + + 0x0001 is the signature header for the ZIP64 extra information blocks + + usage. + Remove ZIP64 Extra information from a central director extra field data + zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); + + Remove ZIP64 Extra information from a Local File Header extra field data + zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip64_H */ diff --git a/contrib/zlib/contrib/pascal/example.pas b/contrib/zlib/contrib/pascal/example.pas new file mode 100644 index 000000000..5518b36a7 --- /dev/null +++ b/contrib/zlib/contrib/pascal/example.pas @@ -0,0 +1,599 @@ +(* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Pascal translation + * Copyright (C) 1998 by Jacques Nomssi Nzali. + * For conditions of distribution and use, see copyright notice in readme.txt + * + * Adaptation to the zlibpas interface + * Copyright (C) 2003 by Cosmin Truta. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +program example; + +{$DEFINE TEST_COMPRESS} +{DO NOT $DEFINE TEST_GZIO} +{$DEFINE TEST_DEFLATE} +{$DEFINE TEST_INFLATE} +{$DEFINE TEST_FLUSH} +{$DEFINE TEST_SYNC} +{$DEFINE TEST_DICT} + +uses SysUtils, zlibpas; + +const TESTFILE = 'foo.gz'; + +(* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + *) +const hello: PChar = 'hello, hello!'; + +const dictionary: PChar = 'hello'; + +var dictId: LongInt; (* Adler32 value of the dictionary *) + +procedure CHECK_ERR(err: Integer; msg: String); +begin + if err <> Z_OK then + begin + WriteLn(msg, ' error: ', err); + Halt(1); + end; +end; + +procedure EXIT_ERR(const msg: String); +begin + WriteLn('Error: ', msg); + Halt(1); +end; + +(* =========================================================================== + * Test compress and uncompress + *) +{$IFDEF TEST_COMPRESS} +procedure test_compress(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + err := compress(compr, comprLen, hello, len); + CHECK_ERR(err, 'compress'); + + StrCopy(PChar(uncompr), 'garbage'); + + err := uncompress(uncompr, uncomprLen, compr, comprLen); + CHECK_ERR(err, 'uncompress'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad uncompress') + else + WriteLn('uncompress(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test read/write of .gz files + *) +{$IFDEF TEST_GZIO} +procedure test_gzio(const fname: PChar; (* compressed file name *) + uncompr: Pointer; + uncomprLen: LongInt); +var err: Integer; + len: Integer; + zfile: gzFile; + pos: LongInt; +begin + len := StrLen(hello)+1; + + zfile := gzopen(fname, 'wb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + gzputc(zfile, 'h'); + if gzputs(zfile, 'ello') <> 4 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$IFDEF GZ_FORMAT_STRING} + if gzprintf(zfile, ', %s!', 'hello') <> 8 then + begin + WriteLn('gzprintf err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ELSE} + if gzputs(zfile, ', hello!') <> 8 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ENDIF} + gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *) + gzclose(zfile); + + zfile := gzopen(fname, 'rb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + + StrCopy(PChar(uncompr), 'garbage'); + + if gzread(zfile, uncompr, uncomprLen) <> len then + begin + WriteLn('gzread err: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello) <> 0 then + begin + WriteLn('bad gzread: ', PChar(uncompr)); + Halt(1); + end + else + WriteLn('gzread(): ', PChar(uncompr)); + + pos := gzseek(zfile, -8, SEEK_CUR); + if (pos <> 6) or (gztell(zfile) <> pos) then + begin + WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile)); + Halt(1); + end; + + if gzgetc(zfile) <> ' ' then + begin + WriteLn('gzgetc error'); + Halt(1); + end; + + if gzungetc(' ', zfile) <> ' ' then + begin + WriteLn('gzungetc error'); + Halt(1); + end; + + gzgets(zfile, PChar(uncompr), uncomprLen); + uncomprLen := StrLen(PChar(uncompr)); + if uncomprLen <> 7 then (* " hello!" *) + begin + WriteLn('gzgets err after gzseek: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello + 6) <> 0 then + begin + WriteLn('bad gzgets after gzseek'); + Halt(1); + end + else + WriteLn('gzgets() after gzseek: ', PChar(uncompr)); + + gzclose(zfile); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with small buffers + *) +{$IFDEF TEST_DEFLATE} +procedure test_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + + while (c_stream.total_in <> len) and + (c_stream.total_out < comprLen) do + begin + c_stream.avail_out := 1; { force small buffers } + c_stream.avail_in := 1; + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + end; + + (* Finish the stream, still forcing small buffers: *) + while TRUE do + begin + c_stream.avail_out := 1; + err := deflate(c_stream, Z_FINISH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'deflate'); + end; + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with small buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_inflate(compr: Pointer; comprLen : LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 0; + d_stream.next_out := uncompr; + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while (d_stream.total_out < uncomprLen) and + (d_stream.total_in < comprLen) do + begin + d_stream.avail_out := 1; (* force small buffers *) + d_stream.avail_in := 1; + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate') + else + WriteLn('inflate(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with large buffers and dynamic change of compression level + *) +{$IFDEF TEST_DEFLATE} +procedure test_large_deflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_SPEED); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + (* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + *) + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + if c_stream.avail_in <> 0 then + EXIT_ERR('deflate not greedy'); + + (* Feed in already compressed data and switch to no compression: *) + deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in := compr; + c_stream.avail_in := Integer(comprLen div 2); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + (* Switch back to compressing mode: *) + deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with large buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_large_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while TRUE do + begin + d_stream.next_out := uncompr; (* discard the output *) + d_stream.avail_out := Integer(uncomprLen); + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'large inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then + begin + WriteLn('bad large inflate: ', d_stream.total_out); + Halt(1); + end + else + WriteLn('large_inflate(): OK'); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with full flush + *) +{$IFDEF TEST_FLUSH} +procedure test_flush(compr: Pointer; var comprLen : LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: Integer; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + c_stream.avail_in := 3; + c_stream.avail_out := Integer(comprLen); + err := deflate(c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, 'deflate'); + + Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *) + c_stream.avail_in := len - 3; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + CHECK_ERR(err, 'deflate'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); + + comprLen := c_stream.total_out; +end; +{$ENDIF} + +(* =========================================================================== + * Test inflateSync() + *) +{$IFDEF TEST_SYNC} +procedure test_sync(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 2; (* just read the zlib header *) + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + inflate(d_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'inflate'); + + d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *) + err := inflateSync(d_stream); (* but skip the damaged part *) + CHECK_ERR(err, 'inflateSync'); + + err := inflate(d_stream, Z_FINISH); + if err <> Z_DATA_ERROR then + EXIT_ERR('inflate should report DATA_ERROR'); + (* Because of incorrect adler32 *) + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + WriteLn('after inflateSync(): hel', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary)); + CHECK_ERR(err, 'deflateSetDictionary'); + + dictId := c_stream.adler; + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + c_stream.next_in := hello; + c_stream.avail_in := StrLen(hello)+1; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with a preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + while TRUE do + begin + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + if err = Z_NEED_DICT then + begin + if d_stream.adler <> dictId then + EXIT_ERR('unexpected dictionary'); + err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary)); + end; + CHECK_ERR(err, 'inflate with dict'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate with dict') + else + WriteLn('inflate with dictionary: ', PChar(uncompr)); +end; +{$ENDIF} + +var compr, uncompr: Pointer; + comprLen, uncomprLen: LongInt; + +begin + if zlibVersion^ <> ZLIB_VERSION[1] then + EXIT_ERR('Incompatible zlib version'); + + WriteLn('zlib version: ', zlibVersion); + WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags])); + + comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *) + uncomprLen := comprLen; + GetMem(compr, comprLen); + GetMem(uncompr, uncomprLen); + if (compr = NIL) or (uncompr = NIL) then + EXIT_ERR('Out of memory'); + (* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + *) + FillChar(compr^, comprLen, 0); + FillChar(uncompr^, uncomprLen, 0); + + {$IFDEF TEST_COMPRESS} + WriteLn('** Testing compress'); + test_compress(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_GZIO} + WriteLn('** Testing gzio'); + if ParamCount >= 1 then + test_gzio(ParamStr(1), uncompr, uncomprLen) + else + test_gzio(TESTFILE, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with small buffers'); + test_deflate(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with small buffers'); + test_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with large buffers'); + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with large buffers'); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_FLUSH} + WriteLn('** Testing deflate with full flush'); + test_flush(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_SYNC} + WriteLn('** Testing inflateSync'); + test_sync(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + comprLen := uncomprLen; + + {$IFDEF TEST_DICT} + WriteLn('** Testing deflate and inflate with preset dictionary'); + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + FreeMem(compr, comprLen); + FreeMem(uncompr, uncomprLen); +end. diff --git a/contrib/zlib/contrib/pascal/readme.txt b/contrib/zlib/contrib/pascal/readme.txt new file mode 100644 index 000000000..60e87c8a3 --- /dev/null +++ b/contrib/zlib/contrib/pascal/readme.txt @@ -0,0 +1,76 @@ + +This directory contains a Pascal (Delphi, Kylix) interface to the +zlib data compression library. + + +Directory listing +================= + +zlibd32.mak makefile for Borland C++ +example.pas usage example of zlib +zlibpas.pas the Pascal interface to zlib +readme.txt this file + + +Compatibility notes +=================== + +- Although the name "zlib" would have been more normal for the + zlibpas unit, this name is already taken by Borland's ZLib unit. + This is somehow unfortunate, because that unit is not a genuine + interface to the full-fledged zlib functionality, but a suite of + class wrappers around zlib streams. Other essential features, + such as checksums, are missing. + It would have been more appropriate for that unit to have a name + like "ZStreams", or something similar. + +- The C and zlib-supplied types int, uInt, long, uLong, etc. are + translated directly into Pascal types of similar sizes (Integer, + LongInt, etc.), to avoid namespace pollution. In particular, + there is no conversion of unsigned int into a Pascal unsigned + integer. The Word type is non-portable and has the same size + (16 bits) both in a 16-bit and in a 32-bit environment, unlike + Integer. Even if there is a 32-bit Cardinal type, there is no + real need for unsigned int in zlib under a 32-bit environment. + +- Except for the callbacks, the zlib function interfaces are + assuming the calling convention normally used in Pascal + (__pascal for DOS and Windows16, __fastcall for Windows32). + Since the cdecl keyword is used, the old Turbo Pascal does + not work with this interface. + +- The gz* function interfaces are not translated, to avoid + interfacing problems with the C runtime library. Besides, + gzprintf(gzFile file, const char *format, ...) + cannot be translated into Pascal. + + +Legal issues +============ + +The zlibpas interface is: + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler. + Copyright (C) 1998 by Bob Dellaca. + Copyright (C) 2003 by Cosmin Truta. + +The example program is: + Copyright (C) 1995-2003 by Jean-loup Gailly. + Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali. + Copyright (C) 2003 by Cosmin Truta. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author 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. + diff --git a/contrib/zlib/contrib/pascal/zlibd32.mak b/contrib/zlib/contrib/pascal/zlibd32.mak new file mode 100644 index 000000000..9bb00b7cc --- /dev/null +++ b/contrib/zlib/contrib/pascal/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/contrib/zlib/contrib/pascal/zlibpas.pas b/contrib/zlib/contrib/pascal/zlibpas.pas new file mode 100644 index 000000000..a0dff11b5 --- /dev/null +++ b/contrib/zlib/contrib/pascal/zlibpas.pas @@ -0,0 +1,276 @@ +(* zlibpas -- Pascal interface to the zlib data compression library + * + * Copyright (C) 2003 Cosmin Truta. + * Derived from original sources by Bob Dellaca. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +unit zlibpas; + +interface + +const + ZLIB_VERSION = '1.2.11'; + ZLIB_VERNUM = $12a0; + +type + alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; + cdecl; + free_func = procedure(opaque, address: Pointer); + cdecl; + + in_func = function(opaque: Pointer; var buf: PByte): Integer; + cdecl; + out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer; + cdecl; + + z_streamp = ^z_stream; + z_stream = packed record + next_in: PChar; (* next input byte *) + avail_in: Integer; (* number of bytes available at next_in *) + total_in: LongInt; (* total nb of input bytes read so far *) + + next_out: PChar; (* next output byte should be put there *) + avail_out: Integer; (* remaining free space at next_out *) + total_out: LongInt; (* total nb of bytes output so far *) + + msg: PChar; (* last error message, NULL if no error *) + state: Pointer; (* not visible by applications *) + + zalloc: alloc_func; (* used to allocate the internal state *) + zfree: free_func; (* used to free the internal state *) + opaque: Pointer; (* private data object passed to zalloc and zfree *) + + data_type: Integer; (* best guess about the data type: ascii or binary *) + adler: LongInt; (* adler32 value of the uncompressed data *) + reserved: LongInt; (* reserved for future use *) + end; + + gz_headerp = ^gz_header; + gz_header = packed record + text: Integer; (* true if compressed data believed to be text *) + time: LongInt; (* modification time *) + xflags: Integer; (* extra flags (not used when writing a gzip file) *) + os: Integer; (* operating system *) + extra: PChar; (* pointer to extra field or Z_NULL if none *) + extra_len: Integer; (* extra field length (valid if extra != Z_NULL) *) + extra_max: Integer; (* space at extra (only when reading header) *) + name: PChar; (* pointer to zero-terminated file name or Z_NULL *) + name_max: Integer; (* space at name (only when reading header) *) + comment: PChar; (* pointer to zero-terminated comment or Z_NULL *) + comm_max: Integer; (* space at comment (only when reading header) *) + hcrc: Integer; (* true if there was or will be a header crc *) + done: Integer; (* true when done reading gzip header *) + end; + +(* constants *) +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + Z_BLOCK = 5; + Z_TREES = 6; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = -1; + Z_STREAM_ERROR = -2; + Z_DATA_ERROR = -3; + Z_MEM_ERROR = -4; + Z_BUF_ERROR = -5; + Z_VERSION_ERROR = -6; + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = -1; + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_FIXED = 4; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_TEXT = 1; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + +(* basic functions *) +function zlibVersion: PChar; +function deflateInit(var strm: z_stream; level: Integer): Integer; +function deflate(var strm: z_stream; flush: Integer): Integer; +function deflateEnd(var strm: z_stream): Integer; +function inflateInit(var strm: z_stream): Integer; +function inflate(var strm: z_stream; flush: Integer): Integer; +function inflateEnd(var strm: z_stream): Integer; + +(* advanced functions *) +function deflateInit2(var strm: z_stream; level, method, windowBits, + memLevel, strategy: Integer): Integer; +function deflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function deflateCopy(var dest, source: z_stream): Integer; +function deflateReset(var strm: z_stream): Integer; +function deflateParams(var strm: z_stream; level, strategy: Integer): Integer; +function deflateTune(var strm: z_stream; good_length, max_lazy, nice_length, max_chain: Integer): Integer; +function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt; +function deflatePending(var strm: z_stream; var pending: Integer; var bits: Integer): Integer; +function deflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function deflateSetHeader(var strm: z_stream; head: gz_header): Integer; +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +function inflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function inflateSync(var strm: z_stream): Integer; +function inflateCopy(var dest, source: z_stream): Integer; +function inflateReset(var strm: z_stream): Integer; +function inflateReset2(var strm: z_stream; windowBits: Integer): Integer; +function inflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function inflateMark(var strm: z_stream): LongInt; +function inflateGetHeader(var strm: z_stream; var head: gz_header): Integer; +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer; + out_fn: out_func; out_desc: Pointer): Integer; +function inflateBackEnd(var strm: z_stream): Integer; +function zlibCompileFlags: LongInt; + +(* utility functions *) +function compress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; +function compress2(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt; + level: Integer): Integer; +function compressBound(sourceLen: LongInt): LongInt; +function uncompress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; + +(* checksum functions *) +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; +function adler32_combine(adler1, adler2, len2: LongInt): LongInt; +function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt; +function crc32_combine(crc1, crc2, len2: LongInt): LongInt; + +(* various hacks, don't look :) *) +function deflateInit_(var strm: z_stream; level: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit_(var strm: z_stream; const version: PChar; + stream_size: Integer): Integer; +function deflateInit2_(var strm: z_stream; + level, method, windowBits, memLevel, strategy: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit2_(var strm: z_stream; windowBits: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateBackInit_(var strm: z_stream; + windowBits: Integer; window: PChar; + const version: PChar; stream_size: Integer): Integer; + + +implementation + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +function adler32; external; +function adler32_combine; external; +function compress; external; +function compress2; external; +function compressBound; external; +function crc32; external; +function crc32_combine; external; +function deflate; external; +function deflateBound; external; +function deflateCopy; external; +function deflateEnd; external; +function deflateInit_; external; +function deflateInit2_; external; +function deflateParams; external; +function deflatePending; external; +function deflatePrime; external; +function deflateReset; external; +function deflateSetDictionary; external; +function deflateSetHeader; external; +function deflateTune; external; +function inflate; external; +function inflateBack; external; +function inflateBackEnd; external; +function inflateBackInit_; external; +function inflateCopy; external; +function inflateEnd; external; +function inflateGetHeader; external; +function inflateInit_; external; +function inflateInit2_; external; +function inflateMark; external; +function inflatePrime; external; +function inflateReset; external; +function inflateReset2; external; +function inflateSetDictionary; external; +function inflateSync; external; +function uncompress; external; +function zlibCompileFlags; external; +function zlibVersion; external; + +function deflateInit(var strm: z_stream; level: Integer): Integer; +begin + Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream)); +end; + +function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel, + strategy: Integer): Integer; +begin + Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit(var strm: z_stream): Integer; +begin + Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +begin + Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +begin + Result := inflateBackInit_(strm, windowBits, window, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + GetMem(Result, Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + +end. diff --git a/contrib/zlib/contrib/puff/README b/contrib/zlib/contrib/puff/README new file mode 100644 index 000000000..bbc4cb595 --- /dev/null +++ b/contrib/zlib/contrib/puff/README @@ -0,0 +1,63 @@ +Puff -- A Simple Inflate +3 Mar 2003 +Mark Adler +madler@alumni.caltech.edu + +What this is -- + +puff.c provides the routine puff() to decompress the deflate data format. It +does so more slowly than zlib, but the code is about one-fifth the size of the +inflate code in zlib, and written to be very easy to read. + +Why I wrote this -- + +puff.c was written to document the deflate format unambiguously, by virtue of +being working C code. It is meant to supplement RFC 1951, which formally +describes the deflate format. I have received many questions on details of the +deflate format, and I hope that reading this code will answer those questions. +puff.c is heavily commented with details of the deflate format, especially +those little nooks and cranies of the format that might not be obvious from a +specification. + +puff.c may also be useful in applications where code size or memory usage is a +very limited resource, and speed is not as important. + +How to use it -- + +Well, most likely you should just be reading puff.c and using zlib for actual +applications, but if you must ... + +Include puff.h in your code, which provides this prototype: + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ + +Then you can call puff() to decompress a deflate stream that is in memory in +its entirety at source, to a sufficiently sized block of memory for the +decompressed data at dest. puff() is the only external symbol in puff.c The +only C library functions that puff.c needs are setjmp() and longjmp(), which +are used to simplify error checking in the code to improve readabilty. puff.c +does no memory allocation, and uses less than 2K bytes off of the stack. + +If destlen is not enough space for the uncompressed data, then inflate will +return an error without writing more than destlen bytes. Note that this means +that in order to decompress the deflate data successfully, you need to know +the size of the uncompressed data ahead of time. + +If needed, puff() can determine the size of the uncompressed data with no +output space. This is done by passing dest equal to (unsigned char *)0. Then +the initial value of *destlen is ignored and *destlen is set to the length of +the uncompressed data. So if the size of the uncompressed data is not known, +then two passes of puff() can be used--first to determine the size, and second +to do the actual inflation after allocating the appropriate memory. Not +pretty, but it works. (This is one of the reasons you should be using zlib.) + +The deflate format is self-terminating. If the deflate stream does not end +in *sourcelen bytes, puff() will return an error without reading at or past +endsource. + +On return, *sourcelen is updated to the amount of input data consumed, and +*destlen is updated to the size of the uncompressed data. See the comments +in puff.c for the possible return codes for puff(). diff --git a/contrib/zlib/contrib/puff/puff.c b/contrib/zlib/contrib/puff/puff.c new file mode 100644 index 000000000..c6c90d714 --- /dev/null +++ b/contrib/zlib/contrib/puff/puff.c @@ -0,0 +1,840 @@ +/* + * puff.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + * + * puff.c is a simple inflate written to be an unambiguous way to specify the + * deflate format. It is not written for speed but rather simplicity. As a + * side benefit, this code might actually be useful when small code is more + * important than speed, such as bootstrap applications. For typical deflate + * data, zlib's inflate() is about four times as fast as puff(). zlib's + * inflate compiles to around 20K on my machine, whereas puff.c compiles to + * around 4K on my machine (a PowerPC using GNU cc). If the faster decode() + * function here is used, then puff() is only twice as slow as zlib's + * inflate(). + * + * All dynamically allocated memory comes from the stack. The stack required + * is less than 2K bytes. This code is compatible with 16-bit int's and + * assumes that long's are at least 32 bits. puff.c uses the short data type, + * assumed to be 16 bits, for arrays in order to conserve memory. The code + * works whether integers are stored big endian or little endian. + * + * In the comments below are "Format notes" that describe the inflate process + * and document some of the less obvious aspects of the format. This source + * code is meant to supplement RFC 1951, which formally describes the deflate + * format: + * + * http://www.zlib.org/rfc-deflate.html + */ + +/* + * Change history: + * + * 1.0 10 Feb 2002 - First version + * 1.1 17 Feb 2002 - Clarifications of some comments and notes + * - Update puff() dest and source pointers on negative + * errors to facilitate debugging deflators + * - Remove longest from struct huffman -- not needed + * - Simplify offs[] index in construct() + * - Add input size and checking, using longjmp() to + * maintain easy readability + * - Use short data type for large arrays + * - Use pointers instead of long to specify source and + * destination sizes to avoid arbitrary 4 GB limits + * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), + * but leave simple version for readabilty + * - Make sure invalid distances detected if pointers + * are 16 bits + * - Fix fixed codes table error + * - Provide a scanning mode for determining size of + * uncompressed data + * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Gailly] + * - Add a puff.h file for the interface + * - Add braces in puff() for else do [Gailly] + * - Use indexes instead of pointers for readability + * 1.4 31 Mar 2002 - Simplify construct() code set check + * - Fix some comments + * - Add FIXLCODES #define + * 1.5 6 Apr 2002 - Minor comment fixes + * 1.6 7 Aug 2002 - Minor format changes + * 1.7 3 Mar 2003 - Added test code for distribution + * - Added zlib-like license + * 1.8 9 Jan 2004 - Added some comments on no distance codes case + * 1.9 21 Feb 2008 - Fix bug on 16-bit integer architectures [Pohland] + * - Catch missing end-of-block symbol error + * 2.0 25 Jul 2008 - Add #define to permit distance too far back + * - Add option in TEST code for puff to write the data + * - Add option in TEST code to skip input bytes + * - Allow TEST code to read from piped stdin + * 2.1 4 Apr 2010 - Avoid variable initialization for happier compilers + * - Avoid unsigned comparisons for even happier compilers + * 2.2 25 Apr 2010 - Fix bug in variable initializations [Oberhumer] + * - Add const where appropriate [Oberhumer] + * - Split if's and ?'s for coverage testing + * - Break out test code to separate file + * - Move NIL to puff.h + * - Allow incomplete code only if single code length is 1 + * - Add full code coverage test to Makefile + * 2.3 21 Jan 2013 - Check for invalid code length codes in dynamic blocks + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "puff.h" /* prototype for puff() */ + +#define local static /* for local function definitions */ + +/* + * Maximums for allocations and loops. It is not useful to change these -- + * they are fixed by the deflate format. + */ +#define MAXBITS 15 /* maximum bits in a code */ +#define MAXLCODES 286 /* maximum number of literal/length codes */ +#define MAXDCODES 30 /* maximum number of distance codes */ +#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */ +#define FIXLCODES 288 /* number of fixed literal/length codes */ + +/* input and output state */ +struct state { + /* output state */ + unsigned char *out; /* output buffer */ + unsigned long outlen; /* available space at out */ + unsigned long outcnt; /* bytes written to out so far */ + + /* input state */ + const unsigned char *in; /* input buffer */ + unsigned long inlen; /* available input at in */ + unsigned long incnt; /* bytes read so far */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + long val; /* bit accumulator (can use up to 20 bits) */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */ + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = (int)(val >> need); + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return (int)(val & ((1L << need) - 1)); +} + +/* + * Process a stored block. + * + * Format notes: + * + * - After the two-bit stored block type (00), the stored block length and + * stored bytes are byte-aligned for fast copying. Therefore any leftover + * bits in the byte that has the last bit of the type, as many as seven, are + * discarded. The value of the discarded bits are not defined and should not + * be checked against any expectation. + * + * - The second inverted copy of the stored block length does not have to be + * checked, but it's probably a good idea to do so anyway. + * + * - A stored block can have zero length. This is sometimes used to byte-align + * subsets of the compressed data for random access or partial recovery. + */ +local int stored(struct state *s) +{ + unsigned len; /* length of stored block */ + + /* discard leftover bits from current byte (assumes s->bitcnt < 8) */ + s->bitbuf = 0; + s->bitcnt = 0; + + /* get length and check against its one's complement */ + if (s->incnt + 4 > s->inlen) + return 2; /* not enough input */ + len = s->in[s->incnt++]; + len |= s->in[s->incnt++] << 8; + if (s->in[s->incnt++] != (~len & 0xff) || + s->in[s->incnt++] != ((~len >> 8) & 0xff)) + return -2; /* didn't match complement! */ + + /* copy len bytes from in to out */ + if (s->incnt + len > s->inlen) + return 2; /* not enough input */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; /* not enough output space */ + while (len--) + s->out[s->outcnt++] = s->in[s->incnt++]; + } + else { /* just scanning */ + s->outcnt += len; + s->incnt += len; + } + + /* done with a valid stored block */ + return 0; +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -10 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. A table-based decoding + * scheme (as used in zlib) does not need to do this reversal. + * + * - The first code for the shortest length is all zeros. Subsequent codes of + * the same length are simply integer increments of the previous code. When + * moving up a length, a zero bit is appended to the code. For a complete + * code, the last code of the longest length will be all ones. + * + * - Incomplete codes are handled by this decoder, since they are permitted + * in the deflate format. See the format notes for fixed() and dynamic(). + */ +#ifdef SLOW +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + + code = first = index = 0; + for (len = 1; len <= MAXBITS; len++) { + code |= bits(s, 1); /* get next bit */ + count = h->count[len]; + if (code - count < first) /* if length len, return symbol */ + return h->symbol[index + (code - first)]; + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + } + return -10; /* ran out of codes */ +} + +/* + * A faster version of decode() for real applications of this code. It's not + * as readable, but it makes puff() twice as fast. And it only makes the code + * a few percent larger. + */ +#else /* !SLOW */ +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= bitbuf & 1; + bitbuf >>= 1; + count = *next++; + if (code - count < first) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) + break; + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + bitbuf = s->in[s->incnt++]; + if (left > 8) + left = 8; + } + return -10; /* ran out of codes */ +} +#endif /* SLOW */ + +/* + * Given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + * + * Not used by decode(), but used for error checking, h->count[0] is the number + * of the n symbols not in the code. So n - h->count[0] is the number of + * codes. This is useful for checking for incomplete codes that have more than + * one symbol, which is an error in a dynamic block. + * + * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS + * This is assured by the construction of the length arrays in dynamic() and + * fixed() and is not verified by construct(). + * + * Format notes: + * + * - Permitted and expected examples of incomplete codes are one of the fixed + * codes and any code with a single symbol which in deflate is coded as one + * bit instead of zero bits. See the format notes for fixed() and dynamic(). + * + * - Within a given code length, the symbols are kept in ascending order for + * the code bits definition. + */ +local int construct(struct huffman *h, const short *length, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) + return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode literal/length and distance codes until an end-of-block code. + * + * Format notes: + * + * - Compressed data that is after the block type if fixed or after the code + * description if dynamic is a combination of literals and length/distance + * pairs terminated by and end-of-block code. Literals are simply Huffman + * coded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - Literals, lengths, and the end-of-block code are combined into a single + * code of up to 286 symbols. They are 256 literals (0..255), 29 length + * symbols (257..285), and the end-of-block symbol (256). + * + * - There are 256 possible lengths (3..258), and so 29 symbols are not enough + * to represent all of those. Lengths 3..10 and 258 are in fact represented + * by just a length symbol. Lengths 11..257 are represented as a symbol and + * some number of extra bits that are added as an integer to the base length + * of the length symbol. The number of extra bits is determined by the base + * length symbol. These are in the static arrays below, lens[] for the base + * lengths and lext[] for the corresponding number of extra bits. + * + * - The reason that 258 gets its own symbol is that the longest length is used + * often in highly redundant files. Note that 258 can also be coded as the + * base value 227 plus the maximum extra value of 31. While a good deflate + * should never do this, it is not an error, and should be decoded properly. + * + * - If a length is decoded, including its extra bits if any, then it is + * followed a distance code. There are up to 30 distance symbols. Again + * there are many more possible distances (1..32768), so extra bits are added + * to a base value represented by the symbol. The distances 1..4 get their + * own symbol, but the rest require extra bits. The base distances and + * corresponding number of extra bits are below in the static arrays dist[] + * and dext[]. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 258 + * simply copies the last byte 258 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. You should not use memcpy() since its behavior is not + * defined for overlapped arrays. You should not use memmove() or bcopy() + * since though their behavior -is- defined for overlapping arrays, it is + * defined to do the wrong thing in this case. + */ +local int codes(struct state *s, + const struct huffman *lencode, + const struct huffman *distcode) +{ + int symbol; /* decoded symbol */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + static const short lens[29] = { /* Size base for length codes 257..285 */ + 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}; + static const short lext[29] = { /* Extra bits for length codes 257..285 */ + 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}; + static const short dists[30] = { /* Offset base for distance codes 0..29 */ + 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}; + static const short dext[30] = { /* Extra bits for distance codes 0..29 */ + 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}; + + /* decode literals and length/distance pairs */ + do { + symbol = decode(s, lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 256) { /* literal: symbol is the byte */ + /* write out the literal */ + if (s->out != NIL) { + if (s->outcnt == s->outlen) + return 1; + s->out[s->outcnt] = symbol; + } + s->outcnt++; + } + else if (symbol > 256) { /* length */ + /* get and compute length */ + symbol -= 257; + if (symbol >= 29) + return -10; /* invalid fixed code */ + len = lens[symbol] + bits(s, lext[symbol]); + + /* get and check distance */ + symbol = decode(s, distcode); + if (symbol < 0) + return symbol; /* invalid symbol */ + dist = dists[symbol] + bits(s, dext[symbol]); +#ifndef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (dist > s->outcnt) + return -11; /* distance too far back */ +#endif + + /* copy length bytes from distance bytes back */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; + while (len--) { + s->out[s->outcnt] = +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + dist > s->outcnt ? + 0 : +#endif + s->out[s->outcnt - dist]; + s->outcnt++; + } + } + else + s->outcnt += len; + } + } while (symbol != 256); /* end of block symbol */ + + /* done with a valid fixed or dynamic block */ + return 0; +} + +/* + * Process a fixed codes block. + * + * Format notes: + * + * - This block type can be useful for compressing small amounts of data for + * which the size of the code descriptions in a dynamic block exceeds the + * benefit of custom codes for that block. For fixed codes, no bits are + * spent on code descriptions. Instead the code lengths for literal/length + * codes and distance codes are fixed. The specific lengths for each symbol + * can be seen in the "for" loops below. + * + * - The literal/length code is complete, but has two symbols that are invalid + * and should result in an error if received. This cannot be implemented + * simply as an incomplete code since those two symbols are in the "middle" + * of the code. They are eight bits long and the longest literal/length\ + * code is nine bits. Therefore the code must be constructed with those + * symbols, and the invalid symbols must be detected after decoding. + * + * - The fixed distance codes also have two invalid symbols that should result + * in an error if received. Since all of the distance codes are the same + * length, this can be implemented as an incomplete code. Then the invalid + * codes are detected while decoding. + */ +local int fixed(struct state *s) +{ + static int virgin = 1; + static short lencnt[MAXBITS+1], lensym[FIXLCODES]; + static short distcnt[MAXBITS+1], distsym[MAXDCODES]; + static struct huffman lencode, distcode; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + int symbol; + short lengths[FIXLCODES]; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* literal/length table */ + for (symbol = 0; symbol < 144; symbol++) + lengths[symbol] = 8; + for (; symbol < 256; symbol++) + lengths[symbol] = 9; + for (; symbol < 280; symbol++) + lengths[symbol] = 7; + for (; symbol < FIXLCODES; symbol++) + lengths[symbol] = 8; + construct(&lencode, lengths, FIXLCODES); + + /* distance table */ + for (symbol = 0; symbol < MAXDCODES; symbol++) + lengths[symbol] = 5; + construct(&distcode, lengths, MAXDCODES); + + /* do this just once */ + virgin = 0; + } + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Process a dynamic codes block. + * + * Format notes: + * + * - A dynamic block starts with a description of the literal/length and + * distance codes for that block. New dynamic blocks allow the compressor to + * rapidly adapt to changing data with new codes optimized for that data. + * + * - The codes used by the deflate format are "canonical", which means that + * the actual bits of the codes are generated in an unambiguous way simply + * from the number of bits in each code. Therefore the code descriptions + * are simply a list of code lengths for each symbol. + * + * - The code lengths are stored in order for the symbols, so lengths are + * provided for each of the literal/length symbols, and for each of the + * distance symbols. + * + * - If a symbol is not used in the block, this is represented by a zero as + * as the code length. This does not mean a zero-length code, but rather + * that no code should be created for this symbol. There is no way in the + * deflate format to represent a zero-length code. + * + * - The maximum number of bits in a code is 15, so the possible lengths for + * any code are 1..15. + * + * - The fact that a length of zero is not permitted for a code has an + * interesting consequence. Normally if only one symbol is used for a given + * code, then in fact that code could be represented with zero bits. However + * in deflate, that code has to be at least one bit. So for example, if + * only a single distance base symbol appears in a block, then it will be + * represented by a single code of length one, in particular one 0 bit. This + * is an incomplete code, since if a 1 bit is received, it has no meaning, + * and should result in an error. So incomplete distance codes of one symbol + * should be permitted, and the receipt of invalid codes should be handled. + * + * - It is also possible to have a single literal/length code, but that code + * must be the end-of-block code, since every dynamic block has one. This + * is not the most efficient way to create an empty block (an empty fixed + * block is fewer bits), but it is allowed by the format. So incomplete + * literal/length codes of one symbol should also be permitted. + * + * - If there are only literal codes and no lengths, then there are no distance + * codes. This is represented by one distance code with zero bits. + * + * - The list of up to 286 length/literal lengths and up to 30 distance lengths + * are themselves compressed using Huffman codes and run-length encoding. In + * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means + * that length, and the symbols 16, 17, and 18 are run-length instructions. + * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 + * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols + * are common, hence the special coding for zero lengths. + * + * - The symbols for 0..18 are Huffman coded, and so that code must be + * described first. This is simply a sequence of up to 19 three-bit values + * representing no code (0) or the code length for that symbol (1..7). + * + * - A dynamic block starts with three fixed-size counts from which is computed + * the number of literal/length code lengths, the number of distance code + * lengths, and the number of code length code lengths (ok, you come up with + * a better name!) in the code descriptions. For the literal/length and + * distance codes, lengths after those provided are considered zero, i.e. no + * code. The code length code lengths are received in a permuted order (see + * the order[] array below) to make a short code length code length list more + * likely. As it turns out, very short and very long codes are less likely + * to be seen in a dynamic code description, hence what may appear initially + * to be a peculiar ordering. + * + * - Given the number of literal/length code lengths (nlen) and distance code + * lengths (ndist), then they are treated as one long list of nlen + ndist + * code lengths. Therefore run-length coding can and often does cross the + * boundary between the two sets of lengths. + * + * - So to summarize, the code description at the start of a dynamic block is + * three counts for the number of code lengths for the literal/length codes, + * the distance codes, and the code length codes. This is followed by the + * code length code lengths, three bits each. This is used to construct the + * code length code which is used to read the remainder of the lengths. Then + * the literal/length code lengths and distance lengths are read as a single + * set of lengths using the code length codes. Codes are constructed from + * the resulting two sets of lengths, and then finally you can start + * decoding actual compressed data in the block. + * + * - For reference, a "typical" size for the code description in a dynamic + * block is around 80 bytes. + */ +local int dynamic(struct state *s) +{ + int nlen, ndist, ncode; /* number of lengths in descriptor */ + int index; /* index of lengths[] */ + int err; /* construct() return value */ + short lengths[MAXCODES]; /* descriptor code lengths */ + short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */ + short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */ + struct huffman lencode, distcode; /* length and distance codes */ + static const short order[19] = /* permutation of code length codes */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* get number of lengths in each table, check lengths */ + nlen = bits(s, 5) + 257; + ndist = bits(s, 5) + 1; + ncode = bits(s, 4) + 4; + if (nlen > MAXLCODES || ndist > MAXDCODES) + return -3; /* bad counts */ + + /* read code length code lengths (really), missing lengths are zero */ + for (index = 0; index < ncode; index++) + lengths[order[index]] = bits(s, 3); + for (; index < 19; index++) + lengths[order[index]] = 0; + + /* build huffman table for code lengths codes (use lencode temporarily) */ + err = construct(&lencode, lengths, 19); + if (err != 0) /* require complete code set here */ + return -4; + + /* read length/literal and distance code length tables */ + index = 0; + while (index < nlen + ndist) { + int symbol; /* decoded value */ + int len; /* last length to repeat */ + + symbol = decode(s, &lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 16) /* length in 0..15 */ + lengths[index++] = symbol; + else { /* repeat instruction */ + len = 0; /* assume repeating zeros */ + if (symbol == 16) { /* repeat last length 3..6 times */ + if (index == 0) + return -5; /* no last length! */ + len = lengths[index - 1]; /* last length */ + symbol = 3 + bits(s, 2); + } + else if (symbol == 17) /* repeat zero 3..10 times */ + symbol = 3 + bits(s, 3); + else /* == 18, repeat zero 11..138 times */ + symbol = 11 + bits(s, 7); + if (index + symbol > nlen + ndist) + return -6; /* too many lengths! */ + while (symbol--) /* repeat last or zero symbol times */ + lengths[index++] = len; + } + } + + /* check for end-of-block code -- there better be one! */ + if (lengths[256] == 0) + return -9; + + /* build huffman table for literal/length codes */ + err = construct(&lencode, lengths, nlen); + if (err && (err < 0 || nlen != lencode.count[0] + lencode.count[1])) + return -7; /* incomplete code ok only for single length 1 code */ + + /* build huffman table for distance codes */ + err = construct(&distcode, lengths + nlen, ndist); + if (err && (err < 0 || ndist != distcode.count[0] + distcode.count[1])) + return -8; /* incomplete code ok only for single length 1 code */ + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Inflate source to dest. On return, destlen and sourcelen are updated to the + * size of the uncompressed data and the size of the deflate data respectively. + * On success, the return value of puff() is zero. If there is an error in the + * source data, i.e. it is not in the deflate format, then a negative value is + * returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. In that case, destlen and + * sourcelen are not updated to facilitate retrying from the beginning with the + * provision of more input data or more output space. In the case of invalid + * inflate data (a negative error), the dest and source pointers are updated to + * facilitate the debugging of deflators. + * + * puff() also has a mode to determine the size of the uncompressed output with + * no output written. For this dest must be (unsigned char *)0. In this case, + * the input value of *destlen is ignored, and on return *destlen is set to the + * size of the uncompressed output. + * + * The return codes are: + * + * 2: available inflate data did not terminate + * 1: output space exhausted before completing inflate + * 0: successful inflate + * -1: invalid block type (type == 3) + * -2: stored block length did not match one's complement + * -3: dynamic block code description: too many length or distance codes + * -4: dynamic block code description: code lengths codes incomplete + * -5: dynamic block code description: repeat lengths with no first length + * -6: dynamic block code description: repeat more than specified lengths + * -7: dynamic block code description: invalid literal/length code lengths + * -8: dynamic block code description: invalid distance code lengths + * -9: dynamic block code description: missing end-of-block code + * -10: invalid literal/length or distance code in fixed or dynamic block + * -11: distance is too far back in fixed or dynamic block + * + * Format notes: + * + * - Three bits are read for each block to determine the kind of block and + * whether or not it is the last block. Then the block is decoded and the + * process repeated if it was not the last block. + * + * - The leftover bits in the last byte of the deflate data after the last + * block (if it was a fixed or dynamic block) are undefined and have no + * expected values to check. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen) /* amount of input available */ +{ + struct state s; /* input/output state */ + int last, type; /* block information */ + int err; /* return value */ + + /* initialize output state */ + s.out = dest; + s.outlen = *destlen; /* ignored if dest is NIL */ + s.outcnt = 0; + + /* initialize input state */ + s.in = source; + s.inlen = *sourcelen; + s.incnt = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp() */ + err = 2; /* then skip do-loop, return error */ + else { + /* process blocks until last block or error */ + do { + last = bits(&s, 1); /* one if last block */ + type = bits(&s, 2); /* block type 0..3 */ + err = type == 0 ? + stored(&s) : + (type == 1 ? + fixed(&s) : + (type == 2 ? + dynamic(&s) : + -1)); /* type == 3, invalid */ + if (err != 0) + break; /* return with error */ + } while (!last); + } + + /* update the lengths and return */ + if (err <= 0) { + *destlen = s.outcnt; + *sourcelen = s.incnt; + } + return err; +} diff --git a/contrib/zlib/contrib/puff/puff.h b/contrib/zlib/contrib/puff/puff.h new file mode 100644 index 000000000..e23a24543 --- /dev/null +++ b/contrib/zlib/contrib/puff/puff.h @@ -0,0 +1,35 @@ +/* puff.h + Copyright (C) 2002-2013 Mark Adler, all rights reserved + version 2.3, 21 Jan 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author 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. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * See puff.c for purpose and usage. + */ +#ifndef NIL +# define NIL ((unsigned char *)0) /* for no output option */ +#endif + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ diff --git a/contrib/zlib/contrib/puff/pufftest.c b/contrib/zlib/contrib/puff/pufftest.c new file mode 100644 index 000000000..776481488 --- /dev/null +++ b/contrib/zlib/contrib/puff/pufftest.c @@ -0,0 +1,165 @@ +/* + * pufftest.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + */ + +/* Example of how to use puff(). + + Usage: puff [-w] [-f] [-nnn] file + ... | puff [-w] [-f] [-nnn] + + where file is the input file with deflate data, nnn is the number of bytes + of input to skip before inflating (e.g. to skip a zlib or gzip header), and + -w is used to write the decompressed data to stdout. -f is for coverage + testing, and causes pufftest to fail with not enough output space (-f does + a write like -w, so -w is not required). */ + +#include +#include +#include "puff.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define local static + +/* Return size times approximately the cube root of 2, keeping the result as 1, + 3, or 5 times a power of 2 -- the result is always > size, until the result + is the maximum value of an unsigned long, where it remains. This is useful + to keep reallocations less than ~33% over the actual data. */ +local size_t bythirds(size_t size) +{ + int n; + size_t m; + + m = size; + for (n = 0; m; n++) + m >>= 1; + if (n < 3) + return size + 1; + n -= 3; + m = size >> n; + m += m == 6 ? 2 : 1; + m <<= n; + return m > size ? m : (size_t)(-1); +} + +/* Read the input file *name, or stdin if name is NULL, into allocated memory. + Reallocate to larger buffers until the entire file is read in. Return a + pointer to the allocated data, or NULL if there was a memory allocation + failure. *len is the number of bytes of data read from the input file (even + if load() returns NULL). If the input file was empty or could not be opened + or read, *len is zero. */ +local void *load(const char *name, size_t *len) +{ + size_t size; + void *buf, *swap; + FILE *in; + + *len = 0; + buf = malloc(size = 4096); + if (buf == NULL) + return NULL; + in = name == NULL ? stdin : fopen(name, "rb"); + if (in != NULL) { + for (;;) { + *len += fread((char *)buf + *len, 1, size - *len, in); + if (*len < size) break; + size = bythirds(size); + if (size == *len || (swap = realloc(buf, size)) == NULL) { + free(buf); + buf = NULL; + break; + } + buf = swap; + } + fclose(in); + } + return buf; +} + +int main(int argc, char **argv) +{ + int ret, put = 0, fail = 0; + unsigned skip = 0; + char *arg, *name = NULL; + unsigned char *source = NULL, *dest; + size_t len = 0; + unsigned long sourcelen, destlen; + + /* process arguments */ + while (arg = *++argv, --argc) + if (arg[0] == '-') { + if (arg[1] == 'w' && arg[2] == 0) + put = 1; + else if (arg[1] == 'f' && arg[2] == 0) + fail = 1, put = 1; + else if (arg[1] >= '0' && arg[1] <= '9') + skip = (unsigned)atoi(arg + 1); + else { + fprintf(stderr, "invalid option %s\n", arg); + return 3; + } + } + else if (name != NULL) { + fprintf(stderr, "only one file name allowed\n"); + return 3; + } + else + name = arg; + source = load(name, &len); + if (source == NULL) { + fprintf(stderr, "memory allocation failure\n"); + return 4; + } + if (len == 0) { + fprintf(stderr, "could not read %s, or it was empty\n", + name == NULL ? "" : name); + free(source); + return 3; + } + if (skip >= len) { + fprintf(stderr, "skip request of %d leaves no input\n", skip); + free(source); + return 3; + } + + /* test inflate data with offset skip */ + len -= skip; + sourcelen = (unsigned long)len; + ret = puff(NIL, &destlen, source + skip, &sourcelen); + if (ret) + fprintf(stderr, "puff() failed with return code %d\n", ret); + else { + fprintf(stderr, "puff() succeeded uncompressing %lu bytes\n", destlen); + if (sourcelen < len) fprintf(stderr, "%lu compressed bytes unused\n", + len - sourcelen); + } + + /* if requested, inflate again and write decompressd data to stdout */ + if (put && ret == 0) { + if (fail) + destlen >>= 1; + dest = malloc(destlen); + if (dest == NULL) { + fprintf(stderr, "memory allocation failure\n"); + free(source); + return 4; + } + puff(dest, &destlen, source + skip, &sourcelen); + SET_BINARY_MODE(stdout); + fwrite(dest, 1, destlen, stdout); + free(dest); + } + + /* clean up */ + free(source); + return ret; +} diff --git a/contrib/zlib/contrib/puff/zeros.raw b/contrib/zlib/contrib/puff/zeros.raw new file mode 100644 index 0000000000000000000000000000000000000000..0a90e76b300205a44a0ecbf613e64aaaef2e51e7 GIT binary patch literal 2517 zcmYdFkYHV$AkxzmXu#!mP=i#?5{3o^3jqcYc(h*%Opg+yAut*OqaiT#LSPd+y9&tF zP5<`ixi4UXdB8xJfs^6ee;AkH?VUytyFsD;HLIJ(gg5bUnNh}Q2#kinXb22!2pr%5 E0JRq+;s5{u literal 0 HcmV?d00001 diff --git a/contrib/zlib/contrib/testzlib/testzlib.c b/contrib/zlib/contrib/testzlib/testzlib.c new file mode 100644 index 000000000..8626c92ad --- /dev/null +++ b/contrib/zlib/contrib/testzlib/testzlib.c @@ -0,0 +1,275 @@ +#include +#include +#include + +#include "zlib.h" + + +void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) +{ + R->HighPart = A.HighPart - B.HighPart; + if (A.LowPart >= B.LowPart) + R->LowPart = A.LowPart - B.LowPart; + else + { + R->LowPart = A.LowPart - B.LowPart; + R->HighPart --; + } +} + +#ifdef _M_X64 +// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc +unsigned __int64 __rdtsc(void); +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + // printf("rdtsc = %I64x\n",__rdtsc()); + pbeginTime64->QuadPart=__rdtsc(); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres; + unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); + LIres.QuadPart=res; + // printf("rdtsc = %I64x\n",__rdtsc()); + return LIres; +} +#else +#ifdef _M_IX86 +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ + DWORD dwEdx,dwEax; + _asm + { + rdtsc + mov dwEax,eax + mov dwEdx,edx + } + pbeginTime64->LowPart=dwEax; + pbeginTime64->HighPart=dwEdx; +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + myGetRDTSC32(pbeginTime64); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres,endTime64; + myGetRDTSC32(&endTime64); + + LIres.LowPart=LIres.HighPart=0; + MyDoMinus64(&LIres,endTime64,beginTime64); + return LIres; +} +#else +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER lr; + lr.QuadPart=0; + return lr; +} +#endif +#endif + +void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) +{ + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) + { + pbeginTime64->LowPart = GetTickCount(); + pbeginTime64->HighPart = 0; + } +} + +DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER endTime64,ticksPerSecond,ticks; + DWORDLONG ticksShifted,tickSecShifted; + DWORD dwLog=16+0; + DWORD dwRet; + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) + dwRet = (GetTickCount() - beginTime64.LowPart)*1; + else + { + MyDoMinus64(&ticks,endTime64,beginTime64); + QueryPerformanceFrequency(&ticksPerSecond); + + + { + ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); + tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); + + } + + dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); + dwRet *=1; + } + return dwRet; +} + +int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) +{ + FILE* stream; + unsigned char* ptr; + int retVal=1; + stream=fopen(filename, "rb"); + if (stream==NULL) + return 0; + + fseek(stream,0,SEEK_END); + + *plFileSize=ftell(stream); + fseek(stream,0,SEEK_SET); + ptr=malloc((*plFileSize)+1); + if (ptr==NULL) + retVal=0; + else + { + if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) + retVal=0; + } + fclose(stream); + *pFilePtr=ptr; + return retVal; +} + +int main(int argc, char *argv[]) +{ + int BlockSizeCompress=0x8000; + int BlockSizeUncompress=0x8000; + int cprLevel=Z_DEFAULT_COMPRESSION ; + long lFileSize; + unsigned char* FilePtr; + long lBufferSizeCpr; + long lBufferSizeUncpr; + long lCompressedSize=0; + unsigned char* CprPtr; + unsigned char* UncprPtr; + long lSizeCpr,lSizeUncpr; + DWORD dwGetTick,dwMsecQP; + LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; + + if (argc<=1) + { + printf("run TestZlib [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); + return 0; + } + + if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) + { + printf("error reading %s\n",argv[1]); + return 1; + } + else printf("file %s read, %u bytes\n",argv[1],lFileSize); + + if (argc>=3) + BlockSizeCompress=atol(argv[2]); + + if (argc>=4) + BlockSizeUncompress=atol(argv[3]); + + if (argc>=5) + cprLevel=(int)atol(argv[4]); + + lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; + lBufferSizeUncpr = lBufferSizeCpr; + + CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lFileSize; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + deflateInit(&zcpr,cprLevel); + + zcpr.next_in = FilePtr; + zcpr.next_out = CprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); + zcpr.avail_out = BlockSizeCompress; + ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeCpr=zcpr.total_out; + deflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total compress size = %u, in %u step\n",lSizeCpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); + UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lSizeCpr; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + inflateInit(&zcpr); + + zcpr.next_in = CprPtr; + zcpr.next_out = UncprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); + zcpr.avail_out = BlockSizeUncompress; + ret=inflate(&zcpr,Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeUncpr=zcpr.total_out; + inflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + if (lSizeUncpr==lFileSize) + { + if (memcmp(FilePtr,UncprPtr,lFileSize)==0) + printf("compare ok\n"); + + } + + return 0; +} diff --git a/contrib/zlib/contrib/testzlib/testzlib.txt b/contrib/zlib/contrib/testzlib/testzlib.txt new file mode 100644 index 000000000..e508bb22f --- /dev/null +++ b/contrib/zlib/contrib/testzlib/testzlib.txt @@ -0,0 +1,10 @@ +To build testzLib with Visual Studio 2005: + +copy to a directory file from : +- root of zLib tree +- contrib/testzlib +- contrib/masmx86 +- contrib/masmx64 +- contrib/vstudio/vc7 + +and open testzlib8.sln \ No newline at end of file diff --git a/contrib/zlib/contrib/untgz/Makefile.msc b/contrib/zlib/contrib/untgz/Makefile.msc new file mode 100644 index 000000000..77b860221 --- /dev/null +++ b/contrib/zlib/contrib/untgz/Makefile.msc @@ -0,0 +1,17 @@ +CC=cl +CFLAGS=-MD + +untgz.exe: untgz.obj ..\..\zlib.lib + $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib + +untgz.obj: untgz.c ..\..\zlib.h + $(CC) $(CFLAGS) -c -I..\.. untgz.c + +..\..\zlib.lib: + cd ..\.. + $(MAKE) -f win32\makefile.msc + cd contrib\untgz + +clean: + -del untgz.obj + -del untgz.exe diff --git a/contrib/zlib/contrib/untgz/untgz.c b/contrib/zlib/contrib/untgz/untgz.c new file mode 100644 index 000000000..2c391e598 --- /dev/null +++ b/contrib/zlib/contrib/untgz/untgz.c @@ -0,0 +1,674 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +#include +#include +#include +#include +#include + +#include "zlib.h" + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + +int tar (gzFile in,int action,int arg,int argc,char **argv) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + case DIRTYPE: + if (action == TGZ_LIST) + printf(" %s %s\n",strtime(&tartime),fname); + if (action == TGZ_EXTRACT) + { + makedir(fname); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (matchname(arg,argc,argv,fname)) + { + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory */ + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname); + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + +int main(int argc,char **argv) +{ + int action = TGZ_EXTRACT; + int arg = 1; + char *TGZfile; + gzFile *f; + + prog = strrchr(argv[0],'\\'); + if (prog == NULL) + { + prog = strrchr(argv[0],'/'); + if (prog == NULL) + { + prog = strrchr(argv[0],':'); + if (prog == NULL) + prog = argv[0]; + else + prog++; + } + else + prog++; + } + else + prog++; + + if (argc == 1) + help(0); + + if (strcmp(argv[arg],"-l") == 0) + { + action = TGZ_LIST; + if (argc == ++arg) + help(0); + } + else if (strcmp(argv[arg],"-h") == 0) + { + help(0); + } + + if ((TGZfile = TGZfname(argv[arg])) == NULL) + TGZnotfound(argv[arg]); + + ++arg; + if ((action == TGZ_LIST) && (arg != argc)) + help(1); + +/* + * Process the TGZ file + */ + switch(action) + { + case TGZ_LIST: + case TGZ_EXTRACT: + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + exit(tar(f, action, arg, argc, argv)); + break; + + default: + error("Unknown option"); + exit(1); + } + + return 0; +} diff --git a/contrib/zlib/contrib/vstudio/readme.txt b/contrib/zlib/contrib/vstudio/readme.txt new file mode 100644 index 000000000..48cccc0d2 --- /dev/null +++ b/contrib/zlib/contrib/vstudio/readme.txt @@ -0,0 +1,78 @@ +Building instructions for the DLL versions of Zlib 1.2.11 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 9.0/10.0. + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + + + + + +Build instructions for Visual Studio 2008 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Compile assembly code (with Visual Studio Command Prompt) by running: + bld_ml64.bat (in contrib\masmx64) + bld_ml32.bat (in contrib\masmx86) +- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 +- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" + +Build instructions for Visual Studio 2010 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010 + +Build instructions for Visual Studio 2012 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012 + +Build instructions for Visual Studio 2013 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013 + +Build instructions for Visual Studio 2015 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015 + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com + +Visual Studio 2013 and 2015 Projects from Sean Hunt +seandhunt_7@yahoo.com diff --git a/contrib/zlib/contrib/vstudio/vc10/zlib.rc b/contrib/zlib/contrib/vstudio/vc10/zlib.rc new file mode 100644 index 000000000..c4e4b016e --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc10/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/contrib/zlib/contrib/vstudio/vc10/zlibvc.def b/contrib/zlib/contrib/vstudio/vc10/zlibvc.def new file mode 100644 index 000000000..f876c3bca --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc10/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/contrib/zlib/contrib/vstudio/vc11/zlib.rc b/contrib/zlib/contrib/vstudio/vc11/zlib.rc new file mode 100644 index 000000000..c4e4b016e --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc11/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/contrib/zlib/contrib/vstudio/vc11/zlibvc.def b/contrib/zlib/contrib/vstudio/vc11/zlibvc.def new file mode 100644 index 000000000..f876c3bca --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc11/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/contrib/zlib/contrib/vstudio/vc12/zlib.rc b/contrib/zlib/contrib/vstudio/vc12/zlib.rc new file mode 100644 index 000000000..c4e4b016e --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc12/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/contrib/zlib/contrib/vstudio/vc12/zlibvc.def b/contrib/zlib/contrib/vstudio/vc12/zlibvc.def new file mode 100644 index 000000000..f876c3bca --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc12/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/contrib/zlib/contrib/vstudio/vc14/zlib.rc b/contrib/zlib/contrib/vstudio/vc14/zlib.rc new file mode 100644 index 000000000..c4e4b016e --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc14/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/contrib/zlib/contrib/vstudio/vc14/zlibvc.def b/contrib/zlib/contrib/vstudio/vc14/zlibvc.def new file mode 100644 index 000000000..f876c3bca --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc14/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/contrib/zlib/contrib/vstudio/vc9/zlib.rc b/contrib/zlib/contrib/vstudio/vc9/zlib.rc new file mode 100644 index 000000000..c4e4b016e --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc9/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/contrib/zlib/contrib/vstudio/vc9/zlibvc.def b/contrib/zlib/contrib/vstudio/vc9/zlibvc.def new file mode 100644 index 000000000..f876c3bca --- /dev/null +++ b/contrib/zlib/contrib/vstudio/vc9/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 From 35f2d8c9073cc4a5c148bee429349ad205431dbe Mon Sep 17 00:00:00 2001 From: Tommy Date: Thu, 1 Feb 2018 18:11:14 +0100 Subject: [PATCH 064/106] Fix Matrix4x4t Decompose to rotation vector. The calculation of the rotation matrix was for left-handed coordinates with row-vectors, but assimp uses right-handed coordinates and column-vectors. --- include/assimp/matrix4x4.inl | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/include/assimp/matrix4x4.inl b/include/assimp/matrix4x4.inl index 67edd6c14..6f96d5a6b 100644 --- a/include/assimp/matrix4x4.inl +++ b/include/assimp/matrix4x4.inl @@ -424,12 +424,18 @@ inline void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector { ASSIMP_MATRIX4_4_DECOMPOSE_PART; - /* - | CE -CF D 0 | - M = | BDE+AF -BDF+AE -BC 0 | - | -ADE+BF -ADF+BE AC 0 | - | 0 0 0 1 | + /* + assuming a right-handed coordinate system + and post-multiplication of column vectors, + the rotation matrix for an euler XYZ rotation is M = Rz * Ry * Rx. + combining gives: + + | CE BDE-AF ADE+BF 0 | + M = | CF BDF+AE ADF-BE 0 | + | -D CB AC 0 | + | 0 0 0 1 | + where A = cos(angle_x), B = sin(angle_x); C = cos(angle_y), D = sin(angle_y); E = cos(angle_z), F = sin(angle_z); @@ -438,20 +444,20 @@ inline void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector // Use a small epsilon to solve floating-point inaccuracies const TReal epsilon = 10e-3f; - pRotation.y = std::asin(vCols[2].x);// D. Angle around oY. + pRotation.y = std::asin(-vCols[0].z);// D. Angle around oY. TReal C = std::cos(pRotation.y); if(std::fabs(C) > epsilon) { // Finding angle around oX. - TReal tan_x = vCols[2].z / C;// A - TReal tan_y = -vCols[2].y / C;// B + TReal tan_x = vCols[2].z / C;// A + TReal tan_y = vCols[1].z / C;// B pRotation.x = std::atan2(tan_y, tan_x); // Finding angle around oZ. - tan_x = vCols[0].x / C;// E - tan_y = -vCols[1].x / C;// F + tan_x = vCols[0].x / C;// E + tan_y = vCols[0].y / C;// F pRotation.z = std::atan2(tan_y, tan_x); } else @@ -459,8 +465,8 @@ inline void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector pRotation.x = 0;// Set angle around oX to 0. => A == 1, B == 0, C == 0, D == 1. // And finding angle around oZ. - TReal tan_x = vCols[1].y;// -BDF+AE => E - TReal tan_y = vCols[0].y;// BDE+AF => F + TReal tan_x = vCols[1].y;// BDF+AE => E + TReal tan_y = -vCols[1].x;// BDE-AF => F pRotation.z = std::atan2(tan_y, tan_x); } From 84957faa163ede7ab6da24f1b2a2a7d360c4351c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 2 Feb 2018 19:50:34 +0100 Subject: [PATCH 065/106] closes https://github.com/assimp/assimp/issues/1758: fix compiler warning. --- test/unit/utRemoveComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utRemoveComponent.cpp b/test/unit/utRemoveComponent.cpp index 31e47b77c..4556e201e 100644 --- a/test/unit/utRemoveComponent.cpp +++ b/test/unit/utRemoveComponent.cpp @@ -110,7 +110,7 @@ void RemoveVCProcessTest::SetUp() char check[sizeof(aiMaterial) == sizeof(aiMaterial) ? 10 : -1]; check[0] = 0; // to remove compiler warning - EXPECT_TRUE( check ); + EXPECT_EQ( 0, check[0] ); } // ------------------------------------------------------------------------------------------------ From d47f34344e0c7b213a00e8d6359eb3fa2daf2030 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 3 Feb 2018 08:46:03 +0100 Subject: [PATCH 066/106] closes https://github.com/assimp/assimp/issues/1752: move guard over include statement. --- code/Importer/IFC/IFCReaderGen_4.cpp | 5 +- code/Importer/IFC/IFCReaderGen_4.h | 1147 +++++++++++++------------- 2 files changed, 578 insertions(+), 574 deletions(-) diff --git a/code/Importer/IFC/IFCReaderGen_4.cpp b/code/Importer/IFC/IFCReaderGen_4.cpp index eb6182674..7a312e691 100644 --- a/code/Importer/IFC/IFCReaderGen_4.cpp +++ b/code/Importer/IFC/IFCReaderGen_4.cpp @@ -40,13 +40,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** MACHINE-GENERATED by scripts/ICFImporter/CppGenerator.py */ -#include "AssimpPCH.h" #ifndef ASSIMP_BUILD_NO_IFC_IMPORTER -#include "IFCReaderGen.h" +#include "AssimpPCH.h" +#include "IFCReaderGen4.h" namespace Assimp { using namespace IFC; +using namespace ::Assimp::IFC::Schema_4; namespace { diff --git a/code/Importer/IFC/IFCReaderGen_4.h b/code/Importer/IFC/IFCReaderGen_4.h index 6c0b5a283..ccfcb6ea0 100644 --- a/code/Importer/IFC/IFCReaderGen_4.h +++ b/code/Importer/IFC/IFCReaderGen_4.h @@ -47,6 +47,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { namespace IFC { +namespace Schema_4 { + using namespace STEP; using namespace STEP::EXPRESS; @@ -4866,583 +4868,584 @@ namespace IFC { } //! IFC namespace STEP { - // ****************************************************************************** - // Converter stubs - // ****************************************************************************** - + // ****************************************************************************** + // Converter stubs + // ****************************************************************************** + #define DECL_CONV_STUB(type) template <> size_t GenericFill(const STEP::DB& db, const EXPRESS::LIST& params, IFC::type* in) - - DECL_CONV_STUB(IfcRoot); - DECL_CONV_STUB(IfcObjectDefinition); - DECL_CONV_STUB(IfcObject); - DECL_CONV_STUB(IfcControl); - DECL_CONV_STUB(IfcActionRequest); - DECL_CONV_STUB(IfcActor); - DECL_CONV_STUB(IfcProduct); - DECL_CONV_STUB(IfcElement); - DECL_CONV_STUB(IfcDistributionElement); - DECL_CONV_STUB(IfcDistributionControlElement); - DECL_CONV_STUB(IfcActuator); - DECL_CONV_STUB(IfcTypeObject); - DECL_CONV_STUB(IfcTypeProduct); - DECL_CONV_STUB(IfcElementType); - DECL_CONV_STUB(IfcDistributionElementType); - DECL_CONV_STUB(IfcDistributionControlElementType); - DECL_CONV_STUB(IfcActuatorType); - DECL_CONV_STUB(IfcRepresentationItem); - DECL_CONV_STUB(IfcGeometricRepresentationItem); - DECL_CONV_STUB(IfcSolidModel); - DECL_CONV_STUB(IfcManifoldSolidBrep); - DECL_CONV_STUB(IfcAdvancedBrep); - DECL_CONV_STUB(IfcAdvancedBrepWithVoids); - DECL_CONV_STUB(IfcTopologicalRepresentationItem); - DECL_CONV_STUB(IfcFace); - DECL_CONV_STUB(IfcFaceSurface); - DECL_CONV_STUB(IfcAdvancedFace); - DECL_CONV_STUB(IfcDistributionFlowElement); - DECL_CONV_STUB(IfcFlowTerminal); - DECL_CONV_STUB(IfcAirTerminal); - DECL_CONV_STUB(IfcFlowController); - DECL_CONV_STUB(IfcAirTerminalBox); - DECL_CONV_STUB(IfcDistributionFlowElementType); - DECL_CONV_STUB(IfcFlowControllerType); - DECL_CONV_STUB(IfcAirTerminalBoxType); - DECL_CONV_STUB(IfcFlowTerminalType); - DECL_CONV_STUB(IfcAirTerminalType); - DECL_CONV_STUB(IfcEnergyConversionDevice); - DECL_CONV_STUB(IfcAirToAirHeatRecovery); - DECL_CONV_STUB(IfcEnergyConversionDeviceType); - DECL_CONV_STUB(IfcAirToAirHeatRecoveryType); - DECL_CONV_STUB(IfcAlarm); - DECL_CONV_STUB(IfcAlarmType); - DECL_CONV_STUB(IfcAnnotation); - DECL_CONV_STUB(IfcAnnotationFillArea); - DECL_CONV_STUB(IfcProfileDef); - DECL_CONV_STUB(IfcArbitraryClosedProfileDef); - DECL_CONV_STUB(IfcArbitraryOpenProfileDef); - DECL_CONV_STUB(IfcArbitraryProfileDefWithVoids); - DECL_CONV_STUB(IfcGroup); - DECL_CONV_STUB(IfcAsset); - DECL_CONV_STUB(IfcParameterizedProfileDef); - DECL_CONV_STUB(IfcAsymmetricIShapeProfileDef); - DECL_CONV_STUB(IfcAudioVisualAppliance); - DECL_CONV_STUB(IfcAudioVisualApplianceType); - DECL_CONV_STUB(IfcPlacement); - DECL_CONV_STUB(IfcAxis1Placement); - DECL_CONV_STUB(IfcAxis2Placement2D); - DECL_CONV_STUB(IfcAxis2Placement3D); - DECL_CONV_STUB(IfcCurve); - DECL_CONV_STUB(IfcBoundedCurve); - DECL_CONV_STUB(IfcBSplineCurve); - DECL_CONV_STUB(IfcBSplineCurveWithKnots); - DECL_CONV_STUB(IfcSurface); - DECL_CONV_STUB(IfcBoundedSurface); - DECL_CONV_STUB(IfcBSplineSurface); - DECL_CONV_STUB(IfcBSplineSurfaceWithKnots); - DECL_CONV_STUB(IfcBuildingElement); - DECL_CONV_STUB(IfcBeam); - DECL_CONV_STUB(IfcBeamStandardCase); - DECL_CONV_STUB(IfcBuildingElementType); - DECL_CONV_STUB(IfcBeamType); - DECL_CONV_STUB(IfcPresentationItem); - DECL_CONV_STUB(IfcCsgPrimitive3D); - DECL_CONV_STUB(IfcBlock); - DECL_CONV_STUB(IfcBoiler); - DECL_CONV_STUB(IfcBoilerType); - DECL_CONV_STUB(IfcBooleanResult); - DECL_CONV_STUB(IfcBooleanClippingResult); - DECL_CONV_STUB(IfcCompositeCurve); - DECL_CONV_STUB(IfcCompositeCurveOnSurface); - DECL_CONV_STUB(IfcBoundaryCurve); - DECL_CONV_STUB(IfcBoundingBox); - DECL_CONV_STUB(IfcHalfSpaceSolid); - DECL_CONV_STUB(IfcBoxedHalfSpace); - DECL_CONV_STUB(IfcSpatialElement); - DECL_CONV_STUB(IfcSpatialStructureElement); - DECL_CONV_STUB(IfcBuilding); - DECL_CONV_STUB(IfcElementComponent); - DECL_CONV_STUB(IfcBuildingElementPart); - DECL_CONV_STUB(IfcElementComponentType); - DECL_CONV_STUB(IfcBuildingElementPartType); - DECL_CONV_STUB(IfcBuildingElementProxy); - DECL_CONV_STUB(IfcBuildingElementProxyType); - DECL_CONV_STUB(IfcBuildingStorey); - DECL_CONV_STUB(IfcSystem); - DECL_CONV_STUB(IfcBuildingSystem); - DECL_CONV_STUB(IfcBurner); - DECL_CONV_STUB(IfcBurnerType); - DECL_CONV_STUB(IfcCShapeProfileDef); - DECL_CONV_STUB(IfcFlowFitting); - DECL_CONV_STUB(IfcCableCarrierFitting); - DECL_CONV_STUB(IfcFlowFittingType); - DECL_CONV_STUB(IfcCableCarrierFittingType); - DECL_CONV_STUB(IfcFlowSegment); - DECL_CONV_STUB(IfcCableCarrierSegment); - DECL_CONV_STUB(IfcFlowSegmentType); - DECL_CONV_STUB(IfcCableCarrierSegmentType); - DECL_CONV_STUB(IfcCableFitting); - DECL_CONV_STUB(IfcCableFittingType); - DECL_CONV_STUB(IfcCableSegment); - DECL_CONV_STUB(IfcCableSegmentType); - DECL_CONV_STUB(IfcPoint); - DECL_CONV_STUB(IfcCartesianPoint); - DECL_CONV_STUB(IfcCartesianPointList); - DECL_CONV_STUB(IfcCartesianPointList2D); - DECL_CONV_STUB(IfcCartesianPointList3D); - DECL_CONV_STUB(IfcCartesianTransformationOperator); - DECL_CONV_STUB(IfcCartesianTransformationOperator2D); - DECL_CONV_STUB(IfcCartesianTransformationOperator2DnonUniform); - DECL_CONV_STUB(IfcCartesianTransformationOperator3D); - DECL_CONV_STUB(IfcCartesianTransformationOperator3DnonUniform); - DECL_CONV_STUB(IfcCenterLineProfileDef); - DECL_CONV_STUB(IfcChiller); - DECL_CONV_STUB(IfcChillerType); - DECL_CONV_STUB(IfcChimney); - DECL_CONV_STUB(IfcChimneyType); - DECL_CONV_STUB(IfcConic); - DECL_CONV_STUB(IfcCircle); - DECL_CONV_STUB(IfcCircleProfileDef); - DECL_CONV_STUB(IfcCircleHollowProfileDef); - DECL_CONV_STUB(IfcCivilElement); - DECL_CONV_STUB(IfcCivilElementType); - DECL_CONV_STUB(IfcConnectedFaceSet); - DECL_CONV_STUB(IfcClosedShell); - DECL_CONV_STUB(IfcCoil); - DECL_CONV_STUB(IfcCoilType); - DECL_CONV_STUB(IfcColourSpecification); - DECL_CONV_STUB(IfcColourRgb); - DECL_CONV_STUB(IfcColumn); - DECL_CONV_STUB(IfcColumnStandardCase); - DECL_CONV_STUB(IfcColumnType); - DECL_CONV_STUB(IfcCommunicationsAppliance); - DECL_CONV_STUB(IfcCommunicationsApplianceType); - DECL_CONV_STUB(IfcPropertyAbstraction); - DECL_CONV_STUB(IfcProperty); - DECL_CONV_STUB(IfcComplexProperty); - DECL_CONV_STUB(IfcPropertyDefinition); - DECL_CONV_STUB(IfcCompositeCurveSegment); - DECL_CONV_STUB(IfcCompositeProfileDef); - DECL_CONV_STUB(IfcFlowMovingDevice); - DECL_CONV_STUB(IfcCompressor); - DECL_CONV_STUB(IfcFlowMovingDeviceType); - DECL_CONV_STUB(IfcCompressorType); - DECL_CONV_STUB(IfcCondenser); - DECL_CONV_STUB(IfcCondenserType); - DECL_CONV_STUB(IfcResource); - DECL_CONV_STUB(IfcConstructionResource); - DECL_CONV_STUB(IfcConstructionEquipmentResource); - DECL_CONV_STUB(IfcTypeResource); - DECL_CONV_STUB(IfcConstructionResourceType); - DECL_CONV_STUB(IfcConstructionEquipmentResourceType); - DECL_CONV_STUB(IfcConstructionMaterialResource); - DECL_CONV_STUB(IfcConstructionMaterialResourceType); - DECL_CONV_STUB(IfcConstructionProductResource); - DECL_CONV_STUB(IfcConstructionProductResourceType); - DECL_CONV_STUB(IfcContext); - DECL_CONV_STUB(IfcNamedUnit); - DECL_CONV_STUB(IfcContextDependentUnit); - DECL_CONV_STUB(IfcController); - DECL_CONV_STUB(IfcControllerType); - DECL_CONV_STUB(IfcConversionBasedUnit); - DECL_CONV_STUB(IfcConversionBasedUnitWithOffset); - DECL_CONV_STUB(IfcCooledBeam); - DECL_CONV_STUB(IfcCooledBeamType); - DECL_CONV_STUB(IfcCoolingTower); - DECL_CONV_STUB(IfcCoolingTowerType); - DECL_CONV_STUB(IfcCostItem); - DECL_CONV_STUB(IfcCostSchedule); - DECL_CONV_STUB(IfcCovering); - DECL_CONV_STUB(IfcCoveringType); - DECL_CONV_STUB(IfcCrewResource); - DECL_CONV_STUB(IfcCrewResourceType); - DECL_CONV_STUB(IfcCsgSolid); - DECL_CONV_STUB(IfcCurtainWall); - DECL_CONV_STUB(IfcCurtainWallType); - DECL_CONV_STUB(IfcCurveBoundedPlane); - DECL_CONV_STUB(IfcCurveBoundedSurface); - DECL_CONV_STUB(IfcPresentationStyle); - DECL_CONV_STUB(IfcElementarySurface); - DECL_CONV_STUB(IfcCylindricalSurface); - DECL_CONV_STUB(IfcDamper); - DECL_CONV_STUB(IfcDamperType); - DECL_CONV_STUB(IfcDerivedProfileDef); - DECL_CONV_STUB(IfcDirection); - DECL_CONV_STUB(IfcDiscreteAccessory); - DECL_CONV_STUB(IfcDiscreteAccessoryType); - DECL_CONV_STUB(IfcDistributionChamberElement); - DECL_CONV_STUB(IfcDistributionChamberElementType); - DECL_CONV_STUB(IfcDistributionSystem); - DECL_CONV_STUB(IfcDistributionCircuit); - DECL_CONV_STUB(IfcPort); - DECL_CONV_STUB(IfcDistributionPort); - DECL_CONV_STUB(IfcDoor); - DECL_CONV_STUB(IfcPropertySetDefinition); - DECL_CONV_STUB(IfcDoorStandardCase); - DECL_CONV_STUB(IfcDoorStyle); - DECL_CONV_STUB(IfcDoorType); - DECL_CONV_STUB(IfcDuctFitting); - DECL_CONV_STUB(IfcDuctFittingType); - DECL_CONV_STUB(IfcDuctSegment); - DECL_CONV_STUB(IfcDuctSegmentType); - DECL_CONV_STUB(IfcFlowTreatmentDevice); - DECL_CONV_STUB(IfcDuctSilencer); - DECL_CONV_STUB(IfcFlowTreatmentDeviceType); - DECL_CONV_STUB(IfcDuctSilencerType); - DECL_CONV_STUB(IfcEdge); - DECL_CONV_STUB(IfcEdgeCurve); - DECL_CONV_STUB(IfcLoop); - DECL_CONV_STUB(IfcEdgeLoop); - DECL_CONV_STUB(IfcElectricAppliance); - DECL_CONV_STUB(IfcElectricApplianceType); - DECL_CONV_STUB(IfcElectricDistributionBoard); - DECL_CONV_STUB(IfcElectricDistributionBoardType); - DECL_CONV_STUB(IfcFlowStorageDevice); - DECL_CONV_STUB(IfcElectricFlowStorageDevice); - DECL_CONV_STUB(IfcFlowStorageDeviceType); - DECL_CONV_STUB(IfcElectricFlowStorageDeviceType); - DECL_CONV_STUB(IfcElectricGenerator); - DECL_CONV_STUB(IfcElectricGeneratorType); - DECL_CONV_STUB(IfcElectricMotor); - DECL_CONV_STUB(IfcElectricMotorType); - DECL_CONV_STUB(IfcElectricTimeControl); - DECL_CONV_STUB(IfcElectricTimeControlType); - DECL_CONV_STUB(IfcElementAssembly); - DECL_CONV_STUB(IfcElementAssemblyType); - DECL_CONV_STUB(IfcQuantitySet); - DECL_CONV_STUB(IfcElementQuantity); - DECL_CONV_STUB(IfcEllipse); - DECL_CONV_STUB(IfcEllipseProfileDef); - DECL_CONV_STUB(IfcEngine); - DECL_CONV_STUB(IfcEngineType); - DECL_CONV_STUB(IfcEvaporativeCooler); - DECL_CONV_STUB(IfcEvaporativeCoolerType); - DECL_CONV_STUB(IfcEvaporator); - DECL_CONV_STUB(IfcEvaporatorType); - DECL_CONV_STUB(IfcProcess); - DECL_CONV_STUB(IfcEvent); - DECL_CONV_STUB(IfcTypeProcess); - DECL_CONV_STUB(IfcEventType); - DECL_CONV_STUB(IfcExternalSpatialStructureElement); - DECL_CONV_STUB(IfcExternalSpatialElement); - DECL_CONV_STUB(IfcSweptAreaSolid); - DECL_CONV_STUB(IfcExtrudedAreaSolid); - DECL_CONV_STUB(IfcExtrudedAreaSolidTapered); - DECL_CONV_STUB(IfcFaceBasedSurfaceModel); - DECL_CONV_STUB(IfcFaceBound); - DECL_CONV_STUB(IfcFaceOuterBound); - DECL_CONV_STUB(IfcFacetedBrep); - DECL_CONV_STUB(IfcFacetedBrepWithVoids); - DECL_CONV_STUB(IfcFan); - DECL_CONV_STUB(IfcFanType); - DECL_CONV_STUB(IfcFastener); - DECL_CONV_STUB(IfcFastenerType); - DECL_CONV_STUB(IfcFeatureElement); - DECL_CONV_STUB(IfcFeatureElementAddition); - DECL_CONV_STUB(IfcFeatureElementSubtraction); - DECL_CONV_STUB(IfcFillAreaStyleHatching); - DECL_CONV_STUB(IfcFillAreaStyleTiles); - DECL_CONV_STUB(IfcFilter); - DECL_CONV_STUB(IfcFilterType); - DECL_CONV_STUB(IfcFireSuppressionTerminal); - DECL_CONV_STUB(IfcFireSuppressionTerminalType); - DECL_CONV_STUB(IfcFixedReferenceSweptAreaSolid); - DECL_CONV_STUB(IfcFlowInstrument); - DECL_CONV_STUB(IfcFlowInstrumentType); - DECL_CONV_STUB(IfcFlowMeter); - DECL_CONV_STUB(IfcFlowMeterType); - DECL_CONV_STUB(IfcFooting); - DECL_CONV_STUB(IfcFootingType); - DECL_CONV_STUB(IfcFurnishingElement); - DECL_CONV_STUB(IfcFurnishingElementType); - DECL_CONV_STUB(IfcFurniture); - DECL_CONV_STUB(IfcFurnitureType); - DECL_CONV_STUB(IfcGeographicElement); - DECL_CONV_STUB(IfcGeographicElementType); - DECL_CONV_STUB(IfcGeometricSet); - DECL_CONV_STUB(IfcGeometricCurveSet); - DECL_CONV_STUB(IfcRepresentationContext); - DECL_CONV_STUB(IfcGeometricRepresentationContext); - DECL_CONV_STUB(IfcGeometricRepresentationSubContext); - DECL_CONV_STUB(IfcGrid); - DECL_CONV_STUB(IfcObjectPlacement); - DECL_CONV_STUB(IfcGridPlacement); - DECL_CONV_STUB(IfcHeatExchanger); - DECL_CONV_STUB(IfcHeatExchangerType); - DECL_CONV_STUB(IfcHumidifier); - DECL_CONV_STUB(IfcHumidifierType); - DECL_CONV_STUB(IfcIShapeProfileDef); - DECL_CONV_STUB(IfcIndexedPolyCurve); - DECL_CONV_STUB(IfcTessellatedItem); - DECL_CONV_STUB(IfcIndexedPolygonalFace); - DECL_CONV_STUB(IfcIndexedPolygonalFaceWithVoids); - DECL_CONV_STUB(IfcInterceptor); - DECL_CONV_STUB(IfcInterceptorType); - DECL_CONV_STUB(IfcSurfaceCurve); - DECL_CONV_STUB(IfcIntersectionCurve); - DECL_CONV_STUB(IfcInventory); - DECL_CONV_STUB(IfcJunctionBox); - DECL_CONV_STUB(IfcJunctionBoxType); - DECL_CONV_STUB(IfcLShapeProfileDef); - DECL_CONV_STUB(IfcLaborResource); - DECL_CONV_STUB(IfcLaborResourceType); - DECL_CONV_STUB(IfcLamp); - DECL_CONV_STUB(IfcLampType); - DECL_CONV_STUB(IfcLightFixture); - DECL_CONV_STUB(IfcLightFixtureType); - DECL_CONV_STUB(IfcLightSource); - DECL_CONV_STUB(IfcLightSourceAmbient); - DECL_CONV_STUB(IfcLightSourceDirectional); - DECL_CONV_STUB(IfcLightSourceGoniometric); - DECL_CONV_STUB(IfcLightSourcePositional); - DECL_CONV_STUB(IfcLightSourceSpot); - DECL_CONV_STUB(IfcLine); - DECL_CONV_STUB(IfcLocalPlacement); - DECL_CONV_STUB(IfcMappedItem); - DECL_CONV_STUB(IfcProductRepresentation); - DECL_CONV_STUB(IfcMaterialDefinitionRepresentation); - DECL_CONV_STUB(IfcMeasureWithUnit); - DECL_CONV_STUB(IfcMechanicalFastener); - DECL_CONV_STUB(IfcMechanicalFastenerType); - DECL_CONV_STUB(IfcMedicalDevice); - DECL_CONV_STUB(IfcMedicalDeviceType); - DECL_CONV_STUB(IfcMember); - DECL_CONV_STUB(IfcMemberStandardCase); - DECL_CONV_STUB(IfcMemberType); - DECL_CONV_STUB(IfcMirroredProfileDef); - DECL_CONV_STUB(IfcMotorConnection); - DECL_CONV_STUB(IfcMotorConnectionType); - DECL_CONV_STUB(IfcOccupant); - DECL_CONV_STUB(IfcOffsetCurve2D); - DECL_CONV_STUB(IfcOffsetCurve3D); - DECL_CONV_STUB(IfcOpenShell); - DECL_CONV_STUB(IfcOpeningElement); - DECL_CONV_STUB(IfcOpeningStandardCase); - DECL_CONV_STUB(IfcOrientedEdge); - DECL_CONV_STUB(IfcOuterBoundaryCurve); - DECL_CONV_STUB(IfcOutlet); - DECL_CONV_STUB(IfcOutletType); - DECL_CONV_STUB(IfcPath); - DECL_CONV_STUB(IfcPcurve); - DECL_CONV_STUB(IfcPerformanceHistory); - DECL_CONV_STUB(IfcPermit); - DECL_CONV_STUB(IfcPile); - DECL_CONV_STUB(IfcPileType); - DECL_CONV_STUB(IfcPipeFitting); - DECL_CONV_STUB(IfcPipeFittingType); - DECL_CONV_STUB(IfcPipeSegment); - DECL_CONV_STUB(IfcPipeSegmentType); - DECL_CONV_STUB(IfcPlanarExtent); - DECL_CONV_STUB(IfcPlanarBox); - DECL_CONV_STUB(IfcPlane); - DECL_CONV_STUB(IfcPlate); - DECL_CONV_STUB(IfcPlateStandardCase); - DECL_CONV_STUB(IfcPlateType); - DECL_CONV_STUB(IfcPointOnCurve); - DECL_CONV_STUB(IfcPointOnSurface); - DECL_CONV_STUB(IfcPolyLoop); - DECL_CONV_STUB(IfcPolygonalBoundedHalfSpace); - DECL_CONV_STUB(IfcTessellatedFaceSet); - DECL_CONV_STUB(IfcPolygonalFaceSet); - DECL_CONV_STUB(IfcPolyline); - DECL_CONV_STUB(IfcPresentationStyleAssignment); - DECL_CONV_STUB(IfcProcedure); - DECL_CONV_STUB(IfcProcedureType); - DECL_CONV_STUB(IfcProductDefinitionShape); - DECL_CONV_STUB(IfcProject); - DECL_CONV_STUB(IfcProjectLibrary); - DECL_CONV_STUB(IfcProjectOrder); - DECL_CONV_STUB(IfcProjectionElement); - DECL_CONV_STUB(IfcSimpleProperty); - DECL_CONV_STUB(IfcPropertyBoundedValue); - DECL_CONV_STUB(IfcPropertyEnumeratedValue); - DECL_CONV_STUB(IfcPropertyListValue); - DECL_CONV_STUB(IfcPropertyReferenceValue); - DECL_CONV_STUB(IfcPropertySet); - DECL_CONV_STUB(IfcPropertySingleValue); - DECL_CONV_STUB(IfcPropertyTableValue); - DECL_CONV_STUB(IfcProtectiveDevice); - DECL_CONV_STUB(IfcProtectiveDeviceTrippingUnit); - DECL_CONV_STUB(IfcProtectiveDeviceTrippingUnitType); - DECL_CONV_STUB(IfcProtectiveDeviceType); - DECL_CONV_STUB(IfcProxy); - DECL_CONV_STUB(IfcPump); - DECL_CONV_STUB(IfcPumpType); - DECL_CONV_STUB(IfcRailing); - DECL_CONV_STUB(IfcRailingType); - DECL_CONV_STUB(IfcRamp); - DECL_CONV_STUB(IfcRampFlight); - DECL_CONV_STUB(IfcRampFlightType); - DECL_CONV_STUB(IfcRampType); - DECL_CONV_STUB(IfcRationalBSplineCurveWithKnots); - DECL_CONV_STUB(IfcRationalBSplineSurfaceWithKnots); - DECL_CONV_STUB(IfcRectangleProfileDef); - DECL_CONV_STUB(IfcRectangleHollowProfileDef); - DECL_CONV_STUB(IfcRectangularPyramid); - DECL_CONV_STUB(IfcRectangularTrimmedSurface); - DECL_CONV_STUB(IfcReinforcingElement); - DECL_CONV_STUB(IfcReinforcingBar); - DECL_CONV_STUB(IfcReinforcingElementType); - DECL_CONV_STUB(IfcReinforcingBarType); - DECL_CONV_STUB(IfcReinforcingMesh); - DECL_CONV_STUB(IfcReinforcingMeshType); - DECL_CONV_STUB(IfcRelationship); - DECL_CONV_STUB(IfcRelDecomposes); - DECL_CONV_STUB(IfcRelAggregates); - DECL_CONV_STUB(IfcRelConnects); - DECL_CONV_STUB(IfcRelContainedInSpatialStructure); - DECL_CONV_STUB(IfcRelDefines); - DECL_CONV_STUB(IfcRelDefinesByProperties); - DECL_CONV_STUB(IfcRelFillsElement); - DECL_CONV_STUB(IfcRelVoidsElement); - DECL_CONV_STUB(IfcReparametrisedCompositeCurveSegment); - DECL_CONV_STUB(IfcRepresentation); - DECL_CONV_STUB(IfcRepresentationMap); - DECL_CONV_STUB(IfcRevolvedAreaSolid); - DECL_CONV_STUB(IfcRevolvedAreaSolidTapered); - DECL_CONV_STUB(IfcRightCircularCone); - DECL_CONV_STUB(IfcRightCircularCylinder); - DECL_CONV_STUB(IfcRoof); - DECL_CONV_STUB(IfcRoofType); - DECL_CONV_STUB(IfcRoundedRectangleProfileDef); - DECL_CONV_STUB(IfcSIUnit); - DECL_CONV_STUB(IfcSanitaryTerminal); - DECL_CONV_STUB(IfcSanitaryTerminalType); - DECL_CONV_STUB(IfcSeamCurve); - DECL_CONV_STUB(IfcSectionedSpine); - DECL_CONV_STUB(IfcSensor); - DECL_CONV_STUB(IfcSensorType); - DECL_CONV_STUB(IfcShadingDevice); - DECL_CONV_STUB(IfcShadingDeviceType); - DECL_CONV_STUB(IfcShapeModel); - DECL_CONV_STUB(IfcShapeRepresentation); - DECL_CONV_STUB(IfcShellBasedSurfaceModel); - DECL_CONV_STUB(IfcSite); - DECL_CONV_STUB(IfcSlab); - DECL_CONV_STUB(IfcSlabElementedCase); - DECL_CONV_STUB(IfcSlabStandardCase); - DECL_CONV_STUB(IfcSlabType); - DECL_CONV_STUB(IfcSolarDevice); - DECL_CONV_STUB(IfcSolarDeviceType); - DECL_CONV_STUB(IfcSpace); - DECL_CONV_STUB(IfcSpaceHeater); - DECL_CONV_STUB(IfcSpaceHeaterType); - DECL_CONV_STUB(IfcSpatialElementType); - DECL_CONV_STUB(IfcSpatialStructureElementType); - DECL_CONV_STUB(IfcSpaceType); - DECL_CONV_STUB(IfcSpatialZone); - DECL_CONV_STUB(IfcSpatialZoneType); - DECL_CONV_STUB(IfcSphere); - DECL_CONV_STUB(IfcSphericalSurface); - DECL_CONV_STUB(IfcStackTerminal); - DECL_CONV_STUB(IfcStackTerminalType); - DECL_CONV_STUB(IfcStair); - DECL_CONV_STUB(IfcStairFlight); - DECL_CONV_STUB(IfcStairFlightType); - DECL_CONV_STUB(IfcStairType); - DECL_CONV_STUB(IfcStructuralActivity); - DECL_CONV_STUB(IfcStructuralAction); - DECL_CONV_STUB(IfcStructuralAnalysisModel); - DECL_CONV_STUB(IfcStructuralItem); - DECL_CONV_STUB(IfcStructuralConnection); - DECL_CONV_STUB(IfcStructuralCurveAction); - DECL_CONV_STUB(IfcStructuralCurveConnection); - DECL_CONV_STUB(IfcStructuralMember); - DECL_CONV_STUB(IfcStructuralCurveMember); - DECL_CONV_STUB(IfcStructuralCurveMemberVarying); - DECL_CONV_STUB(IfcStructuralReaction); - DECL_CONV_STUB(IfcStructuralCurveReaction); - DECL_CONV_STUB(IfcStructuralLinearAction); - DECL_CONV_STUB(IfcStructuralLoadGroup); - DECL_CONV_STUB(IfcStructuralLoadCase); - DECL_CONV_STUB(IfcStructuralSurfaceAction); - DECL_CONV_STUB(IfcStructuralPlanarAction); - DECL_CONV_STUB(IfcStructuralPointAction); - DECL_CONV_STUB(IfcStructuralPointConnection); - DECL_CONV_STUB(IfcStructuralPointReaction); - DECL_CONV_STUB(IfcStructuralResultGroup); - DECL_CONV_STUB(IfcStructuralSurfaceConnection); - DECL_CONV_STUB(IfcStructuralSurfaceMember); - DECL_CONV_STUB(IfcStructuralSurfaceMemberVarying); - DECL_CONV_STUB(IfcStructuralSurfaceReaction); - DECL_CONV_STUB(IfcStyleModel); - DECL_CONV_STUB(IfcStyledItem); - DECL_CONV_STUB(IfcStyledRepresentation); - DECL_CONV_STUB(IfcSubContractResource); - DECL_CONV_STUB(IfcSubContractResourceType); - DECL_CONV_STUB(IfcSubedge); - DECL_CONV_STUB(IfcSurfaceCurveSweptAreaSolid); - DECL_CONV_STUB(IfcSurfaceFeature); - DECL_CONV_STUB(IfcSweptSurface); - DECL_CONV_STUB(IfcSurfaceOfLinearExtrusion); - DECL_CONV_STUB(IfcSurfaceOfRevolution); - DECL_CONV_STUB(IfcSurfaceStyle); - DECL_CONV_STUB(IfcSurfaceStyleShading); - DECL_CONV_STUB(IfcSurfaceStyleRendering); - DECL_CONV_STUB(IfcSurfaceStyleWithTextures); - DECL_CONV_STUB(IfcSweptDiskSolid); - DECL_CONV_STUB(IfcSweptDiskSolidPolygonal); - DECL_CONV_STUB(IfcSwitchingDevice); - DECL_CONV_STUB(IfcSwitchingDeviceType); - DECL_CONV_STUB(IfcSystemFurnitureElement); - DECL_CONV_STUB(IfcSystemFurnitureElementType); - DECL_CONV_STUB(IfcTShapeProfileDef); - DECL_CONV_STUB(IfcTank); - DECL_CONV_STUB(IfcTankType); - DECL_CONV_STUB(IfcTask); - DECL_CONV_STUB(IfcTaskType); - DECL_CONV_STUB(IfcTendon); - DECL_CONV_STUB(IfcTendonAnchor); - DECL_CONV_STUB(IfcTendonAnchorType); - DECL_CONV_STUB(IfcTendonType); - DECL_CONV_STUB(IfcTextLiteral); - DECL_CONV_STUB(IfcTextLiteralWithExtent); - DECL_CONV_STUB(IfcTopologyRepresentation); - DECL_CONV_STUB(IfcToroidalSurface); - DECL_CONV_STUB(IfcTransformer); - DECL_CONV_STUB(IfcTransformerType); - DECL_CONV_STUB(IfcTransportElement); - DECL_CONV_STUB(IfcTransportElementType); - DECL_CONV_STUB(IfcTrapeziumProfileDef); - DECL_CONV_STUB(IfcTriangulatedFaceSet); - DECL_CONV_STUB(IfcTrimmedCurve); - DECL_CONV_STUB(IfcTubeBundle); - DECL_CONV_STUB(IfcTubeBundleType); - DECL_CONV_STUB(IfcUShapeProfileDef); - DECL_CONV_STUB(IfcUnitAssignment); - DECL_CONV_STUB(IfcUnitaryControlElement); - DECL_CONV_STUB(IfcUnitaryControlElementType); - DECL_CONV_STUB(IfcUnitaryEquipment); - DECL_CONV_STUB(IfcUnitaryEquipmentType); - DECL_CONV_STUB(IfcValve); - DECL_CONV_STUB(IfcValveType); - DECL_CONV_STUB(IfcVector); - DECL_CONV_STUB(IfcVertex); - DECL_CONV_STUB(IfcVertexLoop); - DECL_CONV_STUB(IfcVertexPoint); - DECL_CONV_STUB(IfcVibrationIsolator); - DECL_CONV_STUB(IfcVibrationIsolatorType); - DECL_CONV_STUB(IfcVirtualElement); - DECL_CONV_STUB(IfcVoidingFeature); - DECL_CONV_STUB(IfcWall); - DECL_CONV_STUB(IfcWallElementedCase); - DECL_CONV_STUB(IfcWallStandardCase); - DECL_CONV_STUB(IfcWallType); - DECL_CONV_STUB(IfcWasteTerminal); - DECL_CONV_STUB(IfcWasteTerminalType); - DECL_CONV_STUB(IfcWindow); - DECL_CONV_STUB(IfcWindowStandardCase); - DECL_CONV_STUB(IfcWindowStyle); - DECL_CONV_STUB(IfcWindowType); - DECL_CONV_STUB(IfcWorkCalendar); - DECL_CONV_STUB(IfcWorkControl); - DECL_CONV_STUB(IfcWorkPlan); - DECL_CONV_STUB(IfcWorkSchedule); - DECL_CONV_STUB(IfcZShapeProfileDef); - DECL_CONV_STUB(IfcZone); + + DECL_CONV_STUB( IfcRoot ); + DECL_CONV_STUB( IfcObjectDefinition ); + DECL_CONV_STUB( IfcObject ); + DECL_CONV_STUB( IfcControl ); + DECL_CONV_STUB( IfcActionRequest ); + DECL_CONV_STUB( IfcActor ); + DECL_CONV_STUB( IfcProduct ); + DECL_CONV_STUB( IfcElement ); + DECL_CONV_STUB( IfcDistributionElement ); + DECL_CONV_STUB( IfcDistributionControlElement ); + DECL_CONV_STUB( IfcActuator ); + DECL_CONV_STUB( IfcTypeObject ); + DECL_CONV_STUB( IfcTypeProduct ); + DECL_CONV_STUB( IfcElementType ); + DECL_CONV_STUB( IfcDistributionElementType ); + DECL_CONV_STUB( IfcDistributionControlElementType ); + DECL_CONV_STUB( IfcActuatorType ); + DECL_CONV_STUB( IfcRepresentationItem ); + DECL_CONV_STUB( IfcGeometricRepresentationItem ); + DECL_CONV_STUB( IfcSolidModel ); + DECL_CONV_STUB( IfcManifoldSolidBrep ); + DECL_CONV_STUB( IfcAdvancedBrep ); + DECL_CONV_STUB( IfcAdvancedBrepWithVoids ); + DECL_CONV_STUB( IfcTopologicalRepresentationItem ); + DECL_CONV_STUB( IfcFace ); + DECL_CONV_STUB( IfcFaceSurface ); + DECL_CONV_STUB( IfcAdvancedFace ); + DECL_CONV_STUB( IfcDistributionFlowElement ); + DECL_CONV_STUB( IfcFlowTerminal ); + DECL_CONV_STUB( IfcAirTerminal ); + DECL_CONV_STUB( IfcFlowController ); + DECL_CONV_STUB( IfcAirTerminalBox ); + DECL_CONV_STUB( IfcDistributionFlowElementType ); + DECL_CONV_STUB( IfcFlowControllerType ); + DECL_CONV_STUB( IfcAirTerminalBoxType ); + DECL_CONV_STUB( IfcFlowTerminalType ); + DECL_CONV_STUB( IfcAirTerminalType ); + DECL_CONV_STUB( IfcEnergyConversionDevice ); + DECL_CONV_STUB( IfcAirToAirHeatRecovery ); + DECL_CONV_STUB( IfcEnergyConversionDeviceType ); + DECL_CONV_STUB( IfcAirToAirHeatRecoveryType ); + DECL_CONV_STUB( IfcAlarm ); + DECL_CONV_STUB( IfcAlarmType ); + DECL_CONV_STUB( IfcAnnotation ); + DECL_CONV_STUB( IfcAnnotationFillArea ); + DECL_CONV_STUB( IfcProfileDef ); + DECL_CONV_STUB( IfcArbitraryClosedProfileDef ); + DECL_CONV_STUB( IfcArbitraryOpenProfileDef ); + DECL_CONV_STUB( IfcArbitraryProfileDefWithVoids ); + DECL_CONV_STUB( IfcGroup ); + DECL_CONV_STUB( IfcAsset ); + DECL_CONV_STUB( IfcParameterizedProfileDef ); + DECL_CONV_STUB( IfcAsymmetricIShapeProfileDef ); + DECL_CONV_STUB( IfcAudioVisualAppliance ); + DECL_CONV_STUB( IfcAudioVisualApplianceType ); + DECL_CONV_STUB( IfcPlacement ); + DECL_CONV_STUB( IfcAxis1Placement ); + DECL_CONV_STUB( IfcAxis2Placement2D ); + DECL_CONV_STUB( IfcAxis2Placement3D ); + DECL_CONV_STUB( IfcCurve ); + DECL_CONV_STUB( IfcBoundedCurve ); + DECL_CONV_STUB( IfcBSplineCurve ); + DECL_CONV_STUB( IfcBSplineCurveWithKnots ); + DECL_CONV_STUB( IfcSurface ); + DECL_CONV_STUB( IfcBoundedSurface ); + DECL_CONV_STUB( IfcBSplineSurface ); + DECL_CONV_STUB( IfcBSplineSurfaceWithKnots ); + DECL_CONV_STUB( IfcBuildingElement ); + DECL_CONV_STUB( IfcBeam ); + DECL_CONV_STUB( IfcBeamStandardCase ); + DECL_CONV_STUB( IfcBuildingElementType ); + DECL_CONV_STUB( IfcBeamType ); + DECL_CONV_STUB( IfcPresentationItem ); + DECL_CONV_STUB( IfcCsgPrimitive3D ); + DECL_CONV_STUB( IfcBlock ); + DECL_CONV_STUB( IfcBoiler ); + DECL_CONV_STUB( IfcBoilerType ); + DECL_CONV_STUB( IfcBooleanResult ); + DECL_CONV_STUB( IfcBooleanClippingResult ); + DECL_CONV_STUB( IfcCompositeCurve ); + DECL_CONV_STUB( IfcCompositeCurveOnSurface ); + DECL_CONV_STUB( IfcBoundaryCurve ); + DECL_CONV_STUB( IfcBoundingBox ); + DECL_CONV_STUB( IfcHalfSpaceSolid ); + DECL_CONV_STUB( IfcBoxedHalfSpace ); + DECL_CONV_STUB( IfcSpatialElement ); + DECL_CONV_STUB( IfcSpatialStructureElement ); + DECL_CONV_STUB( IfcBuilding ); + DECL_CONV_STUB( IfcElementComponent ); + DECL_CONV_STUB( IfcBuildingElementPart ); + DECL_CONV_STUB( IfcElementComponentType ); + DECL_CONV_STUB( IfcBuildingElementPartType ); + DECL_CONV_STUB( IfcBuildingElementProxy ); + DECL_CONV_STUB( IfcBuildingElementProxyType ); + DECL_CONV_STUB( IfcBuildingStorey ); + DECL_CONV_STUB( IfcSystem ); + DECL_CONV_STUB( IfcBuildingSystem ); + DECL_CONV_STUB( IfcBurner ); + DECL_CONV_STUB( IfcBurnerType ); + DECL_CONV_STUB( IfcCShapeProfileDef ); + DECL_CONV_STUB( IfcFlowFitting ); + DECL_CONV_STUB( IfcCableCarrierFitting ); + DECL_CONV_STUB( IfcFlowFittingType ); + DECL_CONV_STUB( IfcCableCarrierFittingType ); + DECL_CONV_STUB( IfcFlowSegment ); + DECL_CONV_STUB( IfcCableCarrierSegment ); + DECL_CONV_STUB( IfcFlowSegmentType ); + DECL_CONV_STUB( IfcCableCarrierSegmentType ); + DECL_CONV_STUB( IfcCableFitting ); + DECL_CONV_STUB( IfcCableFittingType ); + DECL_CONV_STUB( IfcCableSegment ); + DECL_CONV_STUB( IfcCableSegmentType ); + DECL_CONV_STUB( IfcPoint ); + DECL_CONV_STUB( IfcCartesianPoint ); + DECL_CONV_STUB( IfcCartesianPointList ); + DECL_CONV_STUB( IfcCartesianPointList2D ); + DECL_CONV_STUB( IfcCartesianPointList3D ); + DECL_CONV_STUB( IfcCartesianTransformationOperator ); + DECL_CONV_STUB( IfcCartesianTransformationOperator2D ); + DECL_CONV_STUB( IfcCartesianTransformationOperator2DnonUniform ); + DECL_CONV_STUB( IfcCartesianTransformationOperator3D ); + DECL_CONV_STUB( IfcCartesianTransformationOperator3DnonUniform ); + DECL_CONV_STUB( IfcCenterLineProfileDef ); + DECL_CONV_STUB( IfcChiller ); + DECL_CONV_STUB( IfcChillerType ); + DECL_CONV_STUB( IfcChimney ); + DECL_CONV_STUB( IfcChimneyType ); + DECL_CONV_STUB( IfcConic ); + DECL_CONV_STUB( IfcCircle ); + DECL_CONV_STUB( IfcCircleProfileDef ); + DECL_CONV_STUB( IfcCircleHollowProfileDef ); + DECL_CONV_STUB( IfcCivilElement ); + DECL_CONV_STUB( IfcCivilElementType ); + DECL_CONV_STUB( IfcConnectedFaceSet ); + DECL_CONV_STUB( IfcClosedShell ); + DECL_CONV_STUB( IfcCoil ); + DECL_CONV_STUB( IfcCoilType ); + DECL_CONV_STUB( IfcColourSpecification ); + DECL_CONV_STUB( IfcColourRgb ); + DECL_CONV_STUB( IfcColumn ); + DECL_CONV_STUB( IfcColumnStandardCase ); + DECL_CONV_STUB( IfcColumnType ); + DECL_CONV_STUB( IfcCommunicationsAppliance ); + DECL_CONV_STUB( IfcCommunicationsApplianceType ); + DECL_CONV_STUB( IfcPropertyAbstraction ); + DECL_CONV_STUB( IfcProperty ); + DECL_CONV_STUB( IfcComplexProperty ); + DECL_CONV_STUB( IfcPropertyDefinition ); + DECL_CONV_STUB( IfcCompositeCurveSegment ); + DECL_CONV_STUB( IfcCompositeProfileDef ); + DECL_CONV_STUB( IfcFlowMovingDevice ); + DECL_CONV_STUB( IfcCompressor ); + DECL_CONV_STUB( IfcFlowMovingDeviceType ); + DECL_CONV_STUB( IfcCompressorType ); + DECL_CONV_STUB( IfcCondenser ); + DECL_CONV_STUB( IfcCondenserType ); + DECL_CONV_STUB( IfcResource ); + DECL_CONV_STUB( IfcConstructionResource ); + DECL_CONV_STUB( IfcConstructionEquipmentResource ); + DECL_CONV_STUB( IfcTypeResource ); + DECL_CONV_STUB( IfcConstructionResourceType ); + DECL_CONV_STUB( IfcConstructionEquipmentResourceType ); + DECL_CONV_STUB( IfcConstructionMaterialResource ); + DECL_CONV_STUB( IfcConstructionMaterialResourceType ); + DECL_CONV_STUB( IfcConstructionProductResource ); + DECL_CONV_STUB( IfcConstructionProductResourceType ); + DECL_CONV_STUB( IfcContext ); + DECL_CONV_STUB( IfcNamedUnit ); + DECL_CONV_STUB( IfcContextDependentUnit ); + DECL_CONV_STUB( IfcController ); + DECL_CONV_STUB( IfcControllerType ); + DECL_CONV_STUB( IfcConversionBasedUnit ); + DECL_CONV_STUB( IfcConversionBasedUnitWithOffset ); + DECL_CONV_STUB( IfcCooledBeam ); + DECL_CONV_STUB( IfcCooledBeamType ); + DECL_CONV_STUB( IfcCoolingTower ); + DECL_CONV_STUB( IfcCoolingTowerType ); + DECL_CONV_STUB( IfcCostItem ); + DECL_CONV_STUB( IfcCostSchedule ); + DECL_CONV_STUB( IfcCovering ); + DECL_CONV_STUB( IfcCoveringType ); + DECL_CONV_STUB( IfcCrewResource ); + DECL_CONV_STUB( IfcCrewResourceType ); + DECL_CONV_STUB( IfcCsgSolid ); + DECL_CONV_STUB( IfcCurtainWall ); + DECL_CONV_STUB( IfcCurtainWallType ); + DECL_CONV_STUB( IfcCurveBoundedPlane ); + DECL_CONV_STUB( IfcCurveBoundedSurface ); + DECL_CONV_STUB( IfcPresentationStyle ); + DECL_CONV_STUB( IfcElementarySurface ); + DECL_CONV_STUB( IfcCylindricalSurface ); + DECL_CONV_STUB( IfcDamper ); + DECL_CONV_STUB( IfcDamperType ); + DECL_CONV_STUB( IfcDerivedProfileDef ); + DECL_CONV_STUB( IfcDirection ); + DECL_CONV_STUB( IfcDiscreteAccessory ); + DECL_CONV_STUB( IfcDiscreteAccessoryType ); + DECL_CONV_STUB( IfcDistributionChamberElement ); + DECL_CONV_STUB( IfcDistributionChamberElementType ); + DECL_CONV_STUB( IfcDistributionSystem ); + DECL_CONV_STUB( IfcDistributionCircuit ); + DECL_CONV_STUB( IfcPort ); + DECL_CONV_STUB( IfcDistributionPort ); + DECL_CONV_STUB( IfcDoor ); + DECL_CONV_STUB( IfcPropertySetDefinition ); + DECL_CONV_STUB( IfcDoorStandardCase ); + DECL_CONV_STUB( IfcDoorStyle ); + DECL_CONV_STUB( IfcDoorType ); + DECL_CONV_STUB( IfcDuctFitting ); + DECL_CONV_STUB( IfcDuctFittingType ); + DECL_CONV_STUB( IfcDuctSegment ); + DECL_CONV_STUB( IfcDuctSegmentType ); + DECL_CONV_STUB( IfcFlowTreatmentDevice ); + DECL_CONV_STUB( IfcDuctSilencer ); + DECL_CONV_STUB( IfcFlowTreatmentDeviceType ); + DECL_CONV_STUB( IfcDuctSilencerType ); + DECL_CONV_STUB( IfcEdge ); + DECL_CONV_STUB( IfcEdgeCurve ); + DECL_CONV_STUB( IfcLoop ); + DECL_CONV_STUB( IfcEdgeLoop ); + DECL_CONV_STUB( IfcElectricAppliance ); + DECL_CONV_STUB( IfcElectricApplianceType ); + DECL_CONV_STUB( IfcElectricDistributionBoard ); + DECL_CONV_STUB( IfcElectricDistributionBoardType ); + DECL_CONV_STUB( IfcFlowStorageDevice ); + DECL_CONV_STUB( IfcElectricFlowStorageDevice ); + DECL_CONV_STUB( IfcFlowStorageDeviceType ); + DECL_CONV_STUB( IfcElectricFlowStorageDeviceType ); + DECL_CONV_STUB( IfcElectricGenerator ); + DECL_CONV_STUB( IfcElectricGeneratorType ); + DECL_CONV_STUB( IfcElectricMotor ); + DECL_CONV_STUB( IfcElectricMotorType ); + DECL_CONV_STUB( IfcElectricTimeControl ); + DECL_CONV_STUB( IfcElectricTimeControlType ); + DECL_CONV_STUB( IfcElementAssembly ); + DECL_CONV_STUB( IfcElementAssemblyType ); + DECL_CONV_STUB( IfcQuantitySet ); + DECL_CONV_STUB( IfcElementQuantity ); + DECL_CONV_STUB( IfcEllipse ); + DECL_CONV_STUB( IfcEllipseProfileDef ); + DECL_CONV_STUB( IfcEngine ); + DECL_CONV_STUB( IfcEngineType ); + DECL_CONV_STUB( IfcEvaporativeCooler ); + DECL_CONV_STUB( IfcEvaporativeCoolerType ); + DECL_CONV_STUB( IfcEvaporator ); + DECL_CONV_STUB( IfcEvaporatorType ); + DECL_CONV_STUB( IfcProcess ); + DECL_CONV_STUB( IfcEvent ); + DECL_CONV_STUB( IfcTypeProcess ); + DECL_CONV_STUB( IfcEventType ); + DECL_CONV_STUB( IfcExternalSpatialStructureElement ); + DECL_CONV_STUB( IfcExternalSpatialElement ); + DECL_CONV_STUB( IfcSweptAreaSolid ); + DECL_CONV_STUB( IfcExtrudedAreaSolid ); + DECL_CONV_STUB( IfcExtrudedAreaSolidTapered ); + DECL_CONV_STUB( IfcFaceBasedSurfaceModel ); + DECL_CONV_STUB( IfcFaceBound ); + DECL_CONV_STUB( IfcFaceOuterBound ); + DECL_CONV_STUB( IfcFacetedBrep ); + DECL_CONV_STUB( IfcFacetedBrepWithVoids ); + DECL_CONV_STUB( IfcFan ); + DECL_CONV_STUB( IfcFanType ); + DECL_CONV_STUB( IfcFastener ); + DECL_CONV_STUB( IfcFastenerType ); + DECL_CONV_STUB( IfcFeatureElement ); + DECL_CONV_STUB( IfcFeatureElementAddition ); + DECL_CONV_STUB( IfcFeatureElementSubtraction ); + DECL_CONV_STUB( IfcFillAreaStyleHatching ); + DECL_CONV_STUB( IfcFillAreaStyleTiles ); + DECL_CONV_STUB( IfcFilter ); + DECL_CONV_STUB( IfcFilterType ); + DECL_CONV_STUB( IfcFireSuppressionTerminal ); + DECL_CONV_STUB( IfcFireSuppressionTerminalType ); + DECL_CONV_STUB( IfcFixedReferenceSweptAreaSolid ); + DECL_CONV_STUB( IfcFlowInstrument ); + DECL_CONV_STUB( IfcFlowInstrumentType ); + DECL_CONV_STUB( IfcFlowMeter ); + DECL_CONV_STUB( IfcFlowMeterType ); + DECL_CONV_STUB( IfcFooting ); + DECL_CONV_STUB( IfcFootingType ); + DECL_CONV_STUB( IfcFurnishingElement ); + DECL_CONV_STUB( IfcFurnishingElementType ); + DECL_CONV_STUB( IfcFurniture ); + DECL_CONV_STUB( IfcFurnitureType ); + DECL_CONV_STUB( IfcGeographicElement ); + DECL_CONV_STUB( IfcGeographicElementType ); + DECL_CONV_STUB( IfcGeometricSet ); + DECL_CONV_STUB( IfcGeometricCurveSet ); + DECL_CONV_STUB( IfcRepresentationContext ); + DECL_CONV_STUB( IfcGeometricRepresentationContext ); + DECL_CONV_STUB( IfcGeometricRepresentationSubContext ); + DECL_CONV_STUB( IfcGrid ); + DECL_CONV_STUB( IfcObjectPlacement ); + DECL_CONV_STUB( IfcGridPlacement ); + DECL_CONV_STUB( IfcHeatExchanger ); + DECL_CONV_STUB( IfcHeatExchangerType ); + DECL_CONV_STUB( IfcHumidifier ); + DECL_CONV_STUB( IfcHumidifierType ); + DECL_CONV_STUB( IfcIShapeProfileDef ); + DECL_CONV_STUB( IfcIndexedPolyCurve ); + DECL_CONV_STUB( IfcTessellatedItem ); + DECL_CONV_STUB( IfcIndexedPolygonalFace ); + DECL_CONV_STUB( IfcIndexedPolygonalFaceWithVoids ); + DECL_CONV_STUB( IfcInterceptor ); + DECL_CONV_STUB( IfcInterceptorType ); + DECL_CONV_STUB( IfcSurfaceCurve ); + DECL_CONV_STUB( IfcIntersectionCurve ); + DECL_CONV_STUB( IfcInventory ); + DECL_CONV_STUB( IfcJunctionBox ); + DECL_CONV_STUB( IfcJunctionBoxType ); + DECL_CONV_STUB( IfcLShapeProfileDef ); + DECL_CONV_STUB( IfcLaborResource ); + DECL_CONV_STUB( IfcLaborResourceType ); + DECL_CONV_STUB( IfcLamp ); + DECL_CONV_STUB( IfcLampType ); + DECL_CONV_STUB( IfcLightFixture ); + DECL_CONV_STUB( IfcLightFixtureType ); + DECL_CONV_STUB( IfcLightSource ); + DECL_CONV_STUB( IfcLightSourceAmbient ); + DECL_CONV_STUB( IfcLightSourceDirectional ); + DECL_CONV_STUB( IfcLightSourceGoniometric ); + DECL_CONV_STUB( IfcLightSourcePositional ); + DECL_CONV_STUB( IfcLightSourceSpot ); + DECL_CONV_STUB( IfcLine ); + DECL_CONV_STUB( IfcLocalPlacement ); + DECL_CONV_STUB( IfcMappedItem ); + DECL_CONV_STUB( IfcProductRepresentation ); + DECL_CONV_STUB( IfcMaterialDefinitionRepresentation ); + DECL_CONV_STUB( IfcMeasureWithUnit ); + DECL_CONV_STUB( IfcMechanicalFastener ); + DECL_CONV_STUB( IfcMechanicalFastenerType ); + DECL_CONV_STUB( IfcMedicalDevice ); + DECL_CONV_STUB( IfcMedicalDeviceType ); + DECL_CONV_STUB( IfcMember ); + DECL_CONV_STUB( IfcMemberStandardCase ); + DECL_CONV_STUB( IfcMemberType ); + DECL_CONV_STUB( IfcMirroredProfileDef ); + DECL_CONV_STUB( IfcMotorConnection ); + DECL_CONV_STUB( IfcMotorConnectionType ); + DECL_CONV_STUB( IfcOccupant ); + DECL_CONV_STUB( IfcOffsetCurve2D ); + DECL_CONV_STUB( IfcOffsetCurve3D ); + DECL_CONV_STUB( IfcOpenShell ); + DECL_CONV_STUB( IfcOpeningElement ); + DECL_CONV_STUB( IfcOpeningStandardCase ); + DECL_CONV_STUB( IfcOrientedEdge ); + DECL_CONV_STUB( IfcOuterBoundaryCurve ); + DECL_CONV_STUB( IfcOutlet ); + DECL_CONV_STUB( IfcOutletType ); + DECL_CONV_STUB( IfcPath ); + DECL_CONV_STUB( IfcPcurve ); + DECL_CONV_STUB( IfcPerformanceHistory ); + DECL_CONV_STUB( IfcPermit ); + DECL_CONV_STUB( IfcPile ); + DECL_CONV_STUB( IfcPileType ); + DECL_CONV_STUB( IfcPipeFitting ); + DECL_CONV_STUB( IfcPipeFittingType ); + DECL_CONV_STUB( IfcPipeSegment ); + DECL_CONV_STUB( IfcPipeSegmentType ); + DECL_CONV_STUB( IfcPlanarExtent ); + DECL_CONV_STUB( IfcPlanarBox ); + DECL_CONV_STUB( IfcPlane ); + DECL_CONV_STUB( IfcPlate ); + DECL_CONV_STUB( IfcPlateStandardCase ); + DECL_CONV_STUB( IfcPlateType ); + DECL_CONV_STUB( IfcPointOnCurve ); + DECL_CONV_STUB( IfcPointOnSurface ); + DECL_CONV_STUB( IfcPolyLoop ); + DECL_CONV_STUB( IfcPolygonalBoundedHalfSpace ); + DECL_CONV_STUB( IfcTessellatedFaceSet ); + DECL_CONV_STUB( IfcPolygonalFaceSet ); + DECL_CONV_STUB( IfcPolyline ); + DECL_CONV_STUB( IfcPresentationStyleAssignment ); + DECL_CONV_STUB( IfcProcedure ); + DECL_CONV_STUB( IfcProcedureType ); + DECL_CONV_STUB( IfcProductDefinitionShape ); + DECL_CONV_STUB( IfcProject ); + DECL_CONV_STUB( IfcProjectLibrary ); + DECL_CONV_STUB( IfcProjectOrder ); + DECL_CONV_STUB( IfcProjectionElement ); + DECL_CONV_STUB( IfcSimpleProperty ); + DECL_CONV_STUB( IfcPropertyBoundedValue ); + DECL_CONV_STUB( IfcPropertyEnumeratedValue ); + DECL_CONV_STUB( IfcPropertyListValue ); + DECL_CONV_STUB( IfcPropertyReferenceValue ); + DECL_CONV_STUB( IfcPropertySet ); + DECL_CONV_STUB( IfcPropertySingleValue ); + DECL_CONV_STUB( IfcPropertyTableValue ); + DECL_CONV_STUB( IfcProtectiveDevice ); + DECL_CONV_STUB( IfcProtectiveDeviceTrippingUnit ); + DECL_CONV_STUB( IfcProtectiveDeviceTrippingUnitType ); + DECL_CONV_STUB( IfcProtectiveDeviceType ); + DECL_CONV_STUB( IfcProxy ); + DECL_CONV_STUB( IfcPump ); + DECL_CONV_STUB( IfcPumpType ); + DECL_CONV_STUB( IfcRailing ); + DECL_CONV_STUB( IfcRailingType ); + DECL_CONV_STUB( IfcRamp ); + DECL_CONV_STUB( IfcRampFlight ); + DECL_CONV_STUB( IfcRampFlightType ); + DECL_CONV_STUB( IfcRampType ); + DECL_CONV_STUB( IfcRationalBSplineCurveWithKnots ); + DECL_CONV_STUB( IfcRationalBSplineSurfaceWithKnots ); + DECL_CONV_STUB( IfcRectangleProfileDef ); + DECL_CONV_STUB( IfcRectangleHollowProfileDef ); + DECL_CONV_STUB( IfcRectangularPyramid ); + DECL_CONV_STUB( IfcRectangularTrimmedSurface ); + DECL_CONV_STUB( IfcReinforcingElement ); + DECL_CONV_STUB( IfcReinforcingBar ); + DECL_CONV_STUB( IfcReinforcingElementType ); + DECL_CONV_STUB( IfcReinforcingBarType ); + DECL_CONV_STUB( IfcReinforcingMesh ); + DECL_CONV_STUB( IfcReinforcingMeshType ); + DECL_CONV_STUB( IfcRelationship ); + DECL_CONV_STUB( IfcRelDecomposes ); + DECL_CONV_STUB( IfcRelAggregates ); + DECL_CONV_STUB( IfcRelConnects ); + DECL_CONV_STUB( IfcRelContainedInSpatialStructure ); + DECL_CONV_STUB( IfcRelDefines ); + DECL_CONV_STUB( IfcRelDefinesByProperties ); + DECL_CONV_STUB( IfcRelFillsElement ); + DECL_CONV_STUB( IfcRelVoidsElement ); + DECL_CONV_STUB( IfcReparametrisedCompositeCurveSegment ); + DECL_CONV_STUB( IfcRepresentation ); + DECL_CONV_STUB( IfcRepresentationMap ); + DECL_CONV_STUB( IfcRevolvedAreaSolid ); + DECL_CONV_STUB( IfcRevolvedAreaSolidTapered ); + DECL_CONV_STUB( IfcRightCircularCone ); + DECL_CONV_STUB( IfcRightCircularCylinder ); + DECL_CONV_STUB( IfcRoof ); + DECL_CONV_STUB( IfcRoofType ); + DECL_CONV_STUB( IfcRoundedRectangleProfileDef ); + DECL_CONV_STUB( IfcSIUnit ); + DECL_CONV_STUB( IfcSanitaryTerminal ); + DECL_CONV_STUB( IfcSanitaryTerminalType ); + DECL_CONV_STUB( IfcSeamCurve ); + DECL_CONV_STUB( IfcSectionedSpine ); + DECL_CONV_STUB( IfcSensor ); + DECL_CONV_STUB( IfcSensorType ); + DECL_CONV_STUB( IfcShadingDevice ); + DECL_CONV_STUB( IfcShadingDeviceType ); + DECL_CONV_STUB( IfcShapeModel ); + DECL_CONV_STUB( IfcShapeRepresentation ); + DECL_CONV_STUB( IfcShellBasedSurfaceModel ); + DECL_CONV_STUB( IfcSite ); + DECL_CONV_STUB( IfcSlab ); + DECL_CONV_STUB( IfcSlabElementedCase ); + DECL_CONV_STUB( IfcSlabStandardCase ); + DECL_CONV_STUB( IfcSlabType ); + DECL_CONV_STUB( IfcSolarDevice ); + DECL_CONV_STUB( IfcSolarDeviceType ); + DECL_CONV_STUB( IfcSpace ); + DECL_CONV_STUB( IfcSpaceHeater ); + DECL_CONV_STUB( IfcSpaceHeaterType ); + DECL_CONV_STUB( IfcSpatialElementType ); + DECL_CONV_STUB( IfcSpatialStructureElementType ); + DECL_CONV_STUB( IfcSpaceType ); + DECL_CONV_STUB( IfcSpatialZone ); + DECL_CONV_STUB( IfcSpatialZoneType ); + DECL_CONV_STUB( IfcSphere ); + DECL_CONV_STUB( IfcSphericalSurface ); + DECL_CONV_STUB( IfcStackTerminal ); + DECL_CONV_STUB( IfcStackTerminalType ); + DECL_CONV_STUB( IfcStair ); + DECL_CONV_STUB( IfcStairFlight ); + DECL_CONV_STUB( IfcStairFlightType ); + DECL_CONV_STUB( IfcStairType ); + DECL_CONV_STUB( IfcStructuralActivity ); + DECL_CONV_STUB( IfcStructuralAction ); + DECL_CONV_STUB( IfcStructuralAnalysisModel ); + DECL_CONV_STUB( IfcStructuralItem ); + DECL_CONV_STUB( IfcStructuralConnection ); + DECL_CONV_STUB( IfcStructuralCurveAction ); + DECL_CONV_STUB( IfcStructuralCurveConnection ); + DECL_CONV_STUB( IfcStructuralMember ); + DECL_CONV_STUB( IfcStructuralCurveMember ); + DECL_CONV_STUB( IfcStructuralCurveMemberVarying ); + DECL_CONV_STUB( IfcStructuralReaction ); + DECL_CONV_STUB( IfcStructuralCurveReaction ); + DECL_CONV_STUB( IfcStructuralLinearAction ); + DECL_CONV_STUB( IfcStructuralLoadGroup ); + DECL_CONV_STUB( IfcStructuralLoadCase ); + DECL_CONV_STUB( IfcStructuralSurfaceAction ); + DECL_CONV_STUB( IfcStructuralPlanarAction ); + DECL_CONV_STUB( IfcStructuralPointAction ); + DECL_CONV_STUB( IfcStructuralPointConnection ); + DECL_CONV_STUB( IfcStructuralPointReaction ); + DECL_CONV_STUB( IfcStructuralResultGroup ); + DECL_CONV_STUB( IfcStructuralSurfaceConnection ); + DECL_CONV_STUB( IfcStructuralSurfaceMember ); + DECL_CONV_STUB( IfcStructuralSurfaceMemberVarying ); + DECL_CONV_STUB( IfcStructuralSurfaceReaction ); + DECL_CONV_STUB( IfcStyleModel ); + DECL_CONV_STUB( IfcStyledItem ); + DECL_CONV_STUB( IfcStyledRepresentation ); + DECL_CONV_STUB( IfcSubContractResource ); + DECL_CONV_STUB( IfcSubContractResourceType ); + DECL_CONV_STUB( IfcSubedge ); + DECL_CONV_STUB( IfcSurfaceCurveSweptAreaSolid ); + DECL_CONV_STUB( IfcSurfaceFeature ); + DECL_CONV_STUB( IfcSweptSurface ); + DECL_CONV_STUB( IfcSurfaceOfLinearExtrusion ); + DECL_CONV_STUB( IfcSurfaceOfRevolution ); + DECL_CONV_STUB( IfcSurfaceStyle ); + DECL_CONV_STUB( IfcSurfaceStyleShading ); + DECL_CONV_STUB( IfcSurfaceStyleRendering ); + DECL_CONV_STUB( IfcSurfaceStyleWithTextures ); + DECL_CONV_STUB( IfcSweptDiskSolid ); + DECL_CONV_STUB( IfcSweptDiskSolidPolygonal ); + DECL_CONV_STUB( IfcSwitchingDevice ); + DECL_CONV_STUB( IfcSwitchingDeviceType ); + DECL_CONV_STUB( IfcSystemFurnitureElement ); + DECL_CONV_STUB( IfcSystemFurnitureElementType ); + DECL_CONV_STUB( IfcTShapeProfileDef ); + DECL_CONV_STUB( IfcTank ); + DECL_CONV_STUB( IfcTankType ); + DECL_CONV_STUB( IfcTask ); + DECL_CONV_STUB( IfcTaskType ); + DECL_CONV_STUB( IfcTendon ); + DECL_CONV_STUB( IfcTendonAnchor ); + DECL_CONV_STUB( IfcTendonAnchorType ); + DECL_CONV_STUB( IfcTendonType ); + DECL_CONV_STUB( IfcTextLiteral ); + DECL_CONV_STUB( IfcTextLiteralWithExtent ); + DECL_CONV_STUB( IfcTopologyRepresentation ); + DECL_CONV_STUB( IfcToroidalSurface ); + DECL_CONV_STUB( IfcTransformer ); + DECL_CONV_STUB( IfcTransformerType ); + DECL_CONV_STUB( IfcTransportElement ); + DECL_CONV_STUB( IfcTransportElementType ); + DECL_CONV_STUB( IfcTrapeziumProfileDef ); + DECL_CONV_STUB( IfcTriangulatedFaceSet ); + DECL_CONV_STUB( IfcTrimmedCurve ); + DECL_CONV_STUB( IfcTubeBundle ); + DECL_CONV_STUB( IfcTubeBundleType ); + DECL_CONV_STUB( IfcUShapeProfileDef ); + DECL_CONV_STUB( IfcUnitAssignment ); + DECL_CONV_STUB( IfcUnitaryControlElement ); + DECL_CONV_STUB( IfcUnitaryControlElementType ); + DECL_CONV_STUB( IfcUnitaryEquipment ); + DECL_CONV_STUB( IfcUnitaryEquipmentType ); + DECL_CONV_STUB( IfcValve ); + DECL_CONV_STUB( IfcValveType ); + DECL_CONV_STUB( IfcVector ); + DECL_CONV_STUB( IfcVertex ); + DECL_CONV_STUB( IfcVertexLoop ); + DECL_CONV_STUB( IfcVertexPoint ); + DECL_CONV_STUB( IfcVibrationIsolator ); + DECL_CONV_STUB( IfcVibrationIsolatorType ); + DECL_CONV_STUB( IfcVirtualElement ); + DECL_CONV_STUB( IfcVoidingFeature ); + DECL_CONV_STUB( IfcWall ); + DECL_CONV_STUB( IfcWallElementedCase ); + DECL_CONV_STUB( IfcWallStandardCase ); + DECL_CONV_STUB( IfcWallType ); + DECL_CONV_STUB( IfcWasteTerminal ); + DECL_CONV_STUB( IfcWasteTerminalType ); + DECL_CONV_STUB( IfcWindow ); + DECL_CONV_STUB( IfcWindowStandardCase ); + DECL_CONV_STUB( IfcWindowStyle ); + DECL_CONV_STUB( IfcWindowType ); + DECL_CONV_STUB( IfcWorkCalendar ); + DECL_CONV_STUB( IfcWorkControl ); + DECL_CONV_STUB( IfcWorkPlan ); + DECL_CONV_STUB( IfcWorkSchedule ); + DECL_CONV_STUB( IfcZShapeProfileDef ); + DECL_CONV_STUB( IfcZone ); #undef DECL_CONV_STUB +} //! Schema_4 } //! STEP } //! Assimp From 01e4d07c1eb56085323a0d84a0c782986edf33f6 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 3 Feb 2018 09:42:07 +0100 Subject: [PATCH 067/106] closes https://github.com/assimp/assimp/issues/1583: update doc. --- doc/dox.h | 48 ++++-------------------------------------------- 1 file changed, 4 insertions(+), 44 deletions(-) diff --git a/doc/dox.h b/doc/dox.h index 5c6de51f1..ece3e31d9 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -206,56 +206,16 @@ the library files. Alternatively you can simply add the assimp project to your p your solution. -@section use_noboost Building without boost. - -The Boost-Workaround consists of dummy replacements for some boost utility templates. Currently there are replacements for - - - boost.scoped_ptr - - boost.scoped_array - - boost.format - - boost.random - - boost.common_factor - - boost.foreach - - boost.tuple - - boost.make_shared - -These implementations are very limited and are not intended for use outside assimp. A compiler -with full support for partial template specializations is required. To enable the workaround, put the following in -your compiler's list of predefined macros: -@code -#define ASSIMP_BUILD_BOOST_WORKAROUND -@endcode -
-If you're working with the provided solutions for Visual Studio use the -noboost build configs.
- -assimp_BUILD_BOOST_WORKAROUND implies assimp_BUILD_SINGLETHREADED.
-See the @ref assimp_st section -for more details. - - - @section assimp_dll Windows DLL Build -assimp can be built as DLL. You just need to select a -dll config from the list of project -configs and you're fine. +The Assimp-package can be built as DLL. You just need to run the default cmake run. -NOTE: Theoretically, assimp-dll can be used with multithreaded (non-dll) runtime libraries, -as long as you don't utilize any non-public stuff from the code folder. However, if you happen -to encounter *very* strange problems, try changing the runtime to Multithreaded (Debug) DLL. -@section assimp_stlport Building against STLport +@section assimp static lib -STLport is a free, fast and secure STL replacement that works with -all major compilers and platforms. To get it, download the latest release from -. -Usually you'll just need to run 'configure' + a makefile (see their README for more details). -Don't miss to add /stlport to your compiler's default include paths - prior -to the directory where your compiler vendor's headers lie. Do the same for /lib and -recompile assimp. To ensure you're really building against STLport see aiGetCompileFlags(). -
-In our testing, STLport builds tend to be a bit faster than builds against Microsoft's -C++ Standard Library. +The Assimp-package can be build as a static library as well. Do do so just set the configuration variable BUILD_SHARED_LIBS +to off during the cmake run. */ From 45e4a513defd3db1ed0b0746c00ff4453189160a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 3 Feb 2018 11:07:40 +0100 Subject: [PATCH 068/106] add cmake doc to doxygen-docu. --- doc/dox.h | 78 ++++++++++++++----------------------------------------- 1 file changed, 19 insertions(+), 59 deletions(-) diff --git a/doc/dox.h b/doc/dox.h index ece3e31d9..461c308e2 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -62,7 +62,7 @@ that it has not been implemented yet and some (most ...) formats lack proper spe See the @link importer_notes Importer Notes Page @endlink for information, what a specific importer can do and what not. Note that although this paper claims to be the official documentation, -http://assimp.sourceforge.net/main_features_formats.html +https://github.com/assimp/assimp/blob/master/Readme.md
is usually the most up-to-date list of file formats supported by the library.
1: Experimental loaders
@@ -90,9 +90,9 @@ but not all of them are *open-source*. If there's an accompagning '\source @section main_install Installation assimp can be used in two ways: linking against the pre-built libraries or building the library on your own. The former -option is the easiest, but the assimp distribution contains pre-built libraries only for Visual C++ 2005 and 2008. For other -compilers you'll have to build assimp for yourself. Which is hopefully as hassle-free as the other way, but needs a bit -more work. Both ways are described at the @link install Installation page. @endlink +option is the easiest, but the assimp distribution contains pre-built libraries only for Visual C++ 2012, 2013 and 2015. +For other compilers you'll have to build assimp for yourself. Which is hopefully as hassle-free as the other way, but +needs a bit more work. Both ways are described at the @link install Installation page. @endlink @section main_usage Usage @@ -133,78 +133,38 @@ assimp-discussions. @section install_prebuilt Using the pre-built libraries with Visual C++ 8/9 -If you develop at Visual Studio 2005 or 2008, you can simply use the pre-built linker libraries provided in the distribution. +If you develop at Visual Studio 2015 or 2017, you can simply use the pre-built linker libraries provided in the distribution. Extract all files to a place of your choice. A directory called "assimp" will be created there. Add the assimp/include path to your include paths (Menu->Extras->Options->Projects and Solutions->VC++ Directories->Include files) and the assimp/lib/<Compiler> path to your linker paths (Menu->Extras->Options->Projects and Solutions->VC++ Directories->Library files). This is necessary only once to setup all paths inside you IDE. -To use the library in your C++ project you have to include either <assimp/Importer.hpp> or <assimp/cimport.h> plus some others starting with <types.h>. -If you set up your IDE correctly the compiler should be able to find the files. Then you have to add the linker library to your -project dependencies. Link to /lib//assimp.lib. config-name is one of the predefined -project configs. For static linking, use release/debug. See the sections below on this page for more information on the -other build configs. -If done correctly you should now be able to compile, link, -run and use the application. If the linker complains about some integral functions being defined twice you probably have -mixed the runtimes. Recheck the project configuration (project properties -> C++ -> Code generation -> Runtime) if you use -static runtimes (Multithreaded / Multithreaded Debug) or dynamic runtimes (Multithreaded DLL / Multithreaded Debug DLL). -Choose the assimp linker lib accordingly. -

-Please don't forget to also read the @ref assimp_stl section on MSVC and the STL. - -@section assimp_stl Microsoft Compilers and the C++ Standard Library - -In VC8 and VC9 Microsoft introduced some Standard Library debugging features. A good example are improved iterator checks and -various useful debug checks. The problem is the performance penalty that incurs with those extra checks. - -Most of these security enhancements are active in release builds by default, rendering assimp several times -slower. However, it is possible to disable them by setting +To use the library in your C++ project you can simply generate a project file via cmake. One way is to add the assimp-folder as a subdirectory via the cmake-command @code -_HAS_ITERATOR_DEBUGGING=0 -_SECURE_SCL=0 +addsubdiectory(assimp) @endcode -in the preprocessor options (or alternatively in the source code, just before the STL is included for the first time). -assimp's vc8 and vc9 configs enable these flags by default. +Now just add the assimp-dependency to your application: -If you're linking statically against assimp: Make sure your applications uses the same STl settings! -If you do not, there are two binary incompatible STL versions mangled together and you'll crash. -Alternatively you can disable the fast STL settings for assimp by removing the 'FastSTL' property sheet from -the vc project file. +@code +TARGET_LINK_LIBRARIES(my_game assimp) +@endcode -If you're using assimp in a DLL/SO: It's ok. There's no STL used in the binary DLL/SO interface, so it doesn't care whether -your application uses the same STL settings or not. -

-Another option is to build against a different STL implementation, for example STlport. There's a special -@ref assimp_stlport section that has a description how to achieve this. +If done correctly you should now be able to compile, link, run and use the application. @section install_own Building the library from scratch -To build the library on your own you first have to get hold of the dependencies. Fortunately, special attention was paid to -keep the list of dependencies short. Unfortunately, the only dependency is boost which -can be a bit painful to set up for certain development environments. Boost is a widely used collection of classes and -functions for various purposes. Chances are that it was already installed along with your compiler. If not, you have to install -it for yourself. Read the "Getting Started" section of the Boost documentation for how to setup boost. VisualStudio users -can use a comfortable installer from -http://www.boost-consulting.com/products/free. Choose the appropriate version of boost for your runtime of choice. +First you need to install cmake. Now just get the code from github or download the latest version from the webside. +to buil the library just open a command-prompt / bash, navigate into the repo-folder and run cmake via: -If you don't want to use boost, you can build against our "Boost-Workaround". It consists of very small -implementations of the various boost utility classes used. However, you'll lose functionality (e.g. threading) by doing this. -So, if you can use boost, you should use boost. Otherwise, See the @link use_noboost NoBoost-Section @endlink -later on this page for the details of the workaround. - -Once boost is working, you have to set up a project for the assimp library in your favorite IDE. If you use VC2005 or -VC2008, you can simply load the solution or project files in the workspaces/ folder, otherwise you have to create a new -package and add all the headers and source files from the include/ and code/ directories. Set the temporary output folder -to obj/, for example, and redirect the output folder to bin/. Then build the library - it should compile and link fine. - -The last step is to integrate the library into your project. This is basically the same task as described in the -"Using the pre-built libraries" section above: add the include/ and bin/ directories to your IDE's paths so that the compiler can find -the library files. Alternatively you can simply add the assimp project to your project's overall solution and build it inside -your solution. +@code +cmake CMakeLists.txt +@endcode +A project-file of your default make-system ( like gnu-make on linux or Visual-Studio on Windows ) will be generated. +Run the build and you are done. You can find the libs at assimp/lib and the dll's / so's at bin. @section assimp_dll Windows DLL Build From 1fbfe6736e141480b54be49fe6a09ab2c64169e1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 3 Feb 2018 11:52:40 +0100 Subject: [PATCH 069/106] Update dox.h Update installation guide for linux and python. --- doc/dox.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/dox.h b/doc/dox.h index 461c308e2..d9462590b 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -90,9 +90,16 @@ but not all of them are *open-source*. If there's an accompagning '\source @section main_install Installation assimp can be used in two ways: linking against the pre-built libraries or building the library on your own. The former -option is the easiest, but the assimp distribution contains pre-built libraries only for Visual C++ 2012, 2013 and 2015. +option is the easiest, but the assimp distribution contains pre-built libraries only for Visual C++ 2013, 2015 and 2017. For other compilers you'll have to build assimp for yourself. Which is hopefully as hassle-free as the other way, but needs a bit more work. Both ways are described at the @link install Installation page. @endlink +If you want to use assimp on Ubuntu you can install it via the following command: + +@code +sudo apt-get install assimp +@endcode + +If you want to use the python-assimp-port just follow these instructions: https://github.com/assimp/assimp/tree/master/port/PyAssimp @section main_usage Usage @@ -115,7 +122,6 @@ assimp is considerably easy, as the whole postprocessing infrastructure is avail See the @link extend Extending the library @endlink page for more information. - @section main_support Support & Feedback If you have any questions/comments/suggestions/bug reports you're welcome to post them in our @@ -139,7 +145,8 @@ to your include paths (Menu->Extras->Options->Projects and Solutions-&g and the assimp/lib/<Compiler> path to your linker paths (Menu->Extras->Options->Projects and Solutions->VC++ Directories->Library files). This is necessary only once to setup all paths inside you IDE. -To use the library in your C++ project you can simply generate a project file via cmake. One way is to add the assimp-folder as a subdirectory via the cmake-command +To use the library in your C++ project you can simply generate a project file via cmake. One way is to add the assimp-folder +as a subdirectory via the cmake-command @code addsubdiectory(assimp) From 6aafc5879761c41e950df16355782ab7ab801f36 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 15:51:20 +0200 Subject: [PATCH 070/106] Add missing assignment operator to aiString --- include/assimp/types.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/assimp/types.h b/include/assimp/types.h index f0d9b2428..9868f657c 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -304,6 +304,20 @@ struct aiString data[len] = 0; } + + /** Assigment operator */ + aiString& operator = (const aiString &rOther) { + if (this == &rOther) { + return *this; + } + + length = rOther.length;; + memcpy( data, rOther.data, length); + data[length] = '\0'; + return *this; + } + + /** Assign a const char* to the string */ aiString& operator = (const char* sz) { Set(sz); From a64d5155051a72cf4442af75facc4d71c22085a4 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 16:04:14 +0200 Subject: [PATCH 071/106] Fix varible shadowing issue --- include/assimp/matrix3x3.inl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/assimp/matrix3x3.inl b/include/assimp/matrix3x3.inl index aaf62eb0f..ab2cc410b 100644 --- a/include/assimp/matrix3x3.inl +++ b/include/assimp/matrix3x3.inl @@ -313,16 +313,16 @@ inline aiMatrix3x3t& aiMatrix3x3t::FromToMatrix(const aiVector3t(2.0) / (u * u); - const TReal c2 = static_cast(2.0) / (v * v); - const TReal c3 = c1 * c2 * (u * v); + const TReal c1_ = static_cast(2.0) / (u * u); + const TReal c2_ = static_cast(2.0) / (v * v); + const TReal c3_ = c1_ * c2_ * (u * v); for (unsigned int i = 0; i < 3; i++) { for (unsigned int j = 0; j < 3; j++) { - mtx[i][j] = - c1 * u[i] * u[j] - c2 * v[i] * v[j] - + c3 * v[i] * u[j]; + mtx[i][j] = - c1_ * u[i] * u[j] - c2_ * v[i] * v[j] + + c3_ * v[i] * u[j]; } mtx[i][i] += static_cast(1.0); } From 82980c8a9cd604e59a04251d74e8b8caa4ad401c Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 16:24:45 +0200 Subject: [PATCH 072/106] Add missing assignment operator to aiBone --- include/assimp/mesh.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index a532e2b46..ea27d03a1 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -270,6 +270,32 @@ struct aiBone } } + + //! Assignment operator + aiBone &operator=(const aiBone& other) + { + if (this == &other) { + return *this; + } + + mName = other.mName; + mNumWeights = other.mNumWeights; + mOffsetMatrix = other.mOffsetMatrix; + + if (other.mWeights && other.mNumWeights) + { + if (mWeights) { + delete[] mWeights; + } + + mWeights = new aiVertexWeight[mNumWeights]; + ::memcpy(mWeights,other.mWeights,mNumWeights * sizeof(aiVertexWeight)); + } + + return *this; + } + + //! Destructor - deletes the array of vertex weights ~aiBone() { From b0b125dfe6fd24b5c63db1eb5ac1d9b2afc34a6e Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 16:34:40 +0200 Subject: [PATCH 073/106] Initialize all members of aiVertexWeight in constructor --- include/assimp/mesh.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index ea27d03a1..5896284f6 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -212,7 +212,10 @@ struct aiVertexWeight #ifdef __cplusplus //! Default constructor - aiVertexWeight() { } + aiVertexWeight() + : mVertexId(0) + , mWeight(0.0f) + { } //! Initialisation from a given index and vertex weight factor //! \param pID ID From e21b79a8bf2fdfc70f8f4195b6aae3a5d9f34c8c Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 16:45:07 +0200 Subject: [PATCH 074/106] Mark Importer assignment operator deleted --- include/assimp/Importer.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index 1263868bc..9ae8fccc6 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -139,6 +139,11 @@ public: */ Importer(const Importer& other); + // ------------------------------------------------------------------- + /** Assignment operator has been deleted + */ + Importer &operator=(const Importer &) = delete; + // ------------------------------------------------------------------- /** Destructor. The object kept ownership of the imported data, * which now will be destroyed along with the object. From 123b9ca71a299741f5addaa9752c3dbca3053712 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 16:54:19 +0200 Subject: [PATCH 075/106] Initialize all members of aiMeshKey in constructor --- include/assimp/anim.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/assimp/anim.h b/include/assimp/anim.h index 9156aac06..1a2c11044 100644 --- a/include/assimp/anim.h +++ b/include/assimp/anim.h @@ -162,7 +162,10 @@ struct aiMeshKey #ifdef __cplusplus - aiMeshKey() { + aiMeshKey() + : mTime(0.0) + , mValue(0) + { } /** Construction from a given time and key value */ From 9397932e4f10d83954d5a4af0b0bd10a1b2894e6 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 17:08:25 +0200 Subject: [PATCH 076/106] PretransformVertices: Rearrange some assignments to clarify things --- code/PretransformVertices.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/PretransformVertices.cpp b/code/PretransformVertices.cpp index 6c569c185..cc5c669e4 100644 --- a/code/PretransformVertices.cpp +++ b/code/PretransformVertices.cpp @@ -651,7 +651,8 @@ void PretransformVertices::Execute( aiScene* pScene) // generate mesh nodes for (unsigned int i = 0; i < pScene->mNumMeshes;++i,++nodes) { - aiNode* pcNode = *nodes = new aiNode(); + aiNode* pcNode = new aiNode(); + *nodes = pcNode; pcNode->mParent = pScene->mRootNode; pcNode->mName = pScene->mMeshes[i]->mName; @@ -663,7 +664,8 @@ void PretransformVertices::Execute( aiScene* pScene) // generate light nodes for (unsigned int i = 0; i < pScene->mNumLights;++i,++nodes) { - aiNode* pcNode = *nodes = new aiNode(); + aiNode* pcNode = new aiNode(); + *nodes = pcNode; pcNode->mParent = pScene->mRootNode; pcNode->mName.length = ai_snprintf(pcNode->mName.data, MAXLEN, "light_%u",i); pScene->mLights[i]->mName = pcNode->mName; @@ -671,7 +673,8 @@ void PretransformVertices::Execute( aiScene* pScene) // generate camera nodes for (unsigned int i = 0; i < pScene->mNumCameras;++i,++nodes) { - aiNode* pcNode = *nodes = new aiNode(); + aiNode* pcNode = new aiNode(); + *nodes = pcNode; pcNode->mParent = pScene->mRootNode; pcNode->mName.length = ::ai_snprintf(pcNode->mName.data,MAXLEN,"cam_%u",i); pScene->mCameras[i]->mName = pcNode->mName; From be865ae61380068fadd7e48f6ccc7d39287a46e8 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 17:19:27 +0200 Subject: [PATCH 077/106] LimitBoneWeightsProcess: Initialize all members of Weight in constructor --- code/LimitBoneWeightsProcess.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/LimitBoneWeightsProcess.h b/code/LimitBoneWeightsProcess.h index 2fc6e02b1..090181982 100644 --- a/code/LimitBoneWeightsProcess.h +++ b/code/LimitBoneWeightsProcess.h @@ -120,7 +120,11 @@ public: { unsigned int mBone; ///< Index of the bone float mWeight; ///< Weight of that bone on this vertex - Weight() { } + Weight() + : mBone(0) + , mWeight(0.0f) + { } + Weight( unsigned int pBone, float pWeight) { mBone = pBone; From da19ed0b2a7a5e212bd1d843ded29bfc3412ccb7 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 17:25:31 +0200 Subject: [PATCH 078/106] BaseImporter: Remove dead condition operator new never returns NULL, it throws exception on allocation failure --- code/BaseImporter.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/BaseImporter.cpp b/code/BaseImporter.cpp index f653d8d81..0892efd9f 100644 --- a/code/BaseImporter.cpp +++ b/code/BaseImporter.cpp @@ -157,9 +157,6 @@ void BaseImporter::GetExtensionList(std::set& extensions) // read 200 characters from the file std::unique_ptr _buffer (new char[searchBytes+1 /* for the '\0' */]); char* buffer = _buffer.get(); - if( NULL == buffer ) { - return false; - } const size_t read = pStream->Read(buffer,1,searchBytes); if( !read ) { From cfcaf3e97b382d4e30f2cdc2fd96af3bde632a9f Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 17:38:30 +0200 Subject: [PATCH 079/106] BVH: Initialize all members of Node in constructor --- code/BVHLoader.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/BVHLoader.h b/code/BVHLoader.h index 0836488ff..a18ad81d9 100644 --- a/code/BVHLoader.h +++ b/code/BVHLoader.h @@ -84,7 +84,10 @@ class BVHLoader : public BaseImporter std::vector mChannels; std::vector mChannelValues; // motion data values for that node. Of size NumChannels * NumFrames - Node() { } + Node() + : mNode(nullptr) + { } + explicit Node( const aiNode* pNode) : mNode( pNode) { } }; From 5278e1a5f85dc51f5e0f4c2be28e5b4fffce0227 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Sat, 3 Feb 2018 17:52:25 +0200 Subject: [PATCH 080/106] CSM: Fix a possible memory leak by using std::unique_ptr --- code/CSMLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/CSMLoader.cpp b/code/CSMLoader.cpp index 7b0064164..7160740c1 100644 --- a/code/CSMLoader.cpp +++ b/code/CSMLoader.cpp @@ -136,7 +136,7 @@ void CSMImporter::InternReadFile( const std::string& pFile, TextFileToBuffer(file.get(),mBuffer2); const char* buffer = &mBuffer2[0]; - aiAnimation* anim = new aiAnimation(); + std::unique_ptr anim(new aiAnimation()); int first = 0, last = 0x00ffffff; // now process the file and look out for '$' sections @@ -294,8 +294,8 @@ void CSMImporter::InternReadFile( const std::string& pFile, // Store the one and only animation in the scene pScene->mAnimations = new aiAnimation*[pScene->mNumAnimations=1]; - pScene->mAnimations[0] = anim; anim->mName.Set("$CSM_MasterAnim"); + pScene->mAnimations[0] = anim.release(); // mark the scene as incomplete and run SkeletonMeshBuilder on it pScene->mFlags |= AI_SCENE_FLAGS_INCOMPLETE; From 37d352622bd3556d25ea744eded79d818391b3df Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 4 Feb 2018 16:42:36 +0100 Subject: [PATCH 081/106] closes https://github.com/assimp/assimp/issues/774: use correct type for unitscale in fbx. --- code/FBXDocument.cpp | 4 +++- test/unit/utFBXImporterExporter.cpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index 3714cd617..a1fbd2cf0 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -351,7 +351,9 @@ void Document::ReadGlobalSettings() return; } - std::shared_ptr props = GetPropertyTable(*this, "", *ehead, *ehead->Compound(), true); + std::shared_ptr props = GetPropertyTable( *this, "", *ehead, *ehead->Compound(), true ); + + //double v = PropertyGet( *props.get(), std::string("UnitScaleFactor"), 1.0 ); if(!props) { DOMError("GlobalSettings dictionary contains no property table"); diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index d5a6e4354..d2576cfa1 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -101,12 +101,12 @@ TEST_F( utFBXImporterExporter, importPhongMaterial ) { TEST_F(utFBXImporterExporter, importUnitScaleFactor) { Assimp::Importer importer; - const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/spider.fbx", aiProcess_ValidateDataStructure); + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/global_settings.fbx", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_NE(nullptr, scene->mMetaData); double factor(0.0); scene->mMetaData->Get("UnitScaleFactor", factor); - EXPECT_DOUBLE_EQ(1.0, factor); + EXPECT_DOUBLE_EQ(500.0, factor); } From c5157bc471216c6efc90126539ef44296c23d66e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 4 Feb 2018 17:13:58 +0100 Subject: [PATCH 082/106] fbx: global settings use float instead of double. --- code/FBXDocument.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 386a660d9..654f5bfa8 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -1022,8 +1022,8 @@ public: fbx_simple_property(CoordAxisSign, int, 1) fbx_simple_property(OriginalUpAxis, int, 0) fbx_simple_property(OriginalUpAxisSign, int, 1) - fbx_simple_property(UnitScaleFactor, double, 1) - fbx_simple_property(OriginalUnitScaleFactor, double, 1) + fbx_simple_property(UnitScaleFactor, float, 1) + fbx_simple_property(OriginalUnitScaleFactor, float, 1) fbx_simple_property(AmbientColor, aiVector3D, aiVector3D(0,0,0)) fbx_simple_property(DefaultCamera, std::string, "") From 8284226efdccdfcba303f5ef9ddd74365055d616 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 4 Feb 2018 17:19:49 +0100 Subject: [PATCH 083/106] fbx: add missing test file. --- test/models/FBX/global_settings.fbx | Bin 0 -> 57596 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/models/FBX/global_settings.fbx diff --git a/test/models/FBX/global_settings.fbx b/test/models/FBX/global_settings.fbx new file mode 100644 index 0000000000000000000000000000000000000000..3fc616bb034a81d3cdc62139b6839cb389112294 GIT binary patch literal 57596 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 literal 0 HcmV?d00001 From 3685791e0d05623c68d990ba3878f17d99888211 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 4 Feb 2018 22:15:18 +0100 Subject: [PATCH 084/106] closes https://github.com/assimp/assimp/issues/1729: check for bit flip when unsigned int overflow happens in x-file parsing. --- code/XFileParser.cpp | 241 ++++++++++++++++++++++--------------------- code/XFileParser.h | 59 +++++------ 2 files changed, 151 insertions(+), 149 deletions(-) diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index c7efb83c4..34d8c89f9 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -87,59 +87,60 @@ static void dummy_free (void* /*opaque*/, void* address) { // ------------------------------------------------------------------------------------------------ // Constructor. Creates a data structure out of the XFile given in the memory block. XFileParser::XFileParser( const std::vector& pBuffer) -{ - mMajorVersion = mMinorVersion = 0; - mIsBinaryFormat = false; - mBinaryNumCount = 0; - P = End = NULL; - mLineNumber = 0; - mScene = NULL; - +: mMajorVersion( 0 ) +, mMinorVersion( 0 ) +, mIsBinaryFormat( false ) +, mBinaryNumCount( 0 ) +, mP( nullptr ) +, mEnd( nullptr ) +, mLineNumber( 0 ) +, mScene( nullptr ) { // vector to store uncompressed file for INFLATE'd X files std::vector uncompressed; // set up memory pointers - P = &pBuffer.front(); - End = P + pBuffer.size() - 1; + mP = &pBuffer.front(); + mEnd = mP + pBuffer.size() - 1; // check header - if( strncmp( P, "xof ", 4) != 0) - throw DeadlyImportError( "Header mismatch, file is not an XFile."); + if ( 0 != strncmp( mP, "xof ", 4 ) ) { + throw DeadlyImportError( "Header mismatch, file is not an XFile." ); + } // read version. It comes in a four byte format such as "0302" - mMajorVersion = (unsigned int)(P[4] - 48) * 10 + (unsigned int)(P[5] - 48); - mMinorVersion = (unsigned int)(P[6] - 48) * 10 + (unsigned int)(P[7] - 48); + mMajorVersion = (unsigned int)(mP[4] - 48) * 10 + (unsigned int)(mP[5] - 48); + mMinorVersion = (unsigned int)(mP[6] - 48) * 10 + (unsigned int)(mP[7] - 48); bool compressed = false; // txt - pure ASCII text format - if( strncmp( P + 8, "txt ", 4) == 0) + if( strncmp( mP + 8, "txt ", 4) == 0) mIsBinaryFormat = false; // bin - Binary format - else if( strncmp( P + 8, "bin ", 4) == 0) + else if( strncmp( mP + 8, "bin ", 4) == 0) mIsBinaryFormat = true; // tzip - Inflate compressed text format - else if( strncmp( P + 8, "tzip", 4) == 0) + else if( strncmp( mP + 8, "tzip", 4) == 0) { mIsBinaryFormat = false; compressed = true; } // bzip - Inflate compressed binary format - else if( strncmp( P + 8, "bzip", 4) == 0) + else if( strncmp( mP + 8, "bzip", 4) == 0) { mIsBinaryFormat = true; compressed = true; } else ThrowException( format() << "Unsupported xfile format '" << - P[8] << P[9] << P[10] << P[11] << "'"); + mP[8] << mP[9] << mP[10] << mP[11] << "'"); // float size - mBinaryFloatSize = (unsigned int)(P[12] - 48) * 1000 - + (unsigned int)(P[13] - 48) * 100 - + (unsigned int)(P[14] - 48) * 10 - + (unsigned int)(P[15] - 48); + mBinaryFloatSize = (unsigned int)(mP[12] - 48) * 1000 + + (unsigned int)(mP[13] - 48) * 100 + + (unsigned int)(mP[14] - 48) * 10 + + (unsigned int)(mP[15] - 48); if( mBinaryFloatSize != 32 && mBinaryFloatSize != 64) ThrowException( format() << "Unknown float size " << mBinaryFloatSize << " specified in xfile header." ); @@ -147,7 +148,7 @@ XFileParser::XFileParser( const std::vector& pBuffer) // The x format specifies size in bits, but we work in bytes mBinaryFloatSize /= 8; - P += 16; + mP += 16; // If this is a compressed X file, apply the inflate algorithm to it if (compressed) @@ -186,13 +187,13 @@ XFileParser::XFileParser( const std::vector& pBuffer) ::inflateInit2(&stream, -MAX_WBITS); // skip unknown data (checksum, flags?) - P += 6; + mP += 6; // First find out how much storage we'll need. Count sections. - const char* P1 = P; + const char* P1 = mP; unsigned int est_out = 0; - while (P1 + 3 < End) + while (P1 + 3 < mEnd) { // read next offset uint16_t ofs = *((uint16_t*)P1); @@ -216,18 +217,18 @@ XFileParser::XFileParser( const std::vector& pBuffer) // Allocate storage and terminating zero and do the actual uncompressing uncompressed.resize(est_out + 1); char* out = &uncompressed.front(); - while (P + 3 < End) + while (mP + 3 < mEnd) { - uint16_t ofs = *((uint16_t*)P); + uint16_t ofs = *((uint16_t*)mP); AI_SWAP2(ofs); - P += 4; + mP += 4; - if (P + ofs > End + 2) { + if (mP + ofs > mEnd + 2) { throw DeadlyImportError("X: Unexpected EOF in compressed chunk"); } // push data to the stream - stream.next_in = (Bytef*)P; + stream.next_in = (Bytef*)mP; stream.avail_in = ofs; stream.next_out = (Bytef*)out; stream.avail_out = MSZIP_BLOCK; @@ -242,15 +243,15 @@ XFileParser::XFileParser( const std::vector& pBuffer) // and advance to the next offset out += MSZIP_BLOCK - stream.avail_out; - P += ofs; + mP += ofs; } // terminate zlib ::inflateEnd(&stream); // ok, update pointers to point to the uncompressed file data - P = &uncompressed[0]; - End = out; + mP = &uncompressed[0]; + mEnd = out; // FIXME: we don't need the compressed data anymore, could release // it already for better memory usage. Consider breaking const-co. @@ -647,8 +648,8 @@ void XFileParser::ParseDataObjectMeshVertexColors( Mesh* pMesh) if( !mIsBinaryFormat) { FindNextNoneWhiteSpace(); - if( *P == ';' || *P == ',') - P++; + if( *mP == ';' || *mP == ',') + mP++; } } @@ -678,8 +679,8 @@ void XFileParser::ParseDataObjectMeshMaterialList( Mesh* pMesh) // commented out version check, as version 03.03 exported from blender also has 2 semicolons if( !mIsBinaryFormat) // && MajorVersion == 3 && MinorVersion <= 2) { - if(P < End && *P == ';') - ++P; + if(mP < mEnd && *mP == ';') + ++mP; } // if there was only a single material index, replicate it on all faces @@ -1029,12 +1030,12 @@ void XFileParser::TestForSeparator() return; FindNextNoneWhiteSpace(); - if( P >= End) + if( mP >= mEnd) return; // test and skip - if( *P == ';' || *P == ',') - P++; + if( *mP == ';' || *mP == ',') + mP++; } // ------------------------------------------------------------------------------------------------ @@ -1062,46 +1063,54 @@ std::string XFileParser::GetNextToken() // in binary mode it will only return NAME and STRING token // and (correctly) skip over other tokens. - if( End - P < 2) return s; + if( mEnd - mP < 2) return s; unsigned int tok = ReadBinWord(); unsigned int len; // standalone tokens switch( tok) { - case 1: - // name token - if( End - P < 4) return s; - len = ReadBinDWord(); - if( End - P < int(len)) return s; - s = std::string(P, len); - P += len; + case 1: { + // name token + if ( mEnd - mP < 4 ) return s; + len = ReadBinDWord(); + const int bounds( mEnd - mP ); + const int iLen( len ); + if ( iLen < 0 ) { + return s; + } + if ( bounds < iLen ) { + return s; + } + s = std::string( mP, len ); + mP += len; + } return s; case 2: // string token - if( End - P < 4) return s; + if( mEnd - mP < 4) return s; len = ReadBinDWord(); - if( End - P < int(len)) return s; - s = std::string(P, len); - P += (len + 2); + if( mEnd - mP < int(len)) return s; + s = std::string(mP, len); + mP += (len + 2); return s; case 3: // integer token - P += 4; + mP += 4; return ""; case 5: // GUID token - P += 16; + mP += 16; return ""; case 6: - if( End - P < 4) return s; + if( mEnd - mP < 4) return s; len = ReadBinDWord(); - P += (len * 4); + mP += (len * 4); return ""; case 7: - if( End - P < 4) return s; + if( mEnd - mP < 4) return s; len = ReadBinDWord(); - P += (len * mBinaryFloatSize); + mP += (len * mBinaryFloatSize); return ""; case 0x0a: return "{"; @@ -1159,19 +1168,19 @@ std::string XFileParser::GetNextToken() else { FindNextNoneWhiteSpace(); - if( P >= End) + if( mP >= mEnd) return s; - while( (P < End) && !isspace( (unsigned char) *P)) + while( (mP < mEnd) && !isspace( (unsigned char) *mP)) { // either keep token delimiters when already holding a token, or return if first valid char - if( *P == ';' || *P == '}' || *P == '{' || *P == ',') + if( *mP == ';' || *mP == '}' || *mP == '{' || *mP == ',') { if( !s.size()) - s.append( P++, 1); + s.append( mP++, 1); break; // stop for delimiter } - s.append( P++, 1); + s.append( mP++, 1); } } return s; @@ -1186,18 +1195,18 @@ void XFileParser::FindNextNoneWhiteSpace() bool running = true; while( running ) { - while( P < End && isspace( (unsigned char) *P)) + while( mP < mEnd && isspace( (unsigned char) *mP)) { - if( *P == '\n') + if( *mP == '\n') mLineNumber++; - ++P; + ++mP; } - if( P >= End) + if( mP >= mEnd) return; // check if this is a comment - if( (P[0] == '/' && P[1] == '/') || P[0] == '#') + if( (mP[0] == '/' && mP[1] == '/') || mP[0] == '#') ReadUntilEndOfLine(); else break; @@ -1214,22 +1223,22 @@ void XFileParser::GetNextTokenAsString( std::string& poString) } FindNextNoneWhiteSpace(); - if( P >= End) + if( mP >= mEnd) ThrowException( "Unexpected end of file while parsing string"); - if( *P != '"') + if( *mP != '"') ThrowException( "Expected quotation mark."); - ++P; + ++mP; - while( P < End && *P != '"') - poString.append( P++, 1); + while( mP < mEnd && *mP != '"') + poString.append( mP++, 1); - if( P >= End-1) + if( mP >= mEnd-1) ThrowException( "Unexpected end of file while parsing string"); - if( P[1] != ';' || P[0] != '"') + if( mP[1] != ';' || mP[0] != '"') ThrowException( "Expected quotation mark and semicolon at the end of a string."); - P+=2; + mP+=2; } // ------------------------------------------------------------------------------------------------ @@ -1238,35 +1247,35 @@ void XFileParser::ReadUntilEndOfLine() if( mIsBinaryFormat) return; - while( P < End) + while( mP < mEnd) { - if( *P == '\n' || *P == '\r') + if( *mP == '\n' || *mP == '\r') { - ++P; mLineNumber++; + ++mP; mLineNumber++; return; } - ++P; + ++mP; } } // ------------------------------------------------------------------------------------------------ unsigned short XFileParser::ReadBinWord() { - ai_assert(End - P >= 2); - const unsigned char* q = (const unsigned char*) P; + ai_assert(mEnd - mP >= 2); + const unsigned char* q = (const unsigned char*) mP; unsigned short tmp = q[0] | (q[1] << 8); - P += 2; + mP += 2; return tmp; } // ------------------------------------------------------------------------------------------------ -unsigned int XFileParser::ReadBinDWord() -{ - ai_assert(End - P >= 4); - const unsigned char* q = (const unsigned char*) P; +unsigned int XFileParser::ReadBinDWord() { + ai_assert(mEnd - mP >= 4); + + const unsigned char* q = (const unsigned char*) mP; unsigned int tmp = q[0] | (q[1] << 8) | (q[2] << 16) | (q[3] << 24); - P += 4; + mP += 4; return tmp; } @@ -1275,20 +1284,20 @@ unsigned int XFileParser::ReadInt() { if( mIsBinaryFormat) { - if( mBinaryNumCount == 0 && End - P >= 2) + if( mBinaryNumCount == 0 && mEnd - mP >= 2) { unsigned short tmp = ReadBinWord(); // 0x06 or 0x03 - if( tmp == 0x06 && End - P >= 4) // array of ints follows + if( tmp == 0x06 && mEnd - mP >= 4) // array of ints follows mBinaryNumCount = ReadBinDWord(); else // single int follows mBinaryNumCount = 1; } --mBinaryNumCount; - if ( End - P >= 4) { + if ( mEnd - mP >= 4) { return ReadBinDWord(); } else { - P = End; + mP = mEnd; return 0; } } else @@ -1299,24 +1308,24 @@ unsigned int XFileParser::ReadInt() // check preceding minus sign bool isNegative = false; - if( *P == '-') + if( *mP == '-') { isNegative = true; - P++; + mP++; } // at least one digit expected - if( !isdigit( *P)) + if( !isdigit( *mP)) ThrowException( "Number expected."); // read digits unsigned int number = 0; - while( P < End) + while( mP < mEnd) { - if( !isdigit( *P)) + if( !isdigit( *mP)) break; - number = number * 10 + (*P - 48); - P++; + number = number * 10 + (*mP - 48); + mP++; } CheckForSeparator(); @@ -1329,10 +1338,10 @@ ai_real XFileParser::ReadFloat() { if( mIsBinaryFormat) { - if( mBinaryNumCount == 0 && End - P >= 2) + if( mBinaryNumCount == 0 && mEnd - mP >= 2) { unsigned short tmp = ReadBinWord(); // 0x07 or 0x42 - if( tmp == 0x07 && End - P >= 4) // array of floats following + if( tmp == 0x07 && mEnd - mP >= 4) // array of floats following mBinaryNumCount = ReadBinDWord(); else // single float following mBinaryNumCount = 1; @@ -1341,22 +1350,22 @@ ai_real XFileParser::ReadFloat() --mBinaryNumCount; if( mBinaryFloatSize == 8) { - if( End - P >= 8) { - ai_real result = (ai_real) (*(double*) P); - P += 8; + if( mEnd - mP >= 8) { + ai_real result = (ai_real) (*(double*) mP); + mP += 8; return result; } else { - P = End; + mP = mEnd; return 0; } } else { - if( End - P >= 4) { - ai_real result = *(ai_real*) P; - P += 4; + if( mEnd - mP >= 4) { + ai_real result = *(ai_real*) mP; + mP += 4; return result; } else { - P = End; + mP = mEnd; return 0; } } @@ -1367,21 +1376,21 @@ ai_real XFileParser::ReadFloat() // check for various special strings to allow reading files from faulty exporters // I mean you, Blender! // Reading is safe because of the terminating zero - if( strncmp( P, "-1.#IND00", 9) == 0 || strncmp( P, "1.#IND00", 8) == 0) + if( strncmp( mP, "-1.#IND00", 9) == 0 || strncmp( mP, "1.#IND00", 8) == 0) { - P += 9; + mP += 9; CheckForSeparator(); return 0.0; } else - if( strncmp( P, "1.#QNAN0", 8) == 0) + if( strncmp( mP, "1.#QNAN0", 8) == 0) { - P += 8; + mP += 8; CheckForSeparator(); return 0.0; } ai_real result = 0.0; - P = fast_atoreal_move( P, result); + mP = fast_atoreal_move( mP, result); CheckForSeparator(); diff --git a/code/XFileParser.h b/code/XFileParser.h index 050ecb9ca..24eb6104d 100644 --- a/code/XFileParser.h +++ b/code/XFileParser.h @@ -49,10 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -namespace Assimp -{ - namespace XFile - { +namespace Assimp { + namespace XFile { struct Node; struct Mesh; struct Scene; @@ -61,21 +59,20 @@ namespace Assimp struct AnimBone; } -/** The XFileParser reads a XFile either in text or binary form and builds a temporary - * data structure out of it. - */ -class XFileParser -{ +/** + * @brief The XFileParser reads a XFile either in text or binary form and builds a temporary + * data structure out of it. + */ +class XFileParser { public: - /** Constructor. Creates a data structure out of the XFile given in the memory block. - * @param pBuffer Null-terminated memory buffer containing the XFile - */ + /// Constructor. Creates a data structure out of the XFile given in the memory block. + /// @param pBuffer Null-terminated memory buffer containing the XFile explicit XFileParser( const std::vector& pBuffer); - /** Destructor. Destroys all imported data along with it */ + /// Destructor. Destroys all imported data along with it ~XFileParser(); - /** Returns the temporary representation of the imported data */ + /// Returns the temporary representation of the imported data. XFile::Scene* GetImportedData() const { return mScene; } protected: @@ -101,10 +98,10 @@ protected: //! places pointer to next begin of a token, and ignores comments void FindNextNoneWhiteSpace(); - //! returns next parseable token. Returns empty string if no token there + //! returns next valid token. Returns empty string if no token there std::string GetNextToken(); - //! reads header of dataobject including the opening brace. + //! reads header of data object including the opening brace. //! returns false if error happened, and writes name of object //! if there is one void readHeadOfDataObject( std::string* poName = NULL); @@ -118,8 +115,8 @@ protected: //! checks for a separator char, either a ',' or a ';' void CheckForSeparator(); - /// tests and possibly consumes a separator char, but does nothing if there was no separator - void TestForSeparator(); + /// tests and possibly consumes a separator char, but does nothing if there was no separator + void TestForSeparator(); //! reads a x file style string void GetNextTokenAsString( std::string& poString); @@ -138,27 +135,23 @@ protected: /** Throws an exception with a line number and the given text. */ AI_WONT_RETURN void ThrowException( const std::string& pText) AI_WONT_RETURN_SUFFIX; - /** Filters the imported hierarchy for some degenerated cases that some exporters produce. - * @param pData The sub-hierarchy to filter - */ + /** + * @brief Filters the imported hierarchy for some degenerated cases that some exporters produce. + * @param pData The sub-hierarchy to filter + */ void FilterHierarchy( XFile::Node* pNode); protected: unsigned int mMajorVersion, mMinorVersion; ///< version numbers bool mIsBinaryFormat; ///< true if the file is in binary, false if it's in text form unsigned int mBinaryFloatSize; ///< float size in bytes, either 4 or 8 - // counter for number arrays in binary format - unsigned int mBinaryNumCount; - - const char* P; - const char* End; - - /// Line number when reading in text format - unsigned int mLineNumber; - - /// Imported data - XFile::Scene* mScene; + unsigned int mBinaryNumCount; /// < counter for number arrays in binary format + const char* mP; + const char* mEnd; + unsigned int mLineNumber; ///< Line number when reading in text format + XFile::Scene* mScene; ///< Imported data }; -} +} //! ns Assimp + #endif // AI_XFILEPARSER_H_INC From 862a145ea50088585319512f49aaaca2397034a2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 4 Feb 2018 22:18:54 +0100 Subject: [PATCH 085/106] X: add unittest to ensure no exception will be thrown. --- test/unit/utXImporterExporter.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/unit/utXImporterExporter.cpp b/test/unit/utXImporterExporter.cpp index 770e2be47..d4c742e6f 100644 --- a/test/unit/utXImporterExporter.cpp +++ b/test/unit/utXImporterExporter.cpp @@ -62,3 +62,8 @@ public: TEST_F( utXImporterExporter, importXFromFileTest ) { EXPECT_TRUE( importerTest() ); } + +TEST_F( utXImporterExporter, heap_overflow_in_tokenizer ) { + Assimp::Importer importer; + EXPECT_NO_THROW( importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/X/OV_GetNextToken", 0 ) ); +} From a8f940dd8365ac8076889ee7751949dc879862bc Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 5 Feb 2018 00:05:08 +0100 Subject: [PATCH 086/106] add missing test file. --- test/models/X/OV_GetNextToken | Bin 0 -> 775 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/models/X/OV_GetNextToken diff --git a/test/models/X/OV_GetNextToken b/test/models/X/OV_GetNextToken new file mode 100644 index 0000000000000000000000000000000000000000..8b2a0d0ca49350f0a8dcdda8967ccd910da116bd GIT binary patch literal 775 zcmV+i1Ni)SZ)PAcGcYq^dTDSlFf%d$3jhG{3hx3#OWjsYXcIvceu*Y+vQ7G9tkp|F z5mHYEa`R_NQ)(lo5gUK-woRt#&}3J3w>6+(4uW{{AYMgKMDgNH(L;On;@?53OVlh9XK{uYRbs~>0ywsAoD^s< zE_`|(rj{?&X~l4gF`q7KPqyRO;s43aB zMopuR?!2WeU+iOx)I%qI)`KAP(3n=q8bco$Nm%b+)N=RUw)U3}{&<-Yfn3`#odwHo z%vx14YczpL2^f{9@%CxeC#h)V;%dFyl@)vV=A6{`z-pD^YcH+zRm5Hus^wr%{l&t}8 zoF)=wX%U+m_1~p9+Y^@c!TkfeB!HHlPOnWu`{(fvDGz##u>WbB)ine=8GFXE+&ELG zq`EBY?^OfC8gb*64uOxV=X@&&6A(JTJWsYCdh0q2jq&gZs*!(Hx({YN?5ZGL&}sll zz5ca*jpO=*?bQDc)*l1)K0khYPF-THcF8knP2T{kZ(_r9j6#Oh2v5ciQQI)1kRnSS z3G0k6q=+I%c&$AdXF1L&rpPfqqn?a$l8h3HjQpUGaWe1>4J$J8yM&BWg)hwAij4do zo~I_}VU|ssQFnrdK@LPuyuNk5SKqzn)JrZKp65XR{}~2NTs$}qWzuw)ZIZVvyXqT? z!|?Av+NPfbQP?MTJf^fU>}y+8v`)4uE?Onqk`%3xZ5R=)kYyiLNbuU1%8V~`Nl#DX+hsB;m*C0VkUe4QhoZ^XPrEHf13EU?ITs+9fQ@y F-#UtLa=-up literal 0 HcmV?d00001 From ff556027ef4424ba2f1ed64908be54bdcf98038e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 5 Feb 2018 00:33:41 +0100 Subject: [PATCH 087/106] X: fix some review findings. --- code/XFileParser.cpp | 61 ++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 34d8c89f9..92d8a579b 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -466,12 +466,11 @@ void XFileParser::ParseDataObjectMesh( Mesh* pMesh) // read position faces unsigned int numPosFaces = ReadInt(); pMesh->mPosFaces.resize( numPosFaces); - for( unsigned int a = 0; a < numPosFaces; a++) - { + for( unsigned int a = 0; a < numPosFaces; ++a) { // read indices unsigned int numIndices = ReadInt(); Face& face = pMesh->mPosFaces[a]; - for (unsigned int b = 0; b < numIndices; b++) { + for (unsigned int b = 0; b < numIndices; ++b) { face.mIndices.push_back( ReadInt() ); } TestForSeparator(); @@ -479,11 +478,10 @@ void XFileParser::ParseDataObjectMesh( Mesh* pMesh) // here, other data objects may follow bool running = true; - while ( running ) - { + while ( running ) { std::string objectName = GetNextToken(); - if( objectName.size() == 0) + if( objectName.empty() ) ThrowException( "Unexpected end of file while parsing mesh structure"); else if( objectName == "}") @@ -518,8 +516,10 @@ void XFileParser::ParseDataObjectMesh( Mesh* pMesh) } // ------------------------------------------------------------------------------------------------ -void XFileParser::ParseDataObjectSkinWeights( Mesh *pMesh) -{ +void XFileParser::ParseDataObjectSkinWeights( Mesh *pMesh) { + if ( nullptr == pMesh ) { + return; + } readHeadOfDataObject(); std::string transformNodeName; @@ -1053,39 +1053,40 @@ void XFileParser::readHeadOfDataObject( std::string* poName) } // ------------------------------------------------------------------------------------------------ -std::string XFileParser::GetNextToken() -{ +std::string XFileParser::GetNextToken() { std::string s; // process binary-formatted file - if( mIsBinaryFormat) - { + if( mIsBinaryFormat) { // in binary mode it will only return NAME and STRING token // and (correctly) skip over other tokens. - - if( mEnd - mP < 2) return s; + if ( mEnd - mP < 2 ) { + return s; + } unsigned int tok = ReadBinWord(); unsigned int len; // standalone tokens - switch( tok) - { + switch( tok ) { case 1: { - // name token - if ( mEnd - mP < 4 ) return s; - len = ReadBinDWord(); - const int bounds( mEnd - mP ); - const int iLen( len ); - if ( iLen < 0 ) { - return s; - } - if ( bounds < iLen ) { - return s; - } - s = std::string( mP, len ); - mP += len; + // name token + if ( mEnd - mP < 4 ) { + return s; } - return s; + len = ReadBinDWord(); + const int bounds( mEnd - mP ); + const int iLen( len ); + if ( iLen < 0 ) { + return s; + } + if ( bounds < iLen ) { + return s; + } + s = std::string( mP, len ); + mP += len; + } + return s; + case 2: // string token if( mEnd - mP < 4) return s; From eb23946fe74955eca8978e168e5a6fb00eba6e36 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 5 Feb 2018 13:44:19 +0100 Subject: [PATCH 088/106] Update XFileParser.cpp Fix alignment for float and double. --- code/XFileParser.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 92d8a579b..76ea71e21 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -1349,20 +1349,20 @@ ai_real XFileParser::ReadFloat() } --mBinaryNumCount; - if( mBinaryFloatSize == 8) - { + if( mBinaryFloatSize == 8) { if( mEnd - mP >= 8) { - ai_real result = (ai_real) (*(double*) mP); + double res; + ::memcpy( &res, mP, 8 ); mP += 8; return result; } else { mP = mEnd; return 0; } - } else - { + } else { if( mEnd - mP >= 4) { - ai_real result = *(ai_real*) mP; + ai_real result; + ::memcpy( &result, mP, 4 ); mP += 4; return result; } else { From dceb7257ddf888908581380fd8bf1a7ec1a98d66 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 5 Feb 2018 13:53:06 +0100 Subject: [PATCH 089/106] Update XFileParser.cpp Fix the build. --- code/XFileParser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 76ea71e21..cf3529653 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -1354,6 +1354,7 @@ ai_real XFileParser::ReadFloat() double res; ::memcpy( &res, mP, 8 ); mP += 8; + const ai_real result( static_cast( res ) ); return result; } else { mP = mEnd; From 2a7ebc570c12d0793337e79ab55d9eb812d8cf0f Mon Sep 17 00:00:00 2001 From: Giuseppe Barbieri Date: Mon, 5 Feb 2018 17:13:53 +0100 Subject: [PATCH 090/106] Update Readme.md --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index ca6c9ba4d..a6f2e3d3d 100644 --- a/Readme.md +++ b/Readme.md @@ -120,7 +120,7 @@ Take a look into the `INSTALL` file. Our build system is CMake, if you used CMak * [Pascal](port/AssimpPascal/Readme.md) * [Javascript (Alpha)](https://github.com/makc/assimp2json) * [Unity 3d Plugin](https://www.assetstore.unity3d.com/en/#!/content/91777) -* [JVM](https://github.com/kotlin-graphics/assimp) Full jvm port (currently supported obj, ply, stl, collada, md2) +* [JVM](https://github.com/kotlin-graphics/assimp) Full jvm port (current [status](https://github.com/kotlin-graphics/assimp/wiki/Status)) ### Other tools ### [open3mod](https://github.com/acgessler/open3mod) is a powerful 3D model viewer based on Assimp's import and export abilities. From d284d107e73cd3ae80733e3351c213025365d74c Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 18:43:51 +0200 Subject: [PATCH 091/106] XGLLoader: Fix a memory leak --- code/XGLLoader.cpp | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/code/XGLLoader.cpp b/code/XGLLoader.cpp index 2d7a40362..a9fd6a5ab 100644 --- a/code/XGLLoader.cpp +++ b/code/XGLLoader.cpp @@ -72,17 +72,6 @@ using namespace irr::io; #endif -// scopeguard for a malloc'ed buffer -struct free_it -{ - free_it(void* free) : free(free) {} - ~free_it() { - ::free(this->free); - } - - void* free; -}; - namespace Assimp { // this has to be in here because LogFunctions is in ::Assimp template<> const char* LogFunctions::Prefix() { @@ -155,8 +144,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { #ifndef ASSIMP_BUILD_NO_COMPRESSED_XGL - Bytef* dest = NULL; - free_it free_it_really(dest); + std::vector uncompressed; #endif m_scene = pScene; @@ -192,6 +180,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, size_t total = 0l; + // TODO: be smarter about this, decompress directly into heap buffer // and decompress the data .... do 1k chunks in the hope that we won't kill the stack #define MYBLOCK 1024 Bytef block[MYBLOCK]; @@ -206,8 +195,8 @@ void XGLImporter::InternReadFile( const std::string& pFile, } const size_t have = MYBLOCK - zstream.avail_out; total += have; - dest = reinterpret_cast( realloc(dest,total) ); - memcpy(dest + total - have,block,have); + uncompressed.resize(total); + memcpy(uncompressed.data() + total - have,block,have); } while (ret != Z_STREAM_END); @@ -215,7 +204,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, inflateEnd(&zstream); // replace the input stream with a memory stream - stream.reset(new MemoryIOStream(reinterpret_cast(dest),total)); + stream.reset(new MemoryIOStream(reinterpret_cast(uncompressed.data()),total)); #endif } From c42dd9104cb7a4faea288a634cd2f0c170366308 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 18:52:23 +0200 Subject: [PATCH 092/106] BlenderLoader: Fix memory leak --- code/BlenderLoader.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/code/BlenderLoader.cpp b/code/BlenderLoader.cpp index 482f9ae5c..d4d6473c5 100644 --- a/code/BlenderLoader.cpp +++ b/code/BlenderLoader.cpp @@ -154,14 +154,6 @@ void BlenderImporter::SetupProperties(const Importer* /*pImp*/) // nothing to be done for the moment } -struct free_it { - free_it(void* free) : free(free) {} - ~free_it() { - ::free(this->free); - } - - void* free; -}; // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. @@ -169,8 +161,7 @@ void BlenderImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { #ifndef ASSIMP_BUILD_NO_COMPRESSED_BLEND - Bytef* dest = NULL; - free_it free_it_really(dest); + std::vector uncompressed; #endif @@ -218,6 +209,7 @@ void BlenderImporter::InternReadFile( const std::string& pFile, size_t total = 0l; + // TODO: be smarter about this, decompress directly into heap buffer // and decompress the data .... do 1k chunks in the hope that we won't kill the stack #define MYBLOCK 1024 Bytef block[MYBLOCK]; @@ -232,8 +224,8 @@ void BlenderImporter::InternReadFile( const std::string& pFile, } const size_t have = MYBLOCK - zstream.avail_out; total += have; - dest = reinterpret_cast( realloc(dest,total) ); - memcpy(dest + total - have,block,have); + uncompressed.resize(total); + memcpy(uncompressed.data() + total - have,block,have); } while (ret != Z_STREAM_END); @@ -241,7 +233,7 @@ void BlenderImporter::InternReadFile( const std::string& pFile, inflateEnd(&zstream); // replace the input stream with a memory stream - stream.reset(new MemoryIOStream(reinterpret_cast(dest),total)); + stream.reset(new MemoryIOStream(reinterpret_cast(uncompressed.data()),total)); // .. and retry stream->Read(magic,7,1); From 880be5403f466541335cce1b6fcef26b18cc9f15 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 19:03:47 +0200 Subject: [PATCH 093/106] OpenGEX: Replace raw pointer with vector to fix a memory leak --- code/OpenGEXImporter.cpp | 12 ++++-------- code/OpenGEXImporter.h | 3 +-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index 37c765f4c..a2844ccdf 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -221,9 +221,7 @@ static void propId2StdString( Property *prop, std::string &name, std::string &ke //------------------------------------------------------------------------------------------------ OpenGEXImporter::VertexContainer::VertexContainer() -: m_numVerts( 0 ) -, m_vertices( nullptr ) -, m_numColors( 0 ) +: m_numColors( 0 ) , m_colors( nullptr ) , m_numNormals( 0 ) , m_normals( nullptr ) @@ -234,7 +232,6 @@ OpenGEXImporter::VertexContainer::VertexContainer() //------------------------------------------------------------------------------------------------ OpenGEXImporter::VertexContainer::~VertexContainer() { - delete[] m_vertices; delete[] m_colors; delete[] m_normals; @@ -857,9 +854,8 @@ void OpenGEXImporter::handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene const size_t numItems( countDataArrayListItems( vaList ) ); if( Position == attribType ) { - m_currentVertices.m_numVerts = numItems; - m_currentVertices.m_vertices = new aiVector3D[ numItems ]; - copyVectorArray( numItems, vaList, m_currentVertices.m_vertices ); + m_currentVertices.m_vertices.resize( numItems ); + copyVectorArray( numItems, vaList, m_currentVertices.m_vertices.data() ); } else if ( Color == attribType ) { m_currentVertices.m_numColors = numItems; m_currentVertices.m_colors = new aiColor4D[ numItems ]; @@ -922,7 +918,7 @@ void OpenGEXImporter::handleIndexArrayNode( ODDLParser::DDLNode *node, aiScene * Value *next( vaList->m_dataList ); for( size_t indices = 0; indices < current.mNumIndices; indices++ ) { const int idx( next->getUnsignedInt32() ); - ai_assert( static_cast( idx ) <= m_currentVertices.m_numVerts ); + ai_assert( static_cast( idx ) <= m_currentVertices.m_vertices.size() ); ai_assert( index < m_currentMesh->mNumVertices ); aiVector3D &pos = ( m_currentVertices.m_vertices[ idx ] ); m_currentMesh->mVertices[ index ].Set( pos.x, pos.y, pos.z ); diff --git a/code/OpenGEXImporter.h b/code/OpenGEXImporter.h index bbbe3678d..eedb84375 100644 --- a/code/OpenGEXImporter.h +++ b/code/OpenGEXImporter.h @@ -144,8 +144,7 @@ protected: private: struct VertexContainer { - size_t m_numVerts; - aiVector3D *m_vertices; + std::vector m_vertices; size_t m_numColors; aiColor4D *m_colors; size_t m_numNormals; From 1aed63afb73a83fbfd2bb246f54f2110471aa724 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 19:13:54 +0200 Subject: [PATCH 094/106] OpenGEX: Replace another raw pointer with vector to fix a memory leak --- code/OpenGEXImporter.cpp | 10 +++------- code/OpenGEXImporter.h | 3 +-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index a2844ccdf..dac8299c5 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -223,8 +223,6 @@ static void propId2StdString( Property *prop, std::string &name, std::string &ke OpenGEXImporter::VertexContainer::VertexContainer() : m_numColors( 0 ) , m_colors( nullptr ) -, m_numNormals( 0 ) -, m_normals( nullptr ) , m_numUVComps() , m_textureCoords() { // empty @@ -233,7 +231,6 @@ OpenGEXImporter::VertexContainer::VertexContainer() //------------------------------------------------------------------------------------------------ OpenGEXImporter::VertexContainer::~VertexContainer() { delete[] m_colors; - delete[] m_normals; for(auto &texcoords : m_textureCoords) { delete [] texcoords; @@ -861,9 +858,8 @@ void OpenGEXImporter::handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene m_currentVertices.m_colors = new aiColor4D[ numItems ]; copyColor4DArray( numItems, vaList, m_currentVertices.m_colors ); } else if( Normal == attribType ) { - m_currentVertices.m_numNormals = numItems; - m_currentVertices.m_normals = new aiVector3D[ numItems ]; - copyVectorArray( numItems, vaList, m_currentVertices.m_normals ); + m_currentVertices.m_normals.resize( numItems ); + copyVectorArray( numItems, vaList, m_currentVertices.m_normals.data() ); } else if( TexCoord == attribType ) { m_currentVertices.m_numUVComps[ 0 ] = numItems; m_currentVertices.m_textureCoords[ 0 ] = new aiVector3D[ numItems ]; @@ -900,7 +896,7 @@ void OpenGEXImporter::handleIndexArrayNode( ODDLParser::DDLNode *node, aiScene * hasColors = true; } bool hasNormalCoords( false ); - if ( m_currentVertices.m_numNormals > 0 ) { + if ( !m_currentVertices.m_normals.empty() ) { m_currentMesh->mNormals = new aiVector3D[ m_currentMesh->mNumVertices ]; hasNormalCoords = true; } diff --git a/code/OpenGEXImporter.h b/code/OpenGEXImporter.h index eedb84375..ad331d8e6 100644 --- a/code/OpenGEXImporter.h +++ b/code/OpenGEXImporter.h @@ -147,8 +147,7 @@ private: std::vector m_vertices; size_t m_numColors; aiColor4D *m_colors; - size_t m_numNormals; - aiVector3D *m_normals; + std::vector m_normals; size_t m_numUVComps[ AI_MAX_NUMBER_OF_TEXTURECOORDS ]; aiVector3D *m_textureCoords[ AI_MAX_NUMBER_OF_TEXTURECOORDS ]; From 9344074a04357fb0e8fd2537557f148dbc15ce8f Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 19:22:32 +0200 Subject: [PATCH 095/106] MDLLoader: Replace raw pointer with vector to fix a memory leak --- code/MDLFileData.h | 4 ++-- code/MDLLoader.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/MDLFileData.h b/code/MDLFileData.h index 56f686280..ba732add0 100644 --- a/code/MDLFileData.h +++ b/code/MDLFileData.h @@ -844,11 +844,11 @@ struct IntGroupInfo_MDL7 struct IntGroupData_MDL7 { IntGroupData_MDL7() - : pcFaces(NULL), bNeed2UV(false) + : bNeed2UV(false) {} //! Array of faces that belong to the group - MDL::IntFace_MDL7* pcFaces; + std::vector pcFaces; //! Array of vertex positions std::vector vPositions; diff --git a/code/MDLLoader.cpp b/code/MDLLoader.cpp index 5dd471cf5..3f2bb084b 100644 --- a/code/MDLLoader.cpp +++ b/code/MDLLoader.cpp @@ -1502,7 +1502,7 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) groupData.bNeed2UV = true; } } - groupData.pcFaces = new MDL::IntFace_MDL7[groupInfo.pcGroup->numtris]; + groupData.pcFaces.resize(groupInfo.pcGroup->numtris); // read all faces into the preallocated arrays ReadFaces_3DGS_MDL7(groupInfo, groupData); From 3b68ffe363401cafd8da701a4a757bc88845e164 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 19:32:34 +0200 Subject: [PATCH 096/106] LWO: Use C++11 auto for easier refactoring --- code/LWOLoader.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/LWOLoader.cpp b/code/LWOLoader.cpp index 38e330b8f..10cfd67bd 100644 --- a/code/LWOLoader.cpp +++ b/code/LWOLoader.cpp @@ -584,7 +584,7 @@ void LWOImporter::GenerateNodeGraph(std::map& apcNodes) //Set parent of all children, inserting pivots //std::cout << "Set parent of all children" << std::endl; std::map mapPivot; - for (std::map::iterator itapcNodes = apcNodes.begin(); itapcNodes != apcNodes.end(); ++itapcNodes) { + for (auto itapcNodes = apcNodes.begin(); itapcNodes != apcNodes.end(); ++itapcNodes) { //Get the parent index LWO::Layer* nodeLayer = (LWO::Layer*)(itapcNodes->second->mParent); @@ -615,14 +615,14 @@ void LWOImporter::GenerateNodeGraph(std::map& apcNodes) //Merge pivot map into node map //std::cout << "Merge pivot map into node map" << std::endl; - for (std::map::iterator itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end(); ++itMapPivot) { + for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end(); ++itMapPivot) { apcNodes[itMapPivot->first] = itMapPivot->second; } //Set children of all parents apcNodes[-1] = root; - for (std::map::iterator itMapParentNodes = apcNodes.begin(); itMapParentNodes != apcNodes.end(); ++itMapParentNodes) { - for (std::map::iterator itMapChildNodes = apcNodes.begin(); itMapChildNodes != apcNodes.end(); ++itMapChildNodes) { + for (auto itMapParentNodes = apcNodes.begin(); itMapParentNodes != apcNodes.end(); ++itMapParentNodes) { + for (auto itMapChildNodes = apcNodes.begin(); itMapChildNodes != apcNodes.end(); ++itMapChildNodes) { if ((itMapParentNodes->first != itMapChildNodes->first) && (itMapParentNodes->second == itMapChildNodes->second->mParent)) { ++(itMapParentNodes->second->mNumChildren); } @@ -630,7 +630,7 @@ void LWOImporter::GenerateNodeGraph(std::map& apcNodes) if (itMapParentNodes->second->mNumChildren) { itMapParentNodes->second->mChildren = new aiNode* [ itMapParentNodes->second->mNumChildren ]; uint16_t p = 0; - for (std::map::iterator itMapChildNodes = apcNodes.begin(); itMapChildNodes != apcNodes.end(); ++itMapChildNodes) { + for (auto itMapChildNodes = apcNodes.begin(); itMapChildNodes != apcNodes.end(); ++itMapChildNodes) { if ((itMapParentNodes->first != itMapChildNodes->first) && (itMapParentNodes->second == itMapChildNodes->second->mParent)) { itMapParentNodes->second->mChildren[p++] = itMapChildNodes->second; } From ef891fb850af5edb86869a1e175ce0e07e13ac02 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 19:36:27 +0200 Subject: [PATCH 097/106] LWO: Move some assignments to make it clearer when the thing should be moved --- code/LWOLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/LWOLoader.cpp b/code/LWOLoader.cpp index 10cfd67bd..e908ea178 100644 --- a/code/LWOLoader.cpp +++ b/code/LWOLoader.cpp @@ -432,7 +432,6 @@ void LWOImporter::InternReadFile( const std::string& pFile, unsigned int num = static_cast(apcMeshes.size() - meshStart); if (layer.mName != "" || num > 0) { aiNode* pcNode = new aiNode(); - apcNodes[layer.mIndex] = pcNode; pcNode->mName.Set(layer.mName); pcNode->mParent = (aiNode*)&layer; pcNode->mNumMeshes = num; @@ -442,6 +441,7 @@ void LWOImporter::InternReadFile( const std::string& pFile, for (unsigned int p = 0; p < pcNode->mNumMeshes;++p) pcNode->mMeshes[p] = p + meshStart; } + apcNodes[layer.mIndex] = pcNode; } } @@ -593,7 +593,6 @@ void LWOImporter::GenerateNodeGraph(std::map& apcNodes) //Create pivot node, store it into the pivot map, and set the parent as the pivot aiNode* pivotNode = new aiNode(); pivotNode->mName.Set("Pivot-"+std::string(itapcNodes->second->mName.data)); - mapPivot[-(itapcNodes->first+2)] = pivotNode; itapcNodes->second->mParent = pivotNode; //Look for the parent node to attach the pivot to @@ -611,6 +610,7 @@ void LWOImporter::GenerateNodeGraph(std::map& apcNodes) pivotNode->mTransformation.a4 = nodeLayer->mPivot.x; pivotNode->mTransformation.b4 = nodeLayer->mPivot.y; pivotNode->mTransformation.c4 = nodeLayer->mPivot.z; + mapPivot[-(itapcNodes->first+2)] = pivotNode; } //Merge pivot map into node map From aa434b956648af35917c9b18933b066eb16171dd Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 20:05:02 +0200 Subject: [PATCH 098/106] OpenGEX: Add comment about pointer ownership --- code/OpenGEXImporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/OpenGEXImporter.h b/code/OpenGEXImporter.h index ad331d8e6..5b87d5ce5 100644 --- a/code/OpenGEXImporter.h +++ b/code/OpenGEXImporter.h @@ -192,7 +192,7 @@ private: MetricInfo m_metrics[ MetricInfo::Max ]; aiNode *m_currentNode; VertexContainer m_currentVertices; - aiMesh *m_currentMesh; + aiMesh *m_currentMesh; // not owned, target is owned by m_meshCache aiMaterial *m_currentMaterial; aiLight *m_currentLight; aiCamera *m_currentCamera; From 5ce9ece0ccc110bf858bd21a19b10986236bf63e Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 20:08:49 +0200 Subject: [PATCH 099/106] OpenGEX: Replace std::copy with explicit loop --- code/OpenGEXImporter.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index dac8299c5..a0bef75a9 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -1137,7 +1137,9 @@ void OpenGEXImporter::copyMeshes( aiScene *pScene ) { pScene->mNumMeshes = static_cast(m_meshCache.size()); pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ]; - std::copy( m_meshCache.begin(), m_meshCache.end(), pScene->mMeshes ); + for (unsigned int i = 0; i < pScene->mNumMeshes; i++) { + pScene->mMeshes[i] = m_meshCache[i]; + } } //------------------------------------------------------------------------------------------------ From 17b26c91e254a17091f96ab861569f10b408a9c8 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Tue, 6 Feb 2018 20:20:16 +0200 Subject: [PATCH 100/106] OpenGEX: Use std::unique_ptr to fix some memory leaks --- code/OpenGEXImporter.cpp | 5 +++-- code/OpenGEXImporter.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index a0bef75a9..43c92c4f5 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -691,7 +691,8 @@ void OpenGEXImporter::handleTransformNode( ODDLParser::DDLNode *node, aiScene * void OpenGEXImporter::handleMeshNode( ODDLParser::DDLNode *node, aiScene *pScene ) { m_currentMesh = new aiMesh; const size_t meshidx( m_meshCache.size() ); - m_meshCache.push_back( m_currentMesh ); + // ownership is transfered but a reference remains in m_currentMesh + m_meshCache.emplace_back( m_currentMesh ); Property *prop = node->getProperties(); if( nullptr != prop ) { @@ -1138,7 +1139,7 @@ void OpenGEXImporter::copyMeshes( aiScene *pScene ) { pScene->mNumMeshes = static_cast(m_meshCache.size()); pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ]; for (unsigned int i = 0; i < pScene->mNumMeshes; i++) { - pScene->mMeshes[i] = m_meshCache[i]; + pScene->mMeshes[i] = m_meshCache[i].release(); } } diff --git a/code/OpenGEXImporter.h b/code/OpenGEXImporter.h index 5b87d5ce5..8e86a4aa8 100644 --- a/code/OpenGEXImporter.h +++ b/code/OpenGEXImporter.h @@ -183,7 +183,7 @@ private: typedef std::map > NodeChildMap; NodeChildMap m_nodeChildMap; - std::vector m_meshCache; + std::vector > m_meshCache; typedef std::map ReferenceMap; std::map m_mesh2refMap; std::map m_material2refMap; From 495ae70cc5423b1cda7c5999c4b44cf9fb9de0cd Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 6 Feb 2018 19:21:56 +0100 Subject: [PATCH 101/106] XFileParser: release x-file-based scene when throwing an exception. --- code/3DSLoader.cpp | 16 +- code/PlyLoader.cpp | 352 +++++++++++++++----------------- code/PlyLoader.h | 1 - code/PlyParser.h | 43 ++-- code/XFileParser.cpp | 42 ++-- test/unit/utPLYImportExport.cpp | 25 +++ 6 files changed, 243 insertions(+), 236 deletions(-) diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index 7a5e2b6e5..9d61e125c 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -113,22 +113,24 @@ Discreet3DSImporter::Discreet3DSImporter() , mScene() , mMasterScale() , bHasBG() -, bIsPrj() -{} +, bIsPrj() { + // empty +} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -Discreet3DSImporter::~Discreet3DSImporter() -{} +Discreet3DSImporter::~Discreet3DSImporter() { + // empty +} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool Discreet3DSImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const -{ +bool Discreet3DSImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { std::string extension = GetExtension(pFile); if(extension == "3ds" || extension == "prj" ) { return true; } + if (!extension.length() || checkSig) { uint16_t token[3]; token[0] = 0x4d4d; @@ -210,7 +212,7 @@ void Discreet3DSImporter::InternReadFile( const std::string& pFile, ConvertScene(pScene); // Generate the node graph for the scene. This is a little bit - // tricky since we'll need to split some meshes into submeshes + // tricky since we'll need to split some meshes into sub-meshes GenerateNodeGraph(pScene); // Now apply the master scaling factor to the scene diff --git a/code/PlyLoader.cpp b/code/PlyLoader.cpp index b6ae368df..5f4e556c1 100644 --- a/code/PlyLoader.cpp +++ b/code/PlyLoader.cpp @@ -58,16 +58,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; static const aiImporterDesc desc = { - "Stanford Polygon Library (PLY) Importer", - "", - "", - "", - aiImporterFlags_SupportBinaryFlavour | aiImporterFlags_SupportTextFlavour, - 0, - 0, - 0, - 0, - "ply" + "Stanford Polygon Library (PLY) Importer", + "", + "", + "", + aiImporterFlags_SupportBinaryFlavour | aiImporterFlags_SupportTextFlavour, + 0, + 0, + 0, + 0, + "ply" }; @@ -92,229 +92,209 @@ namespace // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer PLYImporter::PLYImporter() - : mBuffer(nullptr) - , pcDOM(nullptr) - , mGeneratedMesh(nullptr){ - // empty +: mBuffer(nullptr) +, pcDOM(nullptr) +, mGeneratedMesh(nullptr) { + // empty } // ------------------------------------------------------------------------------------------------ // Destructor, private as well PLYImporter::~PLYImporter() { - // empty + // empty } // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool PLYImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const -{ - const std::string extension = GetExtension(pFile); +bool PLYImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { + const std::string extension = GetExtension(pFile); - if (extension == "ply") - return true; - else if (!extension.length() || checkSig) - { - if (!pIOHandler)return true; - const char* tokens[] = { "ply" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); - } - return false; + if ( extension == "ply" ) { + return true; + } else if (!extension.length() || checkSig) { + if ( !pIOHandler ) { + return true; + } + static const char* tokens[] = { "ply" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); + } + + return false; } // ------------------------------------------------------------------------------------------------ -const aiImporterDesc* PLYImporter::GetInfo() const -{ - return &desc; +const aiImporterDesc* PLYImporter::GetInfo() const { + return &desc; } // ------------------------------------------------------------------------------------------------ static bool isBigEndian(const char* szMe) { - ai_assert(NULL != szMe); + ai_assert(NULL != szMe); - // binary_little_endian - // binary_big_endian - bool isBigEndian(false); + // binary_little_endian + // binary_big_endian + bool isBigEndian(false); #if (defined AI_BUILD_BIG_ENDIAN) - if ( 'l' == *szMe || 'L' == *szMe ) { - isBigEndian = true; - } + if ( 'l' == *szMe || 'L' == *szMe ) { + isBigEndian = true; + } #else - if ('b' == *szMe || 'B' == *szMe) { - isBigEndian = true; - } + if ('b' == *szMe || 'B' == *szMe) { + isBigEndian = true; + } #endif // ! AI_BUILD_BIG_ENDIAN - return isBigEndian; + return isBigEndian; } // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void PLYImporter::InternReadFile(const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) -{ - static const std::string mode = "rb"; - std::unique_ptr fileStream(pIOHandler->Open(pFile, mode)); - if (!fileStream.get()) { - throw DeadlyImportError("Failed to open file " + pFile + "."); - } +void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { + static const std::string mode = "rb"; + std::unique_ptr fileStream(pIOHandler->Open(pFile, mode)); + if (!fileStream.get()) { + throw DeadlyImportError("Failed to open file " + pFile + "."); + } - // Get the file-size - size_t fileSize = fileStream->FileSize(); - if ( 0 == fileSize ) { - throw DeadlyImportError("File " + pFile + " is empty."); - } + // Get the file-size + const size_t fileSize( fileStream->FileSize() ); + if ( 0 == fileSize ) { + throw DeadlyImportError("File " + pFile + " is empty."); + } - IOStreamBuffer streamedBuffer(1024 * 1024); - streamedBuffer.open(fileStream.get()); + IOStreamBuffer streamedBuffer(1024 * 1024); + streamedBuffer.open(fileStream.get()); - // the beginning of the file must be PLY - magic, magic - std::vector headerCheck; - streamedBuffer.getNextLine(headerCheck); + // the beginning of the file must be PLY - magic, magic + std::vector headerCheck; + streamedBuffer.getNextLine(headerCheck); - if ((headerCheck.size() < 3) || - (headerCheck[0] != 'P' && headerCheck[0] != 'p') || - (headerCheck[1] != 'L' && headerCheck[1] != 'l') || - (headerCheck[2] != 'Y' && headerCheck[2] != 'y') ) - { - streamedBuffer.close(); - throw DeadlyImportError("Invalid .ply file: Magic number \'ply\' is no there"); - } + if ((headerCheck.size() < 3) || + (headerCheck[0] != 'P' && headerCheck[0] != 'p') || + (headerCheck[1] != 'L' && headerCheck[1] != 'l') || + (headerCheck[2] != 'Y' && headerCheck[2] != 'y') ) { + streamedBuffer.close(); + throw DeadlyImportError("Invalid .ply file: Magic number \'ply\' is no there"); + } - std::vector mBuffer2; - streamedBuffer.getNextLine(mBuffer2); - mBuffer = (unsigned char*)&mBuffer2[0]; + std::vector mBuffer2; + streamedBuffer.getNextLine(mBuffer2); + mBuffer = (unsigned char*)&mBuffer2[0]; - char* szMe = (char*)&this->mBuffer[0]; - SkipSpacesAndLineEnd(szMe, (const char**)&szMe); + char* szMe = (char*)&this->mBuffer[0]; + SkipSpacesAndLineEnd(szMe, (const char**)&szMe); - // determine the format of the file data and construct the aimesh - PLY::DOM sPlyDom; - this->pcDOM = &sPlyDom; + // determine the format of the file data and construct the aimesh + PLY::DOM sPlyDom; + this->pcDOM = &sPlyDom; - if (TokenMatch(szMe, "format", 6)) { - if (TokenMatch(szMe, "ascii", 5)) { - SkipLine(szMe, (const char**)&szMe); - if (!PLY::DOM::ParseInstance(streamedBuffer, &sPlyDom, this)) - { - if (mGeneratedMesh != NULL) - { - delete(mGeneratedMesh); - mGeneratedMesh = nullptr; + if (TokenMatch(szMe, "format", 6)) { + if (TokenMatch(szMe, "ascii", 5)) { + SkipLine(szMe, (const char**)&szMe); + if (!PLY::DOM::ParseInstance(streamedBuffer, &sPlyDom, this)) { + if (mGeneratedMesh != NULL) { + delete(mGeneratedMesh); + mGeneratedMesh = nullptr; + } + + streamedBuffer.close(); + throw DeadlyImportError("Invalid .ply file: Unable to build DOM (#1)"); + } + } else if (!::strncmp(szMe, "binary_", 7)) { + szMe += 7; + const bool bIsBE(isBigEndian(szMe)); + + // skip the line, parse the rest of the header and build the DOM + if (!PLY::DOM::ParseInstanceBinary(streamedBuffer, &sPlyDom, this, bIsBE)) { + if (mGeneratedMesh != NULL) { + delete(mGeneratedMesh); + mGeneratedMesh = nullptr; + } + + streamedBuffer.close(); + throw DeadlyImportError("Invalid .ply file: Unable to build DOM (#2)"); + } + } else { + if (mGeneratedMesh != NULL) { + delete(mGeneratedMesh); + mGeneratedMesh = nullptr; + } + + streamedBuffer.close(); + throw DeadlyImportError("Invalid .ply file: Unknown file format"); + } + } else { + AI_DEBUG_INVALIDATE_PTR(this->mBuffer); + if (mGeneratedMesh != NULL) { + delete(mGeneratedMesh); + mGeneratedMesh = nullptr; } streamedBuffer.close(); - throw DeadlyImportError("Invalid .ply file: Unable to build DOM (#1)"); - } + throw DeadlyImportError("Invalid .ply file: Missing format specification"); } - else if (!::strncmp(szMe, "binary_", 7)) - { - szMe += 7; - const bool bIsBE(isBigEndian(szMe)); - // skip the line, parse the rest of the header and build the DOM - if (!PLY::DOM::ParseInstanceBinary(streamedBuffer, &sPlyDom, this, bIsBE)) - { - if (mGeneratedMesh != NULL) - { - delete(mGeneratedMesh); - mGeneratedMesh = nullptr; + //free the file buffer + streamedBuffer.close(); + + if (mGeneratedMesh == NULL) { + throw DeadlyImportError("Invalid .ply file: Unable to extract mesh data "); + } + + // if no face list is existing we assume that the vertex + // list is containing a list of points + bool pointsOnly = mGeneratedMesh->mFaces == NULL ? true : false; + if (pointsOnly) { + if (mGeneratedMesh->mNumVertices < 3) { + if (mGeneratedMesh != NULL) { + delete(mGeneratedMesh); + mGeneratedMesh = nullptr; + } + + streamedBuffer.close(); + throw DeadlyImportError("Invalid .ply file: Not enough " + "vertices to build a proper face list. "); } - streamedBuffer.close(); - throw DeadlyImportError("Invalid .ply file: Unable to build DOM (#2)"); - } - } - else - { - if (mGeneratedMesh != NULL) - { - delete(mGeneratedMesh); - mGeneratedMesh = nullptr; - } + const unsigned int iNum = (unsigned int)mGeneratedMesh->mNumVertices / 3; + mGeneratedMesh->mNumFaces = iNum; + mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces]; - streamedBuffer.close(); - throw DeadlyImportError("Invalid .ply file: Unknown file format"); - } - } - else - { - AI_DEBUG_INVALIDATE_PTR(this->mBuffer); - if (mGeneratedMesh != NULL) - { - delete(mGeneratedMesh); - mGeneratedMesh = nullptr; + for (unsigned int i = 0; i < iNum; ++i) { + mGeneratedMesh->mFaces[i].mNumIndices = 3; + mGeneratedMesh->mFaces[i].mIndices = new unsigned int[3]; + mGeneratedMesh->mFaces[i].mIndices[0] = (i * 3); + mGeneratedMesh->mFaces[i].mIndices[1] = (i * 3) + 1; + mGeneratedMesh->mFaces[i].mIndices[2] = (i * 3) + 2; + } } - streamedBuffer.close(); - throw DeadlyImportError("Invalid .ply file: Missing format specification"); - } + // now load a list of all materials + std::vector avMaterials; + std::string defaultTexture; + LoadMaterial(&avMaterials, defaultTexture, pointsOnly); - //free the file buffer - streamedBuffer.close(); - - if (mGeneratedMesh == NULL) - { - throw DeadlyImportError("Invalid .ply file: Unable to extract mesh data "); - } - - // if no face list is existing we assume that the vertex - // list is containing a list of points - bool pointsOnly = mGeneratedMesh->mFaces == NULL ? true : false; - if (pointsOnly) - { - if (mGeneratedMesh->mNumVertices < 3) - { - if (mGeneratedMesh != NULL) - { - delete(mGeneratedMesh); - mGeneratedMesh = nullptr; - } - - streamedBuffer.close(); - throw DeadlyImportError("Invalid .ply file: Not enough " - "vertices to build a proper face list. "); + // now generate the output scene object. Fill the material list + pScene->mNumMaterials = (unsigned int)avMaterials.size(); + pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; + for (unsigned int i = 0; i < pScene->mNumMaterials; ++i) { + pScene->mMaterials[i] = avMaterials[i]; } - const unsigned int iNum = (unsigned int)mGeneratedMesh->mNumVertices / 3; - mGeneratedMesh->mNumFaces = iNum; - mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces]; + // fill the mesh list + pScene->mNumMeshes = 1; + pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; + pScene->mMeshes[0] = mGeneratedMesh; + mGeneratedMesh = nullptr; - for (unsigned int i = 0; i < iNum; ++i) - { - mGeneratedMesh->mFaces[i].mNumIndices = 3; - mGeneratedMesh->mFaces[i].mIndices = new unsigned int[3]; - mGeneratedMesh->mFaces[i].mIndices[0] = (i * 3); - mGeneratedMesh->mFaces[i].mIndices[1] = (i * 3) + 1; - mGeneratedMesh->mFaces[i].mIndices[2] = (i * 3) + 2; + // generate a simple node structure + pScene->mRootNode = new aiNode(); + pScene->mRootNode->mNumMeshes = pScene->mNumMeshes; + pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes]; + + for (unsigned int i = 0; i < pScene->mRootNode->mNumMeshes; ++i) { + pScene->mRootNode->mMeshes[i] = i; } - } - - // now load a list of all materials - std::vector avMaterials; - std::string defaultTexture; - LoadMaterial(&avMaterials, defaultTexture, pointsOnly); - - // now generate the output scene object. Fill the material list - pScene->mNumMaterials = (unsigned int)avMaterials.size(); - pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; - for (unsigned int i = 0; i < pScene->mNumMaterials; ++i) { - pScene->mMaterials[i] = avMaterials[i]; - } - - // fill the mesh list - pScene->mNumMeshes = 1; - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; - pScene->mMeshes[0] = mGeneratedMesh; - mGeneratedMesh = nullptr; - - // generate a simple node structure - pScene->mRootNode = new aiNode(); - pScene->mRootNode->mNumMeshes = pScene->mNumMeshes; - pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes]; - - for (unsigned int i = 0; i < pScene->mRootNode->mNumMeshes; ++i) { - pScene->mRootNode->mMeshes[i] = i; - } } void PLYImporter::LoadVertex(const PLY::Element* pcElement, const PLY::ElementInstance* instElement, unsigned int pos) { @@ -521,9 +501,7 @@ void PLYImporter::LoadVertex(const PLY::Element* pcElement, const PLY::ElementIn // ------------------------------------------------------------------------------------------------ // Convert a color component to [0...1] -ai_real PLYImporter::NormalizeColorValue(PLY::PropertyInstance::ValueUnion val, - PLY::EDataType eType) -{ +ai_real PLYImporter::NormalizeColorValue(PLY::PropertyInstance::ValueUnion val, PLY::EDataType eType) { switch (eType) { case EDT_Float: diff --git a/code/PlyLoader.h b/code/PlyLoader.h index beada5f23..9199e17d7 100644 --- a/code/PlyLoader.h +++ b/code/PlyLoader.h @@ -57,7 +57,6 @@ struct aiMesh; namespace Assimp { - using namespace PLY; // --------------------------------------------------------------------------- diff --git a/code/PlyParser.h b/code/PlyParser.h index cba48a4b6..261ac7b82 100644 --- a/code/PlyParser.h +++ b/code/PlyParser.h @@ -39,12 +39,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ - /** @file Defines the helper data structures for importing PLY files */ +#pragma once #ifndef AI_PLYFILEHELPER_H_INC #define AI_PLYFILEHELPER_H_INC - #include #include #include @@ -58,8 +57,7 @@ class PLYImporter; // http://local.wasp.uwa.edu.au/~pbourke/dataformats/ply/ // http://w3.impa.br/~lvelho/outgoing/sossai/old/ViHAP_D4.4.2_PLY_format_v1.1.pdf // http://www.okino.com/conv/exp_ply.htm -namespace PLY -{ +namespace PLY { // --------------------------------------------------------------------------------- /* @@ -78,8 +76,7 @@ int8 int16 uint8 ... forms are also used */ -enum EDataType -{ +enum EDataType { EDT_Char = 0x0u, EDT_UChar, EDT_Short, @@ -98,8 +95,7 @@ enum EDataType * * Semantics define the usage of a property, e.g. x coordinate */ -enum ESemantic -{ +enum ESemantic { //! vertex position x coordinate EST_XCoord = 0x0u, //! vertex position x coordinate @@ -182,15 +178,14 @@ enum ESemantic * * Semantics define the usage of an element, e.g. vertex or material */ -enum EElementSemantic -{ +enum EElementSemantic { //! The element is a vertex EEST_Vertex = 0x0u, //! The element is a face description (index table) EEST_Face, - //! The element is a tristrip description (index table) + //! The element is a triangle-strip description (index table) EEST_TriStrip, //! The element is an edge description (ignored) @@ -211,17 +206,16 @@ enum EElementSemantic * * This can e.g. be a part of the vertex declaration */ -class Property -{ +class Property { public: - //! Default constructor Property() - : eType (EDT_Int), - Semantic(), - bIsList(false), - eFirstType(EDT_UChar) - {} + : eType (EDT_Int) + , Semantic() + , bIsList(false) + , eFirstType(EDT_UChar) { + // empty + } //! Data type of the property EDataType eType; @@ -260,15 +254,14 @@ public: * This can e.g. be the vertex declaration. Elements contain a * well-defined number of properties. */ -class Element -{ +class Element { public: - //! Default constructor Element() - : eSemantic (EEST_INVALID) - , NumOccur(0) - {} + : eSemantic (EEST_INVALID) + , NumOccur(0) { + // empty + } //! List of properties assigned to the element //! std::vector to support operator[] diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index cf3529653..4017ed596 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -1047,8 +1047,10 @@ void XFileParser::readHeadOfDataObject( std::string* poName) if( poName) *poName = nameOrBrace; - if( GetNextToken() != "{") - ThrowException( "Opening brace expected."); + if ( GetNextToken() != "{" ) { + delete mScene; + ThrowException( "Opening brace expected." ); + } } } @@ -1224,21 +1226,29 @@ void XFileParser::GetNextTokenAsString( std::string& poString) } FindNextNoneWhiteSpace(); - if( mP >= mEnd) - ThrowException( "Unexpected end of file while parsing string"); + if ( mP >= mEnd ) { + delete mScene; + ThrowException( "Unexpected end of file while parsing string" ); + } - if( *mP != '"') - ThrowException( "Expected quotation mark."); + if ( *mP != '"' ) { + delete mScene; + ThrowException( "Expected quotation mark." ); + } ++mP; while( mP < mEnd && *mP != '"') poString.append( mP++, 1); - if( mP >= mEnd-1) - ThrowException( "Unexpected end of file while parsing string"); + if ( mP >= mEnd - 1 ) { + delete mScene; + ThrowException( "Unexpected end of file while parsing string" ); + } - if( mP[1] != ';' || mP[0] != '"') - ThrowException( "Expected quotation mark and semicolon at the end of a string."); + if ( mP[ 1 ] != ';' || mP[ 0 ] != '"' ) { + delete mScene; + ThrowException( "Expected quotation mark and semicolon at the end of a string." ); + } mP+=2; } @@ -1449,15 +1459,15 @@ aiColor3D XFileParser::ReadRGB() // ------------------------------------------------------------------------------------------------ // Throws an exception with a line number and the given text. -AI_WONT_RETURN void XFileParser::ThrowException( const std::string& pText) -{ - if( mIsBinaryFormat) - throw DeadlyImportError( pText); - else +AI_WONT_RETURN void XFileParser::ThrowException( const std::string& pText) { + delete mScene; + if ( mIsBinaryFormat ) { + throw DeadlyImportError( pText ); + } else { throw DeadlyImportError( format() << "Line " << mLineNumber << ": " << pText ); + } } - // ------------------------------------------------------------------------------------------------ // Filters the imported hierarchy for some degenerated cases that some exporters produce. void XFileParser::FilterHierarchy( XFile::Node* pNode) diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index fdd20008d..633beda5f 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -103,3 +103,28 @@ TEST_F( utPLYImportExport, vertexColorTest ) { const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", 0 ); EXPECT_NE( nullptr, scene ); } + +static const char *test_file = + "ply\n" + "format ascii 1.0\n" + "element vertex 4\n" + "property float x\n" + "property float y\n" + "property float z\n" + "property uchar red\n" + "property uchar green\n" + "property uchar blue\n" + "property float nx\n" + "property float ny\n" + "property float nz\n" + "end_header\n" + "0.0 0.0 0.0 255 255 255 0.0 1.0 0.0\n" + "0.0 0.0 1.0 255 0 255 0.0 0.0 1.0\n" + "0.0 1.0 0.0 255 255 0 1.0 0.0 0.0\n" + "0.0 1.0 1.0 0 255 255 1.0 1.0 0.0\n"; + +TEST_F( utPLYImportExport, parseErrorTest ) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFileFromMemory( test_file, strlen( test_file ), 0 ); + EXPECT_NE( nullptr, scene ); +} From 57c1fe5954aa44107e86a7c17b0df2ff9a2cd846 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 6 Feb 2018 23:59:46 +0100 Subject: [PATCH 102/106] x-parser: fix the crash. --- code/XFileImporter.cpp | 341 ++++++++++++++++++----------------------- code/XFileParser.cpp | 1 - 2 files changed, 153 insertions(+), 189 deletions(-) diff --git a/code/XFileImporter.cpp b/code/XFileImporter.cpp index 93ae6173b..fd28fbb79 100644 --- a/code/XFileImporter.cpp +++ b/code/XFileImporter.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2018, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -44,7 +42,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Implementation of the XFile importer class */ - #ifndef ASSIMP_BUILD_NO_X_IMPORTER #include "XFileImporter.h" @@ -79,17 +76,19 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer XFileImporter::XFileImporter() -{} +: mBuffer() { + // empty +} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -XFileImporter::~XFileImporter() -{} +XFileImporter::~XFileImporter() { + // empty +} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const -{ +bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { std::string extension = GetExtension(pFile); if(extension == "x") { return true; @@ -104,23 +103,24 @@ bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, boo // ------------------------------------------------------------------------------------------------ // Get file extension list -const aiImporterDesc* XFileImporter::GetInfo () const -{ +const aiImporterDesc* XFileImporter::GetInfo () const { return &desc; } // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void XFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) -{ +void XFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { // read file into memory std::unique_ptr file( pIOHandler->Open( pFile)); - if( file.get() == NULL) - throw DeadlyImportError( "Failed to open file " + pFile + "."); + if ( file.get() == NULL ) { + throw DeadlyImportError( "Failed to open file " + pFile + "." ); + } + static const size_t MinSize = 16; size_t fileSize = file->FileSize(); - if( fileSize < 16) - throw DeadlyImportError( "XFile is too small."); + if ( fileSize < MinSize ) { + throw DeadlyImportError( "XFile is too small." ); + } // in the hope that binary files will never start with a BOM ... mBuffer.resize( fileSize + 1); @@ -134,8 +134,9 @@ void XFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene, I CreateDataRepresentationFromImport( pScene, parser.GetImportedData()); // if nothing came from it, report it as error - if( !pScene->mRootNode) - throw DeadlyImportError( "XFile is ill-formatted - no content imported."); + if ( !pScene->mRootNode ) { + throw DeadlyImportError( "XFile is ill-formatted - no content imported." ); + } } // ------------------------------------------------------------------------------------------------ @@ -146,17 +147,15 @@ void XFileImporter::CreateDataRepresentationFromImport( aiScene* pScene, XFile:: ConvertMaterials( pScene, pData->mGlobalMaterials); // copy nodes, extracting meshes and materials on the way - pScene->mRootNode = CreateNodes( pScene, NULL, pData->mRootNode); + pScene->mRootNode = CreateNodes( pScene, nullptr, pData->mRootNode); // extract animations CreateAnimations( pScene, pData); // read the global meshes that were stored outside of any node - if( pData->mGlobalMeshes.size() > 0) - { + if( !pData->mGlobalMeshes.empty() ) { // create a root node to hold them if there isn't any, yet - if( pScene->mRootNode == NULL) - { + if( pScene->mRootNode == nullptr ) { pScene->mRootNode = new aiNode; pScene->mRootNode->mName.Set( "$dummy_node"); } @@ -180,8 +179,7 @@ void XFileImporter::CreateDataRepresentationFromImport( aiScene* pScene, XFile:: flipper.Execute(pScene); // finally: create a dummy material if not material was imported - if( pScene->mNumMaterials == 0) - { + if( pScene->mNumMaterials == 0) { pScene->mNumMaterials = 1; // create the Material aiMaterial* mat = new aiMaterial; @@ -205,10 +203,10 @@ void XFileImporter::CreateDataRepresentationFromImport( aiScene* pScene, XFile:: // ------------------------------------------------------------------------------------------------ // Recursively creates scene nodes from the imported hierarchy. -aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFile::Node* pNode) -{ - if( !pNode) - return NULL; +aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFile::Node* pNode) { + if ( !pNode ) { + return nullptr; + } // create node aiNode* node = new aiNode; @@ -222,13 +220,13 @@ aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFil CreateMeshes( pScene, node, pNode->mMeshes); // handle childs - if( pNode->mChildren.size() > 0) - { + if( !pNode->mChildren.empty() ) { node->mNumChildren = (unsigned int)pNode->mChildren.size(); node->mChildren = new aiNode* [node->mNumChildren]; - for( unsigned int a = 0; a < pNode->mChildren.size(); a++) - node->mChildren[a] = CreateNodes( pScene, node, pNode->mChildren[a]); + for ( unsigned int a = 0; a < pNode->mChildren.size(); ++a ) { + node->mChildren[ a ] = CreateNodes( pScene, node, pNode->mChildren[ a ] ); + } } return node; @@ -236,16 +234,14 @@ aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFil // ------------------------------------------------------------------------------------------------ // Creates the meshes for the given node. -void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vector& pMeshes) -{ +void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vector& pMeshes) { if (pMeshes.empty()) { return; } // create a mesh for each mesh-material combination in the source node std::vector meshes; - for( unsigned int a = 0; a < pMeshes.size(); a++) - { + for( unsigned int a = 0; a < pMeshes.size(); ++a ) { XFile::Mesh* sourceMesh = pMeshes[a]; if ( nullptr == sourceMesh ) { continue; @@ -255,35 +251,30 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec ConvertMaterials( pScene, sourceMesh->mMaterials); unsigned int numMaterials = std::max( (unsigned int)sourceMesh->mMaterials.size(), 1u); - for( unsigned int b = 0; b < numMaterials; b++) - { + for( unsigned int b = 0; b < numMaterials; ++b ) { // collect the faces belonging to this material std::vector faces; unsigned int numVertices = 0; - if( sourceMesh->mFaceMaterials.size() > 0) - { + if( !sourceMesh->mFaceMaterials.empty() ) { // if there is a per-face material defined, select the faces with the corresponding material - for( unsigned int c = 0; c < sourceMesh->mFaceMaterials.size(); c++) - { - if( sourceMesh->mFaceMaterials[c] == b) - { + for( unsigned int c = 0; c < sourceMesh->mFaceMaterials.size(); ++c ) { + if( sourceMesh->mFaceMaterials[c] == b) { faces.push_back( c); numVertices += (unsigned int)sourceMesh->mPosFaces[c].mIndices.size(); } } - } else - { + } else { // if there is no per-face material, place everything into one mesh - for( unsigned int c = 0; c < sourceMesh->mPosFaces.size(); c++) - { + for( unsigned int c = 0; c < sourceMesh->mPosFaces.size(); ++c ) { faces.push_back( c); numVertices += (unsigned int)sourceMesh->mPosFaces[c].mIndices.size(); } } // no faces/vertices using this material? strange... - if( numVertices == 0) + if ( numVertices == 0 ) { continue; + } // create a submesh using this material aiMesh* mesh = new aiMesh; @@ -291,11 +282,9 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec // find the material in the scene's material list. Either own material // or referenced material, it should already have a valid index - if( sourceMesh->mFaceMaterials.size() > 0) - { + if( !sourceMesh->mFaceMaterials.empty() ) { mesh->mMaterialIndex = static_cast(sourceMesh->mMaterials[b].sceneIndex); - } else - { + } else { mesh->mMaterialIndex = 0; } @@ -310,28 +299,28 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec mesh->mName.Set(sourceMesh->mName); // normals? - if( sourceMesh->mNormals.size() > 0) - mesh->mNormals = new aiVector3D[numVertices]; + if ( sourceMesh->mNormals.size() > 0 ) { + mesh->mNormals = new aiVector3D[ numVertices ]; + } // texture coords - for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS; c++) - { - if( sourceMesh->mTexCoords[c].size() > 0) - mesh->mTextureCoords[c] = new aiVector3D[numVertices]; + for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++c ) { + if ( !sourceMesh->mTexCoords[ c ].empty() ) { + mesh->mTextureCoords[ c ] = new aiVector3D[ numVertices ]; + } } // vertex colors - for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS; c++) - { - if( sourceMesh->mColors[c].size() > 0) - mesh->mColors[c] = new aiColor4D[numVertices]; + for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS; ++c ) { + if ( !sourceMesh->mColors[ c ].empty() ) { + mesh->mColors[ c ] = new aiColor4D[ numVertices ]; + } } // now collect the vertex data of all data streams present in the imported mesh - unsigned int newIndex = 0; + unsigned int newIndex( 0 ); std::vector orgPoints; // from which original point each new vertex stems orgPoints.resize( numVertices, 0); - for( unsigned int c = 0; c < faces.size(); c++) - { + for( unsigned int c = 0; c < faces.size(); ++c ) { unsigned int f = faces[c]; // index of the source face const XFile::Face& pf = sourceMesh->mPosFaces[f]; // position source face @@ -341,30 +330,30 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec df.mIndices = new unsigned int[ df.mNumIndices]; // collect vertex data for indices of this face - for( unsigned int d = 0; d < df.mNumIndices; d++) - { + for( unsigned int d = 0; d < df.mNumIndices; ++d ) { df.mIndices[d] = newIndex; orgPoints[newIndex] = pf.mIndices[d]; // Position mesh->mVertices[newIndex] = sourceMesh->mPositions[pf.mIndices[d]]; // Normal, if present - if( mesh->HasNormals()) - mesh->mNormals[newIndex] = sourceMesh->mNormals[sourceMesh->mNormFaces[f].mIndices[d]]; + if ( mesh->HasNormals() ) { + mesh->mNormals[ newIndex ] = sourceMesh->mNormals[ sourceMesh->mNormFaces[ f ].mIndices[ d ] ]; + } // texture coord sets - for( unsigned int e = 0; e < AI_MAX_NUMBER_OF_TEXTURECOORDS; e++) - { - if( mesh->HasTextureCoords( e)) - { + for( unsigned int e = 0; e < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++e ) { + if( mesh->HasTextureCoords( e)) { aiVector2D tex = sourceMesh->mTexCoords[e][pf.mIndices[d]]; mesh->mTextureCoords[e][newIndex] = aiVector3D( tex.x, 1.0f - tex.y, 0.0f); } } // vertex color sets - for( unsigned int e = 0; e < AI_MAX_NUMBER_OF_COLOR_SETS; e++) - if( mesh->HasVertexColors( e)) - mesh->mColors[e][newIndex] = sourceMesh->mColors[e][pf.mIndices[d]]; + for ( unsigned int e = 0; e < AI_MAX_NUMBER_OF_COLOR_SETS; ++e ) { + if ( mesh->HasVertexColors( e ) ) { + mesh->mColors[ e ][ newIndex ] = sourceMesh->mColors[ e ][ pf.mIndices[ d ] ]; + } + } newIndex++; } @@ -376,28 +365,29 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec // convert all bones of the source mesh which influence vertices in this newly created mesh const std::vector& bones = sourceMesh->mBones; std::vector newBones; - for( unsigned int c = 0; c < bones.size(); c++) - { + for( unsigned int c = 0; c < bones.size(); ++c ) { const XFile::Bone& obone = bones[c]; // set up a vertex-linear array of the weights for quick searching if a bone influences a vertex std::vector oldWeights( sourceMesh->mPositions.size(), 0.0); - for( unsigned int d = 0; d < obone.mWeights.size(); d++) - oldWeights[obone.mWeights[d].mVertex] = obone.mWeights[d].mWeight; + for ( unsigned int d = 0; d < obone.mWeights.size(); ++d ) { + oldWeights[ obone.mWeights[ d ].mVertex ] = obone.mWeights[ d ].mWeight; + } // collect all vertex weights that influence a vertex in the new mesh std::vector newWeights; newWeights.reserve( numVertices); - for( unsigned int d = 0; d < orgPoints.size(); d++) - { + for( unsigned int d = 0; d < orgPoints.size(); ++d ) { // does the new vertex stem from an old vertex which was influenced by this bone? ai_real w = oldWeights[orgPoints[d]]; - if( w > 0.0) - newWeights.push_back( aiVertexWeight( d, w)); + if ( w > 0.0 ) { + newWeights.push_back( aiVertexWeight( d, w ) ); + } } // if the bone has no weights in the newly created mesh, ignore it - if( newWeights.size() == 0) + if ( newWeights.empty() ) { continue; + } // create aiBone* nbone = new aiBone; @@ -407,14 +397,14 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec nbone->mOffsetMatrix = obone.mOffsetMatrix; nbone->mNumWeights = (unsigned int)newWeights.size(); nbone->mWeights = new aiVertexWeight[nbone->mNumWeights]; - for( unsigned int d = 0; d < newWeights.size(); d++) - nbone->mWeights[d] = newWeights[d]; + for ( unsigned int d = 0; d < newWeights.size(); ++d ) { + nbone->mWeights[ d ] = newWeights[ d ]; + } } // store the bones in the mesh mesh->mNumBones = (unsigned int)newBones.size(); - if( newBones.size() > 0) - { + if( !newBones.empty()) { mesh->mBones = new aiBone*[mesh->mNumBones]; std::copy( newBones.begin(), newBones.end(), mesh->mBones); } @@ -424,8 +414,7 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec // reallocate scene mesh array to be large enough aiMesh** prevArray = pScene->mMeshes; pScene->mMeshes = new aiMesh*[pScene->mNumMeshes + meshes.size()]; - if( prevArray) - { + if( prevArray) { memcpy( pScene->mMeshes, prevArray, pScene->mNumMeshes * sizeof( aiMesh*)); delete [] prevArray; } @@ -435,8 +424,7 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec pNode->mMeshes = new unsigned int[pNode->mNumMeshes]; // store all meshes in the mesh library of the scene and store their indices in the node - for( unsigned int a = 0; a < meshes.size(); a++) - { + for( unsigned int a = 0; a < meshes.size(); a++) { pScene->mMeshes[pScene->mNumMeshes] = meshes[a]; pNode->mMeshes[a] = pScene->mNumMeshes; pScene->mNumMeshes++; @@ -445,16 +433,15 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec // ------------------------------------------------------------------------------------------------ // Converts the animations from the given imported data and creates them in the scene. -void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData) -{ +void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData) { std::vector newAnims; - for( unsigned int a = 0; a < pData->mAnims.size(); a++) - { + for( unsigned int a = 0; a < pData->mAnims.size(); ++a ) { const XFile::Animation* anim = pData->mAnims[a]; // some exporters mock me with empty animation tags. - if( anim->mAnims.size() == 0) + if ( anim->mAnims.empty() ) { continue; + } // create a new animation to hold the data aiAnimation* nanim = new aiAnimation; @@ -466,15 +453,14 @@ void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData nanim->mNumChannels = (unsigned int)anim->mAnims.size(); nanim->mChannels = new aiNodeAnim*[nanim->mNumChannels]; - for( unsigned int b = 0; b < anim->mAnims.size(); b++) - { + for( unsigned int b = 0; b < anim->mAnims.size(); ++b ) { const XFile::AnimBone* bone = anim->mAnims[b]; aiNodeAnim* nbone = new aiNodeAnim; nbone->mNodeName.Set( bone->mBoneName); nanim->mChannels[b] = nbone; // keyframes are given as combined transformation matrix keys - if( bone->mTrafoKeys.size() > 0) + if( !bone->mTrafoKeys.empty() ) { nbone->mNumPositionKeys = (unsigned int)bone->mTrafoKeys.size(); nbone->mPositionKeys = new aiVectorKey[nbone->mNumPositionKeys]; @@ -483,8 +469,7 @@ void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData nbone->mNumScalingKeys = (unsigned int)bone->mTrafoKeys.size(); nbone->mScalingKeys = new aiVectorKey[nbone->mNumScalingKeys]; - for( unsigned int c = 0; c < bone->mTrafoKeys.size(); c++) - { + for( unsigned int c = 0; c < bone->mTrafoKeys.size(); ++c) { // deconstruct each matrix into separate position, rotation and scaling double time = bone->mTrafoKeys[c].mTime; aiMatrix4x4 trafo = bone->mTrafoKeys[c].mMatrix; @@ -516,13 +501,11 @@ void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData // longest lasting key sequence determines duration nanim->mDuration = std::max( nanim->mDuration, bone->mTrafoKeys.back().mTime); - } else - { + } else { // separate key sequences for position, rotation, scaling nbone->mNumPositionKeys = (unsigned int)bone->mPosKeys.size(); nbone->mPositionKeys = new aiVectorKey[nbone->mNumPositionKeys]; - for( unsigned int c = 0; c < nbone->mNumPositionKeys; c++) - { + for( unsigned int c = 0; c < nbone->mNumPositionKeys; ++c ) { aiVector3D pos = bone->mPosKeys[c].mValue; nbone->mPositionKeys[c].mTime = bone->mPosKeys[c].mTime; @@ -532,8 +515,7 @@ void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData // rotation nbone->mNumRotationKeys = (unsigned int)bone->mRotKeys.size(); nbone->mRotationKeys = new aiQuatKey[nbone->mNumRotationKeys]; - for( unsigned int c = 0; c < nbone->mNumRotationKeys; c++) - { + for( unsigned int c = 0; c < nbone->mNumRotationKeys; ++c ) { aiMatrix3x3 rotmat = bone->mRotKeys[c].mValue.GetMatrix(); nbone->mRotationKeys[c].mTime = bone->mRotKeys[c].mTime; @@ -573,56 +555,51 @@ void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData void XFileImporter::ConvertMaterials( aiScene* pScene, std::vector& pMaterials) { // count the non-referrer materials in the array - unsigned int numNewMaterials = 0; - for( unsigned int a = 0; a < pMaterials.size(); a++) - if( !pMaterials[a].mIsReference) - numNewMaterials++; + unsigned int numNewMaterials( 0 ); + for ( unsigned int a = 0; a < pMaterials.size(); ++a ) { + if ( !pMaterials[ a ].mIsReference ) { + ++numNewMaterials; + } + } // resize the scene's material list to offer enough space for the new materials - if( numNewMaterials > 0 ) - { - aiMaterial** prevMats = pScene->mMaterials; - pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials + numNewMaterials]; - if( prevMats) - { - memcpy( pScene->mMaterials, prevMats, pScene->mNumMaterials * sizeof( aiMaterial*)); - delete [] prevMats; - } - } + if( numNewMaterials > 0 ) { + aiMaterial** prevMats = pScene->mMaterials; + pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials + numNewMaterials]; + if( nullptr != prevMats) { + ::memcpy( pScene->mMaterials, prevMats, pScene->mNumMaterials * sizeof( aiMaterial*)); + delete [] prevMats; + } + } // convert all the materials given in the array - for( unsigned int a = 0; a < pMaterials.size(); a++) - { + for( unsigned int a = 0; a < pMaterials.size(); ++a ) { XFile::Material& oldMat = pMaterials[a]; - if( oldMat.mIsReference) - { - // find the material it refers to by name, and store its index - for( size_t a = 0; a < pScene->mNumMaterials; ++a ) - { - aiString name; - pScene->mMaterials[a]->Get( AI_MATKEY_NAME, name); - if( strcmp( name.C_Str(), oldMat.mName.data()) == 0 ) - { - oldMat.sceneIndex = a; - break; + if( oldMat.mIsReference) { + // find the material it refers to by name, and store its index + for( size_t a = 0; a < pScene->mNumMaterials; ++a ) { + aiString name; + pScene->mMaterials[a]->Get( AI_MATKEY_NAME, name); + if( strcmp( name.C_Str(), oldMat.mName.data()) == 0 ) { + oldMat.sceneIndex = a; + break; + } + } + + if( oldMat.sceneIndex == SIZE_MAX ) { + DefaultLogger::get()->warn( format() << "Could not resolve global material reference \"" << oldMat.mName << "\"" ); + oldMat.sceneIndex = 0; + } + + continue; } - } - - if( oldMat.sceneIndex == SIZE_MAX ) - { - DefaultLogger::get()->warn( format() << "Could not resolve global material reference \"" << oldMat.mName << "\"" ); - oldMat.sceneIndex = 0; - } - - continue; - } aiMaterial* mat = new aiMaterial; aiString name; name.Set( oldMat.mName); mat->AddProperty( &name, AI_MATKEY_NAME); - // Shading model: hardcoded to PHONG, there is no such information in an XFile + // Shading model: hard-coded to PHONG, there is no such information in an XFile // FIX (aramis): If the specular exponent is 0, use gouraud shading. This is a bugfix // for some models in the SDK (e.g. good old tiny.x) int shadeMode = (int)oldMat.mSpecularExponent == 0.0f @@ -630,8 +607,8 @@ void XFileImporter::ConvertMaterials( aiScene* pScene, std::vectorAddProperty( &shadeMode, 1, AI_MATKEY_SHADING_MODEL); // material colours - // Unclear: there's no ambient colour, but emissive. What to put for ambient? - // Probably nothing at all, let the user select a suitable default. + // Unclear: there's no ambient colour, but emissive. What to put for ambient? + // Probably nothing at all, let the user select a suitable default. mat->AddProperty( &oldMat.mEmissive, 1, AI_MATKEY_COLOR_EMISSIVE); mat->AddProperty( &oldMat.mDiffuse, 1, AI_MATKEY_COLOR_DIFFUSE); mat->AddProperty( &oldMat.mSpecular, 1, AI_MATKEY_COLOR_SPECULAR); @@ -639,36 +616,33 @@ void XFileImporter::ConvertMaterials( aiScene* pScene, std::vectorAddProperty( &tex, AI_MATKEY_TEXTURE_NORMALS(0)); - else - mat->AddProperty( &tex, AI_MATKEY_TEXTURE_DIFFUSE(0)); + if ( otex.mIsNormalMap ) { + mat->AddProperty( &tex, AI_MATKEY_TEXTURE_NORMALS( 0 ) ); + } else { + mat->AddProperty( &tex, AI_MATKEY_TEXTURE_DIFFUSE( 0 ) ); + } } - } - else - { + } else { // Otherwise ... try to search for typical strings in the // texture's file name like 'bump' or 'diffuse' unsigned int iHM = 0,iNM = 0,iDM = 0,iSM = 0,iAM = 0,iEM = 0; - for( unsigned int b = 0; b < oldMat.mTextures.size(); b++) - { + for( unsigned int b = 0; b < oldMat.mTextures.size(); ++b ) { const XFile::TexEntry& otex = oldMat.mTextures[b]; std::string sz = otex.mName; - if (!sz.length())continue; - + if ( !sz.length() ) { + continue; + } // find the file name - //const size_t iLen = sz.length(); std::string::size_type s = sz.find_last_of("\\/"); - if (std::string::npos == s) + if ( std::string::npos == s ) { s = 0; + } // cut off the file extension std::string::size_type sExt = sz.find_last_of('.'); @@ -677,36 +651,27 @@ void XFileImporter::ConvertMaterials( aiScene* pScene, std::vectorAddProperty( &tex, AI_MATKEY_TEXTURE_HEIGHT(iHM++)); - } else - if (otex.mIsNormalMap || std::string::npos != sz.find( "normal", s) || std::string::npos != sz.find("nm", s)) - { + } else if (otex.mIsNormalMap || std::string::npos != sz.find( "normal", s) || std::string::npos != sz.find("nm", s)) { mat->AddProperty( &tex, AI_MATKEY_TEXTURE_NORMALS(iNM++)); - } else - if (std::string::npos != sz.find( "spec", s) || std::string::npos != sz.find( "glanz", s)) - { + } else if (std::string::npos != sz.find( "spec", s) || std::string::npos != sz.find( "glanz", s)) { mat->AddProperty( &tex, AI_MATKEY_TEXTURE_SPECULAR(iSM++)); - } else - if (std::string::npos != sz.find( "ambi", s) || std::string::npos != sz.find( "env", s)) - { + } else if (std::string::npos != sz.find( "ambi", s) || std::string::npos != sz.find( "env", s)) { mat->AddProperty( &tex, AI_MATKEY_TEXTURE_AMBIENT(iAM++)); - } else - if (std::string::npos != sz.find( "emissive", s) || std::string::npos != sz.find( "self", s)) - { + } else if (std::string::npos != sz.find( "emissive", s) || std::string::npos != sz.find( "self", s)) { mat->AddProperty( &tex, AI_MATKEY_TEXTURE_EMISSIVE(iEM++)); - } else - { + } else { // Assume it is a diffuse texture mat->AddProperty( &tex, AI_MATKEY_TEXTURE_DIFFUSE(iDM++)); } diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 4017ed596..bda59ba59 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -1460,7 +1460,6 @@ aiColor3D XFileParser::ReadRGB() // ------------------------------------------------------------------------------------------------ // Throws an exception with a line number and the given text. AI_WONT_RETURN void XFileParser::ThrowException( const std::string& pText) { - delete mScene; if ( mIsBinaryFormat ) { throw DeadlyImportError( pText ); } else { From 990dc983ed2634bc764e6c4c1e6d63499eff6d58 Mon Sep 17 00:00:00 2001 From: Max Vollmer Date: Wed, 7 Feb 2018 10:48:39 +0100 Subject: [PATCH 103/106] Issue #1776 Fixed potential crash bug in ObjectCompare, because it didn't follow strict weak ordering. As counter-intuitive as it seems, a comparator must return false for equal values. The C++ standard defines and expects this behavior: true if lhs < rhs, false otherwise. --- code/BlenderIntermediate.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/BlenderIntermediate.h b/code/BlenderIntermediate.h index 74184a1f1..f3d34d1b2 100644 --- a/code/BlenderIntermediate.h +++ b/code/BlenderIntermediate.h @@ -122,9 +122,11 @@ namespace Blender { # pragma warning(disable:4351) #endif + // As counter-intuitive as it may seem, a comparator must return false for equal values. + // The C++ standard defines and expects this behavior: true if lhs < rhs, false otherwise. struct ObjectCompare { bool operator() (const Object* left, const Object* right) const { - return ::strncmp(left->id.name, right->id.name, strlen( left->id.name ) ) == 0; + return ::strncmp(left->id.name, right->id.name, strlen( left->id.name ) ) < 0; } }; @@ -143,9 +145,11 @@ namespace Blender { , db(db) {} + // As counter-intuitive as it may seem, a comparator must return false for equal values. + // The C++ standard defines and expects this behavior: true if lhs < rhs, false otherwise. struct ObjectCompare { bool operator() (const Object* left, const Object* right) const { - return ::strncmp( left->id.name, right->id.name, strlen( left->id.name ) ) == 0; + return ::strncmp( left->id.name, right->id.name, strlen( left->id.name ) ) < 0; } }; From b3d48d0e9a5e815c2a4acc7662736bb902a362cd Mon Sep 17 00:00:00 2001 From: Max Vollmer Date: Wed, 7 Feb 2018 11:02:08 +0100 Subject: [PATCH 104/106] Issue #1776: Updated and fixed test in utBlenderIntermediate.cpp for Blender::ObjectCompare --- test/unit/utBlenderIntermediate.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/unit/utBlenderIntermediate.cpp b/test/unit/utBlenderIntermediate.cpp index 9146d6d1e..55490e613 100644 --- a/test/unit/utBlenderIntermediate.cpp +++ b/test/unit/utBlenderIntermediate.cpp @@ -57,17 +57,26 @@ class BlenderIntermediateTest : public ::testing::Test { #define NAME_1 "name1" #define NAME_2 "name2" +// Updated this test after fixing #1776: +// A comparator in C++ is used for ordering and must implement strict weak ordering, +// which means it must return false for equal values. +// The C++ standard defines and expects this behavior: true if lhs < rhs, false otherwise. TEST_F( BlenderIntermediateTest,ConversionData_ObjectCompareTest ) { Object obj1, obj2; strncpy( obj1.id.name, NAME_1, sizeof(NAME_1) ); strncpy( obj2.id.name, NAME_2, sizeof(NAME_2) ); - Blender::ObjectCompare cmp_false; - bool res( cmp_false( &obj1, &obj2 ) ); + + Blender::ObjectCompare cmp_true_because_first_is_smaller_than_second; + bool res( cmp_true_because_first_is_smaller_than_second( &obj1, &obj2 ) ); + EXPECT_TRUE( res ); + + Blender::ObjectCompare cmp_false_because_equal; + res = cmp_false_because_equal( &obj1, &obj1 ); EXPECT_FALSE( res ); - Blender::ObjectCompare cmp_true; - res = cmp_true( &obj1, &obj1 ); - EXPECT_TRUE( res ); + Blender::ObjectCompare cmp_false_because_first_is_greater_than_second; + res = cmp_false_because_first_is_greater_than_second( &obj2, &obj1 ); + EXPECT_FALSE( res ); } From c7ea536351ffe7114992a1903af0de0ead46e8b5 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 7 Feb 2018 20:21:05 +0100 Subject: [PATCH 105/106] closes https://github.com/assimp/assimp/issues/1386: fix undefined behaviour in compare function. --- code/BlenderDNA.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/BlenderDNA.cpp b/code/BlenderDNA.cpp index 285cb05b8..1d88f8fa6 100644 --- a/code/BlenderDNA.cpp +++ b/code/BlenderDNA.cpp @@ -58,12 +58,11 @@ using namespace Assimp::Formatter; static bool match4(StreamReaderAny& stream, const char* string) { ai_assert( nullptr != string ); - char tmp[] = { - (const char)(stream).GetI1(), - (const char)(stream).GetI1(), - (const char)(stream).GetI1(), - (const char)(stream).GetI1() - }; + char tmp[4]; + tmp[ 0 ] = ( stream ).GetI1(); + tmp[ 1 ] = ( stream ).GetI1(); + tmp[ 2 ] = ( stream ).GetI1(); + tmp[ 3 ] = ( stream ).GetI1(); return (tmp[0]==string[0] && tmp[1]==string[1] && tmp[2]==string[2] && tmp[3]==string[3]); } From 674a47dd3eaffa1a89db75d258d2a2cd190cbcec Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 8 Feb 2018 20:24:18 +0100 Subject: [PATCH 106/106] closes https://github.com/assimp/assimp/issues/567: prevend dependency cycle --- code/ASELoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index 122b226f4..32b0eae2d 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -583,7 +583,7 @@ void ASEImporter::AddNodes (const std::vector& nodes, node->mTransformation = mParentAdjust*snode->mTransform; // Add sub nodes - prevent stack overflow due to recursive parenting - if (node->mName != node->mParent->mName) { + if (node->mName != node->mParent->mName && node->mName != node->mParent->mParent->mName ) { AddNodes(nodes,node,node->mName.data,snode->mTransform); }