#define SNPRINTF snprintf
#endif
-#define ARGS_TO_BUFFER(format, buffer, size) \
- do { \
- va_list args; \
- va_start(args, format); \
- VSNPRINTF(buffer, size, format, args); \
- va_end(args); \
+#define ARGS_TO_BUFFER(format, buffer, size, written) \
+ do { \
+ va_list args; \
+ va_start(args, format); \
+ written = VSNPRINTF(buffer, size, format, args); \
+ SkASSERT(written >= 0 && written < SkToInt(size)); \
+ va_end(args); \
} while (0)
///////////////////////////////////////////////////////////////////////////////
}
char* SkStrAppendS32(char string[], int32_t dec) {
+ uint32_t udec = dec;
if (dec < 0) {
*string++ = '-';
- dec = -dec;
+ udec = ~udec + 1; // udec = -udec, but silences some warnings that are trying to be helpful
}
- return SkStrAppendU32(string, static_cast<uint32_t>(dec));
+ return SkStrAppendU32(string, udec);
}
char* SkStrAppendU64(char string[], uint64_t dec, int minDigits) {
}
char* SkStrAppendS64(char string[], int64_t dec, int minDigits) {
+ uint64_t udec = dec;
if (dec < 0) {
*string++ = '-';
- dec = -dec;
+ udec = ~udec + 1; // udec = -udec, but silences some warnings that are trying to be helpful
}
- return SkStrAppendU64(string, static_cast<uint64_t>(dec), minDigits);
+ return SkStrAppendU64(string, udec, minDigits);
}
char* SkStrAppendFloat(char string[], float value) {
void SkString::printf(const char format[], ...) {
char buffer[kBufferSize];
- ARGS_TO_BUFFER(format, buffer, kBufferSize);
+ int length;
+ ARGS_TO_BUFFER(format, buffer, kBufferSize, length);
- this->set(buffer, strlen(buffer));
+ this->set(buffer, length);
}
void SkString::appendf(const char format[], ...) {
char buffer[kBufferSize];
- ARGS_TO_BUFFER(format, buffer, kBufferSize);
+ int length;
+ ARGS_TO_BUFFER(format, buffer, kBufferSize, length);
- this->append(buffer, strlen(buffer));
+ this->append(buffer, length);
}
void SkString::appendVAList(const char format[], va_list args) {
char buffer[kBufferSize];
- VSNPRINTF(buffer, kBufferSize, format, args);
+ int length = VSNPRINTF(buffer, kBufferSize, format, args);
+ SkASSERT(length >= 0 && length < SkToInt(kBufferSize));
- this->append(buffer, strlen(buffer));
+ this->append(buffer, length);
}
void SkString::prependf(const char format[], ...) {
char buffer[kBufferSize];
- ARGS_TO_BUFFER(format, buffer, kBufferSize);
+ int length;
+ ARGS_TO_BUFFER(format, buffer, kBufferSize, length);
- this->prepend(buffer, strlen(buffer));
+ this->prepend(buffer, length);
}
void SkString::prependVAList(const char format[], va_list args) {
char buffer[kBufferSize];
- VSNPRINTF(buffer, kBufferSize, format, args);
+ int length = VSNPRINTF(buffer, kBufferSize, format, args);
+ SkASSERT(length >= 0 && length < SkToInt(kBufferSize));
- this->prepend(buffer, strlen(buffer));
+ this->prepend(buffer, length);
}
SkString SkStringPrintf(const char* format, ...) {
SkString formattedOutput;
char buffer[kBufferSize];
- ARGS_TO_BUFFER(format, buffer, kBufferSize);
+ SK_UNUSED int length;
+ ARGS_TO_BUFFER(format, buffer, kBufferSize, length);
formattedOutput.set(buffer);
return formattedOutput;
}