avmedia/source/gstreamer/gstplayer.cxx             |    6 
 compilerplugins/clang/stringliteraldefine.cxx      |  172 +++++++++++++++++++++
 compilerplugins/clang/test/stringliteraldefine.cxx |   56 ++++++
 desktop/source/migration/services/jvmfwk.cxx       |    2 
 i18npool/source/indexentry/indexentrysupplier.cxx  |    2 
 l10ntools/source/xmlparse.cxx                      |    2 
 solenv/CompilerTest_compilerplugins_clang.mk       |    1 
 svx/source/form/datanavi.cxx                       |   48 ++---
 testtools/source/bridgetest/bridgetest.cxx         |    8 
 testtools/source/bridgetest/cppobj.cxx             |    6 
 ucb/source/ucp/ftp/ftpcontent.cxx                  |    4 
 unotools/source/config/cmdoptions.cxx              |    2 
 unotools/source/config/compatibility.cxx           |    2 
 unotools/source/config/fontcfg.cxx                 |   16 -
 unotools/source/config/moduleoptions.cxx           |    2 
 15 files changed, 279 insertions(+), 50 deletions(-)

New commits:
commit 9444c925b254cca32c08c473cc294a5f0e90881a
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed Nov 10 12:28:26 2021 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Nov 10 19:10:31 2021 +0100

    new loplugin:stringliteraldefine
    
    look for
       #define FOO "foo"
    that can be converted into OUStringLiteral.
    
    This is the first pass of this plugin, only doing those #define which
    are local to a single compilation unit.
    
    Change-Id: Ic8610e29ec42c36d03db5014a93c244315d5bbea
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124962
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/avmedia/source/gstreamer/gstplayer.cxx 
b/avmedia/source/gstreamer/gstplayer.cxx
index 2e723ce6efbc..4f12f80f5ded 100644
--- a/avmedia/source/gstreamer/gstplayer.cxx
+++ b/avmedia/source/gstreamer/gstplayer.cxx
@@ -42,12 +42,12 @@
 #include "gstwindow.hxx"
 
 #include <gst/video/videooverlay.h>
-#define AVMEDIA_GST_PLAYER_IMPLEMENTATIONNAME 
"com.sun.star.comp.avmedia.Player_GStreamer"
-#define AVMEDIA_GST_PLAYER_SERVICENAME        
"com.sun.star.media.Player_GStreamer"
-
 #include <gst/pbutils/missing-plugins.h>
 #include <gst/pbutils/pbutils.h>
 
+constexpr OUStringLiteral AVMEDIA_GST_PLAYER_IMPLEMENTATIONNAME = 
u"com.sun.star.comp.avmedia.Player_GStreamer";
+constexpr OUStringLiteral AVMEDIA_GST_PLAYER_SERVICENAME        = 
u"com.sun.star.media.Player_GStreamer";
+
 #define AVVERSION "gst 1.0: "
 
 using namespace ::com::sun::star;
