aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2014-02-18 17:41:29 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2014-02-18 17:41:29 +0100
commit793f801a5ccc76645e569adb971eeced67e763be (patch)
tree3c095a73a0d16b890fe0e8fe6dfce86190501410 /src/parser.cpp
parent0674f295767f2e953baf2eec13cdd4be52468ca1 (diff)
downloadsciteco-793f801a5ccc76645e569adb971eeced67e763be.tar.gz
removed unreliable CHR2STR() macro
* referencing temporaries is unreliable/buggy in GNU C++, at least since v4.7 * in higher optimization levels it resulted in massive memory corruptions * this is responsible for the build issues (PPA build issues) * instead, always declare a buffer on the stack which guarantees that the variable lives long enough * the g_strdup(CHR2STR(x)) idiom has been replaced with String::chrdup(x)
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index fa70482..d39d9ef 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -385,7 +385,7 @@ StateLower:
set(StateStart);
if (chr != CTL_KEY('V'))
- return g_strdup(CHR2STR(g_ascii_tolower(chr)));
+ return String::chrdup(g_ascii_tolower(chr));
undo.push_var(mode) = MODE_LOWER;
return NULL;
@@ -394,7 +394,7 @@ StateUpper:
set(StateStart);
if (chr != CTL_KEY('W'))
- return g_strdup(CHR2STR(g_ascii_toupper(chr)));
+ return String::chrdup(g_ascii_toupper(chr));
undo.push_var(mode) = MODE_UPPER;
return NULL;
@@ -413,9 +413,15 @@ StateCtlE:
undo.push_obj(qregspec_machine) = new QRegSpecMachine;
set(&&StateCtlEU);
break;
- default:
+ default: {
+ gchar *ret = (gchar *)g_malloc(3);
+
set(StateStart);
- return g_strdup(CHR2STR(CTL_KEY('E'), chr));
+ ret[0] = CTL_KEY('E');
+ ret[1] = chr;
+ ret[2] = '\0';
+ return ret;
+ }
}
return NULL;
@@ -436,7 +442,7 @@ StateCtlEU:
undo.push_obj(qregspec_machine) = NULL;
set(StateStart);
- return g_strdup(CHR2STR((gchar)reg->get_integer()));
+ return String::chrdup((gchar)reg->get_integer());
StateCtlEQ:
reg = qregspec_machine->input(chr);
@@ -449,7 +455,7 @@ StateCtlEQ:
StateEscaped:
set(StateStart);
- return g_strdup(CHR2STR(chr));
+ return String::chrdup(chr);
}
StringBuildingMachine::~StringBuildingMachine()
@@ -524,7 +530,7 @@ StateExpectString::custom(gchar chr)
if (!insert)
return this;
} else {
- insert = g_strdup(CHR2STR(chr));
+ insert = String::chrdup(chr);
}
/*