~ubuntu-branches/ubuntu/raring/scummvm/raring

« back to all changes in this revision

Viewing changes to common/str.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Moritz Muehlenhoff
  • Date: 2011-05-25 19:02:23 UTC
  • mto: (21.1.2 sid)
  • mto: This revision was merged to the branch mainline in revision 24.
  • Revision ID: james.westby@ubuntu.com-20110525190223-fiqm0oaec714xk31
Tags: upstream-1.3.0
ImportĀ upstreamĀ versionĀ 1.3.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 * along with this program; if not, write to the Free Software
19
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
20
 *
21
 
 * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/tags/release-1-2-1/common/str.cpp $
22
 
 * $Id: str.cpp 52618 2010-09-07 11:40:44Z wjpalenstijn $
 
21
 * $URL$
 
22
 * $Id$
23
23
 */
24
24
 
25
25
#include "common/str.h"
430
430
}
431
431
 
432
432
// static
433
 
String String::printf(const char *fmt, ...) {
 
433
String String::format(const char *fmt, ...) {
434
434
        String output;
435
435
        assert(output.isStorageIntern());
436
436
 
439
439
        int len = vsnprintf(output._str, _builtinCapacity, fmt, va);
440
440
        va_end(va);
441
441
 
442
 
        if (len == -1) {
443
 
                // MSVC doesn't return the size the full string would take up.
444
 
                // Try increasing the size of the string until it fits.
 
442
        if (len == -1 || len == _builtinCapacity - 1) {
 
443
                // MSVC and IRIX don't return the size the full string would take up.
 
444
                // MSVC returns -1, IRIX returns the number of characters actually written,
 
445
                // which is at the most the size of the buffer minus one, as the string is
 
446
                // truncated to fit.
445
447
 
446
448
                // We assume MSVC failed to output the correct, null-terminated string
447
449
                // if the return value is either -1 or size.
 
450
                // For IRIX, because we lack a better mechanism, we assume failure
 
451
                // if the return value equals size - 1.
 
452
                // The downside to this is that whenever we try to format a string where the
 
453
                // size is 1 below the built-in capacity, the size is needlessly increased.
 
454
 
 
455
                // Try increasing the size of the string until it fits.
448
456
                int size = _builtinCapacity;
449
457
                do {
450
458
                        size *= 2;
455
463
                        va_start(va, fmt);
456
464
                        len = vsnprintf(output._str, size, fmt, va);
457
465
                        va_end(va);
458
 
                } while (len == -1 || len >= size);
 
466
                } while (len == -1 || len >= size - 1);
459
467
                output._size = len;
460
468
        } else if (len < (int)_builtinCapacity) {
461
469
                // vsnprintf succeeded