diff --git a/compilerplugins/clang/stringliteraldefine.cxx 
b/compilerplugins/clang/stringliteraldefine.cxx
new file mode 100644
index 000000000000..0eda65e7bea2
--- /dev/null
+++ b/compilerplugins/clang/stringliteraldefine.cxx
@@ -0,0 +1,172 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+// Find constant character array variables that are either
+//   (a) passed into O[U]String constructors
+//   (b) assigned to O[U]String
+// and are declared using macro names
+// and should thus be turned into O[U]StringLiteral variables.
+//
+
+#include <cassert>
+
+#include "check.hxx"
+#include "plugin.hxx"
+
+namespace
+{
+class StringLiteralDefine final : public 
loplugin::FilteringPlugin<StringLiteralDefine>
+{
+public:
+    explicit StringLiteralDefine(loplugin::InstantiationData const& data)
+        : FilteringPlugin(data)
+    {
+    }
+
+    bool TraverseInitListExpr(InitListExpr* expr, DataRecursionQueue* queue = 
nullptr)
+    {
+        return WalkUpFromInitListExpr(expr)
+               && TraverseSynOrSemInitListExpr(
+                      expr->isSemanticForm() ? expr : expr->getSemanticForm(), 
queue);
+    }
+
+    bool VisitCXXConstructExpr(CXXConstructExpr const* expr)
+    {
+        if (ignoreLocation(expr))
+            return true;
+        loplugin::TypeCheck const tc(expr->getType());
+        if (!(tc.Class("OString").Namespace("rtl").GlobalNamespace()
+              || tc.Class("OUString").Namespace("rtl").GlobalNamespace()))
+        {
+            return true;
+        }
+        auto const ctor = expr->getConstructor();
+        if (ctor->getNumParams() != 2)
+            return true;
+
+        const Expr* arg0 = expr->getArg(0)->IgnoreParenImpCasts();
+        auto const e1 = dyn_cast<clang::StringLiteral>(arg0);
+        if (!e1)
+            return true;
+        auto argLoc = compat::getBeginLoc(arg0);
+        // check if the arg is a macro
+        auto macroLoc = compiler.getSourceManager().getSpellingLoc(argLoc);
+        if (argLoc == macroLoc)
+            return true;
+        // check if it is the right kind of macro (not particularly reliable 
checks)
+        if (!macroLoc.isValid() || 
!compiler.getSourceManager().isInMainFile(macroLoc)
+            || compiler.getSourceManager().isInSystemHeader(macroLoc)
+// not sure when these became available
+#if CLANG_VERSION >= 130000
+            || compiler.getSourceManager().isWrittenInBuiltinFile(macroLoc)
+            || compiler.getSourceManager().isWrittenInScratchSpace(macroLoc)
+            || compiler.getSourceManager().isWrittenInCommandLineFile(macroLoc)
+#endif
+            || isInUnoIncludeFile(macroLoc))
+            return true;
+        StringRef fileName = getFilenameOfLocation(macroLoc);
+        StringRef name{ Lexer::getImmediateMacroName(
+            compat::getBeginLoc(arg0), compiler.getSourceManager(), 
compiler.getLangOpts()) };
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR "/config_host/"))
+            return true;
+        // used in both OUString and OString context
+        if (name == "FM_COL_LISTBOX" || name == 
"HID_RELATIONDIALOG_LEFTFIELDCELL"
+            || name == "OOO_HELP_INDEX" || name == "IMP_PNG" || 
name.startswith("MNI_ACTION_"))
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/svx/source/stbctrls/pszctrl.cxx"))
+            return true;
+        // used as a prefix and/or concatenated with other strings
+        if (name.startswith("UNO_JAVA_JFW") || name == "SETNODE_BINDINGS" || 
name == "PATHDELIMITER"
+            || name == "SETNODE_ALLFILEFORMATS" || name == "SETNODE_DISABLED"
+            || name == "XMLNS_DIALOGS_PREFIX" || name == "XMLNS_LIBRARY_PREFIX"
+            || name == "XMLNS_SCRIPT_PREFIX" || name == "XMLNS_TOOLBAR" || 
name == "XMLNS_XLINK"
+            || name == "XMLNS_XLINK_PREFIX")
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName,
+                                        SRCDIR 
"/stoc/source/security/access_controller.cxx")
+            && (name == "SERVICE_NAME" || name == "USER_CREDS"))
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/stoc/source/security/file_policy.cxx")
+            && name == "IMPL_NAME")
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName,
+                                        SRCDIR 
"/desktop/source/migration/services/jvmfwk.cxx")
+            && name == "IMPL_NAME")
+            return true;
+        if (loplugin::hasPathnamePrefix(
+                fileName, SRCDIR 
"/xmlsecurity/source/xmlsec/xmldocumentwrapper_xmlsecimpl.cxx")
+            && name == "STRXMLNS")
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/sw/source/ui/fldui/fldvar.cxx")
+            && name == "USER_DATA_VERSION_1")
+            return true;
+        // not sure how to exclude the case where the whole block is in a macro
+        // (vs. what I am looking for - regular code with a macro name as the 
argument)
+        if (name == "assert" || name == "SAL_INFO" || name == 
"DECLIMPL_SERVICEINFO_DERIVED"
+            || name == "OSL_VERIFY" || name == "OSL_ENSURE" || name == 
"DECL_PROP_2"
+            || name == "DECL_PROP_3" || name == "DECL_PROP_1" || name == 
"DECL_DEP_PROP_2"
+            || name == "DECL_DEP_PROP_3" || name == 
"CALL_ELEMENT_HANDLER_AND_CARE_FOR_EXCEPTIONS"
+            || name == "IMPLEMENT_SERVICE_INFO" || name == "SQL_GET_REFERENCES"
+            || name == "SFX_IMPL_OBJECTFACTORY" || name == 
"IMPLEMENT_SERVICE_INFO1"
+            || name == "IMPLEMENT_SERVICE_INFO2" || name == 
"IMPLEMENT_SERVICE_INFO3"
+            || name == "IMPLEMENT_SERVICE_INFO_IMPLNAME" || name == 
"SC_SIMPLE_SERVICE_INFO"
+            || name == "SC_SIMPLE_SERVICE_INFO_COMPAT" || name == "OUT_COMMENT"
+            || name == "LOCALE_EN" || name == "LOCALE" || name == 
"VBAFONTBASE_PROPNAME"
+            || name == "VBAHELPER_IMPL_XHELPERINTERFACE" || name == 
"IMPRESS_MAP_ENTRIES"
+            || name == "DRAW_MAP_ENTRIES" || name == 
"DRAW_PAGE_NOTES_PROPERTIES"
+            || name == "COMMON_FLDTYP_PROPERTIES" || name == 
"GRAPHIC_PAGE_PROPERTIES"
+            || name == "makeDelay" || name == "makeEvent" || name == 
"OOO_IMPORTER"
+            || name == "DBG_ASSERT" || name.startswith("CPPUNIT_ASSERT"))
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR
+                                        
"/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx")
+            && name == "DEFAULT_SIZE")
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/filter/source/t602/t602filter.cxx"))
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/hwpfilter/source/formula.cxx"))
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/hwpfilter/source/hwpreader.cxx"))
+            return true;
+        if (loplugin::hasPathnamePrefix(fileName, SRCDIR 
"/filter/source/svg/svgexport.cxx")
+            && name == "NSPREFIX")
+            return true;
+
+        if (!reported_.insert(macroLoc).second)
+            return true;
+
+        report(DiagnosticsEngine::Warning,
+               "change macro '%0' to 'constexpr "
+               "%select{OStringLiteral|OUStringLiteral}1'",
+               macroLoc)
+            << name << (tc.Class("OString").Namespace("rtl").GlobalNamespace() 
? 0 : 1);
+        report(DiagnosticsEngine::Note, "macro used here", 
compat::getBeginLoc(arg0))
+            << arg0->getSourceRange();
+        return true;
+    }
+
+    bool preRun() override { return compiler.getLangOpts().CPlusPlus; }
+
+private:
+    void run() override
+    {
+        if (preRun())
+        {
+            TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+        }
+    }
+
+    std::set<SourceLocation> reported_;
+};
+
+// Off by default because it needs some hand-holding
+static loplugin::Plugin::Registration<StringLiteralDefine> 
reg("stringliteraldefine", false);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/compilerplugins/clang/test/stringliteraldefine.cxx 
b/compilerplugins/clang/test/stringliteraldefine.cxx
new file mode 100644
index 000000000000..ba5f718ed86d
--- /dev/null
+++ b/compilerplugins/clang/test/stringliteraldefine.cxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sal/config.h>
+
+#include <vector>
+
+#include <rtl/ustring.hxx>
+#include <sal/macros.h>
+
+void f(OUString const&);
+
+void f1()
+{
+// expected-error@+1 {{change macro 'XXX' to 'constexpr OUStringLiteral' 
[loplugin:stringliteraldefine]}}
+#define XXX "xxx"
+
+    // expected-note@+1 {{macro used here [loplugin:stringliteraldefine]}}
+    f(OUString(XXX));
+
+    // FIXME no warning expected
+    //#define FOO f(OUString("xxx"))
+    //    FOO;
+}
+
+void f2()
+{
+    struct DataFlavorRepresentation
+    {
+        OUString pMimeType;
+    };
+
+// expected-error@+1 {{change macro 'MIMETYPE_VND_SUN_XML_WRITER_ASCII' to 
'constexpr OUStringLiteral' [loplugin:stringliteraldefine]}}
+#define MIMETYPE_VND_SUN_XML_WRITER_ASCII "xxx"
+    static const DataFlavorRepresentation aInstance[] = {
+        // expected-note@+1 {{macro used here [loplugin:stringliteraldefine]}}
+        { MIMETYPE_VND_SUN_XML_WRITER_ASCII },
+    };
+}
+
+void f3()
+{
+// expected-error@+1 {{change macro 'YYY' to 'constexpr OUStringLiteral' 
[loplugin:stringliteraldefine]}}
+#define YYY "yyy"
+
+    // expected-note@+1 {{macro used here [loplugin:stringliteraldefine]}}
+    f(YYY);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/desktop/source/migration/services/jvmfwk.cxx 
b/desktop/source/migration/services/jvmfwk.cxx
index d388692e4be5..65eff6767459 100644
--- a/desktop/source/migration/services/jvmfwk.cxx
+++ b/desktop/source/migration/services/jvmfwk.cxx
@@ -40,7 +40,7 @@
 
 #include <osl/diagnose.h>
 
