diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.cpp | 20 | ||||
-rw-r--r-- | src/qregisters.cpp | 2 | ||||
-rw-r--r-- | src/qregisters.h | 6 | ||||
-rw-r--r-- | src/sciteco.h | 24 |
4 files changed, 34 insertions, 18 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); } /* diff --git a/src/qregisters.cpp b/src/qregisters.cpp index 1794dbd..f0d56a5 100644 --- a/src/qregisters.cpp +++ b/src/qregisters.cpp @@ -377,7 +377,7 @@ MICROSTATE_START; case '#': set(&&StateFirstChar); break; case '{': set(&&StateString); break; default: - undo.push_str(name) = g_strdup(CHR2STR(g_ascii_toupper(chr))); + undo.push_str(name) = String::chrdup(g_ascii_toupper(chr)); goto done; } diff --git a/src/qregisters.h b/src/qregisters.h index d548179..511d770 100644 --- a/src/qregisters.h +++ b/src/qregisters.h @@ -186,7 +186,8 @@ public: inline QRegister * insert(gchar name) { - return insert(CHR2STR(name)); + gchar buf[] = {name, '\0'}; + return insert(buf); } inline QRegister * @@ -198,7 +199,8 @@ public: inline QRegister * operator [](gchar chr) { - return operator [](CHR2STR(chr)); + gchar buf[] = {chr, '\0'}; + return operator [](buf); } void edit(QRegister *reg); diff --git a/src/sciteco.h b/src/sciteco.h index 65b8e9a..1a349a1 100644 --- a/src/sciteco.h +++ b/src/sciteco.h @@ -63,15 +63,22 @@ extern sig_atomic_t sigint_occurred; #define IS_SUCCESS(X) ((X) < 0) #define IS_FAILURE(X) (!IS_SUCCESS(X)) -/* - * NOTE: compound literals are temporaries beginning with - * g++ 4.7 - */ -#define CHR2STR(X, ...) \ - ({gchar str[] = {(X), ##__VA_ARGS__, '\0'}; str;}) - namespace String { +static inline gchar * +chrdup(gchar chr) +{ + gchar *ret = (gchar *)g_malloc(2); + + /* + * NOTE: even the glib allocs are configured to throw exceptions, + * so there is no error handling necessary + */ + ret[0] = chr; + ret[1] = '\0'; + return ret; +} + static inline void append(gchar *&str1, const gchar *str2) { @@ -84,7 +91,8 @@ append(gchar *&str1, const gchar *str2) static inline void append(gchar *&str, gchar chr) { - append(str, CHR2STR(chr)); + gchar buf[] = {chr, '\0'}; + append(str, buf); } /* in main.cpp */ |