Hash :
3fa8d578
Author :
Date :
2024-03-04T10:06:57
Make appendDecimal use the last char of the buffer ImmutableStringBuilder(1) means 1 char usable payload and \0. This this should fit appendDecimal(1) but did not. Fix the off by one error calling snprintf. Also: * removes const & from uint32_t argument * removes const & from operator<<, to stay consistent * Removes a redundant static_cast * Implements operator<< const char* with potentially better operator<<(const ImmutableString&) (may get compile time strlen) Fixed: angleproject:8567 Change-Id: Ibfff59f6846add0498d06e963266e50ec19baf80 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5332381 Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ImmutableStringBuilder.cpp: Stringstream-like utility for building pool allocated strings where
// the maximum length is known in advance.
//
#include "compiler/translator/ImmutableStringBuilder.h"
#include <stdio.h>
namespace sh
{
ImmutableStringBuilder &ImmutableStringBuilder::operator<<(const ImmutableString &str)
{
ASSERT(mData != nullptr);
ASSERT(mPos + str.length() <= mMaxLength);
memcpy(mData + mPos, str.data(), str.length());
mPos += str.length();
return *this;
}
ImmutableStringBuilder &ImmutableStringBuilder::operator<<(char c)
{
ASSERT(mData != nullptr);
ASSERT(mPos + 1 <= mMaxLength);
mData[mPos++] = c;
return *this;
}
void ImmutableStringBuilder::appendDecimal(uint32_t u)
{
// + 1 is because snprintf writes at most bufsz - 1 and then \0.
// Our bufsz is mMaxLength + 1.
int numChars = snprintf(mData + mPos, mMaxLength - mPos + 1, "%d", u);
ASSERT(numChars >= 0);
ASSERT(mPos + numChars <= mMaxLength);
mPos += numChars;
}
ImmutableStringBuilder::operator ImmutableString()
{
mData[mPos] = '\0';
ImmutableString str(mData, mPos);
#if defined(ANGLE_ENABLE_ASSERTS)
// Make sure that nothing is added to the string after it is finalized.
mData = nullptr;
#endif
return str;
}
} // namespace sh