@@ -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,48 @@ 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
+
55
+
56
+ static GOnce once = G_ONCE_INIT ;
57
+
58
+ g_once (& once , (GThreadFunc )splitter , NULL );
59
+
60
+
61
+ gchar * * array = g_regex_split (once .retval , str , G_REGEX_MATCH_NOTEMPTY );
62
+ gchar * cloned = NULL ;
63
+ if (array != NULL && array [0 ] != NULL ) {
64
+ cloned = g_strdup (array [0 ]);
65
+ if (array [0 ] == str ) {
66
+ // avoid duplicate free in case not matching anything
67
+ array [0 ] = NULL ;
68
+ }
69
+ g_strfreev (array );
70
+ }
71
+ // after split might be length zer0 too, skip those
72
+ if ((cloned != NULL ) && (cloned [0 ] == '\0' )) {
73
+ g_free (cloned );
74
+ cloned = NULL ;
75
+ }
76
+ return cloned ;
47
77
}
48
78
49
79
/**
0 commit comments