Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
S
spdlog
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
spdlog
Commits
2aceb13f
Commit
2aceb13f
authored
Apr 05, 2019
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix support for utf8 logging under win32
parent
e9f34fbd
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
114 additions
and
91 deletions
+114
-91
example.cpp
example/example.cpp
+2
-1
os.h
include/spdlog/details/os.h
+5
-0
logger.h
include/spdlog/logger.h
+83
-90
logger.cpp
src/logger.cpp
+0
-0
os.cpp
src/os.cpp
+24
-0
No files found.
example/example.cpp
View file @
2aceb13f
...
...
@@ -14,5 +14,5 @@ spdlog::logger *get_logger();
int
main
(
int
,
char
*
[])
{
auto
*
l
=
get_logger
();
l
->
info
(
"HE LO "
,
"GA"
);
l
->
info
(
L"HEllo {}"
,
L"HGFS"
);
}
\ No newline at end of file
include/spdlog/details/os.h
View file @
2aceb13f
...
...
@@ -79,6 +79,11 @@ bool is_color_terminal() SPDLOG_NOEXCEPT;
// Detrmine if the terminal attached
// Source: https://github.com/agauniyal/rang/
bool
in_terminal
(
FILE
*
file
)
SPDLOG_NOEXCEPT
;
#if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) && defined(_WIN32)
void
wbuf_to_utf8buf
(
const
fmt
::
wmemory_buffer
&
wbuf
,
fmt
::
memory_buffer
&
target
);
#endif
}
// namespace os
}
// namespace details
}
// namespace spdlog
...
...
include/spdlog/logger.h
View file @
2aceb13f
...
...
@@ -20,6 +20,10 @@
#include "spdlog/common.h"
#include "spdlog/details/log_msg.h"
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
#include "spdlog/details/os.h"
#endif
#include <memory>
#include <string>
#include <vector>
...
...
@@ -79,6 +83,7 @@ public:
{
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
}
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
char
*
msg
);
void
log
(
level
::
level_enum
lvl
,
const
char
*
msg
);
...
...
@@ -118,96 +123,6 @@ public:
log
(
level
::
critical
,
fmt
,
args
...);
}
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
#ifndef _WIN32
#error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows
#else
inline
void
wbuf_to_utf8buf
(
const
fmt
::
wmemory_buffer
&
wbuf
,
fmt
::
memory_buffer
&
target
)
{
int
wbuf_size
=
static_cast
<
int
>
(
wbuf
.
size
());
if
(
wbuf_size
==
0
)
{
return
;
}
auto
result_size
=
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
NULL
,
0
,
NULL
,
NULL
);
if
(
result_size
>
0
)
{
target
.
resize
(
result_size
);
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
&
target
.
data
()[
0
],
result_size
,
NULL
,
NULL
);
}
else
{
throw
spdlog
::
spdlog_ex
(
fmt
::
format
(
"WideCharToMultiByte failed. Last error: {}"
,
::
GetLastError
()));
}
}
template
<
typename
...
Args
>
void
log
(
source_loc
source
,
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
// format to wmemory_buffer and convert to utf8
using
details
::
fmt_helper
::
to_string_view
;
fmt
::
wmemory_buffer
wbuf
;
fmt
::
format_to
(
wbuf
,
fmt
,
args
...);
fmt
::
memory_buffer
buf
;
wbuf_to_utf8buf
(
wbuf
,
buf
);
details
::
log_msg
log_msg
(
source
,
&
name_
,
lvl
,
to_string_view
(
buf
));
sink_it_
(
log_msg
);
}
SPDLOG_CATCH_AND_HANDLE
}
template
<
typename
...
Args
>
void
log
(
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
trace
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
trace
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
debug
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
debug
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
info
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
info
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
warn
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
warn
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
error
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
err
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
critical
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
critical
,
fmt
,
args
...);
}
#endif // _WIN32
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT
template
<
typename
T
>
void
log
(
level
::
level_enum
lvl
,
const
T
&
msg
)
...
...
@@ -300,6 +215,82 @@ public:
log
(
level
::
critical
,
msg
);
}
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
#ifndef _WIN32
#error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows
#else
template
<
typename
...
Args
>
void
log
(
source_loc
source
,
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
// format to wmemory_buffer and convert to utf8
fmt
::
wmemory_buffer
wbuf
;
fmt
::
format_to
(
wbuf
,
fmt
,
args
...);
fmt
::
memory_buffer
buf
;
details
::
os
::
wbuf_to_utf8buf
(
wbuf
,
buf
);
details
::
log_msg
log_msg
(
source
,
&
name_
,
lvl
,
string_view_t
(
buf
.
data
(),
buf
.
size
()));
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
template
<
typename
...
Args
>
void
log
(
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
trace
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
trace
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
debug
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
debug
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
info
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
info
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
warn
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
warn
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
error
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
err
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
critical
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
critical
,
fmt
,
args
...);
}
#endif // _WIN32
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT
bool
should_log
(
level
::
level_enum
msg_level
)
const
;
void
set_level
(
level
::
level_enum
log_level
);
...
...
@@ -350,6 +341,8 @@ public:
spdlog
::
level_t
level_
{
spdlog
::
logger
::
default_level
()};
spdlog
::
level_t
flush_level_
{
level
::
off
};
void
(
*
custom_err_handler_
)(
const
std
::
string
&
msg
)
{
nullptr
};
};
}
// namespace spdlog
...
...
src/logger.cpp
View file @
2aceb13f
src/os.cpp
View file @
2aceb13f
...
...
@@ -397,6 +397,30 @@ SPDLOG_INLINE bool in_terminal(FILE *file) SPDLOG_NOEXCEPT
return
isatty
(
fileno
(
file
))
!=
0
;
#endif
}
#if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) && defined(_WIN32)
SPDLOG_INLINE
void
wbuf_to_utf8buf
(
const
fmt
::
wmemory_buffer
&
wbuf
,
fmt
::
memory_buffer
&
target
)
{
int
wbuf_size
=
static_cast
<
int
>
(
wbuf
.
size
());
if
(
wbuf_size
==
0
)
{
return
;
}
auto
result_size
=
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
NULL
,
0
,
NULL
,
NULL
);
if
(
result_size
>
0
)
{
target
.
resize
(
result_size
);
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
&
target
.
data
()[
0
],
result_size
,
NULL
,
NULL
);
}
else
{
throw
spdlog
::
spdlog_ex
(
fmt
::
format
(
"WideCharToMultiByte failed. Last error: {}"
,
::
GetLastError
()));
}
}
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT) && _WIN32
}
// namespace os
}
// namespace details
}
// namespace spdlog
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