-#define SERVICE_NAME "com.sun.star.migration.Java"
+constexpr OUStringLiteral SERVICE_NAME = u"com.sun.star.migration.Java";
 #define IMPL_NAME "com.sun.star.comp.desktop.migration.Java"
 
 #define ENABLE_JAVA     1
diff --git a/i18npool/source/indexentry/indexentrysupplier.cxx 
b/i18npool/source/indexentry/indexentrysupplier.cxx
index bbaa2cc21c37..0b463315e872 100644
--- a/i18npool/source/indexentry/indexentrysupplier.cxx
+++ b/i18npool/source/indexentry/indexentrysupplier.cxx
@@ -171,7 +171,7 @@ OUString SAL_CALL 
IndexEntrySupplier::getIndexFollowPageWord( sal_Bool bMorePage
                 aFollowPageWords[0] : OUString());
 }
 
-#define implementationName "com.sun.star.i18n.IndexEntrySupplier"
+constexpr OUStringLiteral implementationName = 
u"com.sun.star.i18n.IndexEntrySupplier";
 
 OUString SAL_CALL
 IndexEntrySupplier::getImplementationName()
diff --git a/l10ntools/source/xmlparse.cxx b/l10ntools/source/xmlparse.cxx
index e7c4fad6eb95..bb37352f71dc 100644
--- a/l10ntools/source/xmlparse.cxx
+++ b/l10ntools/source/xmlparse.cxx
@@ -36,7 +36,7 @@
 
 using namespace osl;
 
