Index: ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json =================================================================== --- ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json (revision 24322) +++ ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json (revision 24323) @@ -1,276 +1,277 @@ { "Title": "Programming", "Content": [ { "Title": "Programming managers", "List": [ { "nick": "Acumen", "name": "Stuart Walpole" }, { "nick": "Dak Lozar", "name": "Dave Loeser" }, { "nick": "h20", "name": "Daniel Wilhelm" }, { "nick": "Janwas", "name": "Jan Wassenberg" }, { "nick": "Raj", "name": "Raj Sharma" } ] }, { "Subtitle": "Special thanks to", "List": [ { "nick": "leper", "name": "Georg Kilzer" }, { "nick": "Ykkrosh", "name": "Philip Taylor" } ] }, { "List": [ { "nick": "01d55" }, { "nick": "aBothe", "name": "Alexander Bothe" }, { "nick": "Acumen", "name": "Stuart Walpole" }, { "nick": "adrian", "name": "Adrian Boguszewszki" }, { "name": "Adrian Fatol" }, { "nick": "AI-Amsterdam" }, { "nick": "Alan", "name": "Alan Kemp" }, { "nick": "Alex", "name": "Alexander Yakobovich" }, { "nick": "alpha123", "name": "Peter P. Cannici" }, { "nick": "Ampaex", "name": "Antonio Vazquez" }, { "name": "André Puel" }, { "nick": "andy5995", "name": "Andy Alt" }, { "nick": "Angen" }, { "nick": "Arfrever", "name": "Arfrever Frehtes Taifersar Arahesis" }, { "nick": "ArnH", "name": "Arno Hemelhof" }, { "nick": "Aurium", "name": "Aurélio Heckert" }, { "nick": "badmadblacksad", "name": "Martin F" }, { "nick": "badosu", "name": "Amadeus Folego" }, { "nick": "bb", "name": "Bouke Jansen" }, { "nick": "Ben", "name": "Ben Vinegar" }, { "nick": "Bird" }, { "nick": "Blue", "name": "Richard Welsh" }, { "nick": "bmwiedemann" }, { "nick": "boeseRaupe", "name": "Michael Kluge" }, { "nick": "bog_dan_ro", "name": "BogDan Vatra" }, { "nick": "Bonk", "name": "Christopher Ebbert" }, { "nick": "Boudica" }, { "nick": "Caius", "name": "Lars Kemmann" }, { "nick": "Calefaction", "name": "Matt Holmes" }, { "nick": "Calvinh", "name": "Carl-Johan Höiby" }, { "nick": "causative", "name": "Bart Parkis" }, { "name": "Cédric Houbart" }, { "nick": "Chakakhan", "name": "Kenny Long" }, { "nick": "Clockwork-Muse", "name": "Stephen A. Imhoff" }, { "nick": "Cracker78", "name": "Chad Heim" }, { "nick": "Crynux", "name": "Stephen J. Fewer" }, { "nick": "cwprogger" }, { "nick": "cygal", "name": "Quentin Pradet" }, { "nick": "Dak Lozar", "name": "Dave Loeser" }, { "nick": "dalerank", "name": "Sergey Kushnirenko" }, { "nick": "dan", "name": "Dan Strandberg" }, { "nick": "DanCar", "name": "Daniel Cardenas" }, { "nick": "danger89", "name": "Melroy van den Berg" }, { "name": "Daniel Trevitz" }, { "nick": "Dariost", "name": "Dario Ostuni" }, { "nick": "Dave", "name": "David Protasowski" }, { "nick": "dax", "name": "Dacian Fiordean" }, { "nick": "deebee", "name": "Deepak Anthony" }, { "nick": "Deiz" }, { "nick": "Dietger", "name": "Dietger van Antwerpen" }, { "nick": "DigitalSeraphim", "name": "Nick Owens" }, { "nick": "dp304" }, { "nick": "dpiquet", "name": "Damien Piquet" }, { "nick": "dumbo" }, { "nick": "Dunedan", "name": "Daniel Roschka" }, { "nick": "dvangennip", "name": "Doménique" }, { "nick": "Echelon9", "name": "Rhys Kidd" }, { "nick": "echotangoecho" }, { "nick": "eihrul", "name": "Lee Salzman" }, { "nick": "elexis", "name": "Alexander Heinsius" }, { "nick": "EmjeR", "name": "Matthijs de Rijk" }, { "nick": "EMontana" }, { "nick": "ericb" }, { "nick": "evanssthomas", "name": "Evans Thomas" }, { "nick": "Evulant", "name": "Alexander S." }, { "nick": "fabio", "name": "Fabio Pedretti" }, { "nick": "falsevision", "name": "Mahdi Khodadadifard" }, { "nick": "fatherbushido", "name": "Nicolas Tisserand" }, { "nick": "fcxSanya", "name": "Alexander Olkhovskiy" }, { "nick": "FeXoR", "name": "Florian Finke" }, { "nick": "Fire Giant", "name": "Malte Schwarzkopf" }, { "name": "Fork AD" }, { "nick": "fpre", "name": "Frederick Stallmeyer" }, { "nick": "Freagarach" }, { "nick": "freenity", "name": "Anton Galitch" }, { "nick": "Gallaecio", "name": "Adrián Chaves" }, { "nick": "gbish (aka Iny)", "name": "Grant Bishop" }, { "nick": "Gee", "name": "Gustav Larsson" }, { "nick": "Gentz", "name": "Hal Gentz" }, { "nick": "gerbilOFdoom" }, { "nick": "godlikeldh" }, { "nick": "greybeard", "name": "Joe Cocovich" }, { "nick": "grillaz" }, { "nick": "Grugnas", "name": "Giuseppe Tranchese" }, { "nick": "gudo" }, { "nick": "Guuts", "name": "Matthew Guttag" }, { "nick": "h20", "name": "Daniel Wilhelm" }, { "nick": "Hannibal_Barca", "name": "Clive Juhász S." }, { "nick": "Haommin" }, { "nick": "happyconcepts", "name": "Ben Bird" }, { "nick": "historic_bruno", "name": "Ben Brian" }, { "nick": "idanwin" }, { "nick": "Imarok", "name": "J. S." }, { "nick": "Inari" }, { "nick": "infyquest", "name": "Vijay Kiran Kamuju" }, { "nick": "irishninja", "name": "Brian Broll" }, { "nick": "IronNerd", "name": "Matthew McMullan" }, { "nick": "Itms", "name": "Nicolas Auvray" }, { "nick": "Jaison", "name": "Marco tom Suden" }, { "nick": "jammus", "name": "James Scott" }, { "nick": "Janwas", "name": "Jan Wassenberg" }, { "nick": "javiergodas", "name": "Javier Godas Vieitez" }, { "nick": "Jgwman" }, { "nick": "JonBaer", "name": "Jon Baer" }, { "nick": "Josh", "name": "Joshua J. Bakita" }, { "nick": "joskar", "name": "Johnny Oskarsson" }, { "nick": "jP_wanN", "name": "Jonas Platte" }, { "nick": "Jubalbarca", "name": "James Baillie" }, { "nick": "JubJub", "name": "Sebastian Vetter" }, { "nick": "jurgemaister" }, { "nick": "kabzerek", "name": "Grzegorz Kabza" }, { "nick": "Kai", "name": "Kai Chen" }, { "name": "Kareem Ergawy" }, { "nick": "kevmo", "name": "Kevin Caffrey" }, { "nick": "kezz", "name": "Graeme Kerry" }, { "nick": "kingadami", "name": "Adam Winsor" }, { "nick": "kingbasil", "name": "Giannis Fafalios" }, { "nick": "Krinkle", "name": "Timo Tijhof" }, { "nick": "lafferjm", "name": "Justin Lafferty" }, { "nick": "LeanderH", "name": "Leander Hemelhof" }, { "nick": "leper", "name": "Georg Kilzer" }, { "nick": "Link Mauve", "name": "Emmanuel Gil Peyrot" }, { "nick": "LittleDev" }, { "nick": "livingaftermidnight", "name": "Will Dull" }, { "nick": "Louhike" }, { "nick": "lsdh" }, { "nick": "Ludovic", "name": "Ludovic Rousseau" }, { "nick": "luiko", "name": "Luis Carlos Garcia Barajas" }, { "nick": "m0l0t0ph", "name": "Christoph Gielisch" }, { "nick": "madmax", "name": "Abhijit Nandy" }, { "nick": "madpilot", "name": "Guido Falsi" }, { "nick": "markcho" }, { "nick": "MarkT", "name": "Mark Thompson" }, { "nick": "Markus" }, { "nick": "Mate-86", "name": "Mate Kovacs" }, { "nick": "Matei", "name": "Matei Zaharia" }, { "nick": "MattDoerksen", "name": "Matt Doerksen" }, { "nick": "mattlott", "name": "Matt Lott" }, { "nick": "maveric", "name": "Anton Protko" }, { "nick": "Micnasty", "name": "Travis Gorkin" }, { "name": "Mikołaj \"Bajter\" Korcz" }, { "nick": "mimo" }, { "nick": "mk12", "name": "Mitchell Kember" }, { "nick": "mmayfield45", "name": "Michael Mayfield" }, { "nick": "mmoanis", "name": "Mohamed Moanis" }, { "nick": "Molotov", "name": "Dario Alvarez" }, { "nick": "mpmoreti", "name": "Marcos Paulo Moreti" }, { "nick": "mreiland", "name": "Michael Reiland" }, { "nick": "myconid" }, { "nick": "nani", "name": "S. N." }, { "nick": "nd3c3nt", "name": "Gavin Fowler" }, { "nick": "nephele" }, { "nick": "Nescio" }, + { "nick": "NF", "name": "Nuno Ferreira" }, { "nick": "niektb", "name": "Niek ten Brinke" }, { "nick": "njm" }, { "nick": "NoMonkey", "name": "John Mena" }, { "nick": "norsnor" }, { "nick": "notpete", "name": "Rich Cross" }, { "nick": "nwtour" }, { "nick": "odoaker", "name": "Ágoston Sipos" }, { "nick": "Offensive ePeen", "name": "Jared Ryan Bills" }, { "nick": "Ols", "name": "Oliver Whiteman" }, { "nick": "olsner", "name": "Simon Brenner" }, { "nick": "OptimusShepard", "name": "Pirmin Stanglmeier" }, { "nick": "otero" }, { "nick": "Palaxin", "name": "David A. Freitag" }, { "name": "Paul Withers" }, { "nick": "paulobezerr", "name": "Paulo George Gomes Bezerra" }, { "nick": "pcpa", "name": "Paulo Andrade" }, { "nick": "Pendingchaos" }, { "nick": "PeteVasi", "name": "Pete Vasiliauskas" }, { "nick": "pilino1234" }, { "nick": "PingvinBetyar", "name": "Schronk Tamás" }, { "nick": "plugwash", "name": "Peter Michael Green" }, { "nick": "Polakrity" }, { "nick": "Poya", "name": "Poya Manouchehri" }, { "nick": "prefect", "name": "Nicolai Hähnle" }, { "nick": "Prodigal Son" }, { "nick": "pstumpf", "name": "Pascal Stumpf" }, { "nick": "pyrolink", "name": "Andrew Decker" }, { "nick": "quantumstate", "name": "Jonathan Waller" }, { "nick": "QuickShot", "name": "Walter Krawec" }, { "nick": "quonter" }, { "nick": "qwertz" }, { "nick": "Radagast" }, { "nick": "Raj", "name": "Raj Sharma" }, { "nick": "ramtzok1", "name": "Ram" }, { "nick": "rapidelectron", "name": "Christian Weihsbach" }, { "nick": "RedFox", "name": "Jorma Rebane" }, { "nick": "RefinedCode" }, { "nick": "Riemer" }, { "name": "Rolf Sievers" }, { "nick": "s0600204", "name": "Matthew Norwood" }, { "nick": "sacha_vrand", "name": "Sacha Vrand" }, { "nick": "SafaAlfulaij" }, { "name": "Samuel Guarnieri" }, { "nick": "Sandarac" }, { "nick": "sanderd17", "name": "Sander Deryckere" }, { "nick": "sathyam", "name": "Sathyam Vellal" }, { "nick": "sbirmi", "name": "Sharad Birmiwal" }, { "nick": "sbte", "name": "Sven Baars" }, { "nick": "scroogie", "name": "André Gemünd" }, { "nick": "scythetwirler", "name": "Casey X." }, { "nick": "serveurix" }, { "nick": "Shane", "name": "Shane Grant" }, { "nick": "shh" }, { "nick": "Silk", "name": "Josh Godsiff" }, { "nick": "silure" }, { "nick": "Simikolon", "name": "Yannick & Simon" }, { "nick": "smiley", "name": "M. L." }, { "nick": "Spahbod", "name": "Omid Davoodi" }, { "nick": "Stan", "name": "Stanislas Dolcini" }, { "nick": "Stefan" }, { "nick": "StefanBruens", "name": "Stefan Brüns" }, { "nick": "stilz", "name": "Sławomir Zborowski" }, { "nick": "stwf", "name": "Steven Fuchs" }, { "nick": "svott", "name": "Sven Ott" }, { "nick": "t4nk004" }, { "nick": "tau" }, { "nick": "tbm", "name": "Martin Michlmayr" }, { "nick": "Teiresias" }, { "nick": "temple" }, { "nick": "texane" }, { "nick": "thamlett", "name": "Timothy Hamlett" }, { "nick": "thedrunkyak", "name": "Dan Fuhr" }, { "nick": "Tobbi" }, { "nick": "TrinityDeath", "name": "Jethro Lu" }, { "nick": "triumvir", "name": "Corin Schedler" }, { "nick": "trompetin17", "name": "Juan Guillermo" }, { "nick": "user1", "name": "A. C." }, { "nick": "usey11" }, { "nick": "vincent_c", "name": "Vincent Cheng" }, { "nick": "vinhig", "name": "Vincent Higginson" }, { "nick": "vladislavbelov", "name": "Vladislav Belov" }, { "nick": "voroskoi" }, { "nick": "vts", "name": "Jeroen DR" }, { "nick": "wacko", "name": "Andrew Spiering" }, { "nick": "WhiteTreePaladin", "name": "Brian Ashley" }, { "nick": "wraitii", "name": "Lancelot de Ferrière le Vayer" }, { "nick": "Xentelian", "name": "Mark Strawson" }, { "nick": "Xienen", "name": "Dayle Flowers" }, { "nick": "xtizer", "name": "Matt Green" }, { "nick": "yashi", "name": "Yasushi Shoji" }, { "nick": "Ykkrosh", "name": "Philip Taylor" }, { "nick": "Yves" }, { "nick": "Zeusthor", "name": "Jeffrey Tavares" }, { "nick": "zoot" }, { "nick": "zsol", "name": "Zsolt Dollenstein" }, { "nick": "ztamas", "name": "Tamas Zolnai" }, { "nick": "Zyi", "name": "Charles De Meulenaer" } ] } ] } Index: ps/trunk/binaries/system/Collada.dll =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: ps/trunk/binaries/system/FCollada.dll =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: ps/trunk/binaries/system/FCollada.pdb =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: ps/trunk/binaries/system/FColladaD.dll =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: ps/trunk/binaries/system/FColladaD.pdb =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: ps/trunk/libraries/source/fcollada/build.sh =================================================================== --- ps/trunk/libraries/source/fcollada/build.sh (revision 24322) +++ ps/trunk/libraries/source/fcollada/build.sh (revision 24323) @@ -1,35 +1,43 @@ #!/bin/sh set -e -LIB_VERSION="fcollada-3.05+wildfiregames.4" +LIB_VERSION="fcollada-3.05+wildfiregames.5" JOBS=${JOBS:="-j2"} MAKE=${MAKE:="make"} LDFLAGS=${LDFLAGS:=""} CFLAGS=${CFLAGS:=""} CXXFLAGS=${CXXFLAGS:=""} if [ -e .already-built ] && [ "$(cat .already-built)" = "${LIB_VERSION}" ] then echo "FCollada is already up to date." exit fi echo "Building FCollada..." echo +if cc ./tests/ecvt.c -o /dev/null > /dev/null 2>&1; then + CXXFLAGS="${CXXFLAGS} -DHAS_ECVT=1" + echo "checking for ecvt... yes" +else + CXXFLAGS="${CXXFLAGS} -DHAS_ECVT=0" + echo "checking for ecvt... no" +fi + if [ "$(uname -s)" = "Darwin" ]; then # The Makefile refers to pkg-config for libxml2, but we # don't have that (replace with xml2-config instead). sed -i.bak -e 's/pkg-config libxml-2.0/xml2-config/' src/Makefile fi rm -f .already-built rm -f lib/*.a mkdir -p lib (cd src && rm -rf "output/" && "${MAKE}" clean && CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" && LDFLAGS="$LDFLAGS" "${MAKE}" "${JOBS}") || die "FCollada build failed" if [ "$(uname -s)" = "Darwin" ]; then # Undo Makefile change as we don't want to have it when creating patches. mv src/Makefile.bak src/Makefile fi echo "$LIB_VERSION" > .already-built Index: ps/trunk/libraries/source/fcollada/include/FUtils/FUStringBuilder.hpp =================================================================== --- ps/trunk/libraries/source/fcollada/include/FUtils/FUStringBuilder.hpp (revision 24322) +++ ps/trunk/libraries/source/fcollada/include/FUtils/FUStringBuilder.hpp (revision 24323) @@ -1,389 +1,418 @@ /* Copyright (C) 2005-2007 Feeling Software Inc. Portions of the code are: Copyright (C) 2005-2007 Sony Computer Entertainment America - - MIT License: http://www.opensource.org/licenses/mit-license.php + + MIT License: https://www.opensource.org/licenses/mit-license.php */ /* Based on the FS Import classes: Copyright (C) 2005-2006 Feeling Software Inc Copyright (C) 2005-2006 Autodesk Media Entertainment MIT License: http://www.opensource.org/licenses/mit-license.php */ +/* + musl + Copyright (C) 2005-2019 Rich Felker, et al. + https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT + MIT License: http://www.opensource.org/licenses/mit-license.php +*/ + #include #ifdef WIN32 #include #endif #ifdef WIN32 #define ecvt _ecvt -#endif // WIN32 +#elif !HAS_ECVT +#include +char* ecvt(double x, int n, int *dp, int *sign) +{ + static char buf[16]; + char tmp[32]; + int i, j; + + if (n - 1 > 15) + n = 15; + + sprintf(tmp, "%.*e", n - 1, x); + i = *sign = (tmp[0] == '-'); + + for (j = 0; tmp[i] != 'e'; j += (tmp[i++] != '.')) + buf[j] = tmp[i]; + + buf[j] = 0; + *dp = atoi(tmp + i + 1) + 1; + + return buf; +} +#endif #ifndef SAFE_DELETE_ARRAY -#define SAFE_DELETE_ARRAY(ptr) if (ptr != NULL) { delete [] ptr; ptr = NULL; } +#define SAFE_DELETE_ARRAY(ptr) { delete [] ptr; ptr = NULL; } #endif template void FloatToString(FloatType f, Char* sz) { Char* buffer = sz + 1; static const int digitCount = 6; int decimal, sign; // ecvt rounds the string for us: http://www.datafocus.com/docs/man3/ecvt.3.asp char* end = ecvt(f, digitCount, &decimal, &sign); if (sign != 0) (*buffer++) = '-'; int count = digitCount; if (decimal > digitCount) { // We use the scientific notation: P.MeX (*buffer++) = (*end++); // P is one character. (*buffer++) = '.'; // Mantissa (cleaned for zeroes) for (--count; count > 0; --count) if (end[count - 1] != '0') break; for (int i = 0; i < count; ++i) (*buffer++) = (*end++); if (buffer[-1] == '.') --buffer; // Exponent (*buffer++) = 'e'; uint32 exponent = decimal - 1; // X if (exponent >= 10) (*buffer++) = (Char) ('0' + (exponent / 10)); (*buffer++) = (Char) ('0' + (exponent % 10)); (*buffer) = 0; return; } else if (decimal > 0) { // Simple number: A.B for (int i = 0; i < decimal; ++i) (*buffer++) = (*end++); if (decimal < digitCount) (*buffer++) = '.'; count = digitCount - decimal; } else if (decimal < -digitCount) { // What case is this? decimal = count = 0; } else if (decimal < 0 || (decimal == 0 && *end != '0')) { // Tiny number: 0.Me-X (*buffer++) = '0'; (*buffer++) = '.'; for (int i = 0; i < -decimal; ++i) (*buffer++) = '0'; count = digitCount + decimal; } for (; count > 0; --count) if (end[count - 1] != '0') break; for (int i = 0; i < count; ++i) (*buffer++) = (*end++); if (decimal == 0 && count == 0) (*buffer++) = '0'; if (buffer[-1] == '.') --buffer; (*buffer) = 0; } template FUStringBuilderT::FUStringBuilderT(const String& sz) { this->buffer = NULL; this->size = 0; this->reserved = 0; - + reserve(sz.size() + 32); append(sz.c_str()); } template FUStringBuilderT::FUStringBuilderT(const Char* sz) { this->buffer = NULL; this->size = 0; this->reserved = 0; size_t len = 0; for (const Char* p = sz; *p != 0; ++p) ++len; reserve(len + 32); append(sz); } template FUStringBuilderT::FUStringBuilderT(Char ch, size_t count) { this->buffer = NULL; this->size = 0; this->reserved = 0; reserve(count + 32); for (size_t i = 0; i < count; ++i) buffer[size++] = ch; } template FUStringBuilderT::FUStringBuilderT(size_t reservation) { this->buffer = NULL; this->size = 0; this->reserved = 0; reserve(reservation); } template FUStringBuilderT::FUStringBuilderT() { this->buffer = NULL; this->size = 0; this->reserved = 0; #ifndef _DEBUG reserve(32); #endif } template FUStringBuilderT::~FUStringBuilderT() { reserve(0); } template void FUStringBuilderT::enlarge(size_t minimum) { reserve(max(reserved + minimum + 32, 2 * reserved + 32)); } template void FUStringBuilderT::clear() { size = 0; } template void FUStringBuilderT::reserve(size_t _length) { FUAssert(size <= reserved,); if (_length > reserved) { Char* b = new Char[_length]; memcpy(b, buffer, size * sizeof(Char)); SAFE_DELETE_ARRAY(buffer); buffer = b; reserved = _length; } else if (_length == 0) { SAFE_DELETE_ARRAY(buffer); size = reserved = 0; } else if (_length < reserved) { size_t realSize = min(size, _length); Char* b = new Char[_length]; memcpy(b, buffer, realSize * sizeof(Char)); SAFE_DELETE_ARRAY(buffer); buffer = b; reserved = _length; size = realSize; } } template void FUStringBuilderT::append(Char c) { if (size + 1 >= reserved) enlarge(2); buffer[size++] = c; } template void FUStringBuilderT::append(const String& sz) { append(sz.c_str()); } template void FUStringBuilderT::append(const Char* sz) { if (sz == NULL) return; // This is optimized for SMALL strings. for (; *sz != 0; ++sz) { if (size >= reserved) enlarge(64); buffer[size++] = *sz; } } template void FUStringBuilderT::append(const Char* sz, size_t len) { if (sz == NULL) return; if (size + len >= reserved) { enlarge(max((size_t)64, size + len + 1)); } memcpy(buffer + size, sz, len); size += len; } template void FUStringBuilderT::append(const FUStringBuilderT& b) { if (size + b.size >= reserved) enlarge(64 + size + b.size - reserved); memcpy(buffer + size, b.buffer, b.size * sizeof(Char)); size += b.size; } template void FUStringBuilderT::append(float f) { #ifdef WIN32 // use _isnan method to detect the 1.#IND00 NaN. if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN() && !_isnan((double)f)) #else if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN()) #endif { if (IsEquivalent(f, 0.0f, std::numeric_limits::epsilon())) append((Char)'0'); else { Char sz[128]; FloatToString(f, sz); append(sz + 1); } } else if (f == std::numeric_limits::infinity()) { append((Char)'I'); append((Char)'N'); append((Char)'F'); } else if (f == -std::numeric_limits::infinity()) { append((Char)'-'); append((Char)'I'); append((Char)'N'); append((Char)'F'); } else { append((Char)'N'); append((Char)'a'); append((Char)'N'); } } template void FUStringBuilderT::append(double f) { #ifdef WIN32 // use _isnan method to detect the .#IND00 NaN. if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN() && !_isnan(f)) #else if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN()) #endif { if (IsEquivalent(f, 0.0, std::numeric_limits::epsilon())) append((Char)'0'); else { Char sz[128]; FloatToString(f, sz); append(sz + 1); } } else if (f == std::numeric_limits::infinity()) { append((Char)'I'); append((Char)'N'); append((Char)'F'); } else if (f == -std::numeric_limits::infinity()) { append((Char)'-'); append((Char)'I'); append((Char)'N'); append((Char)'F'); } else { append((Char)'N'); append((Char)'a'); append((Char)'N'); } } template void FUStringBuilderT::append(const FMVector2& v) { if (!empty() && (back() != (Char) ' ' || back() != (Char) '\t' || back() != (Char) '\n' || back() != (Char) '\r')) { append((Char)' '); } append(v.x); append((Char)' '); append(v.y); } template void FUStringBuilderT::append(const FMVector3& v) { if (!empty() && (back() != (Char) ' ' || back() != (Char) '\t' || back() != (Char) '\n' || back() != (Char) '\r')) { append((Char)' '); } - append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); + append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); } template void FUStringBuilderT::append(const FMVector4& v) { if (!empty() && (back() != (Char) ' ' || back() != (Char) '\t' || back() != (Char) '\n' || back() != (Char) '\r')) { append((Char)' '); } - append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); append((Char)' '); append(v.w); + append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); append((Char)' '); append(v.w); } template void FUStringBuilderT::appendLine(const Char* sz) { append(sz); append((Char)'\n'); } template void FUStringBuilderT::appendHex(uint8 i) { uint8 top = (i & 0xF0) >> 4; uint8 bot = i & 0xF; if (top <= 0x9) append((Char) ('0' + top)); else append((Char) ('A' + (top - 0xA))); if (bot <= 0x9) append((Char) ('0' + bot)); else append((Char) ('A' + (bot - 0xA))); } template void FUStringBuilderT::remove(int32 start) { if ((int32)size > start && start >= 0) size = start; } template void FUStringBuilderT::remove(int32 start, int32 end) { int32 diff = end - start; if ((int32)size >= end && start >= 0 && diff > 0) { const Char* stop = buffer + size - diff; for (Char* p = buffer + start; p != stop; ++p) { *p = *(p + diff); } size -= diff; } } -template +template const Char* FUStringBuilderT::ToCharPtr() const { FUStringBuilderT* ncThis = const_cast< FUStringBuilderT* >(this); if (size + 1 > reserved) ncThis->enlarge(1); ncThis->buffer[size] = 0; return buffer; } template int32 FUStringBuilderT::index(Char c) const { if (buffer != NULL && size > 0) { const Char* end = buffer + size + 1; for (const Char* p = buffer; p != end; ++p) { if (*p == c) return (int32)(p - buffer); } } return -1; } template int32 FUStringBuilderT::rindex(Char c) const { if (buffer != NULL && size > 0) { for (const Char* p = buffer + size - 1; p != buffer; --p) { if (*p == c) return (int32)(p - buffer); } } return -1; } Index: ps/trunk/libraries/source/fcollada/src/FCollada/FUtils/FUStringBuilder.hpp =================================================================== --- ps/trunk/libraries/source/fcollada/src/FCollada/FUtils/FUStringBuilder.hpp (revision 24322) +++ ps/trunk/libraries/source/fcollada/src/FCollada/FUtils/FUStringBuilder.hpp (revision 24323) @@ -1,389 +1,418 @@ /* Copyright (C) 2005-2007 Feeling Software Inc. Portions of the code are: Copyright (C) 2005-2007 Sony Computer Entertainment America - - MIT License: http://www.opensource.org/licenses/mit-license.php + + MIT License: https://www.opensource.org/licenses/mit-license.php */ /* Based on the FS Import classes: Copyright (C) 2005-2006 Feeling Software Inc Copyright (C) 2005-2006 Autodesk Media Entertainment MIT License: http://www.opensource.org/licenses/mit-license.php */ +/* + musl + Copyright (C) 2005-2019 Rich Felker, et al. + https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT + MIT License: http://www.opensource.org/licenses/mit-license.php +*/ + #include #ifdef WIN32 #include #endif #ifdef WIN32 #define ecvt _ecvt -#endif // WIN32 +#elif !HAS_ECVT +#include +char* ecvt(double x, int n, int *dp, int *sign) +{ + static char buf[16]; + char tmp[32]; + int i, j; + + if (n - 1 > 15) + n = 15; + + sprintf(tmp, "%.*e", n - 1, x); + i = *sign = (tmp[0] == '-'); + + for (j = 0; tmp[i] != 'e'; j += (tmp[i++] != '.')) + buf[j] = tmp[i]; + + buf[j] = 0; + *dp = atoi(tmp + i + 1) + 1; + + return buf; +} +#endif #ifndef SAFE_DELETE_ARRAY -#define SAFE_DELETE_ARRAY(ptr) if (ptr != NULL) { delete [] ptr; ptr = NULL; } +#define SAFE_DELETE_ARRAY(ptr) { delete [] ptr; ptr = NULL; } #endif template void FloatToString(FloatType f, Char* sz) { Char* buffer = sz + 1; static const int digitCount = 6; int decimal, sign; // ecvt rounds the string for us: http://www.datafocus.com/docs/man3/ecvt.3.asp char* end = ecvt(f, digitCount, &decimal, &sign); if (sign != 0) (*buffer++) = '-'; int count = digitCount; if (decimal > digitCount) { // We use the scientific notation: P.MeX (*buffer++) = (*end++); // P is one character. (*buffer++) = '.'; // Mantissa (cleaned for zeroes) for (--count; count > 0; --count) if (end[count - 1] != '0') break; for (int i = 0; i < count; ++i) (*buffer++) = (*end++); if (buffer[-1] == '.') --buffer; // Exponent (*buffer++) = 'e'; uint32 exponent = decimal - 1; // X if (exponent >= 10) (*buffer++) = (Char) ('0' + (exponent / 10)); (*buffer++) = (Char) ('0' + (exponent % 10)); (*buffer) = 0; return; } else if (decimal > 0) { // Simple number: A.B for (int i = 0; i < decimal; ++i) (*buffer++) = (*end++); if (decimal < digitCount) (*buffer++) = '.'; count = digitCount - decimal; } else if (decimal < -digitCount) { // What case is this? decimal = count = 0; } else if (decimal < 0 || (decimal == 0 && *end != '0')) { // Tiny number: 0.Me-X (*buffer++) = '0'; (*buffer++) = '.'; for (int i = 0; i < -decimal; ++i) (*buffer++) = '0'; count = digitCount + decimal; } for (; count > 0; --count) if (end[count - 1] != '0') break; for (int i = 0; i < count; ++i) (*buffer++) = (*end++); if (decimal == 0 && count == 0) (*buffer++) = '0'; if (buffer[-1] == '.') --buffer; (*buffer) = 0; } template FUStringBuilderT::FUStringBuilderT(const String& sz) { this->buffer = NULL; this->size = 0; this->reserved = 0; - + reserve(sz.size() + 32); append(sz.c_str()); } template FUStringBuilderT::FUStringBuilderT(const Char* sz) { this->buffer = NULL; this->size = 0; this->reserved = 0; size_t len = 0; for (const Char* p = sz; *p != 0; ++p) ++len; reserve(len + 32); append(sz); } template FUStringBuilderT::FUStringBuilderT(Char ch, size_t count) { this->buffer = NULL; this->size = 0; this->reserved = 0; reserve(count + 32); for (size_t i = 0; i < count; ++i) buffer[size++] = ch; } template FUStringBuilderT::FUStringBuilderT(size_t reservation) { this->buffer = NULL; this->size = 0; this->reserved = 0; reserve(reservation); } template FUStringBuilderT::FUStringBuilderT() { this->buffer = NULL; this->size = 0; this->reserved = 0; #ifndef _DEBUG reserve(32); #endif } template FUStringBuilderT::~FUStringBuilderT() { reserve(0); } template void FUStringBuilderT::enlarge(size_t minimum) { reserve(max(reserved + minimum + 32, 2 * reserved + 32)); } template void FUStringBuilderT::clear() { size = 0; } template void FUStringBuilderT::reserve(size_t _length) { FUAssert(size <= reserved,); if (_length > reserved) { Char* b = new Char[_length]; memcpy(b, buffer, size * sizeof(Char)); SAFE_DELETE_ARRAY(buffer); buffer = b; reserved = _length; } else if (_length == 0) { SAFE_DELETE_ARRAY(buffer); size = reserved = 0; } else if (_length < reserved) { size_t realSize = min(size, _length); Char* b = new Char[_length]; memcpy(b, buffer, realSize * sizeof(Char)); SAFE_DELETE_ARRAY(buffer); buffer = b; reserved = _length; size = realSize; } } template void FUStringBuilderT::append(Char c) { if (size + 1 >= reserved) enlarge(2); buffer[size++] = c; } template void FUStringBuilderT::append(const String& sz) { append(sz.c_str()); } template void FUStringBuilderT::append(const Char* sz) { if (sz == NULL) return; // This is optimized for SMALL strings. for (; *sz != 0; ++sz) { if (size >= reserved) enlarge(64); buffer[size++] = *sz; } } template void FUStringBuilderT::append(const Char* sz, size_t len) { if (sz == NULL) return; if (size + len >= reserved) { enlarge(max((size_t)64, size + len + 1)); } memcpy(buffer + size, sz, len); size += len; } template void FUStringBuilderT::append(const FUStringBuilderT& b) { if (size + b.size >= reserved) enlarge(64 + size + b.size - reserved); memcpy(buffer + size, b.buffer, b.size * sizeof(Char)); size += b.size; } template void FUStringBuilderT::append(float f) { #ifdef WIN32 // use _isnan method to detect the 1.#IND00 NaN. if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN() && !_isnan((double)f)) #else if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN()) #endif { if (IsEquivalent(f, 0.0f, std::numeric_limits::epsilon())) append((Char)'0'); else { Char sz[128]; FloatToString(f, sz); append(sz + 1); } } else if (f == std::numeric_limits::infinity()) { append((Char)'I'); append((Char)'N'); append((Char)'F'); } else if (f == -std::numeric_limits::infinity()) { append((Char)'-'); append((Char)'I'); append((Char)'N'); append((Char)'F'); } else { append((Char)'N'); append((Char)'a'); append((Char)'N'); } } template void FUStringBuilderT::append(double f) { #ifdef WIN32 // use _isnan method to detect the .#IND00 NaN. if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN() && !_isnan(f)) #else if (f != std::numeric_limits::infinity() && f != -std::numeric_limits::infinity() && f != std::numeric_limits::quiet_NaN() && f != std::numeric_limits::signaling_NaN()) #endif { if (IsEquivalent(f, 0.0, std::numeric_limits::epsilon())) append((Char)'0'); else { Char sz[128]; FloatToString(f, sz); append(sz + 1); } } else if (f == std::numeric_limits::infinity()) { append((Char)'I'); append((Char)'N'); append((Char)'F'); } else if (f == -std::numeric_limits::infinity()) { append((Char)'-'); append((Char)'I'); append((Char)'N'); append((Char)'F'); } else { append((Char)'N'); append((Char)'a'); append((Char)'N'); } } template void FUStringBuilderT::append(const FMVector2& v) { if (!empty() && (back() != (Char) ' ' || back() != (Char) '\t' || back() != (Char) '\n' || back() != (Char) '\r')) { append((Char)' '); } append(v.x); append((Char)' '); append(v.y); } template void FUStringBuilderT::append(const FMVector3& v) { if (!empty() && (back() != (Char) ' ' || back() != (Char) '\t' || back() != (Char) '\n' || back() != (Char) '\r')) { append((Char)' '); } - append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); + append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); } template void FUStringBuilderT::append(const FMVector4& v) { if (!empty() && (back() != (Char) ' ' || back() != (Char) '\t' || back() != (Char) '\n' || back() != (Char) '\r')) { append((Char)' '); } - append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); append((Char)' '); append(v.w); + append(v.x); append((Char)' '); append(v.y); append((Char)' '); append(v.z); append((Char)' '); append(v.w); } template void FUStringBuilderT::appendLine(const Char* sz) { append(sz); append((Char)'\n'); } template void FUStringBuilderT::appendHex(uint8 i) { uint8 top = (i & 0xF0) >> 4; uint8 bot = i & 0xF; if (top <= 0x9) append((Char) ('0' + top)); else append((Char) ('A' + (top - 0xA))); if (bot <= 0x9) append((Char) ('0' + bot)); else append((Char) ('A' + (bot - 0xA))); } template void FUStringBuilderT::remove(int32 start) { if ((int32)size > start && start >= 0) size = start; } template void FUStringBuilderT::remove(int32 start, int32 end) { int32 diff = end - start; if ((int32)size >= end && start >= 0 && diff > 0) { const Char* stop = buffer + size - diff; for (Char* p = buffer + start; p != stop; ++p) { *p = *(p + diff); } size -= diff; } } -template +template const Char* FUStringBuilderT::ToCharPtr() const { FUStringBuilderT* ncThis = const_cast< FUStringBuilderT* >(this); if (size + 1 > reserved) ncThis->enlarge(1); ncThis->buffer[size] = 0; return buffer; } template int32 FUStringBuilderT::index(Char c) const { if (buffer != NULL && size > 0) { const Char* end = buffer + size + 1; for (const Char* p = buffer; p != end; ++p) { if (*p == c) return (int32)(p - buffer); } } return -1; } template int32 FUStringBuilderT::rindex(Char c) const { if (buffer != NULL && size > 0) { for (const Char* p = buffer + size - 1; p != buffer; --p) { if (*p == c) return (int32)(p - buffer); } } return -1; } Index: ps/trunk/libraries/source/fcollada/tests/ecvt.c =================================================================== --- ps/trunk/libraries/source/fcollada/tests/ecvt.c (nonexistent) +++ ps/trunk/libraries/source/fcollada/tests/ecvt.c (revision 24323) @@ -0,0 +1,8 @@ +#include + +int main() { + int dp = 0; + int sign = 0; + ecvt(3.14, 6, &dp, &sign); + return 0; +} Property changes on: ps/trunk/libraries/source/fcollada/tests/ecvt.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property