diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-02-18 17:41:29 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-02-18 17:41:29 +0100 |
commit | 793f801a5ccc76645e569adb971eeced67e763be (patch) | |
tree | 3c095a73a0d16b890fe0e8fe6dfce86190501410 /src/parser.cpp | |
parent | 0674f295767f2e953baf2eec13cdd4be52468ca1 (diff) | |
download | sciteco-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.cpp | 20 |
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); } /* |