summaryrefslogtreecommitdiff
path: root/src/fe-common
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe-common')
-rw-r--r--src/fe-common/core/themes.c59
-rw-r--r--src/fe-common/irc/fe-netjoin.c13
-rw-r--r--src/fe-common/irc/fe-netsplit.c12
3 files changed, 56 insertions, 28 deletions
diff --git a/src/fe-common/core/themes.c b/src/fe-common/core/themes.c
index 6692985b..5a817daa 100644
--- a/src/fe-common/core/themes.c
+++ b/src/fe-common/core/themes.c
@@ -382,7 +382,8 @@ char *theme_format_expand_get(THEME_REC *theme, const char **format)
} else {
theme_format_append_next(theme, str, format,
reset, reset,
- &dummy, &dummy, 0);
+ &dummy, &dummy,
+ EXPAND_FLAG_IGNORE_REPLACES);
continue;
}
@@ -400,12 +401,15 @@ char *theme_format_expand_get(THEME_REC *theme, const char **format)
return ret;
}
+static char *theme_format_expand_data_rec(THEME_REC *theme, const char **format,
+ theme_rm_col default_fg, theme_rm_col default_bg,
+ theme_rm_col *save_last_fg, theme_rm_col *save_last_bg,
+ int flags, GTree *block_list);
+
/* expand a single {abstract ...data... } */
-static char *theme_format_expand_abstract(THEME_REC *theme,
- const char **formatp,
- theme_rm_col *last_fg,
- theme_rm_col *last_bg,
- int flags)
+static char *theme_format_expand_abstract(THEME_REC *theme, const char **formatp,
+ theme_rm_col *last_fg, theme_rm_col *last_bg, int flags,
+ GTree *block_list)
{
GString *str;
const char *p, *format;
@@ -439,12 +443,20 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
}
*formatp = format+len;
+ if (block_list == NULL) {
+ block_list = g_tree_new_full((GCompareDataFunc) g_strcmp0, NULL, g_free, NULL);
+ } else {
+ g_tree_ref(block_list);
+ }
+
/* get the abstract data */
data = g_hash_table_lookup(theme->abstracts, abstract);
- g_free(abstract);
- if (data == NULL) {
+ if (data == NULL || g_tree_lookup(block_list, abstract) != NULL) {
/* unknown abstract, just display the data */
data = "$0-";
+ g_free(abstract);
+ } else {
+ g_tree_insert(block_list, abstract, abstract);
}
abstract = g_strdup(data);
@@ -473,7 +485,7 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
str = g_string_new(NULL);
p = ret;
while (*p != '\0') {
- if (*p == '\\') {
+ if (*p == '\\' && p[1] != '\0') {
int chr;
p++;
chr = expand_escape(&p);
@@ -488,18 +500,17 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
/* abstract may itself contain abstracts or replaces */
p = abstract;
- ret = theme_format_expand_data(theme, &p, default_fg, default_bg,
- last_fg, last_bg,
- flags | EXPAND_FLAG_LASTCOLOR_ARG);
+ ret = theme_format_expand_data_rec(theme, &p, default_fg, default_bg, last_fg, last_bg,
+ flags | EXPAND_FLAG_LASTCOLOR_ARG, block_list);
g_free(abstract);
+ g_tree_unref(block_list);
return ret;
}
-/* expand the data part in {abstract data} */
-char *theme_format_expand_data(THEME_REC *theme, const char **format,
- theme_rm_col default_fg, theme_rm_col default_bg,
- theme_rm_col *save_last_fg, theme_rm_col *save_last_bg,
- int flags)
+static char *theme_format_expand_data_rec(THEME_REC *theme, const char **format,
+ theme_rm_col default_fg, theme_rm_col default_bg,
+ theme_rm_col *save_last_fg, theme_rm_col *save_last_bg,
+ int flags, GTree *block_list)
{
GString *str;
char *ret, *abstract;
@@ -545,9 +556,8 @@ char *theme_format_expand_data(THEME_REC *theme, const char **format,
break; /* error */
/* get a single {...} */
- abstract = theme_format_expand_abstract(theme, format,
- &last_fg, &last_bg,
- recurse_flags);
+ abstract = theme_format_expand_abstract(theme, format, &last_fg, &last_bg,
+ recurse_flags, block_list);
if (abstract != NULL) {
g_string_append(str, abstract);
g_free(abstract);
@@ -565,6 +575,15 @@ char *theme_format_expand_data(THEME_REC *theme, const char **format,
return ret;
}
+/* expand the data part in {abstract data} */
+char *theme_format_expand_data(THEME_REC *theme, const char **format, theme_rm_col default_fg,
+ theme_rm_col default_bg, theme_rm_col *save_last_fg,
+ theme_rm_col *save_last_bg, int flags)
+{
+ return theme_format_expand_data_rec(theme, format, default_fg, default_bg, save_last_bg,
+ save_last_bg, flags, NULL);
+}
+
#define IS_OLD_FORMAT(code, last_fg, last_bg) \
(((code) == 'n' && (last_fg) == 'n' && (last_bg) == 'n') || \
((code) != 'n' && ((code) == (last_fg) || (code) == (last_bg))))
diff --git a/src/fe-common/irc/fe-netjoin.c b/src/fe-common/irc/fe-netjoin.c
index bc39b27c..9ea633b4 100644
--- a/src/fe-common/irc/fe-netjoin.c
+++ b/src/fe-common/irc/fe-netjoin.c
@@ -253,12 +253,17 @@ static void sig_print_starting(TEXT_DEST_REC *dest)
if (!IS_IRC_SERVER(dest->server))
return;
- if (!server_ischannel(dest->server, dest->target))
- return;
-
rec = netjoin_find_server(IRC_SERVER(dest->server));
- if (rec != NULL && rec->netjoins != NULL)
+ if (rec != NULL && rec->netjoins != NULL) {
+ /* if netjoins exists, the server rec should be
+ still valid. otherwise, calling server->ischannel
+ may not be safe. */
+ if (dest->target != NULL &&
+ !server_ischannel((SERVER_REC *) rec->server, dest->target))
+ return;
+
print_netjoins(rec, NULL);
+ }
}
static int sig_check_netjoins(void)
diff --git a/src/fe-common/irc/fe-netsplit.c b/src/fe-common/irc/fe-netsplit.c
index ac3330e5..258d0d57 100644
--- a/src/fe-common/irc/fe-netsplit.c
+++ b/src/fe-common/irc/fe-netsplit.c
@@ -255,12 +255,16 @@ static void sig_print_starting(TEXT_DEST_REC *dest)
if (!IS_IRC_SERVER(dest->server))
return;
- if (!server_ischannel(dest->server, dest->target))
- return;
-
rec = IRC_SERVER(dest->server);
- if (rec->split_servers != NULL)
+ if (rec->split_servers != NULL) {
+ /* if split_servers exists, the server rec should be
+ still valid. otherwise, calling server->ischannel
+ may not be safe. */
+ if (dest->target != NULL && !server_ischannel((SERVER_REC *) rec, dest->target))
+ return;
+
print_splits(rec, NULL);
+ }
}
static int sig_check_splits(void)