Apply clang-format to nick column code

Formatted all modified files according to irssi's .clang-format rules:
- src/fe-common/core/fe-expandos.c
- src/fe-common/core/formats.c
- src/fe-common/core/fe-messages.c

Key formatting changes:
- Indentation: spaces → tabs (IndentWidth: 8, UseTab: ForIndentation)
- Line breaking: ColumnLimit: 100, BreakBeforeBraces: Linux
- Alignment: AlignAfterOpenBracket: Align
- Spacing: proper spacing around operators and parentheses

Code functionality unchanged - purely cosmetic formatting
to match irssi project standards.

Timestamp: 2025-01-25 02:40
This commit is contained in:
kofany 2025-08-25 02:45:12 +02:00
commit 781d27e245
3 changed files with 385 additions and 455 deletions

View file

@ -36,7 +36,7 @@ static char *expando_winref(SERVER_REC *server, void *item, int *free_ret)
if (active_win == NULL) if (active_win == NULL)
return ""; return "";
*free_ret = TRUE; *free_ret = TRUE;
return g_strdup_printf("%d", active_win->refnum); return g_strdup_printf("%d", active_win->refnum);
} }
@ -53,7 +53,8 @@ static char *expando_winname(SERVER_REC *server, void *item, int *free_ret)
static int count_nick_chars(const char *str) static int count_nick_chars(const char *str)
{ {
int count = 0; int count = 0;
if (!str) return 0; if (!str)
return 0;
for (const char *p = str; *p; p++) { for (const char *p = str; *p; p++) {
/* Alfanumeryczne */ /* Alfanumeryczne */
@ -61,9 +62,8 @@ static int count_nick_chars(const char *str)
count++; count++;
} }
/* Specjalne znaki nicka - zgodnie z isnickchar z fe-messages.c */ /* Specjalne znaki nicka - zgodnie z isnickchar z fe-messages.c */
else if (*p == '`' || *p == '-' || *p == '_' || else if (*p == '`' || *p == '-' || *p == '_' || *p == '[' || *p == ']' ||
*p == '[' || *p == ']' || *p == '{' || *p == '}' || *p == '{' || *p == '}' || *p == '|' || *p == '\\' || *p == '^') {
*p == '|' || *p == '\\' || *p == '^') {
count++; count++;
} }
/* Ignoruje kody kolorów %B %N %Y %n itp. */ /* Ignoruje kody kolorów %B %N %Y %n itp. */
@ -100,8 +100,6 @@ static char *expando_nickalign(SERVER_REC *server, void *item, int *free_ret)
padding = width - total_chars; padding = width - total_chars;
} }
*free_ret = TRUE; *free_ret = TRUE;
return g_strnfill(padding, ' '); return g_strnfill(padding, ' ');
} }
@ -113,8 +111,6 @@ static char *expando_nicktrunc(SERVER_REC *server, void *item, int *free_ret)
const char *mode; const char *mode;
char *result; char *result;
/* Gdy wyłączone - zwróć oryginalny nick */ /* Gdy wyłączone - zwróć oryginalny nick */
if (!settings_get_bool("nick_column_enabled")) { if (!settings_get_bool("nick_column_enabled")) {
return current_nick ? current_nick : ""; return current_nick ? current_nick : "";
@ -139,12 +135,9 @@ static char *expando_nicktrunc(SERVER_REC *server, void *item, int *free_ret)
/* Przytnij nick i dodaj >> */ /* Przytnij nick i dodaj >> */
result = g_strdup_printf("%.*s>>", available_for_nick, current_nick); result = g_strdup_printf("%.*s>>", available_for_nick, current_nick);
} else { } else {
/* Mode sam za długi */ /* Mode sam za długi */
result = g_strdup(">>"); result = g_strdup(">>");
} }
*free_ret = TRUE; *free_ret = TRUE;
return result; return result;
@ -173,18 +166,14 @@ void clear_nick_context(void)
void fe_expandos_init(void) void fe_expandos_init(void)
{ {
expando_create("winref", expando_winref, expando_create("winref", expando_winref, "window changed", EXPANDO_ARG_NONE,
"window changed", EXPANDO_ARG_NONE, "window refnum changed", EXPANDO_ARG_WINDOW, NULL);
"window refnum changed", EXPANDO_ARG_WINDOW, NULL); expando_create("winname", expando_winname, "window changed", EXPANDO_ARG_NONE,
expando_create("winname", expando_winname, "window name changed", EXPANDO_ARG_WINDOW, NULL);
"window changed", EXPANDO_ARG_NONE, expando_create("nickalign", expando_nickalign, "message public", EXPANDO_ARG_NONE,
"window name changed", EXPANDO_ARG_WINDOW, NULL); "message own_public", EXPANDO_ARG_NONE, NULL);
expando_create("nickalign", expando_nickalign, expando_create("nicktrunc", expando_nicktrunc, "message public", EXPANDO_ARG_NONE,
"message public", EXPANDO_ARG_NONE, "message own_public", EXPANDO_ARG_NONE, NULL);
"message own_public", EXPANDO_ARG_NONE, NULL);
expando_create("nicktrunc", expando_nicktrunc,
"message public", EXPANDO_ARG_NONE,
"message own_public", EXPANDO_ARG_NONE, NULL);
} }
void fe_expandos_deinit(void) void fe_expandos_deinit(void)

View file

