summaryrefslogtreecommitdiff
path: root/src/fe-common
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2001-03-12 10:34:04 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2001-03-12 10:34:04 +0000
commit7ced2beab412c51b80155bd7ef98f9fff117f6d1 (patch)
tree7bfc66eef4e99bd730e23b609601b44b8532c2f6 /src/fe-common
parent4d5da596c9854ae60f699ffda8dc931e0b528365 (diff)
downloadirssi-7ced2beab412c51b80155bd7ef98f9fff117f6d1.zip
added format_real_length()
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1380 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-common')
-rw-r--r--src/fe-common/core/formats.c43
-rw-r--r--src/fe-common/core/formats.h4
2 files changed, 45 insertions, 2 deletions
diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c
index 43f8f275..038938c3 100644
--- a/src/fe-common/core/formats.c
+++ b/src/fe-common/core/formats.c
@@ -216,11 +216,14 @@ void format_create_dest(TEXT_DEST_REC *dest,
dest->hilight_bg_color = 0;
}
+/* Return length of text part in string (ie. without % codes) */
int format_get_length(const char *str)
{
GString *tmp;
int len;
+ g_return_val_if_fail(str != NULL, 0);
+
tmp = g_string_new(NULL);
len = 0;
while (*str != '\0') {
@@ -233,17 +236,53 @@ int format_get_length(const char *str)
/* %% or unknown %code, written as-is */
if (*str != '%')
- len++;
+ len++;
}
len++;
- str++;
+ str++;
}
g_string_free(tmp, TRUE);
return len;
}
+/* Return how many characters in `str' must be skipped before `len'
+ characters of text is skipped. Like strip_real_length(), except this
+ handles %codes. */
+int format_real_length(const char *str, int 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);
+ while (*str != '\0' && len > 0) {
+ if (*str == '%' && str[1] != '\0') {
+ str++;
+ if (*str != '%' && format_expand_styles(tmp, *str)) {
+ str++;
+ continue;
+ }
+
+ /* %% or unknown %code, written as-is */
+ if (*str != '%') {
+ if (--len == 0)
+ break;
+ }
+ }
+
+ len--;
+ str++;
+ }
+
+ g_string_free(tmp, TRUE);
+ return (int) (str-start);
+}
+
static char *format_get_text_args(TEXT_DEST_REC *dest,
const char *text, char **arglist)
{
diff --git a/src/fe-common/core/formats.h b/src/fe-common/core/formats.h
index fdd27015..0dd46489 100644
--- a/src/fe-common/core/formats.h
+++ b/src/fe-common/core/formats.h
@@ -44,6 +44,10 @@ int format_find_tag(const char *module, const char *tag);
/* Return length of text part in string (ie. without % codes) */
int format_get_length(const char *str);
+/* Return how many characters in `str' must be skipped before `len'
+ characters of text is skipped. Like strip_real_length(), except this
+ handles %codes. */
+int format_real_length(const char *str, int len);
char *format_get_text(const char *module, WINDOW_REC *window,
void *server, const char *target,