#include "formats.h"
#include "themes.h"
#include "translation.h"
+#ifdef HAVE_GLIB2
+#include "recode.h"
+#include "utf8.h"
+#endif
static const char *format_backs = "04261537";
static const char *format_fores = "kbgcrmyw";
int set;
if (flags == NULL) {
- /* flags are being ignored - skip the code */
+ /* flags are being ignored - skip the code */
while (**format != ']')
(*format)++;
- return;
+ return;
}
- set = TRUE;
+ set = TRUE;
(*format)++;
while (**format != ']' && **format != '\0') {
if (**format == '+')
(*format)++;
}
g_string_append_c(out, ',');
- (*format)--;
+ (*format)--;
break;
case 's':
case 'S':
break;
case 't':
*flags |= set ? PRINT_FLAG_SET_TIMESTAMP :
- PRINT_FLAG_UNSET_TIMESTAMP;
- break;
+ PRINT_FLAG_UNSET_TIMESTAMP;
+ break;
case 'T':
*flags |= set ? PRINT_FLAG_SET_SERVERTAG :
- PRINT_FLAG_UNSET_SERVERTAG;
- break;
+ PRINT_FLAG_UNSET_SERVERTAG;
+ break;
}
(*format)++;
{
char *p, fmt;
- fmt = **format;
+ fmt = **format;
switch (fmt) {
case '{':
case '}':
case '%':
- /* escaped char */
+ /* escaped char */
g_string_append_c(out, fmt);
break;
case 'U':
g_string_append_c(out, FORMAT_STYLE_DEFAULTS);
break;
case '>':
- /* clear to end of line */
+ /* clear to end of line */
g_string_append_c(out, 4);
g_string_append_c(out, FORMAT_STYLE_CLRTOEOL);
break;
break;
case '[':
/* code */
- format_expand_code(format, out, flags);
+ format_expand_code(format, out, flags);
break;
default:
/* check if it's a background color */
{
int num, len, bufpos;
- g_return_if_fail(format->params < arglist_size);
+ g_return_if_fail(format->params < arglist_size);
bufpos = 0;
- arglist[format->params] = NULL;
+ arglist[format->params] = NULL;
for (num = 0; num < format->params; num++) {
switch (format->paramtypes[num]) {
case FORMAT_STRING:
arglist[num] = buffer+bufpos;
len = g_snprintf(buffer+bufpos, buffer_size-bufpos,
"%ld", l);
- bufpos += len+1;
+ bufpos += len+1;
break;
}
case FORMAT_FLOAT: {
}
}
}
-
void format_create_dest(TEXT_DEST_REC *dest,
void *server, const char *target,
int level, WINDOW_REC *window)
{
- format_create_dest_tag(dest, server, NULL, target, level, window);
+ format_create_dest_tag(dest, server, NULL, target, level, window);
}
void format_create_dest_tag(TEXT_DEST_REC *dest, void *server,
const char *server_tag, const char *target,
int level, WINDOW_REC *window)
{
- memset(dest, 0, sizeof(TEXT_DEST_REC));
+ memset(dest, 0, sizeof(TEXT_DEST_REC));
dest->server = server;
dest->server_tag = server != NULL ? SERVER(server)->tag : server_tag;
dest->window = window != NULL ? window :
window_find_closest(server, target, level);
}
+#ifdef HAVE_GLIB2
+static int advance (char const **str, gboolean utf8)
+{
+ if (utf8) {
+ gunichar c;
+
+ c = g_utf8_get_char(*str);
+ *str = g_utf8_next_char(*str);
+ return utf8_width(c);
+ } else {
+ *str += 1;
+
+ return 1;
+ }
+}
+#endif
/* Return length of text part in string (ie. without % codes) */
int format_get_length(const char *str)
{
- GString *tmp;
+ GString *tmp;
int len;
+#ifdef HAVE_GLIB2
+ gboolean utf8;
+#endif
- g_return_val_if_fail(str != NULL, 0);
+ g_return_val_if_fail(str != NULL, 0);
- tmp = g_string_new(NULL);
+#ifdef HAVE_GLIB2
+ utf8 = is_utf8() && g_utf8_validate(str, -1, NULL);
+#endif
+
+ tmp = g_string_new(NULL);
len = 0;
while (*str != '\0') {
if (*str == '%' && str[1] != '\0') {
str++;
if (*str != '%' &&
format_expand_styles(tmp, &str, NULL)) {
- str++;
+ str++;
continue;
}
if (*str != '%')
len++;
}
-
- len++;
+#ifdef HAVE_GLIB2
+ len += advance(&str, utf8);
+#else
+ len++;
str++;
+#endif
}
g_string_free(tmp, TRUE);
- return len;
+ return len;
}
/* Return how many characters in `str' must be skipped before `len'
{
GString *tmp;
const char *start;
-
- g_return_val_if_fail(str != NULL, 0);
- g_return_val_if_fail(len >= 0, 0);
-
- start = str;
- tmp = g_string_new(NULL);
+#ifdef HAVE_GLIB2
+ gboolean utf8;
+#endif
+ g_return_val_if_fail(str != NULL, 0);
+ g_return_val_if_fail(len >= 0, 0);
+
+#ifdef HAVE_GLIB2
+ utf8 = is_utf8() && g_utf8_validate(str, -1, NULL);
+#endif
+
+ start = str;
+ tmp = g_string_new(NULL);
while (*str != '\0' && len > 0) {
if (*str == '%' && str[1] != '\0') {
str++;
if (*str != '%' &&
format_expand_styles(tmp, &str, NULL)) {
- str++;
+ str++;
continue;
}
/* %% or unknown %code, written as-is */
if (*str != '%') {
if (--len == 0)
- break;
+ break;
}
}
- len--;
+#ifdef HAVE_GLIB2
+ len -= advance(&str, utf8);
+#else
+ len--;
str++;
+#endif
}
g_string_free(tmp, TRUE);
- return (int) (str-start);
+ return (int) (str-start);
}
char *format_string_expand(const char *text, int *flags)
GString *out;
char code, *ret;
- g_return_val_if_fail(text != NULL, NULL);
+ g_return_val_if_fail(text != NULL, NULL);
out = g_string_new(NULL);
if (ret != NULL) {
/* string shouldn't end with \003 or it could
mess up the next one or two characters */
- int diff;
+ int diff;
int len = strlen(ret);
while (len > 0 && ret[len-1] == 3) len--;
diff = strlen(ret)-len;
if (module_theme == NULL)
return NULL;
- text = module_theme->expanded_formats[formatnum];
+ text = module_theme->expanded_formats[formatnum];
return format_get_text_args(dest, text, args);
}
ret = str->str;
g_string_free(str, FALSE);
- return ret;
+ return ret;
}
char *format_add_lineend(const char *text, const char *linestart)
ret = str->str;
g_string_free(str, FALSE);
- return ret;
+ return ret;
}
#define LINE_START_IRSSI_LEVEL \
{
int format;
- /* check for flags if we want to override defaults */
+ /* check for flags if we want to override defaults */
if (dest->flags & PRINT_FLAG_UNSET_LINE_START)
return NULL;
if (dest->flags & PRINT_FLAG_SET_LINE_START)
format = TXT_LINE_START;
- else if (dest->flags & PRINT_FLAG_SET_LINE_START_IRSSI)
+ else if (dest->flags & PRINT_FLAG_SET_LINE_START_IRSSI)
format = TXT_LINE_START_IRSSI;
else {
- /* use defaults */
+ /* use defaults */
if (dest->level & LINE_START_IRSSI_LEVEL)
format = TXT_LINE_START_IRSSI;
else if ((dest->level & NOT_LINE_START_LEVEL) == 0)
static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
{
- char *format, str[256];
+ char *format, str[256];
struct tm *tm;
int diff;
if ((timestamp_level & dest->level) == 0)
return NULL;
- /* check for flags if we want to override defaults */
+ /* check for flags if we want to override defaults */
if (dest->flags & PRINT_FLAG_UNSET_TIMESTAMP)
return NULL;
if ((dest->flags & PRINT_FLAG_SET_TIMESTAMP) == 0 &&
(dest->level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) != 0)
- return NULL;
+ return NULL;
if (timestamp_timeout > 0) {
format = format_get_text_theme(theme, MODULE_NAME, dest,
TXT_TIMESTAMP);
if (strftime(str, sizeof(str), format, tm) <= 0)
- str[0] = '\0';
+ str[0] = '\0';
g_free(format);
return g_strdup(str);
}
int count = 0;
if (dest->server_tag == NULL || hide_server_tags)
- return NULL;
+ return NULL;
- /* check for flags if we want to override defaults */
+ /* check for flags if we want to override defaults */
if (dest->flags & PRINT_FLAG_UNSET_SERVERTAG)
return NULL;
}
if (count < 2)
- return NULL;
+ return NULL;
}
return format_get_text_theme(theme, MODULE_NAME, dest,
/* foreground color */
if (**str != ',') {
fg = **str-'0';
- (*str)++;
+ (*str)++;
if (i_isdigit(**str)) {
fg = fg*10 + (**str-'0');
(*str)++;
{
const char *start = str;
- if (last_color_pos != NULL)
+ if (last_color_pos != NULL)
*last_color_pos = -1;
if (last_color_len != NULL)
*last_color_len = -1;
if (last_color_pos != NULL)
*last_color_pos = (int) (str-start);
- str++;
+ str++;
get_mirc_color(&str, NULL, NULL);
- if (last_color_len != NULL)
+ if (last_color_len != NULL)
*last_color_len = (int) (str-mircstart);
} else if (*str == 4 && str[1] != '\0') {
if (str[1] < FORMAT_STYLE_SPECIAL && str[2] != '\0') {
if (last_color_pos != NULL)
*last_color_pos = (int) (str-start);
- if (last_color_len != NULL)
- *last_color_len = 3;
+ if (last_color_len != NULL)
+ *last_color_len = 3;
str++;
} else if (str[1] == FORMAT_STYLE_DEFAULTS) {
if (last_color_pos != NULL)
*last_color_pos = (int) (str-start);
- if (last_color_len != NULL)
- *last_color_len = 2;
+ if (last_color_len != NULL)
+ *last_color_len = 2;
}
- str += 2;
+ str += 2;
} else {
if (!IS_COLOR_CODE(*str)) {
if (len-- == 0)
char *strip_codes(const char *input)
{
- const char *p;
- char *str, *out;
-
- out = str = g_strdup(input);
- for (p = input; *p != '\0'; p++) {
- if (*p == 3) {
- p++;
-
- /* mirc color */
- get_mirc_color(&p, NULL, NULL);
- p--;
- continue;
- }
-
- if (*p == 4 && p[1] != '\0') {
- if (p[1] >= FORMAT_STYLE_SPECIAL) {
- p++;
- continue;
- }
-
- /* irssi color */
- if (p[2] != '\0') {
- p += 2;
- continue;
- }
+ const char *p;
+ char *str, *out;
+
+ out = str = g_strdup(input);
+ for (p = input; *p != '\0'; p++) {
+ if (*p == 3) {
+ p++;
+
+ /* mirc color */
+ get_mirc_color(&p, NULL, NULL);
+ p--;
+ continue;
+ }
+
+ if (*p == 4 && p[1] != '\0') {
+ if (p[1] >= FORMAT_STYLE_SPECIAL) {
+ p++;
+ continue;
+ }
+
+ /* irssi color */
+ if (p[2] != '\0') {
+ p += 2;
+ continue;
+ }
}
if (*p == 27 && p[1] != '\0') {
- p++;
+ p++;
p = get_ansi_color(current_theme, p, NULL, NULL, NULL);
p--;
} else if (!IS_COLOR_CODE(*p))
- *out++ = *p;
- }
+ *out++ = *p;
+ }
- *out = '\0';
- return str;
+ *out = '\0';
+ return str;
}
/* send a fully parsed text string for GUI to print */
void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
{
- THEME_REC *theme;
+ THEME_REC *theme;
char *dup, *str, *ptr, type;
int fgcolor, bgcolor;
int flags;
- theme = dest->window != NULL && dest->window->theme != NULL ?
+ theme = dest->window != NULL && dest->window->theme != NULL ?
dest->window->theme : current_theme;
dup = str = g_strdup(text);
flags = 0; fgcolor = theme->default_color; bgcolor = -1;
while (*str != '\0') {
- type = '\0';
+ type = '\0';
for (ptr = str; *ptr != '\0'; ptr++) {
if (IS_COLOR_CODE(*ptr) || *ptr == '\n') {
type = *ptr;
if (type == 7) {
/* bell */
if (settings_get_bool("bell_beeps"))
- signal_emit("beep", 0);
+ signal_emit("beep", 0);
} else if (type == 4 && *ptr == FORMAT_STYLE_CLRTOEOL) {
- /* clear to end of line */
+ /* clear to end of line */
flags |= GUI_PRINT_FLAG_CLRTOEOL;
}
if (*str != '\0' || (flags & GUI_PRINT_FLAG_CLRTOEOL)) {
- /* send the text to gui handler */
+ /* send the text to gui handler */
signal_emit_id(signal_gui_print_text, 6, dest->window,
GINT_TO_POINTER(fgcolor),
GINT_TO_POINTER(bgcolor),
while (*ptr != ',' && *ptr != '\0')
ptr++;
if (*ptr != '\0') *ptr++ = '\0';
- ptr--;
+ ptr--;
signal_emit_id(signal_gui_print_text, 6,
dest->window, NULL, NULL,
GINT_TO_POINTER(GUI_PRINT_FLAG_INDENT_FUNC),
- str, start, dest);
+ start, dest);
break;
}
case FORMAT_STYLE_DEFAULTS:
- fgcolor = theme->default_color;
+ fgcolor = theme->default_color;
bgcolor = -1;
flags &= GUI_PRINT_FLAG_INDENT|GUI_PRINT_FLAG_MONOSPACE;
break;
case FORMAT_STYLE_CLRTOEOL:
- break;
+ break;
default:
if (*ptr != FORMAT_COLOR_NOCHANGE) {
fgcolor = (unsigned char) *ptr-'0';
flags &= ~GUI_PRINT_FLAG_BLINK;
else {
/* blink */
- bgcolor -= 8;
- flags |= GUI_PRINT_FLAG_BLINK;
+ bgcolor -= 8;
+ flags |= GUI_PRINT_FLAG_BLINK;
}
}
}
static void read_settings(void)
{
timestamp_level = settings_get_bool("timestamps") ? MSGLEVEL_ALL : 0;
- if (timestamp_level > 0) {
- timestamp_level =
- level2bits(settings_get_str("timestamp_level"));
- }
- timestamp_timeout = settings_get_int("timestamp_timeout");
+ if (timestamp_level > 0)
+ timestamp_level = settings_get_level("timestamp_level");
+ timestamp_timeout = settings_get_time("timestamp_timeout")/1000;
hide_server_tags = settings_get_bool("hide_server_tags");
hide_text_style = settings_get_bool("hide_text_style");