summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2011-10-08 12:58:14 +0200
committerStephan Bergmann <sbergman@redhat.com>2011-10-08 12:59:09 +0200
commit6b900b8bede24c8710d62e9e7cbff613a0b12f9f (patch)
tree7171825495fa78eb93b23ca9c2d30f26da45f91b /sal
parent8ac7152ca8b3b71c17ea55ec9e660804990ab86c (diff)
Introduced OSL_FORMAT, adpated some places to it.
Diffstat (limited to 'sal')
-rw-r--r--sal/inc/osl/diagnose.h20
-rw-r--r--sal/osl/all/formatstring.cxx58
-rw-r--r--sal/osl/all/makefile.mk2
-rwxr-xr-xsal/util/sal.map5
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;