@@ -10,7 +10,9 @@ struct _LogPrivate
10
10
11
11
G_DEFINE_TYPE (Log , log , GTK_TYPE_LIST_STORE );
12
12
13
- static void log_finalize (GObject * object ) { G_OBJECT_CLASS (log_parent_class )-> finalize (object ); }
13
+ static void log_finalize (GObject * object ) {
14
+ G_OBJECT_CLASS (log_parent_class )-> finalize (object );
15
+ }
14
16
15
17
static void log_class_init (LogClass * klass )
16
18
{
@@ -30,20 +32,43 @@ static void log_init (Log *self)
30
32
31
33
Log * log_new () { return g_object_new (LOG_TYPE , NULL ); }
32
34
35
+
36
+
37
+ static GRegex * splitter () {
38
+ GError * error = NULL ;
39
+ GRegex * regex = g_regex_new ("[\\r\\n]*(.*?)[\\n$]+" , 0 ,0 , & error );
40
+ g_assert (error == NULL );
41
+ g_assert (regex != NULL );
42
+ return regex ;
43
+ }
44
+
45
+
33
46
/**
34
47
* trim only newlines
35
48
*/
36
- gchar * log_append_trim_message (const gchar * string ) {
37
- if (string == NULL )
49
+ gchar * log_append_trim_message (const gchar * str ) {
50
+ // skip empty or null strings right away
51
+ if (str == NULL || str [0 ] == '\0' ) {
38
52
return NULL ;
39
- gchar * * array = g_regex_split_simple ("[\\r\\n]*(.*?)[\\n$]+" , string , 0 , 0 );
40
- gchar * ret_val = g_strdup (array [0 ]);
41
- g_strfreev (array );
42
- if (* ret_val == 0 ) {
43
- g_free (ret_val );
44
- ret_val = NULL ;
45
53
}
46
- return ret_val ;
54
+ // TODO this is inefficient
55
+
56
+ gchar * * array = g_regex_split (regex , str );
57
+ gchar * cloned = NULL ;
58
+ if (array != NULL && array [0 ] != NULL ) {
59
+ cloned = g_strdup (array [0 ]);
60
+ if (array [0 ] == str ) {
61
+ // avoid duplicate free in case not matching anything
62
+ array [0 ] = NULL ;
63
+ }
64
+ g_strfreev (array );
65
+ }
66
+ // after split might be length zer0 too, skip those
67
+ if (cloned != NULL && (cloned [0 ] == '\0' ) {
68
+ g_free (cloned );
69
+ cloned = NULL ;
70
+ }
71
+ return cloned ;
47
72
}
48
73
49
74
/**
0 commit comments