diff options
Diffstat (limited to 'sal')
-rw-r--r-- | sal/inc/osl/diagnose.h | 24 | ||||
-rw-r--r-- | sal/osl/all/formatstring.cxx | 61 | ||||
-rw-r--r-- | sal/osl/all/makefile.mk | 2 | ||||
-rwxr-xr-x | sal/util/sal.map | 5 |
4 files changed, 92 insertions, 0 deletions
diff --git a/sal/inc/osl/diagnose.h b/sal/inc/osl/diagnose.h index ab5243fe94d5..aab76b320f2a 100644 --- a/sal/inc/osl/diagnose.h +++ b/sal/inc/osl/diagnose.h @@ -192,6 +192,30 @@ pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pf #define OSL_THIS_FUNC "" #endif +#if defined __cplusplus + +#include "rtl/string.hxx" + +/** @internal */ +extern "C" struct _rtl_String * SAL_CALL osl_detail_formatString( + char const * format, ...) SAL_THROW_EXTERN_C(); + // "struct _rtl_String" instead of "rtl_String" for the case where + // osl/diagnose.h is included in rtl/string.hxx + +/** 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, ...) \ + (::rtl::OString( \ + ::osl_detail_formatString(format, __VA_ARGS__), \ + ::SAL_NO_ACQUIRE).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..9fefa2f52cfe --- /dev/null +++ b/sal/osl/all/formatstring.cxx @@ -0,0 +1,61 @@ +/* + * 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.h" +#include "rtl/string.hxx" + +rtl_String * 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; + } + rtl::OString s(buf, n2); + rtl_string_acquire(s.pData); + return s.pData; +} 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; |