/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#endif
#include <array>
+#include <cinttypes>
#include <deque>
#include <map>
#include <unordered_map>
#include <folly/Exception.h>
#include <folly/FormatTraits.h>
#include <folly/Traits.h>
+#include <folly/portability/Windows.h>
// Ignore -Wformat-nonliteral warnings within this file
#pragma GCC diagnostic push
auto p = s.begin();
auto end = s.end();
while (p != end) {
- auto q = static_cast<const char*>(memchr(p, '}', end - p));
+ auto q = static_cast<const char*>(memchr(p, '}', size_t(end - p)));
if (!q) {
out(StringPiece(p, end));
break;
bool hasDefaultArgIndex = false;
bool hasExplicitArgIndex = false;
while (p != end) {
- auto q = static_cast<const char*>(memchr(p, '{', end - p));
+ auto q = static_cast<const char*>(memchr(p, '{', size_t(end - p)));
if (!q) {
outputString(StringPiece(p, end));
break;
}
// Format string
- q = static_cast<const char*>(memchr(p, '}', end - p));
+ q = static_cast<const char*>(memchr(p, '}', size_t(end - p)));
if (q == nullptr) {
throw BadFormatArg("folly::format: missing ending '}'");
}
arg.enforce(arg.widthIndex == FormatArg::kNoIndex,
"cannot provide width arg index without value arg index");
int sizeArg = nextArg++;
- arg.width = getSizeArg(sizeArg, arg);
+ arg.width = getSizeArg(size_t(sizeArg), arg);
}
argIndex = nextArg++;
if (arg.width == FormatArg::kDynamicWidth) {
arg.enforce(arg.widthIndex != FormatArg::kNoIndex,
"cannot provide value arg index without width arg index");
- arg.width = getSizeArg(arg.widthIndex, arg);
+ arg.width = getSizeArg(size_t(arg.widthIndex), arg);
}
try {
argIndex = to<int>(piece);
- } catch (const std::out_of_range& e) {
+ } catch (const std::out_of_range&) {
arg.error("argument index must be integer");
}
arg.enforce(argIndex >= 0, "argument index must be non-negative");
"folly::format: may not have both default and explicit arg indexes");
}
- doFormat(argIndex, arg, out);
+ doFormat(size_t(argIndex), arg, out);
}
}
if (arg.precision != FormatArg::kDefaultPrecision &&
val.size() > static_cast<size_t>(arg.precision)) {
- val.reset(val.data(), arg.precision);
+ val.reset(val.data(), size_t(arg.precision));
}
constexpr int padBufSize = 128;
auto pad = [&padBuf, &cb, padBufSize] (int chars) {
while (chars) {
int n = std::min(chars, padBufSize);
- cb(StringPiece(padBuf, n));
+ cb(StringPiece(padBuf, size_t(n)));
chars -= n;
}
};
val.size() < static_cast<size_t>(arg.width)) {
char fill = arg.fill == FormatArg::kDefaultFill ? ' ' : arg.fill;
int padChars = static_cast<int> (arg.width - val.size());
- memset(padBuf, fill, std::min(padBufSize, padChars));
+ memset(padBuf, fill, size_t(std::min(padBufSize, padChars)));
switch (arg.align) {
case FormatArg::Align::DEFAULT:
arg.align = FormatArg::Align::RIGHT;
} else if (prefixLen && arg.align == FormatArg::Align::PAD_AFTER_SIGN) {
// Split off the prefix, then do any padding if necessary
- cb(val.subpiece(0, prefixLen));
- val.advance(prefixLen);
+ cb(val.subpiece(0, size_t(prefixLen)));
+ val.advance(size_t(prefixLen));
arg.width = std::max(arg.width - prefixLen, 0);
}
format_value::formatString(val, arg, cb);
char sign;
if (std::is_signed<T>::value) {
if (folly::is_negative(val_)) {
- uval = static_cast<UT>(-val_);
+ uval = UT(-static_cast<UT>(val_));
sign = '-';
} else {
uval = static_cast<UT>(val_);
}
}
} else {
- uval = val_;
+ uval = static_cast<UT>(val_);
sign = '\0';
arg.enforce(arg.sign == FormatArg::Sign::DEFAULT,
"' specifier");
valBufBegin = valBuf + 3; // room for sign and base prefix
-#ifdef _MSC_VER
- char valBuf2[valBufSize];
- snprintf(valBuf2, valBufSize, "%ju", static_cast<uintmax_t>(uval));
- int len = GetNumberFormat(
- LOCALE_USER_DEFAULT,
- 0,
- valBuf2,
- nullptr,
- valBufBegin,
- (int)((valBuf + valBufSize) - valBufBegin)
- );
-#else
+#if defined(__ANDROID__)
int len = snprintf(valBufBegin, (valBuf + valBufSize) - valBufBegin,
- "%'ju", static_cast<uintmax_t>(uval));
+ "%" PRIuMAX, static_cast<uintmax_t>(uval));
+#else
+ int len = snprintf(
+ valBufBegin,
+ size_t((valBuf + valBufSize) - valBufBegin),
+ "%ju",
+ static_cast<uintmax_t>(uval));
#endif
// valBufSize should always be big enough, so this should never
// happen.
"invalid specifier '", arg.presentation, "'");
format_value::formatString(val_, arg, cb);
} else {
- FormatValue<char>(val_.at(arg.splitIntKey())).format(arg, cb);
+ FormatValue<char>(val_.at(size_t(arg.splitIntKey()))).format(arg, cb);
}
}
class TryFormatValue {
public:
template <class FormatCallback>
- static void formatOrFail(T& value, FormatArg& arg, FormatCallback& cb) {
+ static void formatOrFail(T& /* value */,
+ FormatArg& arg,
+ FormatCallback& /* cb */) {
arg.error("No formatter available for this type");
}
};
static constexpr size_t valueCount = std::tuple_size<Tuple>::value;
template <size_t K, class Callback>
- typename std::enable_if<K == valueCount>::type
- doFormatFrom(size_t i, FormatArg& arg, Callback& cb) const {
+ typename std::enable_if<K == valueCount>::type doFormatFrom(
+ size_t i, FormatArg& arg, Callback& /* cb */) const {
arg.enforce("tuple index out of range, max=", i);
}