Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
spdlog
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
spdlog
Commits
e5376c3c
Commit
e5376c3c
authored
Mar 30, 2016
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
updated cppformat to latest version (52f89065e1843f4123198df326b480380d993312)
parent
8dbf88f9
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
4597 additions
and
4481 deletions
+4597
-4481
include/spdlog/details/format.cc
include/spdlog/details/format.cc
+838
-721
include/spdlog/details/format.h
include/spdlog/details/format.h
+3759
-3760
No files found.
include/spdlog/details/format.cc
View file @
e5376c3c
...
...
@@ -77,26 +77,29 @@ using fmt::internal::Arg;
// Dummy implementations of strerror_r and strerror_s called if corresponding
// system functions are not available.
static
inline
fmt
::
internal
::
Null
<>
strerror_r
(
int
,
char
*
,
...)
{
static
inline
fmt
::
internal
::
Null
<>
strerror_r
(
int
,
char
*
,
...)
{
return
fmt
::
internal
::
Null
<>
();
}
static
inline
fmt
::
internal
::
Null
<>
strerror_s
(
char
*
,
std
::
size_t
,
...)
{
static
inline
fmt
::
internal
::
Null
<>
strerror_s
(
char
*
,
std
::
size_t
,
...)
{
return
fmt
::
internal
::
Null
<>
();
}
namespace
fmt
{
namespace
{
namespace
{
#ifndef _MSC_VER
# define FMT_SNPRINTF snprintf
#else // _MSC_VER
inline
int
fmt_snprintf
(
char
*
buffer
,
size_t
size
,
const
char
*
format
,
...)
{
inline
int
fmt_snprintf
(
char
*
buffer
,
size_t
size
,
const
char
*
format
,
...)
{
va_list
args
;
va_start
(
args
,
format
);
int
result
=
vsnprintf_s
(
buffer
,
size
,
_TRUNCATE
,
format
,
args
);
va_end
(
args
);
return
result
;
}
}
# define FMT_SNPRINTF fmt_snprintf
#endif // _MSC_VER
...
...
@@ -106,65 +109,76 @@ inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) {
# define FMT_SWPRINTF swprintf
#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT)
// Checks if a value fits in int - used to avoid warnings about comparing
// signed and unsigned integers.
template
<
bool
IsSigned
>
struct
IntChecker
{
// Checks if a value fits in int - used to avoid warnings about comparing
// signed and unsigned integers.
template
<
bool
IsSigned
>
struct
IntChecker
{
template
<
typename
T
>
static
bool
fits_in_int
(
T
value
)
{
static
bool
fits_in_int
(
T
value
)
{
unsigned
max
=
INT_MAX
;
return
value
<=
max
;
}
static
bool
fits_in_int
(
bool
)
{
static
bool
fits_in_int
(
bool
)
{
return
true
;
}
};
};
template
<
>
struct
IntChecker
<
true
>
{
template
<
>
struct
IntChecker
<
true
>
{
template
<
typename
T
>
static
bool
fits_in_int
(
T
value
)
{
static
bool
fits_in_int
(
T
value
)
{
return
value
>=
INT_MIN
&&
value
<=
INT_MAX
;
}
static
bool
fits_in_int
(
int
)
{
static
bool
fits_in_int
(
int
)
{
return
true
;
}
};
};
const
char
RESET_COLOR
[]
=
"
\x1b
[0m"
;
typedef
void
(
*
FormatFunc
)(
fmt
::
Writer
&
,
int
,
fmt
::
StringRef
);
// Portable thread-safe version of strerror.
// Sets buffer to point to a string describing the error code.
// This can be either a pointer to a string stored in buffer,
// or a pointer to some static immutable string.
// Returns one of the following values:
// 0 - success
// ERANGE - buffer is not large enough to store the error message
// other - failure
// Buffer should be at least of size 1.
int
safe_strerror
(
int
error_code
,
char
*&
buffer
,
std
::
size_t
buffer_size
)
FMT_NOEXCEPT
{
const
char
RESET_COLOR
[]
=
"
\x1b
[0m"
;
typedef
void
(
*
FormatFunc
)(
fmt
::
Writer
&
,
int
,
fmt
::
StringRef
);
// Portable thread-safe version of strerror.
// Sets buffer to point to a string describing the error code.
// This can be either a pointer to a string stored in buffer,
// or a pointer to some static immutable string.
// Returns one of the following values:
// 0 - success
// ERANGE - buffer is not large enough to store the error message
// other - failure
// Buffer should be at least of size 1.
int
safe_strerror
(
int
error_code
,
char
*&
buffer
,
std
::
size_t
buffer_size
)
FMT_NOEXCEPT
{
FMT_ASSERT
(
buffer
!=
0
&&
buffer_size
!=
0
,
"invalid buffer"
);
class
StrError
{
class
StrError
{
private:
int
error_code_
;
char
*&
buffer_
;
std
::
size_t
buffer_size_
;
// A noop assignment operator to avoid bogus warnings.
void
operator
=
(
const
StrError
&
)
{}
void
operator
=
(
const
StrError
&
)
{}
// Handle the result of XSI-compliant version of strerror_r.
int
handle
(
int
result
)
{
int
handle
(
int
result
)
{
// glibc versions before 2.13 return result in errno.
return
result
==
-
1
?
errno
:
result
;
}
// Handle the result of GNU-specific version of strerror_r.
int
handle
(
char
*
message
)
{
int
handle
(
char
*
message
)
{
// If the buffer is full then the message is probably truncated.
if
(
message
==
buffer_
&&
strlen
(
buffer_
)
==
buffer_size_
-
1
)
return
ERANGE
;
...
...
@@ -173,19 +187,22 @@ int safe_strerror(
}
// Handle the case when strerror_r is not available.
int
handle
(
fmt
::
internal
::
Null
<>
)
{
int
handle
(
fmt
::
internal
::
Null
<>
)
{
return
fallback
(
strerror_s
(
buffer_
,
buffer_size_
,
error_code_
));
}
// Fallback to strerror_s when strerror_r is not available.
int
fallback
(
int
result
)
{
int
fallback
(
int
result
)
{
// If the buffer is full then the message is probably truncated.
return
result
==
0
&&
strlen
(
buffer_
)
==
buffer_size_
-
1
?
ERANGE
:
result
;
}
// Fallback to strerror if strerror_r and strerror_s are not available.
int
fallback
(
fmt
::
internal
::
Null
<>
)
{
int
fallback
(
fmt
::
internal
::
Null
<>
)
{
errno
=
0
;
buffer_
=
strerror
(
error_code_
);
return
errno
;
...
...
@@ -193,72 +210,87 @@ int safe_strerror(
public:
StrError
(
int
err_code
,
char
*&
buf
,
std
::
size_t
buf_size
)
:
error_code_
(
err_code
),
buffer_
(
buf
),
buffer_size_
(
buf_size
)
{}
:
error_code_
(
err_code
),
buffer_
(
buf
),
buffer_size_
(
buf_size
)
{}
int
run
()
{
int
run
()
{
strerror_r
(
0
,
0
,
""
);
// Suppress a warning about unused strerror_r.
return
handle
(
strerror_r
(
error_code_
,
buffer_
,
buffer_size_
));
}
};
return
StrError
(
error_code
,
buffer
,
buffer_size
).
run
();
}
}
void
format_error_code
(
fmt
::
Writer
&
out
,
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
void
format_error_code
(
fmt
::
Writer
&
out
,
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
// Report error code making sure that the output fits into
// INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential
// bad_alloc.
out
.
clear
();
static
const
char
SEP
[]
=
": "
;
static
const
char
ERROR_STR
[]
=
"error "
;
fmt
::
internal
::
IntTraits
<
int
>::
MainType
ec_value
=
error_code
;
// Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
std
::
size_t
error_code_size
=
sizeof
(
SEP
)
+
sizeof
(
ERROR_STR
)
-
2
;
error_code_size
+=
fmt
::
internal
::
count_digits
(
ec_value
);
typedef
fmt
::
internal
::
IntTraits
<
int
>::
MainType
MainType
;
MainType
abs_value
=
static_cast
<
MainType
>
(
error_code
);
if
(
internal
::
is_negative
(
error_code
))
{
abs_value
=
0
-
abs_value
;
++
error_code_size
;
}
error_code_size
+=
fmt
::
internal
::
count_digits
(
abs_value
);
if
(
message
.
size
()
<=
fmt
::
internal
::
INLINE_BUFFER_SIZE
-
error_code_size
)
out
<<
message
<<
SEP
;
out
<<
ERROR_STR
<<
error_code
;
assert
(
out
.
size
()
<=
fmt
::
internal
::
INLINE_BUFFER_SIZE
);
}
}
void
report_error
(
FormatFunc
func
,
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
void
report_error
(
FormatFunc
func
,
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
fmt
::
MemoryWriter
full_message
;
func
(
full_message
,
error_code
,
message
);
// Use Writer::data instead of Writer::c_str to avoid potential memory
// allocation.
std
::
fwrite
(
full_message
.
data
(),
full_message
.
size
(),
1
,
stderr
);
std
::
fputc
(
'\n'
,
stderr
);
}
}
// IsZeroInt::visit(arg) returns true iff arg is a zero integer.
class
IsZeroInt
:
public
fmt
::
internal
::
ArgVisitor
<
IsZeroInt
,
bool
>
{
public:
// IsZeroInt::visit(arg) returns true iff arg is a zero integer.
class
IsZeroInt
:
public
fmt
::
internal
::
ArgVisitor
<
IsZeroInt
,
bool
>
{
public:
template
<
typename
T
>
bool
visit_any_int
(
T
value
)
{
bool
visit_any_int
(
T
value
)
{
return
value
==
0
;
}
};
};
// Checks if an argument is a valid printf width specifier and sets
// left alignment if it is negative.
class
WidthHandler
:
public
fmt
::
internal
::
ArgVisitor
<
WidthHandler
,
unsigned
>
{
private:
// Checks if an argument is a valid printf width specifier and sets
// left alignment if it is negative.
class
WidthHandler
:
public
fmt
::
internal
::
ArgVisitor
<
WidthHandler
,
unsigned
>
{
private:
fmt
::
FormatSpec
&
spec_
;
FMT_DISALLOW_COPY_AND_ASSIGN
(
WidthHandler
);
public:
explicit
WidthHandler
(
fmt
::
FormatSpec
&
spec
)
:
spec_
(
spec
)
{}
public:
explicit
WidthHandler
(
fmt
::
FormatSpec
&
spec
)
:
spec_
(
spec
)
{}
void
report_unhandled_arg
()
{
void
report_unhandled_arg
()
{
FMT_THROW
(
fmt
::
FormatError
(
"width is not integer"
));
}
template
<
typename
T
>
unsigned
visit_any_int
(
T
value
)
{
unsigned
visit_any_int
(
T
value
)
{
typedef
typename
fmt
::
internal
::
IntTraits
<
T
>::
MainType
UnsignedType
;
UnsignedType
width
=
value
;
UnsignedType
width
=
static_cast
<
UnsignedType
>
(
value
)
;
if
(
fmt
::
internal
::
is_negative
(
value
))
{
spec_
.
align_
=
fmt
::
ALIGN_LEFT
;
width
=
0
-
width
;
...
...
@@ -267,62 +299,94 @@ public:
FMT_THROW
(
fmt
::
FormatError
(
"number is too big"
));
return
static_cast
<
unsigned
>
(
width
);
}
};
};
class
PrecisionHandler
:
public
fmt
::
internal
::
ArgVisitor
<
PrecisionHandler
,
int
>
{
public:
void
report_unhandled_arg
()
{
class
PrecisionHandler
:
public
fmt
::
internal
::
ArgVisitor
<
PrecisionHandler
,
int
>
{
public:
void
report_unhandled_arg
()
{
FMT_THROW
(
fmt
::
FormatError
(
"precision is not integer"
));
}
template
<
typename
T
>
int
visit_any_int
(
T
value
)
{
int
visit_any_int
(
T
value
)
{
if
(
!
IntChecker
<
std
::
numeric_limits
<
T
>::
is_signed
>::
fits_in_int
(
value
))
FMT_THROW
(
fmt
::
FormatError
(
"number is too big"
));
return
static_cast
<
int
>
(
value
);
}
};
};
// Converts an integer argument to an integral type T for printf.
template
<
typename
T
>
class
ArgConverter
:
public
fmt
::
internal
::
ArgVisitor
<
ArgConverter
<
T
>
,
void
>
{
private:
template
<
typename
T
,
typename
U
>
struct
is_same
{
enum
{
value
=
0
};
};
template
<
typename
T
>
struct
is_same
<
T
,
T
>
{
enum
{
value
=
1
};
};
// An argument visitor that converts an integer argument to T for printf,
// if T is an integral type. If T is void, the argument is converted to
// corresponding signed or unsigned type depending on the type specifier:
// 'd' and 'i' - signed, other - unsigned)
template
<
typename
T
=
void
>
class
ArgConverter
:
public
fmt
::
internal
::
ArgVisitor
<
ArgConverter
<
T
>
,
void
>
{
private:
fmt
::
internal
::
Arg
&
arg_
;
wchar_t
type_
;
FMT_DISALLOW_COPY_AND_ASSIGN
(
ArgConverter
);
public:
public:
ArgConverter
(
fmt
::
internal
::
Arg
&
arg
,
wchar_t
type
)
:
arg_
(
arg
),
type_
(
type
)
{}
:
arg_
(
arg
),
type_
(
type
)
{}
void
visit_bool
(
bool
value
)
{
void
visit_bool
(
bool
value
)
{
if
(
type_
!=
's'
)
visit_any_int
(
value
);
}
template
<
typename
U
>
void
visit_any_int
(
U
value
)
{
void
visit_any_int
(
U
value
)
{
bool
is_signed
=
type_
==
'd'
||
type_
==
'i'
;
using
fmt
::
internal
::
Arg
;
if
(
sizeof
(
T
)
<=
sizeof
(
int
))
{
typedef
typename
fmt
::
internal
::
Conditional
<
is_same
<
T
,
void
>::
value
,
U
,
T
>::
type
TargetType
;
if
(
sizeof
(
TargetType
)
<=
sizeof
(
int
))
{
// Extra casts are used to silence warnings.
if
(
is_signed
)
{
arg_
.
type
=
Arg
::
INT
;
arg_
.
int_value
=
static_cast
<
int
>
(
static_cast
<
T
>
(
value
));
arg_
.
int_value
=
static_cast
<
int
>
(
static_cast
<
TargetType
>
(
value
));
}
else
{
arg_
.
type
=
Arg
::
UINT
;
arg_
.
uint_value
=
static_cast
<
unsigned
>
(
static_cast
<
typename
fmt
::
internal
::
MakeUnsigned
<
T
>::
Type
>
(
value
));
typedef
typename
fmt
::
internal
::
MakeUnsigned
<
TargetType
>::
Type
Unsigned
;
arg_
.
uint_value
=
static_cast
<
unsigned
>
(
static_cast
<
Unsigned
>
(
value
));
}
}
else
{
if
(
is_signed
)
{
arg_
.
type
=
Arg
::
LONG_LONG
;
arg_
.
long_long_value
=
static_cast
<
typename
fmt
::
internal
::
MakeUnsigned
<
U
>::
Type
>
(
value
);
// glibc's printf doesn't sign extend arguments of smaller types:
// std::printf("%lld", -42); // prints "4294967254"
// but we don't have to do the same because it's a UB.
arg_
.
long_long_value
=
static_cast
<
fmt
::
LongLong
>
(
value
);
}
else
{
arg_
.
type
=
Arg
::
ULONG_LONG
;
...
...
@@ -331,44 +395,67 @@ public:
}
}
}
};
};
// Converts an integer argument to char for printf.
class
CharConverter
:
public
fmt
::
internal
::
ArgVisitor
<
CharConverter
,
void
>
{
private:
// Converts an integer argument to char for printf.
class
CharConverter
:
public
fmt
::
internal
::
ArgVisitor
<
CharConverter
,
void
>
{
private:
fmt
::
internal
::
Arg
&
arg_
;
FMT_DISALLOW_COPY_AND_ASSIGN
(
CharConverter
);
public:
explicit
CharConverter
(
fmt
::
internal
::
Arg
&
arg
)
:
arg_
(
arg
)
{}
public:
explicit
CharConverter
(
fmt
::
internal
::
Arg
&
arg
)
:
arg_
(
arg
)
{}
template
<
typename
T
>
void
visit_any_int
(
T
value
)
{
void
visit_any_int
(
T
value
)
{
arg_
.
type
=
Arg
::
CHAR
;
arg_
.
int_value
=
static_cast
<
char
>
(
value
);
}
};
}
// namespace
namespace
internal
{
template
<
typename
Char
>
class
PrintfArgFormatter
:
public
ArgFormatterBase
<
PrintfArgFormatter
<
Char
>
,
Char
>
{
};
void
write_null_pointer
()
{
// Write the content of w to os.
void
write
(
std
::
ostream
&
os
,
fmt
::
Writer
&
w
)
{
const
char
*
data
=
w
.
data
();
typedef
internal
::
MakeUnsigned
<
std
::
streamsize
>::
Type
UnsignedStreamSize
;
UnsignedStreamSize
size
=
w
.
size
();
UnsignedStreamSize
max_size
=
internal
::
to_unsigned
((
std
::
numeric_limits
<
std
::
streamsize
>::
max
)());
do
{
UnsignedStreamSize
n
=
size
<=
max_size
?
size
:
max_size
;
os
.
write
(
data
,
static_cast
<
std
::
streamsize
>
(
n
));
data
+=
n
;
size
-=
n
;
}
while
(
size
!=
0
);
}
}
// namespace
namespace
internal
{
template
<
typename
Char
>
class
PrintfArgFormatter
:
public
ArgFormatterBase
<
PrintfArgFormatter
<
Char
>
,
Char
>
{
void
write_null_pointer
()
{
this
->
spec
().
type_
=
0
;
this
->
write
(
"(nil)"
);
}
typedef
ArgFormatterBase
<
PrintfArgFormatter
<
Char
>
,
Char
>
Base
;
public:
public:
PrintfArgFormatter
(
BasicWriter
<
Char
>
&
w
,
FormatSpec
&
s
)
:
ArgFormatterBase
<
PrintfArgFormatter
<
Char
>
,
Char
>
(
w
,
s
)
{}
:
ArgFormatterBase
<
PrintfArgFormatter
<
Char
>
,
Char
>
(
w
,
s
)
{}
void
visit_bool
(
bool
value
)
{
void
visit_bool
(
bool
value
)
{
FormatSpec
&
fmt_spec
=
this
->
spec
();
if
(
fmt_spec
.
type_
!=
's'
)
return
this
->
visit_any_int
(
value
);
...
...
@@ -376,7 +463,8 @@ public:
this
->
write
(
value
);
}
void
visit_char
(
int
value
)
{
void
visit_char
(
int
value
)
{
const
FormatSpec
&
fmt_spec
=
this
->
spec
();
BasicWriter
<
Char
>
&
w
=
this
->
writer
();
if
(
fmt_spec
.
type_
&&
fmt_spec
.
type_
!=
'c'
)
...
...
@@ -400,7 +488,8 @@ public:
*
out
=
static_cast
<
Char
>
(
value
);
}
void
visit_cstring
(
const
char
*
value
)
{
void
visit_cstring
(
const
char
*
value
)
{
if
(
value
)
Base
::
visit_cstring
(
value
);
else
if
(
this
->
spec
().
type_
==
'p'
)
...
...
@@ -409,25 +498,28 @@ public:
this
->
write
(
"(null)"
);
}
void
visit_pointer
(
const
void
*
value
)
{
void
visit_pointer
(
const
void
*
value
)
{
if
(
value
)
return
Base
::
visit_pointer
(
value
);
this
->
spec
().
type_
=
0
;
write_null_pointer
();
}
void
visit_custom
(
Arg
::
CustomValue
c
)
{
void
visit_custom
(
Arg
::
CustomValue
c
)
{
BasicFormatter
<
Char
>
formatter
(
ArgList
(),
this
->
writer
());
const
Char
format_str
[]
=
{
'}'
,
0
};
const
Char
*
format
=
format_str
;
c
.
format
(
&
formatter
,
c
.
value
,
&
format
);
}
};
}
// namespace internal
};
}
// namespace internal
}
// namespace fmt
FMT_FUNC
void
fmt
::
SystemError
::
init
(
int
err_code
,
CStringRef
format_str
,
ArgList
args
)
{
int
err_code
,
CStringRef
format_str
,
ArgList
args
)
{
error_code_
=
err_code
;
MemoryWriter
w
;
internal
::
format_system_error
(
w
,
err_code
,
format
(
format_str
,
args
));
...
...
@@ -438,7 +530,8 @@ FMT_FUNC void fmt::SystemError::init(
template
<
typename
T
>
int
fmt
::
internal
::
CharTraits
<
char
>::
format_float
(
char
*
buffer
,
std
::
size_t
size
,
const
char
*
format
,
unsigned
width
,
int
precision
,
T
value
)
{
unsigned
width
,
int
precision
,
T
value
)
{
if
(
width
==
0
)
{
return
precision
<
0
?
FMT_SNPRINTF
(
buffer
,
size
,
format
,
value
)
:
...
...
@@ -452,7 +545,8 @@ int fmt::internal::CharTraits<char>::format_float(
template
<
typename
T
>
int
fmt
::
internal
::
CharTraits
<
wchar_t
>::
format_float
(
wchar_t
*
buffer
,
std
::
size_t
size
,
const
wchar_t
*
format
,
unsigned
width
,
int
precision
,
T
value
)
{
unsigned
width
,
int
precision
,
T
value
)
{
if
(
width
==
0
)
{
return
precision
<
0
?
FMT_SWPRINTF
(
buffer
,
size
,
format
,
value
)
:
...
...
@@ -465,11 +559,11 @@ int fmt::internal::CharTraits<wchar_t>::format_float(
template
<
typename
T
>
const
char
fmt
::
internal
::
BasicData
<
T
>::
DIGITS
[]
=
"0001020304050607080910111213141516171819"
"2021222324252627282930313233343536373839"
"4041424344454647484950515253545556575859"
"6061626364656667686970717273747576777879"
"8081828384858687888990919293949596979899"
;
"0001020304050607080910111213141516171819"
"2021222324252627282930313233343536373839"
"4041424344454647484950515253545556575859"
"6061626364656667686970717273747576777879"
"8081828384858687888990919293949596979899"
;
#define FMT_POWERS_OF_10(factor) \
factor * 10, \
...
...
@@ -497,7 +591,8 @@ const uint64_t fmt::internal::BasicData<T>::POWERS_OF_10_64[] = {
fmt
::
ULongLong
(
1000000000
)
*
fmt
::
ULongLong
(
1000000000
)
*
10
};
FMT_FUNC
void
fmt
::
internal
::
report_unknown_type
(
char
code
,
const
char
*
type
)
{
FMT_FUNC
void
fmt
::
internal
::
report_unknown_type
(
char
code
,
const
char
*
type
)
{
(
void
)
type
;
if
(
std
::
isprint
(
static_cast
<
unsigned
char
>
(
code
)))
{
FMT_THROW
(
fmt
::
FormatError
(
...
...
@@ -510,7 +605,8 @@ FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) {
#if FMT_USE_WINDOWS_H
FMT_FUNC
fmt
::
internal
::
UTF8ToUTF16
::
UTF8ToUTF16
(
fmt
::
StringRef
s
)
{
FMT_FUNC
fmt
::
internal
::
UTF8ToUTF16
::
UTF8ToUTF16
(
fmt
::
StringRef
s
)
{
static
const
char
ERROR_MSG
[]
=
"cannot convert string from UTF-8 to UTF-16"
;
if
(
s
.
size
()
>
INT_MAX
)
FMT_THROW
(
WindowsError
(
ERROR_INVALID_PARAMETER
,
ERROR_MSG
));
...
...
@@ -527,14 +623,16 @@ FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) {
buffer_
[
length
]
=
0
;
}
FMT_FUNC
fmt
::
internal
::
UTF16ToUTF8
::
UTF16ToUTF8
(
fmt
::
WStringRef
s
)
{
FMT_FUNC
fmt
::
internal
::
UTF16ToUTF8
::
UTF16ToUTF8
(
fmt
::
WStringRef
s
)
{
if
(
int
error_code
=
convert
(
s
))
{
FMT_THROW
(
WindowsError
(
error_code
,
"cannot convert string from UTF-16 to UTF-8"
));
}
}
FMT_FUNC
int
fmt
::
internal
::
UTF16ToUTF8
::
convert
(
fmt
::
WStringRef
s
)
{
FMT_FUNC
int
fmt
::
internal
::
UTF16ToUTF8
::
convert
(
fmt
::
WStringRef
s
)
{
if
(
s
.
size
()
>
INT_MAX
)
return
ERROR_INVALID_PARAMETER
;
int
s_size
=
static_cast
<
int
>
(
s
.
size
());
...
...
@@ -551,7 +649,8 @@ FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) {
}
FMT_FUNC
void
fmt
::
WindowsError
::
init
(
int
err_code
,
CStringRef
format_str
,
ArgList
args
)
{
int
err_code
,
CStringRef
format_str
,
ArgList
args
)
{
error_code_
=
err_code
;
MemoryWriter
w
;
internal
::
format_windows_error
(
w
,
err_code
,
format
(
format_str
,
args
));
...
...
@@ -561,34 +660,30 @@ FMT_FUNC void fmt::WindowsError::init(
FMT_FUNC
void
fmt
::
internal
::
format_windows_error
(
fmt
::
Writer
&
out
,
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
class
String
{
private:
LPWSTR
str_
;
public:
String
()
:
str_
()
{}
~
String
()
{
LocalFree
(
str_
);
}
LPWSTR
*
ptr
()
{
return
&
str_
;
}
LPCWSTR
c_str
()
const
{
return
str_
;
}
};
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
FMT_TRY
{
String
system_message
;
if
(
FormatMessageW
(
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_IGNORE_INSERTS
,
0
,
error_code
,
MAKELANGID
(
LANG_NEUTRAL
,
SUBLANG_DEFAULT
),
reinterpret_cast
<
LPWSTR
>
(
system_message
.
ptr
()),
0
,
0
))
{
MemoryBuffer
<
wchar_t
,
INLINE_BUFFER_SIZE
>
buffer
;
buffer
.
resize
(
INLINE_BUFFER_SIZE
);
for
(;;)
{
wchar_t
*
system_message
=
&
buffer
[
0
];
int
result
=
FormatMessageW
(
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_IGNORE_INSERTS
,
0
,
error_code
,
MAKELANGID
(
LANG_NEUTRAL
,
SUBLANG_DEFAULT
),
system_message
,
static_cast
<
uint32_t
>
(
buffer
.
size
()),
0
);
if
(
result
!=
0
)
{
UTF16ToUTF8
utf8_message
;
if
(
utf8_message
.
convert
(
system_message
.
c_str
()
)
==
ERROR_SUCCESS
)
{
if
(
utf8_message
.
convert
(
system_message
)
==
ERROR_SUCCESS
)
{
out
<<
message
<<
": "
<<
utf8_message
;
return
;
}
break
;
}
}
FMT_CATCH
(...)
{}
if
(
GetLastError
()
!=
ERROR_INSUFFICIENT_BUFFER
)
break
;
// Can't get error message, report error code instead.
buffer
.
resize
(
buffer
.
size
()
*
2
);
}
}
FMT_CATCH
(...)
{}
fmt
::
format_error_code
(
out
,
error_code
,
message
);
// 'fmt::' is for bcc32.
}
...
...
@@ -596,7 +691,8 @@ FMT_FUNC void fmt::internal::format_windows_error(
FMT_FUNC
void
fmt
::
internal
::
format_system_error
(
fmt
::
Writer
&
out
,
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
FMT_TRY
{
MemoryBuffer
<
char
,
INLINE_BUFFER_SIZE
>
buffer
;
buffer
.
resize
(
INLINE_BUFFER_SIZE
);
...
...
@@ -611,12 +707,14 @@ FMT_FUNC void fmt::internal::format_system_error(
break
;
// Can't get error message, report error code instead.
buffer
.
resize
(
buffer
.
size
()
*
2
);
}
}
FMT_CATCH
(...)
{}
}
FMT_CATCH
(...)
{}
fmt
::
format_error_code
(
out
,
error_code
,
message
);
// 'fmt::' is for bcc32.
}
template
<
typename
Char
>
void
fmt
::
internal
::
ArgMap
<
Char
>::
init
(
const
ArgList
&
args
)
{
void
fmt
::
internal
::
ArgMap
<
Char
>::
init
(
const
ArgList
&
args
)
{
if
(
!
map_
.
empty
())
return
;
typedef
internal
::
NamedArg
<
Char
>
NamedArg
;
...
...
@@ -631,11 +729,10 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) {
return
;
case
internal
:
:
Arg
::
NAMED_ARG
:
named_arg
=
static_cast
<
const
NamedArg
*>
(
args
.
values_
[
i
].
pointer
);
map_
.
insert
(
Pair
(
named_arg
->
name
,
*
named_arg
));
map_
.
push_back
(
Pair
(
named_arg
->
name
,
*
named_arg
));
break
;
default:
/*nothing*/
;
/*nothing*/
;
}
}
return
;
...
...
@@ -644,7 +741,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) {
internal
::
Arg
::
Type
arg_type
=
args
.
type
(
i
);
if
(
arg_type
==
internal
::
Arg
::
NAMED_ARG
)
{
named_arg
=
static_cast
<
const
NamedArg
*>
(
args
.
args_
[
i
].
pointer
);
map_
.
insert
(
Pair
(
named_arg
->
name
,
*
named_arg
));
map_
.
push_back
(
Pair
(
named_arg
->
name
,
*
named_arg
));
}
}
for
(
unsigned
i
=
ArgList
::
MAX_PACKED_ARGS
;
/*nothing*/
;
++
i
)
{
...
...
@@ -653,22 +750,23 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) {
return
;
case
internal
:
:
Arg
::
NAMED_ARG
:
named_arg
=
static_cast
<
const
NamedArg
*>
(
args
.
args_
[
i
].
pointer
);
map_
.
insert
(
Pair
(
named_arg
->
name
,
*
named_arg
));
map_
.
push_back
(
Pair
(
named_arg
->
name
,
*
named_arg
));
break
;
default:
/*nothing*/
;
/*nothing*/
;
}
}
}
template
<
typename
Char
>
void
fmt
::
internal
::
FixedBuffer
<
Char
>::
grow
(
std
::
size_t
)
{
void
fmt
::
internal
::
FixedBuffer
<
Char
>::
grow
(
std
::
size_t
)
{
FMT_THROW
(
std
::
runtime_error
(
"buffer overflow"
));
}
FMT_FUNC
Arg
fmt
::
internal
::
FormatterBase
::
do_get_arg
(
unsigned
arg_index
,
const
char
*&
error
)
{
unsigned
arg_index
,
const
char
*&
error
)
{
Arg
arg
=
args_
[
arg_index
];
switch
(
arg
.
type
)
{
case
Arg
:
:
NONE
:
...
...
@@ -676,16 +774,17 @@ FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg(
break
;
case
Arg
:
:
NAMED_ARG
:
arg
=
*
static_cast
<
const
internal
::
Arg
*>
(
arg
.
pointer
);
break
;
default:
/*nothing*/
;
/*nothing*/
;
}
return
arg
;
}
template
<
typename
Char
>
void
fmt
::
internal
::
PrintfFormatter
<
Char
>::
parse_flags
(
FormatSpec
&
spec
,
const
Char
*&
s
)
{
FormatSpec
&
spec
,
const
Char
*&
s
)
{
for
(;;)
{
switch
(
*
s
++
)
{
case
'-'
:
...
...
@@ -712,7 +811,8 @@ void fmt::internal::PrintfFormatter<Char>::parse_flags(
template
<
typename
Char
>
Arg
fmt
::
internal
::
PrintfFormatter
<
Char
>::
get_arg
(
const
Char
*
s
,
unsigned
arg_index
)
{
const
Char
*
s
,
unsigned
arg_index
)
{
(
void
)
s
;
const
char
*
error
=
0
;
Arg
arg
=
arg_index
==
UINT_MAX
?
...
...
@@ -724,7 +824,8 @@ Arg fmt::internal::PrintfFormatter<Char>::get_arg(
template
<
typename
Char
>
unsigned
fmt
::
internal
::
PrintfFormatter
<
Char
>::
parse_header
(
const
Char
*&
s
,
FormatSpec
&
spec
)
{
const
Char
*&
s
,
FormatSpec
&
spec
)
{
unsigned
arg_index
=
UINT_MAX
;
Char
c
=
*
s
;
if
(
c
>=
'0'
&&
c
<=
'9'
)
{
...
...
@@ -760,7 +861,8 @@ unsigned fmt::internal::PrintfFormatter<Char>::parse_header(
template
<
typename
Char
>
void
fmt
::
internal
::
PrintfFormatter
<
Char
>::
format
(
BasicWriter
<
Char
>
&
writer
,
BasicCStringRef
<
Char
>
format_str
)
{
BasicWriter
<
Char
>
&
writer
,
BasicCStringRef
<
Char
>
format_str
)
{
const
Char
*
start
=
format_str
.
c_str
();
const
Char
*
s
=
start
;
while
(
*
s
)
{
...
...
@@ -783,7 +885,7 @@ void fmt::internal::PrintfFormatter<Char>::format(
if
(
*
s
==
'.'
)
{
++
s
;
if
(
'0'
<=
*
s
&&
*
s
<=
'9'
)
{
spec
.
precision_
=
parse_nonnegative_int
(
s
);
spec
.
precision_
=
static_cast
<
int
>
(
parse_nonnegative_int
(
s
)
);
}
else
if
(
*
s
==
'*'
)
{
++
s
;
...
...
@@ -793,7 +895,7 @@ void fmt::internal::PrintfFormatter<Char>::format(
Arg
arg
=
get_arg
(
s
,
arg_index
);
if
(
spec
.
flag
(
HASH_FLAG
)
&&
IsZeroInt
().
visit
(
arg
))
spec
.
flags_
&=
~
HASH_FLAG
;
spec
.
flags_
&=
~
to_unsigned
<
int
>
(
HASH_FLAG
)
;
if
(
spec
.
fill_
==
'0'
)
{
if
(
arg
.
type
<=
Arg
::
LAST_NUMERIC_TYPE
)
spec
.
align_
=
ALIGN_NUMERIC
;
...
...
@@ -830,7 +932,7 @@ void fmt::internal::PrintfFormatter<Char>::format(
break
;
default:
--
s
;
ArgConverter
<
int
>
(
arg
,
*
s
).
visit
(
arg
);
ArgConverter
<
void
>
(
arg
,
*
s
).
visit
(
arg
);
}
// Parse type.
...
...
@@ -840,8 +942,7 @@ void fmt::internal::PrintfFormatter<Char>::format(
if
(
arg
.
type
<=
Arg
::
LAST_INTEGER_TYPE
)
{
// Normalize type.
switch
(
spec
.
type_
)
{
case
'i'
:
case
'u'
:
case
'i'
:
case
'u'
:
spec
.
type_
=
'd'
;
break
;
case
'c'
:
...
...
@@ -860,36 +961,43 @@ void fmt::internal::PrintfFormatter<Char>::format(
}
FMT_FUNC
void
fmt
::
report_system_error
(
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
// 'fmt::' is for bcc32.
fmt
::
report_error
(
internal
::
format_system_error
,
error_code
,
message
);
}
#if FMT_USE_WINDOWS_H
FMT_FUNC
void
fmt
::
report_windows_error
(
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
int
error_code
,
fmt
::
StringRef
message
)
FMT_NOEXCEPT
{
// 'fmt::' is for bcc32.
fmt
::
report_error
(
internal
::
format_windows_error
,
error_code
,
message
);
}
#endif
FMT_FUNC
void
fmt
::
print
(
std
::
FILE
*
f
,
CStringRef
format_str
,
ArgList
args
)
{
FMT_FUNC
void
fmt
::
print
(
std
::
FILE
*
f
,
CStringRef
format_str
,
ArgList
args
)
{
MemoryWriter
w
;
w
.
write
(
format_str
,
args
);
std
::
fwrite
(
w
.
data
(),
1
,
w
.
size
(),
f
);
}
FMT_FUNC
void
fmt
::
print
(
CStringRef
format_str
,
ArgList
args
)
{
FMT_FUNC
void
fmt
::
print
(
CStringRef
format_str
,
ArgList
args
)
{
print
(
stdout
,
format_str
,
args
);
}
FMT_FUNC
void
fmt
::
print
(
std
::
ostream
&
os
,
CStringRef
format_str
,
ArgList
args
)
{
FMT_FUNC
void
fmt
::
print
(
std
::
ostream
&
os
,
CStringRef
format_str
,
ArgList
args
)
{
MemoryWriter
w
;
w
.
write
(
format_str
,
args
);
os
.
write
(
w
.
data
(),
w
.
size
()
);
write
(
os
,
w
);
}
FMT_FUNC
void
fmt
::
print_colored
(
Color
c
,
CStringRef
format
,
ArgList
args
)
{
FMT_FUNC
void
fmt
::
print_colored
(
Color
c
,
CStringRef
format
,
ArgList
args
)
{
char
escape
[]
=
"
\x1b
[30m"
;
escape
[
3
]
=
static_cast
<
char
>
(
'0'
+
c
);
std
::
fputs
(
escape
,
stdout
);
...
...
@@ -897,13 +1005,22 @@ FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) {
std
::
fputs
(
RESET_COLOR
,
stdout
);
}
FMT_FUNC
int
fmt
::
fprintf
(
std
::
FILE
*
f
,
CStringRef
format
,
ArgList
args
)
{
FMT_FUNC
int
fmt
::
fprintf
(
std
::
FILE
*
f
,
CStringRef
format
,
ArgList
args
)
{
MemoryWriter
w
;
printf
(
w
,
format
,
args
);
std
::
size_t
size
=
w
.
size
();
return
std
::
fwrite
(
w
.
data
(),
1
,
size
,
f
)
<
size
?
-
1
:
static_cast
<
int
>
(
size
);
}
FMT_FUNC
int
fmt
::
fprintf
(
std
::
ostream
&
os
,
CStringRef
format
,
ArgList
args
)
{
MemoryWriter
w
;
printf
(
w
,
format
,
args
);
write
(
os
,
w
);
return
static_cast
<
int
>
(
w
.
size
());
}
#ifndef FMT_HEADER_ONLY
template
struct
fmt
::
internal
::
BasicData
<
void
>;
...
...
include/spdlog/details/format.h
View file @
e5376c3c
This source diff could not be displayed because it is too large. You can
view the blob
instead.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment