diff options
author | Gerald Combs <gerald@wireshark.org> | 2016-07-15 13:59:23 -0700 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2016-07-21 20:09:03 +0000 |
commit | 913e0f408c48f3baf6933807f9cfe4195fde5c75 (patch) | |
tree | 285e4dd8b2e5c660bc04b0256323de6622082a10 /wsutil/ws_printf.h | |
parent | 97d194cd3cb7fa3806a7bb83f83f06ee2eda418b (diff) |
Use Windows CRT string functions in some places.
Copy wsutil/wsprintf.h from change 16537. Update it to use functions
appropriate to Visual C++ >= 2015, < 2015, and everything else. Add
notes about specific API issues.
Update epan/expert.c to use ws_snprintf, since the VS profiler shows it
as a minor hot spot. This reduces load time for a large-ish capture from
~14s to ~12s here.
Migrate a previous column-utils change.
Change-Id: Id4064b7c06c35fd447b63c73f731afee181df4f9
Reviewed-on: https://code.wireshark.org/review/16483
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
Diffstat (limited to 'wsutil/ws_printf.h')
-rw-r--r-- | wsutil/ws_printf.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/wsutil/ws_printf.h b/wsutil/ws_printf.h new file mode 100644 index 0000000000..1ee3bf69e6 --- /dev/null +++ b/wsutil/ws_printf.h @@ -0,0 +1,100 @@ +/* + * Wrappers for printf like functions. + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 2007 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __WS_PRINTF_H__ +#define __WS_PRINTF_H__ + +/* + * GLib's string utility routines are slow on windows, likely due to calling + * g_printf_string_upper_bound. Using ws_snprintf and ws_vsnprintf in hot + * code paths can speed up program execution. Otherwise you're probably safe + * sticking with g_snprintf and g_vsnprintf. + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef _WIN32 +#include <strsafe.h> + +#if _MSC_VER < 1900 +#include <stdarg.h> + +/* + * vsnprintf_s's return value isn't compatible with C99 vsnprintf. We don't + * return anything in order to avoid confusion. + */ + +static __inline void +ws_vsnprintf(char *buffer, size_t size_of_buffer, const char *format, va_list argptr) { + /* We could alternatively use StringCchVPrintfA */ + vsnprintf_s(buffer, size_of_buffer, _TRUNCATE, format, argptr); +} + +#else /* _MSC_VER uses UCRT */ + +/* The UCRT versions of snprintf and vsnprintf conform to C99 */ + +static __inline void +ws_vsnprintf(char *buffer, size_t size_of_buffer, const char *format, va_list argptr) +{ + vsnprintf(buffer, size_of_buffer, format, argptr); +} + +#endif /* _MSC_VER */ + +#else /* _WIN32 */ + +#include <glib.h> + +/* + * Use g_vsnprintf. On Linux and macOS these should be a thin wrapper around + * vsprintf. + */ + +static inline void +ws_vsnprintf(char *buffer, size_t size_of_buffer, const char *format, va_list argptr) +{ + g_vsnprintf(buffer, (gulong) size_of_buffer, format, argptr); +} + +#endif /* _WIN32 */ + +#ifdef _WIN32 +static __inline void +#else +static inline void +#endif +ws_snprintf(char *buffer, size_t size_of_buffer, const char * format, ...) { + va_list argptr; + + va_start(argptr, format); + ws_vsnprintf(buffer, size_of_buffer, format, argptr); + va_end(argptr); +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __WS_PRINTF_H__ */ |