summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2011-10-08 18:56:48 +0200
committerStephan Bergmann <sbergman@redhat.com>2011-10-08 18:56:48 +0200
commitd1076b1b7f4049d8820f410d72c7a60bfac95152 (patch)
treeb7d734cddb6b39a1028834e4307bbc5744c35e2f /sal
parentd71c0373433da965f8a2d512f72df1d0a0adee2b (diff)
Second attempt at (cross-platform) OSL_FORMAT.
Diffstat (limited to 'sal')
-rw-r--r--sal/inc/osl/diagnose.h24
-rw-r--r--sal/osl/all/formatstring.cxx61
-rw-r--r--sal/osl/all/makefile.mk2
-rwxr-xr-xsal/util/sal.map5
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;