@ -42,10 +42,9 @@ void update_nick_context(const char *nick, const char *mode);
void clear_nick_context(void); void clear_nick_context(void);
#define ishighalnum(c) ((unsigned char) (c) >= 128 || i_isalnum(c)) #define ishighalnum(c) ((unsigned char) (c) >= 128 || i_isalnum(c))
#define isnickchar(a) \ #define isnickchar(a) \
(i_isalnum(a) || (a) == '`' || (a) == '-' || (a) == '_' || \ (i_isalnum(a) || (a) == '`' || (a) == '-' || (a) == '_' || (a) == '[' || (a) == ']' || \
(a) == '[' || (a) == ']' || (a) == '{' || (a) == '}' || \ (a) == '{' || (a) == '}' || (a) == '|' || (a) == '\\' || (a) == '^')
(a) == '|' || (a) == '\\' || (a) == '^')
GHashTable *printnicks; GHashTable *printnicks;
@ -58,7 +57,7 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text)
int pos; int pos;
int emphasis_italics; int emphasis_italics;
g_return_val_if_fail(text != NULL, NULL); g_return_val_if_fail(text != NULL, NULL);
emphasis_italics = settings_get_bool("emphasis_italics"); emphasis_italics = settings_get_bool("emphasis_italics");
@ -82,10 +81,10 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text)
that the matching end marker ends a word */ that the matching end marker ends a word */
if ((pos > 0 && bgn[-1] != ' ') || !ishighalnum(bgn[1])) if ((pos > 0 && bgn[-1] != ' ') || !ishighalnum(bgn[1]))
continue; continue;
if ((end = strchr(bgn+1, *bgn)) == NULL) if ((end = strchr(bgn + 1, *bgn)) == NULL)
continue; continue;
if (!ishighalnum(end[-1]) || ishighalnum(end[1]) || if (!ishighalnum(end[-1]) || ishighalnum(end[1]) || end[1] == type ||
end[1] == type || end[1] == '*' || end[1] == '_' || end[1] == '*' || end[1] == '_' ||
/* special case for italics to not emphasise /* special case for italics to not emphasise
common paths by skipping /.../.X */ common paths by skipping /.../.X */
(type == 29 && i_ispunct(end[1]) && ishighalnum(end[2]))) (type == 29 && i_ispunct(end[1]) && ishighalnum(end[2])))
@ -95,15 +94,16 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text)
/* check that this isn't a _nick_, we don't want to /* check that this isn't a _nick_, we don't want to
use emphasis on them. */ use emphasis on them. */
int found; int found;
char c; char c;
char *end2; char *end2;
/* check if _foo_ is a nick */ /* check if _foo_ is a nick */
c = end[1]; c = end[1];
end[1] = '\0'; end[1] = '\0';
found = nicklist_find(CHANNEL(item), bgn) != NULL; found = nicklist_find(CHANNEL(item), bgn) != NULL;
end[1] = c; end[1] = c;
if (found) continue; if (found)
continue;
/* check if the whole 'word' (e.g. "_foo_^") is a nick /* check if the whole 'word' (e.g. "_foo_^") is a nick
in "_foo_^ ", end will be the second _, end2 the ^ */ in "_foo_^ ", end will be the second _, end2 the ^ */
@ -114,25 +114,27 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text)
end2[1] = '\0'; end2[1] = '\0';
found = nicklist_find(CHANNEL(item), bgn) != NULL; found = nicklist_find(CHANNEL(item), bgn) != NULL;
end2[1] = c; end2[1] = c;
if (found) continue; if (found)
continue;
} }
/* allow only *word* emphasis, not *multiple words* */ /* allow only *word* emphasis, not *multiple words* */
if (!settings_get_bool("emphasis_multiword")) { if (!settings_get_bool("emphasis_multiword")) {
char *c; char *c;
for (c = bgn+1; c != end; c++) { for (c = bgn + 1; c != end; c++) {
if (!ishighalnum(*c)) if (!ishighalnum(*c))
break; break;
} }
if (c != end) continue; if (c != end)
continue;
} }
if (settings_get_bool("emphasis_replace")) { if (settings_get_bool("emphasis_replace")) {
*bgn = *end = type; *bgn = *end = type;
pos += (end-bgn); pos += (end - bgn);
} else { } else {
g_string_insert_c(str, pos, type); g_string_insert_c(str, pos, type);
pos += (end - bgn) + 2; pos += (end - bgn) + 2;
g_string_insert_c(str, pos++, type); g_string_insert_c(str, pos++, type);
} }
} }
@ -143,13 +145,13 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text)
static char *channel_get_nickmode_rec(NICK_REC *nickrec) static char *channel_get_nickmode_rec(NICK_REC *nickrec)
{ {
char *emptystr; char *emptystr;
char *nickmode; char *nickmode;
if (!settings_get_bool("show_nickmode")) if (!settings_get_bool("show_nickmode"))
return g_strdup(""); return g_strdup("");
emptystr = settings_get_bool("show_nickmode_empty") ? " " : ""; emptystr = settings_get_bool("show_nickmode_empty") ? " " : "";
if (nickrec == NULL || nickrec->prefixes[0] == '\0') if (nickrec == NULL || nickrec->prefixes[0] == '\0')
nickmode = g_strdup(emptystr); nickmode = g_strdup(emptystr);
@ -165,13 +167,11 @@ char *channel_get_nickmode(CHANNEL_REC *channel, const char *nick)
{ {
g_return_val_if_fail(nick != NULL, NULL); g_return_val_if_fail(nick != NULL, NULL);
return channel_get_nickmode_rec(channel == NULL ? NULL : return channel_get_nickmode_rec(channel == NULL ? NULL : nicklist_find(channel, nick));
nicklist_find(channel, nick));
} }
static void sig_message_public(SERVER_REC *server, const char *msg, static void sig_message_public(SERVER_REC *server, const char *msg, const char *nick,
const char *nick, const char *address, const char *address, const char *target, NICK_REC *nickrec)
const char *target, NICK_REC *nickrec)
{ {
CHANNEL_REC *chanrec; CHANNEL_REC *chanrec;
const char *printnick; const char *printnick;
@ -184,18 +184,18 @@ static void sig_message_public(SERVER_REC *server, const char *msg,
/WINDOW CLOSE and server still sends the few last messages */ /WINDOW CLOSE and server still sends the few last messages */
chanrec = channel_find(server, target); chanrec = channel_find(server, target);
if (nickrec == NULL && chanrec != NULL) if (nickrec == NULL && chanrec != NULL)
nickrec = nicklist_find(chanrec, nick); nickrec = nicklist_find(chanrec, nick);
for_me = !settings_get_bool("hilight_nick_matches") ? FALSE : for_me = !settings_get_bool("hilight_nick_matches") ?
!settings_get_bool("hilight_nick_matches_everywhere") ? FALSE :
nick_match_msg(chanrec, msg, server->nick) : !settings_get_bool("hilight_nick_matches_everywhere") ?
nick_match_msg_everywhere(chanrec, msg, server->nick); nick_match_msg(chanrec, msg, server->nick) :
hilight = for_me ? NULL : nick_match_msg_everywhere(chanrec, msg, server->nick);
hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg); hilight =
for_me ? NULL : hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg);
color = (hilight == NULL) ? NULL : hilight_get_color(hilight); color = (hilight == NULL) ? NULL : hilight_get_color(hilight);
print_channel = chanrec == NULL || print_channel = chanrec == NULL || !window_item_is_active((WI_ITEM_REC *) chanrec);
!window_item_is_active((WI_ITEM_REC *) chanrec);
if (!print_channel && settings_get_bool("print_active_channel") && if (!print_channel && settings_get_bool("print_active_channel") &&
window_item_window((WI_ITEM_REC *) chanrec)->items->next != NULL) window_item_window((WI_ITEM_REC *) chanrec)->items->next != NULL)
print_channel = TRUE; print_channel = TRUE;
@ -217,8 +217,7 @@ static void sig_message_public(SERVER_REC *server, const char *msg,
/* get nick mode & nick what to print the msg with /* get nick mode & nick what to print the msg with
(in case there's multiple identical nicks) */ (in case there's multiple identical nicks) */
nickmode = channel_get_nickmode_rec(nickrec); nickmode = channel_get_nickmode_rec(nickrec);
printnick = nickrec == NULL ? nick : printnick = nickrec == NULL ? nick : g_hash_table_lookup(printnicks, nickrec);
g_hash_table_lookup(printnicks, nickrec);
if (printnick == NULL) if (printnick == NULL)
printnick = nick; printnick = nick;
@ -232,24 +231,20 @@ static void sig_message_public(SERVER_REC *server, const char *msg,
dest.nick = nick; dest.nick = nick;
if (color != NULL) { if (color != NULL) {
/* highlighted nick */ /* highlighted nick */
hilight_update_text_dest(&dest,hilight); hilight_update_text_dest(&dest, hilight);
if (!print_channel) /* message to active channel in window */ if (!print_channel) /* message to active channel in window */
printformat_dest(&dest, TXT_PUBMSG_HILIGHT, color, printformat_dest(&dest, TXT_PUBMSG_HILIGHT, color, printnick, msg,
printnick, msg, nickmode); nickmode);
else /* message to not existing/active channel */ else /* message to not existing/active channel */
printformat_dest(&dest, TXT_PUBMSG_HILIGHT_CHANNEL, printformat_dest(&dest, TXT_PUBMSG_HILIGHT_CHANNEL, color, printnick,
color, printnick, target, msg, target, msg, nickmode);
nickmode);
} else { } else {
if (!print_channel) if (!print_channel)
printformat_dest(&dest, printformat_dest(&dest, for_me ? TXT_PUBMSG_ME : TXT_PUBMSG, printnick, msg,
for_me ? TXT_PUBMSG_ME : TXT_PUBMSG, nickmode);
printnick, msg, nickmode);
else else
printformat_dest(&dest, printformat_dest(&dest, for_me ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL,
for_me ? TXT_PUBMSG_ME_CHANNEL : printnick, target, msg, nickmode);
TXT_PUBMSG_CHANNEL,
printnick, target, msg, nickmode);
} }
g_free_not_null(nickmode); g_free_not_null(nickmode);
@ -257,11 +252,11 @@ static void sig_message_public(SERVER_REC *server, const char *msg,
g_free_not_null(color); g_free_not_null(color);
} }
static void sig_message_private(SERVER_REC *server, const char *msg, static void sig_message_private(SERVER_REC *server, const char *msg, const char *nick,
const char *nick, const char *address, const char *target) const char *address, const char *target)
{ {
QUERY_REC *query; QUERY_REC *query;
char *freemsg = NULL; char *freemsg = NULL;
int level = MSGLEVEL_MSGS; int level = MSGLEVEL_MSGS;
/* own message returned by bouncer? */ /* own message returned by bouncer? */
@ -276,24 +271,23 @@ static void sig_message_private(SERVER_REC *server, const char *msg,
if (own) { if (own) {
printformat(server, target, level, printformat(server, target, level,
query == NULL ? TXT_OWN_MSG_PRIVATE : query == NULL ? TXT_OWN_MSG_PRIVATE : TXT_OWN_MSG_PRIVATE_QUERY, target,
TXT_OWN_MSG_PRIVATE_QUERY, target, msg, server->nick); msg, server->nick);
} else { } else {
printformat(server, nick, level, printformat(server, nick, level,
query == NULL ? TXT_MSG_PRIVATE : query == NULL ? TXT_MSG_PRIVATE : TXT_MSG_PRIVATE_QUERY, nick, address,
TXT_MSG_PRIVATE_QUERY, nick, address, msg); msg);
} }
g_free_not_null(freemsg); g_free_not_null(freemsg);
} }
static void sig_message_own_public(SERVER_REC *server, const char *msg, static void sig_message_own_public(SERVER_REC *server, const char *msg, const char *target)
const char *target)
{ {
WINDOW_REC *window; WINDOW_REC *window;
CHANNEL_REC *channel; CHANNEL_REC *channel;
char *nickmode; char *nickmode;
char *freemsg = NULL; char *freemsg = NULL;
int print_channel; int print_channel;
channel = channel_find(server, target); channel = channel_find(server, target);
if (channel != NULL) if (channel != NULL)
@ -306,14 +300,12 @@ static void sig_message_own_public(SERVER_REC *server, const char *msg,
update_nick_context(server->nick, nickmode); update_nick_context(server->nick, nickmode);
} }
window = channel == NULL ? NULL : window = channel == NULL ? NULL : window_item_window((WI_ITEM_REC *) channel);
window_item_window((WI_ITEM_REC *) channel);
print_channel = window == NULL || print_channel = window == NULL || window->active != (WI_ITEM_REC *) channel;
window->active != (WI_ITEM_REC *) channel;
if (!print_channel && settings_get_bool("print_active_channel") && if (!print_channel && settings_get_bool("print_active_channel") && window != NULL &&
window != NULL && g_slist_length(window->items) > 1) g_slist_length(window->items) > 1)
print_channel = TRUE; print_channel = TRUE;
if (settings_get_bool("emphasis")) if (settings_get_bool("emphasis"))
@ -321,21 +313,21 @@ static void sig_message_own_public(SERVER_REC *server, const char *msg,
if (!print_channel) { if (!print_channel) {
printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
TXT_OWN_MSG, server->nick, msg, nickmode); TXT_OWN_MSG, server->nick, msg, nickmode);
} else { } else {
printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
TXT_OWN_MSG_CHANNEL, server->nick, target, msg, nickmode); TXT_OWN_MSG_CHANNEL, server->nick, target, msg, nickmode);
} }
g_free_not_null(nickmode); g_free_not_null(nickmode);
g_free_not_null(freemsg); g_free_not_null(freemsg);
} }
static void sig_message_own_private(SERVER_REC *server, const char *msg, static void sig_message_own_private(SERVER_REC *server, const char *msg, const char *target,
const char *target, const char *origtarget) const char *origtarget)
{ {
QUERY_REC *query; QUERY_REC *query;
char *freemsg = NULL; char *freemsg = NULL;
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
g_return_if_fail(msg != NULL); g_return_if_fail(msg != NULL);
@ -344,11 +336,10 @@ static void sig_message_own_private(SERVER_REC *server, const char *msg,
we should display some error message. currently the special we should display some error message. currently the special
targets are only ',' and '.'. */ targets are only ',' and '.'. */
g_return_if_fail(g_strcmp0(origtarget, ",") == 0 || g_return_if_fail(g_strcmp0(origtarget, ",") == 0 ||
g_strcmp0(origtarget, ".") == 0); g_strcmp0(origtarget, ".") == 0);
printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
*origtarget == ',' ? TXT_NO_MSGS_GOT : *origtarget == ',' ? TXT_NO_MSGS_GOT : TXT_NO_MSGS_SENT);
TXT_NO_MSGS_SENT);
signal_stop(); signal_stop();
return; return;
} }
@ -358,17 +349,15 @@ static void sig_message_own_private(SERVER_REC *server, const char *msg,
if (settings_get_bool("emphasis")) if (settings_get_bool("emphasis"))
msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg);
printformat(server, target, printformat(server, target, MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, query == NULL ? TXT_OWN_MSG_PRIVATE : TXT_OWN_MSG_PRIVATE_QUERY, target, msg,
query == NULL ? TXT_OWN_MSG_PRIVATE : server->nick);
TXT_OWN_MSG_PRIVATE_QUERY, target, msg, server->nick);
g_free_not_null(freemsg); g_free_not_null(freemsg);
} }
static void sig_message_join(SERVER_REC *server, const char *channel, static void sig_message_join(SERVER_REC *server, const char *channel, const char *nick,
const char *nick, const char *address, const char *address, const char *account, const char *realname)
const char *account, const char *realname)
{ {
int level = MSGLEVEL_JOINS; int level = MSGLEVEL_JOINS;
@ -376,37 +365,33 @@ static void sig_message_join(SERVER_REC *server, const char *channel,
if (settings_get_bool("show_extended_join")) { if (settings_get_bool("show_extended_join")) {
int txt; int txt;
if (*account == '\0') txt = TXT_JOIN; if (*account == '\0')
else if (g_strcmp0("*", account) == 0) txt = TXT_JOIN_EXTENDED; txt = TXT_JOIN;
else txt = TXT_JOIN_EXTENDED_ACCOUNT; else if (g_strcmp0("*", account) == 0)
printformat(server, channel, level, txt = TXT_JOIN_EXTENDED;
txt, nick, address, channel, account, realname); else
txt = TXT_JOIN_EXTENDED_ACCOUNT;
printformat(server, channel, level, txt, nick, address, channel, account, realname);
} else { } else {
printformat(server, channel, level, printformat(server, channel, level, TXT_JOIN, nick, address, channel, account,
TXT_JOIN, nick, address, channel, account, realname); realname);
} }
} }
static void sig_message_part(SERVER_REC *server, const char *channel, static void sig_message_part(SERVER_REC *server, const char *channel, const char *nick,
const char *nick, const char *address, const char *address, const char *reason)
const char *reason)
{ {
int level = MSGLEVEL_PARTS; int level = MSGLEVEL_PARTS;
ignore_check_plus(server, nick, address, channel, NULL, &level, FALSE); ignore_check_plus(server, nick, address, channel, NULL, &level, FALSE);
printformat(server, channel, level, printformat(server, channel, level, TXT_PART, nick, address, channel, reason);
TXT_PART, nick, address, channel, reason);
} }
static void spread_server_message_to_windows(SERVER_REC *server, gboolean once, static void spread_server_message_to_windows(SERVER_REC *server, gboolean once, gboolean in_query,
gboolean in_query, int base_level, int txt, int txt_once,
int base_level, const char *nick, const char *address,
int txt, int txt_once, const char *data, const char *ignore_data)
const char *nick, const char *address,
const char *data,
const char *ignore_data
)
{ {
WINDOW_REC *window; WINDOW_REC *window;
GString *chans; GString *chans;
@ -419,7 +404,8 @@ static void spread_server_message_to_windows(SERVER_REC *server, gboolean once,
print_channel = NULL; print_channel = NULL;
count = 0; windows = NULL; count = 0;
windows = NULL;
chans = g_string_new(NULL); chans = g_string_new(NULL);
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
CHANNEL_REC *rec; CHANNEL_REC *rec;
@ -430,14 +416,13 @@ static void spread_server_message_to_windows(SERVER_REC *server, gboolean once,
continue; continue;
} }
if (ignore_check_plus(server, nick, address, rec->visible_name, if (ignore_check_plus(server, nick, address, rec->visible_name, ignore_data, &level,
ignore_data, &level, TRUE)) { TRUE)) {
count++; count++;
continue; continue;
} }
if (print_channel == NULL || if (print_channel == NULL || active_win->active == (WI_ITEM_REC *) rec) {
active_win->active == (WI_ITEM_REC *) rec) {
print_channel = rec->visible_name; print_channel = rec->visible_name;
} }
@ -447,10 +432,8 @@ static void spread_server_message_to_windows(SERVER_REC *server, gboolean once,
window = window_item_window((WI_ITEM_REC *) rec); window = window_item_window((WI_ITEM_REC *) rec);
if (g_slist_find(windows, window) == NULL) { if (g_slist_find(windows, window) == NULL) {
windows = g_slist_prepend(windows, window); windows = g_slist_prepend(windows, window);
printformat(server, rec->visible_name, printformat(server, rec->visible_name, level, txt, nick, address,
level, data, rec->visible_name);
txt, nick, address, data,
rec->visible_name);
} }
} }
count++; count++;
@ -462,38 +445,30 @@ static void spread_server_message_to_windows(SERVER_REC *server, gboolean once,
display the change there too */ display the change there too */
QUERY_REC *query = query_find(server, nick); QUERY_REC *query = query_find(server, nick);
if (query != NULL) { if (query != NULL) {
printformat(server, nick, level, printformat(server, nick, level, txt, nick, address, data, "");
txt, nick, address, data, "");
} }
} }
if (once || count == 0) { if (once || count == 0) {
if (chans->len > 0) { if (chans->len > 0) {
g_string_truncate(chans, chans->len-1); g_string_truncate(chans, chans->len - 1);
} }
printformat(server, print_channel, base_level, printformat(server, print_channel, base_level, count <= 1 ? txt : txt_once, nick,
count <= 1 ? txt : txt_once, address, data, chans->str);
nick, address, data, chans->str);
} }
g_string_free(chans, TRUE); g_string_free(chans, TRUE);
} }
static void sig_message_host_changed(SERVER_REC *server, const char *nick, static void sig_message_host_changed(SERVER_REC *server, const char *nick, const char *address,
const char *address, const char *old_address) const char *old_address)
{ {
spread_server_message_to_windows( spread_server_message_to_windows(server, settings_get_bool("show_quit_once"), TRUE,
server, MSGLEVEL_JOINS, TXT_HOST_CHANGED, TXT_HOST_CHANGED, nick,
settings_get_bool("show_quit_once"), address, old_address, NULL);
TRUE,
MSGLEVEL_JOINS,
TXT_HOST_CHANGED, TXT_HOST_CHANGED,
nick, address, old_address,
NULL
);
} }
static void sig_message_account_changed(SERVER_REC *server, const char *nick, static void sig_message_account_changed(SERVER_REC *server, const char *nick, const char *address,
const char *address, const char *account) const char *account)
{ {
gboolean logged_in; gboolean logged_in;
int txt; int txt;
@ -504,64 +479,46 @@ static void sig_message_account_changed(SERVER_REC *server, const char *nick,
logged_in = g_strcmp0("*", account) != 0; logged_in = g_strcmp0("*", account) != 0;
txt = logged_in ? TXT_LOGGED_IN : TXT_LOGGED_OUT; txt = logged_in ? TXT_LOGGED_IN : TXT_LOGGED_OUT;
spread_server_message_to_windows( spread_server_message_to_windows(server, settings_get_bool("show_quit_once"), TRUE,
server, MSGLEVEL_MODES, txt, txt, nick, address, account,
settings_get_bool("show_quit_once"), "account");
TRUE,
MSGLEVEL_MODES,
txt, txt,
nick, address, account,
"account"
);
} }
static void sig_message_quit(SERVER_REC *server, const char *nick, static void sig_message_quit(SERVER_REC *server, const char *nick, const char *address,
const char *address, const char *reason) const char *reason)
{ {
spread_server_message_to_windows( spread_server_message_to_windows(server, settings_get_bool("show_quit_once"), TRUE,
server, MSGLEVEL_QUITS, TXT_QUIT, TXT_QUIT_ONCE, nick, address,
settings_get_bool("show_quit_once"), reason, reason);
TRUE,
MSGLEVEL_QUITS,
TXT_QUIT, TXT_QUIT_ONCE,
nick, address, reason,
reason
);
} }
static void sig_message_kick(SERVER_REC *server, const char *channel, static void sig_message_kick(SERVER_REC *server, const char *channel, const char *nick,
const char *nick, const char *kicker, const char *kicker, const char *address, const char *reason)
const char *address, const char *reason)
{ {
int level = MSGLEVEL_KICKS; int level = MSGLEVEL_KICKS;
ignore_check_plus(server, kicker, address, channel, reason, &level, FALSE); ignore_check_plus(server, kicker, address, channel, reason, &level, FALSE);
printformat(server, channel, level, printformat(server, channel, level, TXT_KICK, nick, channel, kicker, reason, address);
TXT_KICK, nick, channel, kicker, reason, address);
} }
static void print_nick_change_channel(SERVER_REC *server, const char *channel, static void print_nick_change_channel(SERVER_REC *server, const char *channel, const char *newnick,
const char *newnick, const char *oldnick, const char *oldnick, const char *address, int ownnick)
const char *address,
int ownnick)
{ {
int level; int level;
level = MSGLEVEL_NICKS; level = MSGLEVEL_NICKS;
if (ownnick) level |= MSGLEVEL_NO_ACT; if (ownnick)
if (ignore_check_plus(server, oldnick, address, level |= MSGLEVEL_NO_ACT;
channel, newnick, &level, TRUE)) if (ignore_check_plus(server, oldnick, address, channel, newnick, &level, TRUE))
return; return;
printformat(server, channel, level, printformat(server, channel, level, ownnick ? TXT_YOUR_NICK_CHANGED : TXT_NICK_CHANGED,
ownnick ? TXT_YOUR_NICK_CHANGED : TXT_NICK_CHANGED, oldnick, newnick, channel, address);
oldnick, newnick, channel, address);
} }
static void print_nick_change(SERVER_REC *server, const char *newnick, static void print_nick_change(SERVER_REC *server, const char *newnick, const char *oldnick,
const char *oldnick, const char *address, const char *address, int ownnick)
int ownnick)
{ {
GSList *tmp, *windows; GSList *tmp, *windows;
int msgprint; int msgprint;
@ -573,59 +530,55 @@ static void print_nick_change(SERVER_REC *server, const char *newnick,
windows = NULL; windows = NULL;
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
CHANNEL_REC *channel = tmp->data; CHANNEL_REC *channel = tmp->data;
WINDOW_REC *window = WINDOW_REC *window = window_item_window((WI_ITEM_REC *) channel);
window_item_window((WI_ITEM_REC *) channel);
if (nicklist_find(channel, newnick) == NULL || if (nicklist_find(channel, newnick) == NULL ||
g_slist_find(windows, window) != NULL) g_slist_find(windows, window) != NULL)
continue; continue;
windows = g_slist_append(windows, window); windows = g_slist_append(windows, window);
print_nick_change_channel(server, channel->visible_name, print_nick_change_channel(server, channel->visible_name, newnick, oldnick, address,
newnick, oldnick, address, ownnick); ownnick);
msgprint = TRUE; msgprint = TRUE;
} }
g_slist_free(windows); g_slist_free(windows);
if (!msgprint && ownnick) { if (!msgprint && ownnick) {
printformat(server, NULL, MSGLEVEL_NICKS, printformat(server, NULL, MSGLEVEL_NICKS, TXT_YOUR_NICK_CHANGED, oldnick, newnick,
TXT_YOUR_NICK_CHANGED, oldnick, newnick, "", "", address);
address);
} }
} }
static void sig_message_nick(SERVER_REC *server, const char *newnick, static void sig_message_nick(SERVER_REC *server, const char *newnick, const char *oldnick,
const char *oldnick, const char *address) const char *address)
{ {
print_nick_change(server, newnick, oldnick, address, FALSE); print_nick_change(server, newnick, oldnick, address, FALSE);
} }
static void sig_message_own_nick(SERVER_REC *server, const char *newnick, static void sig_message_own_nick(SERVER_REC *server, const char *newnick, const char *oldnick,
const char *oldnick, const char *address) const char *address)
{ {
if (!settings_get_bool("show_own_nickchange_once")) if (!settings_get_bool("show_own_nickchange_once"))
print_nick_change(server, newnick, oldnick, address, TRUE); print_nick_change(server, newnick, oldnick, address, TRUE);
else { else {
printformat(server, NULL, MSGLEVEL_NICKS, printformat(server, NULL, MSGLEVEL_NICKS, TXT_YOUR_NICK_CHANGED, oldnick, newnick,
TXT_YOUR_NICK_CHANGED, oldnick, newnick, "", "", address);
address);
} }
} }
static void sig_message_invite(SERVER_REC *server, const char *channel, static void sig_message_invite(SERVER_REC *server, const char *channel, const char *nick,
const char *nick, const char *address) const char *address)
{ {
char *str; char *str;
str = show_lowascii(channel); str = show_lowascii(channel);
printformat(server, NULL, MSGLEVEL_INVITES, printformat(server, NULL, MSGLEVEL_INVITES, TXT_INVITE, nick, str, address);
TXT_INVITE, nick, str, address);
g_free(str); g_free(str);
} }
static void sig_message_invite_other(SERVER_REC *server, const char *channel, static void sig_message_invite_other(SERVER_REC *server, const char *channel, const char *invited,
const char *invited, const char *nick, const char *address) const char *nick, const char *address)
{ {
char *str; char *str;
int level = MSGLEVEL_INVITES; int level = MSGLEVEL_INVITES;
@ -633,45 +586,34 @@ static void sig_message_invite_other(SERVER_REC *server, const char *channel,
ignore_check_plus(server, nick, address, channel, invited, &level, FALSE); ignore_check_plus(server, nick, address, channel, invited, &level, FALSE);
str = show_lowascii(channel); str = show_lowascii(channel);
printformat(server, channel, level, printformat(server, channel, level, TXT_INVITE_OTHER, invited, nick, str, address);
TXT_INVITE_OTHER, invited, nick, str, address);
g_free(str); g_free(str);
} }
static void sig_message_topic(SERVER_REC *server, const char *channel, static void sig_message_topic(SERVER_REC *server, const char *channel, const char *topic,
const char *topic, const char *nick, const char *address)
const char *nick, const char *address)
{ {
int level = MSGLEVEL_TOPICS; int level = MSGLEVEL_TOPICS;
ignore_check_plus(server, nick, address, channel, topic, &level, FALSE); ignore_check_plus(server, nick, address, channel, topic, &level, FALSE);
printformat(server, channel, level, printformat(server, channel, level, *topic != '\0' ? TXT_NEW_TOPIC : TXT_TOPIC_UNSET, nick,
*topic != '\0' ? TXT_NEW_TOPIC : TXT_TOPIC_UNSET, channel, topic, address);
nick, channel, topic, address);
} }
static void sig_message_away_notify(SERVER_REC *server, const char *nick, static void sig_message_away_notify(SERVER_REC *server, const char *nick, const char *addr,
const char *addr, const char *awaymsg) const char *awaymsg)
{ {
int txt = *awaymsg == '\0' ? TXT_NOTIFY_UNAWAY_CHANNEL : int txt = *awaymsg == '\0' ? TXT_NOTIFY_UNAWAY_CHANNEL : TXT_NOTIFY_AWAY_CHANNEL;
TXT_NOTIFY_AWAY_CHANNEL;
if (!settings_get_bool("away_notify_public")) if (!settings_get_bool("away_notify_public"))
return; return;
spread_server_message_to_windows(server, FALSE, spread_server_message_to_windows(server, FALSE, FALSE, MSGLEVEL_CRAP, txt, txt, nick, addr,
FALSE, awaymsg, awaymsg);
MSGLEVEL_CRAP,
txt, txt,
nick, addr,
awaymsg,
awaymsg
);
} }
static int printnick_exists(NICK_REC *first, NICK_REC *ignore, static int printnick_exists(NICK_REC *first, NICK_REC *ignore, const char *nick)
const char *nick)
{ {
char *printnick; char *printnick;
@ -685,14 +627,14 @@ static int printnick_exists(NICK_REC *first, NICK_REC *ignore,
first = first->next; first = first->next;
} }
return FALSE; return FALSE;
} }
static NICK_REC *printnick_find_original(NICK_REC *nick) static NICK_REC *printnick_find_original(NICK_REC *nick)
{ {
while (nick != NULL) { while (nick != NULL) {
if (g_hash_table_lookup(printnicks, nick) == NULL) if (g_hash_table_lookup(printnicks, nick) == NULL)
return nick; return nick;
nick = nick->next; nick = nick->next;
} }
@ -716,31 +658,35 @@ static void sig_nicklist_new(CHANNEL_REC *channel, NICK_REC *nick)
someone else having the original nick already in use.. */ someone else having the original nick already in use.. */
nick = printnick_find_original(firstnick->next); nick = printnick_find_original(firstnick->next);
if (nick == NULL) if (nick == NULL)
return; /* nope, we have it */ return; /* nope, we have it */
} }
if (nick->host == NULL) if (nick->host == NULL)
return; return;
/* identical nick already exists, have to change it somehow.. */ /* identical nick already exists, have to change it somehow.. */
p = strchr(nick->host, '@'); p = strchr(nick->host, '@');
if (p == NULL) p = nick->host; else p++; if (p == NULL)
p = nick->host;
else
p++;
nickhost = g_strdup_printf("%s@%s", nick->nick, p); nickhost = g_strdup_printf("%s@%s", nick->nick, p);
p = strchr(nickhost+strlen(nick->nick), '.'); p = strchr(nickhost + strlen(nick->nick), '.');
if (p != NULL) *p = '\0'; if (p != NULL)
*p = '\0';
if (!printnick_exists(firstnick, nick, nickhost)) { if (!printnick_exists(firstnick, nick, nickhost)) {
/* use nick@host */ /* use nick@host */
g_hash_table_insert(printnicks, nick, nickhost); g_hash_table_insert(printnicks, nick, nickhost);
return; return;
} }
newnick = g_string_new(NULL); newnick = g_string_new(NULL);
n = 2; n = 2;
do { do {
g_string_printf(newnick, "%s%d", nickhost, n); g_string_printf(newnick, "%s%d", nickhost, n);
n++; n++;
} while (printnick_exists(firstnick, nick, newnick->str)); } while (printnick_exists(firstnick, nick, newnick->str));
g_hash_table_insert(printnicks, nick, g_string_free_and_steal(newnick)); g_hash_table_insert(printnicks, nick, g_string_free_and_steal(newnick));
@ -753,53 +699,52 @@ static void sig_nicklist_remove(CHANNEL_REC *channel, NICK_REC *nick)
nickname = g_hash_table_lookup(printnicks, nick); nickname = g_hash_table_lookup(printnicks, nick);
if (nickname != NULL) { if (nickname != NULL) {
g_free(nickname); g_free(nickname);
g_hash_table_remove(printnicks, nick); g_hash_table_remove(printnicks, nick);
} }
} }
static void sig_nicklist_changed(CHANNEL_REC *channel, NICK_REC *nick) static void sig_nicklist_changed(CHANNEL_REC *channel, NICK_REC *nick)
{ {
sig_nicklist_remove(channel, nick); sig_nicklist_remove(channel, nick);
sig_nicklist_new(channel, nick); sig_nicklist_new(channel, nick);
} }
static void sig_channel_joined(CHANNEL_REC *channel) static void sig_channel_joined(CHANNEL_REC *channel)
{ {
NICK_REC *nick; NICK_REC *nick;
char *nickname; char *nickname;
/* channel->ownnick is set at this point - check if our own nick /* channel->ownnick is set at this point - check if our own nick
has been changed, if it was set it back to the original nick and has been changed, if it was set it back to the original nick and
change the previous original to something else */ change the previous original to something else */
nickname = g_hash_table_lookup(printnicks, channel->ownnick); nickname = g_hash_table_lookup(printnicks, channel->ownnick);
if (nickname == NULL) if (nickname == NULL)
return; return;
g_free(nickname); g_free(nickname);
g_hash_table_remove(printnicks, channel->ownnick); g_hash_table_remove(printnicks, channel->ownnick);
/* our own nick is guaranteed to be the first in list */ /* our own nick is guaranteed to be the first in list */
nick = channel->ownnick->next; nick = channel->ownnick->next;
while (nick != NULL) { while (nick != NULL) {
if (g_hash_table_lookup(printnicks, nick) == NULL) { if (g_hash_table_lookup(printnicks, nick) == NULL) {
sig_nicklist_new(channel, nick); sig_nicklist_new(channel, nick);
break; break;
} }
nick = nick->next; nick = nick->next;
} }
} }
static void i_hash_free_value(void *key, void *value) static void i_hash_free_value(void *key, void *value)
{ {
g_free(value); g_free(value);
} }
void fe_messages_init(void) void fe_messages_init(void)
{ {
printnicks = g_hash_table_new((GHashFunc) g_direct_hash, printnicks = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal);
(GCompareFunc) g_direct_equal);
settings_add_bool("lookandfeel", "hilight_nick_matches", TRUE); settings_add_bool("lookandfeel", "hilight_nick_matches", TRUE);
settings_add_bool("lookandfeel", "hilight_nick_matches_everywhere", FALSE); settings_add_bool("lookandfeel", "hilight_nick_matches_everywhere", FALSE);

View file

@ -63,8 +63,7 @@ int format_find_tag(const char *module, const char *tag)
return -1; return -1;
for (n = 0; formats[n].def != NULL; n++) { for (n = 0; formats[n].def != NULL; n++) {
if (formats[n].tag != NULL && if (formats[n].tag != NULL && g_ascii_strcasecmp(formats[n].tag, tag) == 0)
g_ascii_strcasecmp(formats[n].tag, tag) == 0)
return n; return n;
} }
@ -89,22 +88,23 @@ static void format_expand_code(const char **format, GString *out, int *flags)
set = TRUE; set = TRUE;
else if (**format == '-') else if (**format == '-')
set = FALSE; set = FALSE;
else switch (**format) { else
case 's': switch (**format) {
case 'S': case 's':
*flags |= !set ? PRINT_FLAG_UNSET_LINE_START : case 'S':
**format == 's' ? PRINT_FLAG_SET_LINE_START : *flags |= !set ? PRINT_FLAG_UNSET_LINE_START :
PRINT_FLAG_SET_LINE_START_IRSSI; **format == 's' ? PRINT_FLAG_SET_LINE_START :
break; PRINT_FLAG_SET_LINE_START_IRSSI;
case 't': break;
*flags |= set ? PRINT_FLAG_SET_TIMESTAMP : case 't':
PRINT_FLAG_UNSET_TIMESTAMP; *flags |=
break; set ? PRINT_FLAG_SET_TIMESTAMP : PRINT_FLAG_UNSET_TIMESTAMP;
case 'T': break;
*flags |= set ? PRINT_FLAG_SET_SERVERTAG : case 'T':
PRINT_FLAG_UNSET_SERVERTAG; *flags |=
break; set ? PRINT_FLAG_SET_SERVERTAG : PRINT_FLAG_UNSET_SERVERTAG;
} break;
}
(*format)++; (*format)++;
} }
@ -116,18 +116,15 @@ void format_ext_color(GString *out, int bg, int color)
if (bg && color < 0x10) if (bg && color < 0x10)
g_string_append_c(out, FORMAT_COLOR_NOCHANGE); g_string_append_c(out, FORMAT_COLOR_NOCHANGE);
if (color < 0x10) if (color < 0x10)
g_string_append_c(out, color+'0'); g_string_append_c(out, color + '0');
else { else {
if (color < 0x60) if (color < 0x60)
g_string_append_c(out, bg ? FORMAT_COLOR_EXT1_BG g_string_append_c(out, bg ? FORMAT_COLOR_EXT1_BG : FORMAT_COLOR_EXT1);
: FORMAT_COLOR_EXT1);
else if (color < 0xb0) else if (color < 0xb0)
g_string_append_c(out, bg ? FORMAT_COLOR_EXT2_BG g_string_append_c(out, bg ? FORMAT_COLOR_EXT2_BG : FORMAT_COLOR_EXT2);
: FORMAT_COLOR_EXT2);
else else
g_string_append_c(out, bg ? FORMAT_COLOR_EXT3_BG g_string_append_c(out, bg ? FORMAT_COLOR_EXT3_BG : FORMAT_COLOR_EXT3);
: FORMAT_COLOR_EXT3); g_string_append_c(out, FORMAT_COLOR_NOCHANGE + ((color - 0x10) % 0x50));
g_string_append_c(out, FORMAT_COLOR_NOCHANGE + ((color-0x10)%0x50));
} }
if (!bg && color < 0x10) if (!bg && color < 0x10)
@ -166,8 +163,7 @@ void unformat_24bit_color(char **ptr, int off, int *fgcolor, int *bgcolor, int *
if (rgbx[3] & 0x1) { if (rgbx[3] & 0x1) {
*bgcolor = color; *bgcolor = color;
*flags |= GUI_PRINT_FLAG_COLOR_24_BG; *flags |= GUI_PRINT_FLAG_COLOR_24_BG;
} } else {
else {
*fgcolor = color; *fgcolor = color;
*flags |= GUI_PRINT_FLAG_COLOR_24_FG; *flags |= GUI_PRINT_FLAG_COLOR_24_FG;
} }
@ -294,7 +290,7 @@ int format_expand_styles(GString *out, const char **format, int *flags)
if ((*format)[1] < '0' || (*format)[1] > '7') if ((*format)[1] < '0' || (*format)[1] > '7')
break; break;
tmp = 16 + ((*format)[1]-'0'-1)*36; tmp = 16 + ((*format)[1] - '0' - 1) * 36;
if (tmp > 231) { if (tmp > 231) {
if (!isalpha((*format)[2])) if (!isalpha((*format)[2]))
break; break;
@ -303,8 +299,7 @@ int format_expand_styles(GString *out, const char **format, int *flags)
if (tmp > 255) if (tmp > 255)
break; break;
} } else if (tmp > 0) {
else if (tmp > 0) {
if (!isalnum((*format)[2])) if (!isalnum((*format)[2]))
break; break;
@ -314,8 +309,7 @@ int format_expand_styles(GString *out, const char **format, int *flags)
tmp += 10 + (*format)[2] - 'A'; tmp += 10 + (*format)[2] - 'A';
else else
tmp += (*format)[2] - '0'; tmp += (*format)[2] - '0';
} } else {
else {
if (!isxdigit((*format)[2])) if (!isxdigit((*format)[2]))
break; break;
@ -361,26 +355,28 @@ int format_expand_styles(GString *out, const char **format, int *flags)
if (p != NULL) { if (p != NULL) {
g_string_append_c(out, 4); g_string_append_c(out, 4);
g_string_append_c(out, FORMAT_COLOR_NOCHANGE); g_string_append_c(out, FORMAT_COLOR_NOCHANGE);
g_string_append_c(out, (char) ((int) (p-format_backs)+'0')); g_string_append_c(out, (char) ((int) (p - format_backs) + '0'));
break; break;
} }
/* check if it's a foreground color */ /* check if it's a foreground color */
if (fmt == 'p') fmt = 'm'; if (fmt == 'p')
fmt = 'm';
p = strchr(format_fores, fmt); p = strchr(format_fores, fmt);
if (p != NULL) { if (p != NULL) {
g_string_append_c(out, 4); g_string_append_c(out, 4);
g_string_append_c(out, (char) ((int) (p-format_fores)+'0')); g_string_append_c(out, (char) ((int) (p - format_fores) + '0'));
g_string_append_c(out, FORMAT_COLOR_NOCHANGE); g_string_append_c(out, FORMAT_COLOR_NOCHANGE);
break; break;
} }
/* check if it's a bold foreground color */ /* check if it's a bold foreground color */
if (fmt == 'P') fmt = 'M'; if (fmt == 'P')
fmt = 'M';
p = strchr(format_boldfores, fmt); p = strchr(format_boldfores, fmt);
if (p != NULL) { if (p != NULL) {
g_string_append_c(out, 4); g_string_append_c(out, 4);
g_string_append_c(out, (char) (8+(int) (p-format_boldfores)+'0')); g_string_append_c(out, (char) (8 + (int) (p - format_boldfores) + '0'));
g_string_append_c(out, FORMAT_COLOR_NOCHANGE); g_string_append_c(out, FORMAT_COLOR_NOCHANGE);
break; break;
} }
@ -391,9 +387,8 @@ int format_expand_styles(GString *out, const char **format, int *flags)
return retval; return retval;
} }
void format_read_arglist(va_list va, FORMAT_REC *format, void format_read_arglist(va_list va, FORMAT_REC *format, char **arglist, int arglist_size,
char **arglist, int arglist_size, char *buffer, int buffer_size)
char *buffer, int buffer_size)
{ {
int num, len, bufpos; int num, len, bufpos;
@ -416,10 +411,9 @@ void format_read_arglist(va_list va, FORMAT_REC *format,
break; break;
} }
arglist[num] = buffer+bufpos; arglist[num] = buffer + bufpos;
len = g_snprintf(buffer+bufpos, buffer_size-bufpos, len = g_snprintf(buffer + bufpos, buffer_size - bufpos, "%d", d);
"%d", d); bufpos += len + 1;
bufpos += len+1;
break; break;
} }
case FORMAT_LONG: { case FORMAT_LONG: {
@ -430,10 +424,9 @@ void format_read_arglist(va_list va, FORMAT_REC *format,
break; break;
} }
arglist[num] = buffer+bufpos; arglist[num] = buffer + bufpos;
len = g_snprintf(buffer+bufpos, buffer_size-bufpos, len = g_snprintf(buffer + bufpos, buffer_size - bufpos, "%ld", l);
"%ld", l); bufpos += len + 1;
bufpos += len+1;
break; break;
} }
case FORMAT_FLOAT: { case FORMAT_FLOAT: {
@ -444,10 +437,9 @@ void format_read_arglist(va_list va, FORMAT_REC *format,
break; break;
} }
arglist[num] = buffer+bufpos; arglist[num] = buffer + bufpos;
len = g_snprintf(buffer+bufpos, buffer_size-bufpos, len = g_snprintf(buffer + bufpos, buffer_size - bufpos, "%0.2f", f);
"%0.2f", f); bufpos += len + 1;
bufpos += len+1;
break; break;
} }
} }
@ -485,8 +477,7 @@ void format_create_dest_tag_meta(TEXT_DEST_REC *dest, void *server, const char *
dest->server_tag = server != NULL ? SERVER(server)->tag : server_tag; dest->server_tag = server != NULL ? SERVER(server)->tag : server_tag;
dest->target = target; dest->target = target;
dest->level = level; dest->level = level;
dest->window = window != NULL ? window : dest->window = window != NULL ? window : window_find_closest(server, target, level);
window_find_closest(server, target, level);
dest->meta = meta != NULL ? meta : global_meta; dest->meta = meta != NULL ? meta : global_meta;
} }
@ -521,10 +512,10 @@ int format_get_length(const char *str)
if (*str == '%' && str[1] != '\0') { if (*str == '%' && str[1] != '\0') {
str++; str++;
if (*str != '%') { if (*str != '%') {
adv = format_expand_styles(tmp, &str, NULL); adv = format_expand_styles(tmp, &str, NULL);
str += adv; str += adv;
if (adv) if (adv)
continue; continue;
} }
/* %% or unknown %code, written as-is */ /* %% or unknown %code, written as-is */
@ -561,17 +552,17 @@ int format_real_length(const char *str, int len)
if (*str == '%' && str[1] != '\0') { if (*str == '%' && str[1] != '\0') {
str++; str++;
if (*str != '%') { if (*str != '%') {
adv = format_expand_styles(tmp, &str, NULL); adv = format_expand_styles(tmp, &str, NULL);
if (adv) { if (adv) {
str += adv; str += adv;
continue; continue;
} }
/* discount for unknown % */ /* discount for unknown % */
if (--len < 0) { if (--len < 0) {
str = oldstr; str = oldstr;
break; break;
} }
oldstr = str; oldstr = str;
} }
} }
@ -583,7 +574,7 @@ int format_real_length(const char *str, int len)
} }
g_string_free(tmp, TRUE); g_string_free(tmp, TRUE);
return (int) (str-start); return (int) (str - start);
} }
char *format_string_expand(const char *text, int *flags) char *format_string_expand(const char *text, int *flags)
@ -596,7 +587,8 @@ char *format_string_expand(const char *text, int *flags)
out = g_string_new(NULL); out = g_string_new(NULL);
if (flags != NULL) *flags = 0; if (flags != NULL)
*flags = 0;
code = 0; code = 0;
while (*text != '\0') { while (*text != '\0') {
if (code == '%') { if (code == '%') {
@ -607,7 +599,7 @@ char *format_string_expand(const char *text, int *flags)
g_string_append_c(out, '%'); g_string_append_c(out, '%');
g_string_append_c(out, *text); g_string_append_c(out, *text);
} else { } else {
text += adv - 1; text += adv - 1;
} }
code = 0; code = 0;
} else { } else {
@ -739,8 +731,7 @@ char *format_string_unexpand(const char *text, int flags)
return g_string_free(out, FALSE); return g_string_free(out, FALSE);
} }
static char *format_get_text_args(TEXT_DEST_REC *dest, static char *format_get_text_args(TEXT_DEST_REC *dest, const char *text, char **arglist)
const char *text, char **arglist)
{ {
GString *out; GString *out;
char code, *ret; char code, *ret;
@ -767,22 +758,25 @@ static char *format_get_text_args(TEXT_DEST_REC *dest,
char *ret; char *ret;
ret = parse_special((char **) &text, dest->server, ret = parse_special((char **) &text, dest->server,
dest->target == NULL ? NULL : dest->target == NULL ?
window_item_find(dest->server, dest->target), NULL :
arglist, &need_free, NULL, 0); window_item_find(dest->server, dest->target),
arglist, &need_free, NULL, 0);
if (ret != NULL) { if (ret != NULL) {
/* string shouldn't end with \003 or it could /* string shouldn't end with \003 or it could
mess up the next one or two characters */ mess up the next one or two characters */
int diff; int diff;
int len = strlen(ret); int len = strlen(ret);
while (len > 0 && ret[len-1] == 3) len--; while (len > 0 && ret[len - 1] == 3)
diff = strlen(ret)-len; len--;
diff = strlen(ret) - len;
g_string_append(out, ret); g_string_append(out, ret);
if (diff > 0) if (diff > 0)
g_string_truncate(out, out->len-diff); g_string_truncate(out, out->len - diff);
if (need_free) g_free(ret); if (need_free)
g_free(ret);
} }
code = 0; code = 0;
} else { } else {
@ -799,8 +793,8 @@ static char *format_get_text_args(TEXT_DEST_REC *dest,
return ret; return ret;
} }
char *format_get_text_theme(THEME_REC *theme, const char *module, char *format_get_text_theme(THEME_REC *theme, const char *module, TEXT_DEST_REC *dest,
TEXT_DEST_REC *dest, int formatnum, ...) int formatnum, ...)
{ {
va_list va; va_list va;
char *str; char *str;
@ -815,21 +809,18 @@ char *format_get_text_theme(THEME_REC *theme, const char *module,
return str; return str;
} }
char *format_get_text_theme_args(THEME_REC *theme, const char *module, char *format_get_text_theme_args(THEME_REC *theme, const char *module, TEXT_DEST_REC *dest,
TEXT_DEST_REC *dest, int formatnum, int formatnum, va_list va)
va_list va)
{ {
char *arglist[MAX_FORMAT_PARAMS]; char *arglist[MAX_FORMAT_PARAMS];
char buffer[DEFAULT_FORMAT_ARGLIST_SIZE]; char buffer[DEFAULT_FORMAT_ARGLIST_SIZE];
FORMAT_REC *formats; FORMAT_REC *formats;
formats = g_hash_table_lookup(default_formats, module); formats = g_hash_table_lookup(default_formats, module);
format_read_arglist(va, &formats[formatnum], format_read_arglist(va, &formats[formatnum], arglist, sizeof(arglist) / sizeof(char *),
arglist, sizeof(arglist)/sizeof(char *), buffer, sizeof(buffer));
buffer, sizeof(buffer));
return format_get_text_theme_charargs(theme, module, dest, return format_get_text_theme_charargs(theme, module, dest, formatnum, arglist);
formatnum, arglist);
} }
/* Check if format number is a message format that needs nick column */ /* Check if format number is a message format that needs nick column */
@ -846,20 +837,20 @@ static gboolean is_message_format(int formatnum)
static int get_nick_param_for_format(int formatnum) static int get_nick_param_for_format(int formatnum)
{ {
switch (formatnum) { switch (formatnum) {
case TXT_OWN_MSG: case TXT_OWN_MSG:
case TXT_OWN_MSG_CHANNEL: case TXT_OWN_MSG_CHANNEL:
case TXT_PUBMSG: case TXT_PUBMSG:
case TXT_PUBMSG_CHANNEL: case TXT_PUBMSG_CHANNEL:
case TXT_PUBMSG_ME: case TXT_PUBMSG_ME:
case TXT_PUBMSG_ME_CHANNEL: case TXT_PUBMSG_ME_CHANNEL:
return 0; /* $0 = nick */ return 0; /* $0 = nick */
case TXT_PUBMSG_HILIGHT: case TXT_PUBMSG_HILIGHT:
case TXT_PUBMSG_HILIGHT_CHANNEL: case TXT_PUBMSG_HILIGHT_CHANNEL:
return 1; /* $1 = nick (because $0 = color) */ return 1; /* $1 = nick (because $0 = color) */
default: default:
return 0; /* fallback */ return 0; /* fallback */
} }
} }
@ -871,7 +862,8 @@ static char *apply_nick_column_formatting(const char *format, int formatnum)
char search_param[10], replace_param[20]; char search_param[10], replace_param[20];
int nick_param; int nick_param;
if (!format) return NULL; if (!format)
return NULL;
/* Get correct parameter number for nick in this format */ /* Get correct parameter number for nick in this format */
nick_param = get_nick_param_for_format(formatnum); nick_param = get_nick_param_for_format(formatnum);
@ -893,9 +885,8 @@ static char *apply_nick_column_formatting(const char *format, int formatnum)
return result; return result;
} }
char *format_get_text_theme_charargs(THEME_REC *theme, const char *module, char *format_get_text_theme_charargs(THEME_REC *theme, const char *module, TEXT_DEST_REC *dest,
TEXT_DEST_REC *dest, int formatnum, int formatnum, char **args)
char **args)
{ {
MODULE_THEME_REC *module_theme; MODULE_THEME_REC *module_theme;
char *text, *modified_text = NULL; char *text, *modified_text = NULL;
@ -912,17 +903,13 @@ char *format_get_text_theme_charargs(THEME_REC *theme, const char *module,
/* Apply nick column formatting if enabled and this is a message format */ /* Apply nick column formatting if enabled and this is a message format */
/* Additional protection: avoid recursion during timestamp formatting */ /* Additional protection: avoid recursion during timestamp formatting */
if (settings_get_bool("nick_column_enabled") && if (settings_get_bool("nick_column_enabled") && g_strcmp0(module, "fe-common/core") == 0 &&
g_strcmp0(module, "fe-common/core") == 0 && is_message_format(formatnum) && nick_formatting_depth == 0) { /* Prevent recursion */
is_message_format(formatnum) &&
nick_formatting_depth == 0) { /* Prevent recursion */
nick_formatting_depth++; nick_formatting_depth++;
modified_text = apply_nick_column_formatting(text, formatnum); modified_text = apply_nick_column_formatting(text, formatnum);
text = modified_text; text = modified_text;
nick_formatting_depth--; nick_formatting_depth--;
} }
result = format_get_text_args(dest, text, args); result = format_get_text_args(dest, text, args);
@ -933,9 +920,8 @@ char *format_get_text_theme_charargs(THEME_REC *theme, const char *module,
return result; return result;
} }
char *format_get_text(const char *module, WINDOW_REC *window, char *format_get_text(const char *module, WINDOW_REC *window, void *server, const char *target,
void *server, const char *target, int formatnum, ...)
int formatnum, ...)
{ {
TEXT_DEST_REC dest; TEXT_DEST_REC dest;
THEME_REC *theme; THEME_REC *theme;
@ -1001,8 +987,7 @@ char *format_add_lineend(const char *text, const char *linestart)
return ret; return ret;
} }
#define LINE_START_IRSSI_LEVEL \ #define LINE_START_IRSSI_LEVEL (MSGLEVEL_CLIENTERROR | MSGLEVEL_CLIENTNOTICE)
(MSGLEVEL_CLIENTERROR | MSGLEVEL_CLIENTNOTICE)
#define NOT_LINE_START_LEVEL \ #define NOT_LINE_START_LEVEL \
(MSGLEVEL_NEVER | MSGLEVEL_LASTLOG | MSGLEVEL_CLIENTCRAP | MSGLEVEL_MSGS | \ (MSGLEVEL_NEVER | MSGLEVEL_LASTLOG | MSGLEVEL_CLIENTCRAP | MSGLEVEL_MSGS | \
@ -1049,10 +1034,9 @@ static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
return NULL; return NULL;
if ((dest->flags & PRINT_FLAG_SET_TIMESTAMP) == 0 && if ((dest->flags & PRINT_FLAG_SET_TIMESTAMP) == 0 &&
(dest->level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) != 0) (dest->level & (MSGLEVEL_NEVER | MSGLEVEL_LASTLOG)) != 0)
return NULL; return NULL;
if (timestamp_timeout > 0) { if (timestamp_timeout > 0) {
diff = t - dest->window->last_timestamp; diff = t - dest->window->last_timestamp;
dest->window->last_timestamp = t; dest->window->last_timestamp = t;
@ -1061,8 +1045,7 @@ static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
} }
tm = localtime(&t); tm = localtime(&t);
format = format_get_text_theme(theme, MODULE_NAME, dest, format = format_get_text_theme(theme, MODULE_NAME, dest, TXT_TIMESTAMP);
TXT_TIMESTAMP);
if (strftime(str, sizeof(str), format, tm) <= 0) if (strftime(str, sizeof(str), format, tm) <= 0)
str[0] = '\0'; str[0] = '\0';
g_free(format); g_free(format);
@ -1081,8 +1064,7 @@ static char *get_server_tag(THEME_REC *theme, TEXT_DEST_REC *dest)
return NULL; return NULL;
if ((dest->flags & PRINT_FLAG_SET_SERVERTAG) == 0) { if ((dest->flags & PRINT_FLAG_SET_SERVERTAG) == 0) {
if (dest->window->active != NULL && if (dest->window->active != NULL && dest->window->active->server == dest->server)
dest->window->active->server == dest->server)
return NULL; return NULL;
if (servers != NULL) { if (servers != NULL) {
@ -1100,8 +1082,7 @@ static char *get_server_tag(THEME_REC *theme, TEXT_DEST_REC *dest)
return NULL; return NULL;
} }
return format_get_text_theme(theme, MODULE_NAME, dest, return format_get_text_theme(theme, MODULE_NAME, dest, TXT_SERVERTAG, dest->server_tag);
TXT_SERVERTAG, dest->server_tag);
} }
char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t) char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
@ -1115,8 +1096,7 @@ char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
if (timestamp == NULL && servertag == NULL) if (timestamp == NULL && servertag == NULL)
return NULL; return NULL;
linestart = g_strconcat(timestamp != NULL ? timestamp : "", linestart = g_strconcat(timestamp != NULL ? timestamp : "", servertag, NULL);
servertag, NULL);
g_free_not_null(timestamp); g_free_not_null(timestamp);
g_free_not_null(servertag); g_free_not_null(servertag);
@ -1132,10 +1112,9 @@ void format_newline(TEXT_DEST_REC *dest)
GINT_TO_POINTER(-1), GINT_TO_POINTER(GUI_PRINT_FLAG_NEWLINE), "", dest); GINT_TO_POINTER(-1), GINT_TO_POINTER(GUI_PRINT_FLAG_NEWLINE), "", dest);
} }
/* parse ANSI color string */ /* parse ANSI color string */
static const char *get_ansi_color(THEME_REC *theme, const char *str, static const char *get_ansi_color(THEME_REC *theme, const char *str, int *fg_ret, int *bg_ret,
int *fg_ret, int *bg_ret, int *flags_ret) int *flags_ret)
{ {
static char ansitab[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; static char ansitab[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
const char *start; const char *start;
@ -1153,7 +1132,8 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
num = 0; num = 0;
for (;; str++) { for (;; str++) {
if (*str == '\0') return start; if (*str == '\0')
return start;
if (i_isdigit(*str)) { if (i_isdigit(*str)) {
if (!parse_uint(str, &endptr, 10, &num)) { if (!parse_uint(str, &endptr, 10, &num)) {
@ -1170,10 +1150,10 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
/* reset colors and attributes back to default */ /* reset colors and attributes back to default */
fg = theme->default_color; fg = theme->default_color;
bg = -1; bg = -1;
flags &= ~(GUI_PRINT_FLAG_INDENT | flags &= ~(GUI_PRINT_FLAG_INDENT | GUI_PRINT_FLAG_BOLD |
GUI_PRINT_FLAG_BOLD | GUI_PRINT_FLAG_ITALIC | GUI_PRINT_FLAG_UNDERLINE | GUI_PRINT_FLAG_ITALIC | GUI_PRINT_FLAG_UNDERLINE |
GUI_PRINT_FLAG_BLINK | GUI_PRINT_FLAG_REVERSE | GUI_PRINT_FLAG_BLINK | GUI_PRINT_FLAG_REVERSE |
GUI_PRINT_FLAG_COLOR_24_FG | GUI_PRINT_FLAG_COLOR_24_BG); GUI_PRINT_FLAG_COLOR_24_FG | GUI_PRINT_FLAG_COLOR_24_BG);
break; break;
case 1: case 1:
/* hilight */ /* hilight */
@ -1228,7 +1208,8 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
case 38: case 38:
case 48: case 48:
/* ANSI indexed color or RGB color */ /* ANSI indexed color or RGB color */
if (*str != ';') break; if (*str != ';')
break;
str++; str++;
if (!parse_uint(str, &endptr, 10, &num2)) { if (!parse_uint(str, &endptr, 10, &num2)) {
@ -1236,7 +1217,8 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
} }
str = endptr; str = endptr;
if (*str == '\0') return start; if (*str == '\0')
return start;
switch (num2) { switch (num2) {
case 2: case 2:
@ -1252,13 +1234,15 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
} }
str++; str++;
for (; i_isdigit(*str); str++) for (; i_isdigit(*str); str++)
num2 = (num2&~0xff) | num2 = (num2 & ~0xff) |
(((num2&0xff) * 10 + (*str-'0'))&0xff); (((num2 & 0xff) * 10 + (*str - '0')) & 0xff);
if (*str == '\0') return start; if (*str == '\0')
return start;
} }
if (i == -1) break; if (i == -1)
break;
if (num == 38) { if (num == 38) {
flags |= GUI_PRINT_FLAG_COLOR_24_FG; flags |= GUI_PRINT_FLAG_COLOR_24_FG;
@ -1271,7 +1255,8 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
break; break;
case 5: case 5:
/* indexed */ /* indexed */
if (*str != ';') break; if (*str != ';')
break;
str++; str++;
if (!parse_uint(str, &endptr, 10, &num2)) { if (!parse_uint(str, &endptr, 10, &num2)) {
@ -1279,7 +1264,8 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
} }
str = endptr; str = endptr;
if (*str == '\0') return start; if (*str == '\0')
return start;
if (num == 38) { if (num == 38) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_FG; flags &= ~GUI_PRINT_FLAG_COLOR_24_FG;
@ -1295,25 +1281,28 @@ static const char *get_ansi_color(THEME_REC *theme, const char *str,
default: default:
if (num >= 30 && num <= 37) { if (num >= 30 && num <= 37) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_FG; flags &= ~GUI_PRINT_FLAG_COLOR_24_FG;
fg = ansitab[num-30]; fg = ansitab[num - 30];
} else if (num >= 40 && num <= 47) { } else if (num >= 40 && num <= 47) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_BG; flags &= ~GUI_PRINT_FLAG_COLOR_24_BG;
bg = ansitab[num-40]; bg = ansitab[num - 40];
} else if (num >= 90 && num <= 97) { } else if (num >= 90 && num <= 97) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_FG; flags &= ~GUI_PRINT_FLAG_COLOR_24_FG;
fg = 8 + ansitab[num-90]; fg = 8 + ansitab[num - 90];
} else if (num >= 100 && num <= 107) { } else if (num >= 100 && num <= 107) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_BG; flags &= ~GUI_PRINT_FLAG_COLOR_24_BG;
bg = 8 + ansitab[num-100]; bg = 8 + ansitab[num - 100];
} }
break; break;
} }
num = 0; num = 0;
if (*str == 'm') { if (*str == 'm') {
if (fg_ret != NULL) *fg_ret = fg; if (fg_ret != NULL)
if (bg_ret != NULL) *bg_ret = bg; *fg_ret = fg;
if (flags_ret != NULL) *flags_ret = flags; if (bg_ret != NULL)
*bg_ret = bg;
if (flags_ret != NULL)
*flags_ret = flags;
str++; str++;
break; break;
@ -1337,37 +1326,38 @@ static void get_mirc_color(const char **str, int *fg_ret, int *bg_ret)
bg = -1; bg = -1;
} else { } else {
/* foreground color */ /* foreground color */
fg = **str-'0'; fg = **str - '0';
(*str)++; (*str)++;
if (i_isdigit(**str)) { if (i_isdigit(**str)) {
fg = fg*10 + (**str-'0'); fg = fg * 10 + (**str - '0');
(*str)++; (*str)++;
} }
if ((*str)[0] == ',' && i_isdigit((*str)[1])) { if ((*str)[0] == ',' && i_isdigit((*str)[1])) {
/* background color */ /* background color */
(*str)++; (*str)++;
bg = **str-'0'; bg = **str - '0';
(*str)++; (*str)++;
if (i_isdigit(**str)) { if (i_isdigit(**str)) {
bg = bg*10 + (**str-'0'); bg = bg * 10 + (**str - '0');
(*str)++; (*str)++;
} }
} }
} }
if (fg_ret) *fg_ret = fg; if (fg_ret)
if (bg_ret) *bg_ret = bg; *fg_ret = fg;
if (bg_ret)
*bg_ret = bg;
} }
#define IS_COLOR_CODE(c) \ #define IS_COLOR_CODE(c) \
((c) == 2 || (c) == 3 || (c) == 4 || (c) == 6 || (c) == 7 || \ ((c) == 2 || (c) == 3 || (c) == 4 || (c) == 6 || (c) == 7 || (c) == 15 || (c) == 17 || \
(c) == 15 || (c) == 17 || (c) == 22 || (c) == 27 || (c) == 29 || (c) == 31) (c) == 22 || (c) == 27 || (c) == 29 || (c) == 31)
/* Return how many characters in `str' must be skipped before `len' /* Return how many characters in `str' must be skipped before `len'
characters of text is skipped. */ characters of text is skipped. */
int strip_real_length(const char *str, int len, int strip_real_length(const char *str, int len, int *last_color_pos, int *last_color_len)
int *last_color_pos, int *last_color_len)
{ {
const char *start = str; const char *start = str;
@ -1381,36 +1371,39 @@ int strip_real_length(const char *str, int len,
const char *mircstart = str; const char *mircstart = str;
if (last_color_pos != NULL) if (last_color_pos != NULL)
*last_color_pos = (int) (str-start); *last_color_pos = (int) (str - start);
str++; str++;
get_mirc_color(&str, NULL, NULL); get_mirc_color(&str, NULL, NULL);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = (int) (str-mircstart); *last_color_len = (int) (str - mircstart);
} else if (*str == 4 && str[1] != '\0') { } else if (*str == 4 && str[1] != '\0') {
/* We expect 4 to indicate an internal Irssi color code. However 4 /* We expect 4 to indicate an internal Irssi color code. However 4
* also means hex color, an alternative to mIRC color codes. We * also means hex color, an alternative to mIRC color codes. We
* don't support those. */ * don't support those. */
if (str[1] == FORMAT_COLOR_24 && str[2] != '\0') { if (str[1] == FORMAT_COLOR_24 && str[2] != '\0') {
if (str[3] == '\0') str++; if (str[3] == '\0')
else if (str[4] == '\0') str += 2; str++;
else if (str[5] == '\0') str += 3; else if (str[4] == '\0')
str += 2;
else if (str[5] == '\0')
str += 3;
else { else {
if (last_color_pos != NULL) if (last_color_pos != NULL)
*last_color_pos = (int) (str-start); *last_color_pos = (int) (str - start);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = 6; *last_color_len = 6;
str+=4; str += 4;
} }
} else if (str[1] < FORMAT_STYLE_SPECIAL && str[2] != '\0') { } else if (str[1] < FORMAT_STYLE_SPECIAL && str[2] != '\0') {
if (last_color_pos != NULL) if (last_color_pos != NULL)
*last_color_pos = (int) (str-start); *last_color_pos = (int) (str - start);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = 3; *last_color_len = 3;
str++; str++;
} else if (str[1] == FORMAT_STYLE_DEFAULTS) { } else if (str[1] == FORMAT_STYLE_DEFAULTS) {
if (last_color_pos != NULL) if (last_color_pos != NULL)
*last_color_pos = (int) (str-start); *last_color_pos = (int) (str - start);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = 2; *last_color_len = 2;
} }
@ -1424,7 +1417,7 @@ int strip_real_length(const char *str, int len,
} }
} }
return (int) (str-start); return (int) (str - start);
} }
char *strip_codes(const char *input) char *strip_codes(const char *input)
@ -1452,12 +1445,16 @@ char *strip_codes(const char *input)
/* irssi color */ /* irssi color */
if (p[2] != '\0') { if (p[2] != '\0') {
if (p[1] == FORMAT_COLOR_24) { if (p[1] == FORMAT_COLOR_24) {
if (p[3] == '\0') p += 2; if (p[3] == '\0')
else if (p[4] == '\0') p += 3; p += 2;
else if (p[5] == '\0') p += 4; else if (p[4] == '\0')
else p += 5; p += 3;
else if (p[5] == '\0')
p += 4;
else
p += 5;
} else } else
p += 2; p += 2;
continue; continue;
} }
} }
@ -1492,7 +1489,9 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
dup = str = g_strdup(text); dup = str = g_strdup(text);
flags = 0; fgcolor = theme->default_color; bgcolor = -1; flags = 0;
fgcolor = theme->default_color;
bgcolor = -1;
if (*str == '\0') { if (*str == '\0') {
/* empty line, write line info only */ /* empty line, write line info only */
@ -1519,7 +1518,7 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
/* send the text to gui handler */ /* send the text to gui handler */
handler(dest->window, GINT_TO_POINTER(fgcolor), GINT_TO_POINTER(bgcolor), handler(dest->window, GINT_TO_POINTER(fgcolor), GINT_TO_POINTER(bgcolor),
GINT_TO_POINTER(flags), str, dest); GINT_TO_POINTER(flags), str, dest);
flags &= ~(GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_CLRTOEOL); flags &= ~(GUI_PRINT_FLAG_INDENT | GUI_PRINT_FLAG_CLRTOEOL);
} }
if (type == '\n') { if (type == '\n') {
@ -1527,14 +1526,13 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
GINT_TO_POINTER(GUI_PRINT_FLAG_NEWLINE), "", dest); GINT_TO_POINTER(GUI_PRINT_FLAG_NEWLINE), "", dest);
fgcolor = theme->default_color; fgcolor = theme->default_color;
bgcolor = -1; bgcolor = -1;
flags &= GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_MONOSPACE; flags &= GUI_PRINT_FLAG_INDENT | GUI_PRINT_FLAG_MONOSPACE;
} }
if (*ptr == '\0') if (*ptr == '\0')
break; break;
switch (type) switch (type) {
{
case 2: case 2:
/* bold */ /* bold */
if (!hide_text_style) if (!hide_text_style)
@ -1542,9 +1540,8 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
break; break;
case 3: case 3:
/* MIRC color */ /* MIRC color */
get_mirc_color((const char **) &ptr, get_mirc_color((const char **) &ptr, hide_colors ? NULL : &fgcolor,
hide_colors ? NULL : &fgcolor, hide_colors ? NULL : &bgcolor);
hide_colors ? NULL : &bgcolor);
if (!hide_colors) if (!hide_colors)
flags |= GUI_PRINT_FLAG_MIRC_COLOR; flags |= GUI_PRINT_FLAG_MIRC_COLOR;
break; break;
@ -1576,7 +1573,7 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
case FORMAT_STYLE_DEFAULTS: case FORMAT_STYLE_DEFAULTS:
fgcolor = theme->default_color; fgcolor = theme->default_color;
bgcolor = -1; bgcolor = -1;
flags &= GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_MONOSPACE; flags &= GUI_PRINT_FLAG_INDENT | GUI_PRINT_FLAG_MONOSPACE;
break; break;
case FORMAT_STYLE_CLRTOEOL: case FORMAT_STYLE_CLRTOEOL:
break; break;
@ -1610,7 +1607,8 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
default: default:
if (*ptr != FORMAT_COLOR_NOCHANGE) { if (*ptr != FORMAT_COLOR_NOCHANGE) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_FG; flags &= ~GUI_PRINT_FLAG_COLOR_24_FG;
fgcolor = *ptr==(char)0xff ? -1 : (unsigned char) *ptr-'0'; fgcolor =
*ptr == (char) 0xff ? -1 : (unsigned char) *ptr - '0';
} }
if (ptr[1] == '\0') if (ptr[1] == '\0')
break; break;
@ -1618,7 +1616,7 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
ptr++; ptr++;
if (*ptr != FORMAT_COLOR_NOCHANGE) { if (*ptr != FORMAT_COLOR_NOCHANGE) {
flags &= ~GUI_PRINT_FLAG_COLOR_24_BG; flags &= ~GUI_PRINT_FLAG_COLOR_24_BG;
bgcolor = *ptr==(char)0xff ? -1 : *ptr-'0'; bgcolor = *ptr == (char) 0xff ? -1 : *ptr - '0';
} }
} }
if (*ptr == '\0') if (*ptr == '\0')
@ -1635,7 +1633,7 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
/* remove all styling */ /* remove all styling */
fgcolor = theme->default_color; fgcolor = theme->default_color;
bgcolor = -1; bgcolor = -1;
flags &= GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_MONOSPACE; flags &= GUI_PRINT_FLAG_INDENT | GUI_PRINT_FLAG_MONOSPACE;
break; break;
case 17: case 17:
if (!hide_text_style) if (!hide_text_style)
@ -1658,11 +1656,9 @@ void format_send_as_gui_flags(TEXT_DEST_REC *dest, const char *text, SIGNAL_FUNC
break; break;
case 27: case 27:
/* ansi color code */ /* ansi color code */
ptr = (char *) ptr = (char *) get_ansi_color(theme, ptr, hide_colors ? NULL : &fgcolor,
get_ansi_color(theme, ptr, hide_colors ? NULL : &bgcolor,
hide_colors ? NULL : &fgcolor, hide_colors ? NULL : &flags);
hide_colors ? NULL : &bgcolor,
hide_colors ? NULL : &flags);
break; break;
} }
@ -1767,7 +1763,7 @@ static void read_settings(void)
timestamp_level = settings_get_bool("timestamps") ? MSGLEVEL_ALL : 0; timestamp_level = settings_get_bool("timestamps") ? MSGLEVEL_ALL : 0;
if (timestamp_level > 0) if (timestamp_level > 0)
timestamp_level = settings_get_level("timestamp_level"); timestamp_level = settings_get_level("timestamp_level");
timestamp_timeout = settings_get_time("timestamp_timeout")/1000; timestamp_timeout = settings_get_time("timestamp_timeout") / 1000;
hide_server_tags = settings_get_bool("hide_server_tags"); hide_server_tags = settings_get_bool("hide_server_tags");
hide_text_style = settings_get_bool("hide_text_style"); hide_text_style = settings_get_bool("hide_text_style");