aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--TODO2
-rw-r--r--src/parser.cpp20
-rw-r--r--src/qregisters.cpp2
-rw-r--r--src/qregisters.h6
-rw-r--r--src/sciteco.h24
5 files changed, 34 insertions, 20 deletions
diff --git a/TODO b/TODO
index d83c9a8..98198ae 100644
--- a/TODO
+++ b/TODO
@@ -2,8 +2,6 @@ Known Bugs:
* ??? Dot is not always restored properly (e.g. after closing file)
need test case!!!
* Null-byte in strings not always handled transparently
- * strange crashes during automated builds:
- I will investigate after finishing the error tracing feature
* saving another user's file will only preserve the user when run as root
(WON'T FIX!?)
* Scintilla/Scinterm: sometimes <TAB> indents too much (see e.g. state declarations)
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 */