diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2011-10-08 12:58:14 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2011-10-08 12:59:09 +0200 |
commit | 6b900b8bede24c8710d62e9e7cbff613a0b12f9f (patch) | |
tree | 7171825495fa78eb93b23ca9c2d30f26da45f91b /sal | |
parent | 8ac7152ca8b3b71c17ea55ec9e660804990ab86c (diff) |
Introduced OSL_FORMAT, adpated some places to it.
Diffstat (limited to 'sal')
-rw-r--r-- | sal/inc/osl/diagnose.h | 20 | ||||
-rw-r--r-- | sal/osl/all/formatstring.cxx | 58 | ||||
-rw-r--r-- | sal/osl/all/makefile.mk | 2 | ||||
-rwxr-xr-x | sal/util/sal.map | 5 |
4 files changed, 85 insertions, 0 deletions
diff --git a/sal/inc/osl/diagnose.h b/sal/inc/osl/diagnose.h index ab5243fe94d5..1e4dd1360c59 100644 --- a/sal/inc/osl/diagnose.h +++ b/sal/inc/osl/diagnose.h @@ -192,6 +192,26 @@ pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pf #define OSL_THIS_FUNC "" #endif +#if defined __cplusplus + +namespace rtl { class OString; } + +/** @internal */ +extern "C" ::rtl::OString SAL_CALL osl_detail_formatString( + char const * format, ...) SAL_THROW_EXTERN_C(); + +/** A facility for printf-style messages in OSL_ENSURE, OSL_FAIL, etc. + + Use like: OSL_ENSURE(i == 5, OSL_FORMAT("i should be 5 but is %d", i)); +*/ +#define OSL_FORMAT(format, ...) \ + (::osl_detail_formatString(format, __VA_ARGS__).getStr()) + // it appears that all relevant compilers (esp. GCC 4.0 and MS VS 2008 + // Express) already support variadic macros in C++; see also + // <http://wiki.apache.org/stdcxx/C++0xCompilerSupport> + +#endif + #endif /* _OSL_DIAGNOSE_H_ */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/all/formatstring.cxx b/sal/osl/all/formatstring.cxx new file mode 100644 index 000000000000..9741745dc45b --- /dev/null +++ b/sal/osl/all/formatstring.cxx @@ -0,0 +1,58 @@ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * [ Copyright (C) 2011 Stephan Bergmann, Red Hat Inc. <sbergman@redhat.com> + * (initial developer) ] + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include "precompiled_sal.hxx" +#include "sal/config.h" + +#include <cstdarg> +#include <cstring> +#include <stdio.h> // vsnprintf not in C++03 <cstdio>, only C99 <stdio.h> + +#include "osl/diagnose.h" +#include "rtl/string.hxx" + +rtl::OString osl_detail_formatString(char const * format, ...) + SAL_THROW_EXTERN_C() +{ + // Avoid the use of other sal code as much as possible, so that this code + // can be called from other sal code without causing endless recursion: + char buf[1024]; + int n1 = sizeof buf - RTL_CONSTASCII_LENGTH("..."); + std::va_list args; + va_start(args, format); + int n2 = vsnprintf(buf, n1, format, args); + va_end(args); + if (n2 < 0) { + std::strcpy(buf, "???"); + n2 = RTL_CONSTASCII_LENGTH("???"); + } else if (n2 >= n1) { + std::strcpy(buf + n1 - 1, "..."); + n2 = sizeof buf - 1; + } + return rtl::OString(buf, n2); +} diff --git a/sal/osl/all/makefile.mk b/sal/osl/all/makefile.mk index fa928412ffc3..d9db5b7bb749 100644 --- a/sal/osl/all/makefile.mk +++ b/sal/osl/all/makefile.mk @@ -50,6 +50,7 @@ CXXFLAGS+= $(LFS_CFLAGS) SLOFILES= \ $(SLO)$/utility.obj\ $(SLO)$/filepath.obj\ + $(SLO)$/formatstring.obj\ $(SLO)$/debugbase.obj\ $(SLO)$/loadmodulerelative.obj \ $(SLO)/printtrace.obj @@ -57,6 +58,7 @@ SLOFILES= \ OBJFILES= \ $(OBJ)$/utility.obj\ $(OBJ)$/filepath.obj\ + $(OBJ)$/formatstring.obj\ $(OBJ)$/debugbase.obj\ $(OBJ)$/loadmodulerelative.obj \ $(OBJ)/printtrace.obj diff --git a/sal/util/sal.map b/sal/util/sal.map index 152b02349d9c..b1b8892a0bd1 100755 --- a/sal/util/sal.map +++ b/sal/util/sal.map @@ -625,3 +625,8 @@ PRIVATE_1.1 { sal_detail_initialize; sal_detail_deinitialize; } PRIVATE_1.0; + +PRIVATE_1.2 { # LibreOffice 3.5 + global: + osl_detail_formatString; +} PRIVATE_1.1; |