-#define XML_LANG    "xml-lang"
+constexpr OStringLiteral XML_LANG = "xml-lang";
 
 
 
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk 
b/solenv/CompilerTest_compilerplugins_clang.mk
index b2dd397bbf46..53f51e0759ba 100644
--- a/solenv/CompilerTest_compilerplugins_clang.mk
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -91,6 +91,7 @@ $(eval $(call 
gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
     compilerplugins/clang/test/stringconcatliterals \
     compilerplugins/clang/test/stringconstant \
     compilerplugins/clang/test/stringliteralvar \
+    compilerplugins/clang/test/stringliteraldefine \
     compilerplugins/clang/test/stringloop \
     compilerplugins/clang/test/stringstatic \
     compilerplugins/clang/test/stringview \
diff --git a/svx/source/form/datanavi.cxx b/svx/source/form/datanavi.cxx
index 4d5ac51af1d3..ea553e28810e 100644
--- a/svx/source/form/datanavi.cxx
+++ b/svx/source/form/datanavi.cxx
@@ -74,36 +74,36 @@ namespace svxform
 {
 
     // properties of instance
-    #define PN_INSTANCE_MODEL       "Instance"
-    #define PN_INSTANCE_ID          "ID"
-    #define PN_INSTANCE_URL         "URL"
+    constexpr OUStringLiteral PN_INSTANCE_MODEL = u"Instance";
+    constexpr OUStringLiteral PN_INSTANCE_ID = u"ID";
+    constexpr OUStringLiteral PN_INSTANCE_URL = u"URL";
 
     // properties of binding
-    #define PN_BINDING_ID           "BindingID"
-    #define PN_BINDING_EXPR         "BindingExpression"
-    #define PN_BINDING_MODEL        "Model"
-    #define PN_BINDING_NAMESPACES   "ModelNamespaces"
-    #define PN_READONLY_EXPR        "ReadonlyExpression"
-    #define PN_RELEVANT_EXPR        "RelevantExpression"
-    #define PN_REQUIRED_EXPR        "RequiredExpression"
-    #define PN_CONSTRAINT_EXPR      "ConstraintExpression"
-    #define PN_CALCULATE_EXPR       "CalculateExpression"
-    #define PN_BINDING_TYPE         "Type"
+    constexpr OUStringLiteral PN_BINDING_ID = u"BindingID";
+    constexpr OUStringLiteral PN_BINDING_EXPR = u"BindingExpression";
+    constexpr OUStringLiteral PN_BINDING_MODEL = u"Model";
+    constexpr OUStringLiteral PN_BINDING_NAMESPACES = u"ModelNamespaces";
+    constexpr OUStringLiteral PN_READONLY_EXPR = u"ReadonlyExpression";
+    constexpr OUStringLiteral PN_RELEVANT_EXPR = u"RelevantExpression";
+    constexpr OUStringLiteral PN_REQUIRED_EXPR = u"RequiredExpression";
+    constexpr OUStringLiteral PN_CONSTRAINT_EXPR = u"ConstraintExpression";
+    constexpr OUStringLiteral PN_CALCULATE_EXPR = u"CalculateExpression";
+    constexpr OUStringLiteral PN_BINDING_TYPE = u"Type";
 
     // properties of submission
-    #define PN_SUBMISSION_ID        "ID"
-    #define PN_SUBMISSION_BIND      "Bind"
-    #define PN_SUBMISSION_REF       "Ref"
-    #define PN_SUBMISSION_ACTION    "Action"
-    #define PN_SUBMISSION_METHOD    "Method"
-    #define PN_SUBMISSION_REPLACE   "Replace"
+    constexpr OUStringLiteral PN_SUBMISSION_ID = u"ID";
+    constexpr OUStringLiteral PN_SUBMISSION_BIND = u"Bind";
+    constexpr OUStringLiteral PN_SUBMISSION_REF = u"Ref";
+    constexpr OUStringLiteral PN_SUBMISSION_ACTION = u"Action";
+    constexpr OUStringLiteral PN_SUBMISSION_METHOD = u"Method";
+    constexpr OUStringLiteral PN_SUBMISSION_REPLACE = u"Replace";
 
     // other const strings
-    #define TRUE_VALUE              "true()"
-    #define NEW_ELEMENT             "newElement"
-    #define NEW_ATTRIBUTE           "newAttribute"
-    #define EVENTTYPE_CHARDATA      "DOMCharacterDataModified"
-    #define EVENTTYPE_ATTR          "DOMAttrModified"
+    constexpr OUStringLiteral TRUE_VALUE = u"true()";
+    constexpr OUStringLiteral NEW_ELEMENT = u"newElement";
+    constexpr OUStringLiteral NEW_ATTRIBUTE = u"newAttribute";
+    constexpr OUStringLiteral EVENTTYPE_CHARDATA = u"DOMCharacterDataModified";
+    constexpr OUStringLiteral EVENTTYPE_ATTR = u"DOMAttrModified";
 
     #define MIN_PAGE_COUNT          3 // at least one instance, one submission 
and one binding page
 
diff --git a/testtools/source/bridgetest/bridgetest.cxx 
b/testtools/source/bridgetest/bridgetest.cxx
index bb1c3af497f2..5860708695d2 100644
--- a/testtools/source/bridgetest/bridgetest.cxx
+++ b/testtools/source/bridgetest/bridgetest.cxx
@@ -67,10 +67,10 @@ using namespace com::sun::star::bridge;
 using namespace test::testtools::bridgetest;
 
 
-#define SERVICENAME     "com.sun.star.test.bridge.BridgeTest"
-#define IMPLNAME        "com.sun.star.comp.bridge.BridgeTest"
+constexpr OUStringLiteral SERVICENAME = u"com.sun.star.test.bridge.BridgeTest";
+constexpr OUStringLiteral IMPLNAME = u"com.sun.star.comp.bridge.BridgeTest";
 
-#define STRING_TEST_CONSTANT "\" paco\' chorizo\\\' \"\'"
+constexpr OUStringLiteral STRING_TEST_CONSTANT  = u"\" paco\' chorizo\\\' 
\"\'";
 
 namespace bridge_test
 {
@@ -1313,7 +1313,7 @@ SAL_DLLPUBLIC_EXPORT void * component_getFactory(
 {
     void * pRet = nullptr;
 
-    if (pServiceManager && rtl_str_compare( pImplName, IMPLNAME ) == 0)
+    if (pServiceManager && OUString(IMPLNAME).equalsAscii(pImplName))
     {
         Reference< XInterface > xFactory(
             createSingleComponentFactory(
diff --git a/testtools/source/bridgetest/cppobj.cxx 
b/testtools/source/bridgetest/cppobj.cxx
index f8cfb521351e..9d5b469d48c7 100644
--- a/testtools/source/bridgetest/cppobj.cxx
+++ b/testtools/source/bridgetest/cppobj.cxx
@@ -61,8 +61,8 @@ using namespace test::testtools::bridgetest;
 #pragma warning (disable : 4503) // irrelevant for test code
 #endif
 
-#define SERVICENAME     "com.sun.star.test.bridge.CppTestObject"
-#define IMPLNAME        "com.sun.star.comp.bridge.CppTestObject"
+constexpr OUStringLiteral SERVICENAME = 
u"com.sun.star.test.bridge.CppTestObject";
+constexpr OUStringLiteral IMPLNAME = u"com.sun.star.comp.bridge.CppTestObject";
 
 namespace bridge_object
 {
@@ -1199,7 +1199,7 @@ SAL_DLLPUBLIC_EXPORT void * component_getFactory(
 {
     void * pRet = nullptr;
 
-    if (pServiceManager && rtl_str_compare( pImplName, IMPLNAME ) == 0)
+    if (pServiceManager && OUString(IMPLNAME).equalsAscii(pImplName))
     {
         Reference< XSingleServiceFactory > xFactory( createSingleFactory(
             static_cast< XMultiServiceFactory * >( pServiceManager ),
diff --git a/ucb/source/ucp/ftp/ftpcontent.cxx 
b/ucb/source/ucp/ftp/ftpcontent.cxx
index b10d6469506f..3b035681da95 100644
--- a/ucb/source/ucp/ftp/ftpcontent.cxx
+++ b/ucb/source/ucp/ftp/ftpcontent.cxx
@@ -557,9 +557,9 @@ Any SAL_CALL FTPContent::execute( const Command& aCommand,
     }
 }
 
-#define FTP_FILE "application/vnd.sun.staroffice.ftp-file"
+constexpr OUStringLiteral FTP_FILE = 
u"application/vnd.sun.staroffice.ftp-file";
 
-#define FTP_FOLDER "application/vnd.sun.staroffice.ftp-folder"
+constexpr OUStringLiteral FTP_FOLDER = 
u"application/vnd.sun.staroffice.ftp-folder";
 
 Sequence<ContentInfo > SAL_CALL
 FTPContent::queryCreatableContentsInfo(  )
diff --git a/unotools/source/config/cmdoptions.cxx 
b/unotools/source/config/cmdoptions.cxx
index 631c3ddbfb1d..b61e49840390 100644
--- a/unotools/source/config/cmdoptions.cxx
+++ b/unotools/source/config/cmdoptions.cxx
@@ -40,7 +40,7 @@ using namespace ::osl;
 using namespace ::com::sun::star::uno;
 using namespace ::com::sun::star::beans;
 
-#define ROOTNODE_CMDOPTIONS                             
"Office.Commands/Execute"
+constexpr OUStringLiteral ROOTNODE_CMDOPTIONS        = 
u"Office.Commands/Execute";
 #define PATHDELIMITER                                   "/"
 
 #define SETNODE_DISABLED                                "Disabled"
diff --git a/unotools/source/config/compatibility.cxx 
b/unotools/source/config/compatibility.cxx
index 46d50889f6bc..b12cf6174d58 100644
--- a/unotools/source/config/compatibility.cxx
+++ b/unotools/source/config/compatibility.cxx
@@ -39,7 +39,7 @@ using namespace ::osl;
 using namespace ::com::sun::star::uno;
 using namespace ::com::sun::star::beans;
 
-#define ROOTNODE_OPTIONS        "Office.Compatibility"
+constexpr OUStringLiteral ROOTNODE_OPTIONS = u"Office.Compatibility";
 #define PATHDELIMITER           "/"
 #define SETNODE_ALLFILEFORMATS  "AllFileFormats"
 
diff --git a/unotools/source/config/fontcfg.cxx 
b/unotools/source/config/fontcfg.cxx
index 9c26795e2611..cfa6705a41c6 100644
--- a/unotools/source/config/fontcfg.cxx
+++ b/unotools/source/config/fontcfg.cxx
@@ -241,14 +241,14 @@ OUString DefaultFontConfiguration::getUserInterfaceFont( 
const LanguageTag& rLan
 
     // fallback mechanism (either no configuration or no entry in configuration
 
-    #define FALLBACKFONT_UI_SANS "Andale Sans UI;Albany;Albany 
AMT;Tahoma;Arial Unicode MS;Arial;Nimbus Sans L;Bitstream Vera 
Sans;gnu-unifont;Interface 
User;Geneva;WarpSans;Dialog;Swiss;Lucida;Helvetica;Charcoal;Chicago;MS Sans 
Serif;Helv;Times;Times New Roman;Interface System"
-    #define FALLBACKFONT_UI_SANS_LATIN2 "Andale Sans UI;Albany;Albany 
AMT;Tahoma;Arial Unicode MS;Arial;Nimbus Sans L;Luxi Sans;Bitstream Vera 
Sans;Interface 
User;Geneva;WarpSans;Dialog;Swiss;Lucida;Helvetica;Charcoal;Chicago;MS Sans 
Serif;Helv;Times;Times New Roman;Interface System"
-    #define FALLBACKFONT_UI_SANS_ARABIC "Tahoma;Traditional Arabic;Simplified 
Arabic;Lucidasans;Lucida Sans;Supplement;Andale Sans UI;clearlyU;Interface 
User;Arial Unicode MS;Lucida Sans Unicode;WarpSans;Geneva;MS Sans 
Serif;Helv;Dialog;Albany;Lucida;Helvetica;Charcoal;Chicago;Arial;Helmet;Interface
 System;Sans Serif"
-    #define FALLBACKFONT_UI_SANS_THAI "OONaksit;Tahoma;Lucidasans;Arial 
Unicode MS"
-    #define FALLBACKFONT_UI_SANS_KOREAN "Noto Sans KR;Noto Sans CJK KR;Noto 
Serif KR;Noto Serif CJK KR;Source Han Sans 
KR;NanumGothic;NanumBarunGothic;NanumBarunGothic YetHangul;KoPubWorld 
Dotum;Malgun Gothic;Apple SD Gothic 
Neo;Dotum;DotumChe;Gulim;GulimChe;Batang;BatangChe;Apple Gothic;UnDotum;Baekmuk 
Gulim;Arial Unicode MS;Lucida Sans Unicode;gnu-unifont;Andale Sans UI"
-    #define FALLBACKFONT_UI_SANS_JAPANESE "Noto Sans CJK JP;Noto Sans 
JP;Source Han Sans;Source Han Sans JP;Yu Gothic UI;Yu Gothic;YuGothic;Hiragino 
Sans;Hiragino Kaku Gothic ProN;Hiragino Kaku Gothic Pro;Hiragino Kaku Gothic 
StdN;Meiryo UI;Meiryo;IPAexGothic;IPAPGothic;IPAGothic;MS UI Gothic;MS 
PGothic;MS Gothic;Osaka;Unifont;gnu-unifont;Arial Unicode MS;Interface System"
-    #define FALLBACKFONT_UI_SANS_CHINSIM "Andale Sans UI;Arial Unicode 
MS;ZYSong18030;AR PL SungtiL GB;AR PL KaitiM GB;SimSun;Lucida Sans 
Unicode;Fangsong;Hei;Song;Kai;Ming;gnu-unifont;Interface User;"
-    #define FALLBACKFONT_UI_SANS_CHINTRD "Andale Sans UI;Arial Unicode MS;AR 
PL Mingti2L Big5;AR PL KaitiM Big5;Kai;PMingLiU;MingLiU;Ming;Lucida Sans 
Unicode;gnu-unifont;Interface User;"
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS = u"Andale Sans 
UI;Albany;Albany AMT;Tahoma;Arial Unicode MS;Arial;Nimbus Sans L;Bitstream Vera 
Sans;gnu-unifont;Interface 
User;Geneva;WarpSans;Dialog;Swiss;Lucida;Helvetica;Charcoal;Chicago;MS Sans 
Serif;Helv;Times;Times New Roman;Interface System";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_LATIN2 = u"Andale 
Sans UI;Albany;Albany AMT;Tahoma;Arial Unicode MS;Arial;Nimbus Sans L;Luxi 
Sans;Bitstream Vera Sans;Interface 
User;Geneva;WarpSans;Dialog;Swiss;Lucida;Helvetica;Charcoal;Chicago;MS Sans 
Serif;Helv;Times;Times New Roman;Interface System";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_ARABIC = 
u"Tahoma;Traditional Arabic;Simplified Arabic;Lucidasans;Lucida 
Sans;Supplement;Andale Sans UI;clearlyU;Interface User;Arial Unicode MS;Lucida 
Sans Unicode;WarpSans;Geneva;MS Sans 
Serif;Helv;Dialog;Albany;Lucida;Helvetica;Charcoal;Chicago;Arial;Helmet;Interface
 System;Sans Serif";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_THAI = 
u"OONaksit;Tahoma;Lucidasans;Arial Unicode MS";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_KOREAN = u"Noto Sans 
KR;Noto Sans CJK KR;Noto Serif KR;Noto Serif CJK KR;Source Han Sans 
KR;NanumGothic;NanumBarunGothic;NanumBarunGothic YetHangul;KoPubWorld 
Dotum;Malgun Gothic;Apple SD Gothic 
Neo;Dotum;DotumChe;Gulim;GulimChe;Batang;BatangChe;Apple Gothic;UnDotum;Baekmuk 
Gulim;Arial Unicode MS;Lucida Sans Unicode;gnu-unifont;Andale Sans UI";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_JAPANESE = u"Noto 
Sans CJK JP;Noto Sans JP;Source Han Sans;Source Han Sans JP;Yu Gothic UI;Yu 
Gothic;YuGothic;Hiragino Sans;Hiragino Kaku Gothic ProN;Hiragino Kaku Gothic 
Pro;Hiragino Kaku Gothic StdN;Meiryo 
UI;Meiryo;IPAexGothic;IPAPGothic;IPAGothic;MS UI Gothic;MS PGothic;MS 
Gothic;Osaka;Unifont;gnu-unifont;Arial Unicode MS;Interface System";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_CHINSIM = u"Andale 
Sans UI;Arial Unicode MS;ZYSong18030;AR PL SungtiL GB;AR PL KaitiM 
GB;SimSun;Lucida Sans Unicode;Fangsong;Hei;Song;Kai;Ming;gnu-unifont;Interface 
User;";
+    static constexpr OUStringLiteral FALLBACKFONT_UI_SANS_CHINTRD = u"Andale 
Sans UI;Arial Unicode MS;AR PL Mingti2L Big5;AR PL KaitiM 
Big5;Kai;PMingLiU;MingLiU;Ming;Lucida Sans Unicode;gnu-unifont;Interface User;";
 
     const OUString aLanguage( aLanguageTag.getLanguage());
 
diff --git a/unotools/source/config/moduleoptions.cxx 
b/unotools/source/config/moduleoptions.cxx
index 44205dd06a59..0af82141d30a 100644
--- a/unotools/source/config/moduleoptions.cxx
+++ b/unotools/source/config/moduleoptions.cxx
@@ -52,7 +52,7 @@
                     e.g.:
                             NAMELIST[ PROPERTYHANDLE_xxx ] => VALUELIST[ 
PROPERTYHANDLE_xxx ]
 
*//*-*************************************************************************************************************/
-#define ROOTNODE_FACTORIES                  "Setup/Office/Factories"
+constexpr OUStringLiteral ROOTNODE_FACTORIES = u"Setup/Office/Factories";
 #define PATHSEPARATOR                       "/"
 
 // Attention: The property "ooSetupFactoryEmptyDocumentURL" is read from 
configuration but not used! There is

Reply via email to