commit c16ccdb5fd25a14c096ef9dfa68975c77377bf41
Author: Enrico Forestieri <for...@lyx.org>
Date:   Sun Oct 15 15:29:33 2017 +0200

    Fix issue with regular expressions
    
    At least with gcc 6.4, if the first parameter passed to
    regex_match() is afterward changed, the second one gets
    corrupted. This is avoided by using a temporary string.
---
 src/BiblioInfo.cpp |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp
index 87245d3..bb7c64c 100644
--- a/src/BiblioInfo.cpp
+++ b/src/BiblioInfo.cpp
@@ -236,6 +236,8 @@ docstring constructName(docstring const & name, string 
const scheme)
        static regex const 
reg2("(.*)(\\{%suffix%\\[\\[)([^\\]]+)(\\]\\]\\})(.*)");
        static regex const 
reg3("(.*)(\\{%prefix%\\[\\[)([^\\]]+)(\\]\\]\\})(.*)");
        smatch sub;
+       // Changing the first parameter of regex_match() may corrupt the
+       // second one. In this case we use the temporary string tmp.
        if (regex_match(scheme, sub, reg1)) {
                res = sub.str(1);
                if (!prename.empty())
@@ -243,16 +245,16 @@ docstring constructName(docstring const & name, string 
const scheme)
                res += sub.str(5);
        }
        if (regex_match(res, sub, reg2)) {
-               res = sub.str(1);
+               string tmp = sub.str(1);
                if (!suffix.empty())
-                       res += sub.str(3);
-               res += sub.str(5);
+                       tmp += sub.str(3);
+               res = tmp + sub.str(5);
        }
        if (regex_match(res, sub, reg3)) {
-               res = sub.str(1);
+               string tmp = sub.str(1);
                if (!prefix.empty())
-                       res += sub.str(3);
-               res += sub.str(5);
+                       tmp += sub.str(3);
+               res = tmp + sub.str(5);
        }
        docstring result = from_ascii(res);
        result = subst(result, from_ascii("%prename%"), prename);

Reply via email to