diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ephy-string.c | 49 | ||||
-rw-r--r-- | lib/ephy-string.h | 9 |
2 files changed, 55 insertions, 3 deletions
diff --git a/lib/ephy-string.c b/lib/ephy-string.c index 2d53c25b5..f996a7fe3 100644 --- a/lib/ephy-string.c +++ b/lib/ephy-string.c @@ -27,6 +27,8 @@ #include <stdlib.h> #include <glib.h> +#define ELLIPSIS "\xe2\x80\xa6" + gboolean ephy_string_to_int (const char *string, gulong *integer) { @@ -85,3 +87,50 @@ ephy_string_blank_chr (char *source) return source; } + +/** + * ephy_string_shorten: shortens a string + * @str: the string to shorten, in UTF-8 + * @target_length: the length of the shortened string (in characters) + * + * If @str is already short enough, it is returned. Otherwise a new string + * is allocated and @str is consumed. + * + * Return value: a newly allocated string, not longer than target_length + * characters. + */ +char * +ephy_string_shorten (const char *str, + gsize target_length) +{ + char *new_str; + glong actual_length; + gulong bytes; + + g_return_val_if_fail (target_length > 0, NULL); + + if (!str) return NULL; + + /* FIXME: this function is a big mess. While it is utf-8 safe now, + * it can still split a sequence of combining characters. + */ + + actual_length = g_utf8_strlen (str, -1); + + /* if the string is already short enough, or if it's too short for + * us to shorten it, return a new copy */ + if (actual_length <= target_length) return g_strdup (str); + + /* create string */ + bytes = GPOINTER_TO_UINT (g_utf8_offset_to_pointer (str, target_length - 1) - str); + + new_str = g_new (gchar, bytes + strlen(ELLIPSIS) + 1); + + strncpy (new_str, str, bytes); + strncpy (new_str + bytes, ELLIPSIS, strlen (ELLIPSIS)); + new_str[bytes + strlen (ELLIPSIS)] = '\0'; + + g_free (str); + + return new_str; +} diff --git a/lib/ephy-string.h b/lib/ephy-string.h index 36e23d1c3..86ab9eafc 100644 --- a/lib/ephy-string.h +++ b/lib/ephy-string.h @@ -25,10 +25,13 @@ G_BEGIN_DECLS -gboolean ephy_string_to_int (const char *string, - gulong *integer); +gboolean ephy_string_to_int (const char *string, + gulong *integer); -char *ephy_string_blank_chr (char *source); +char *ephy_string_blank_chr (char *source); + +char *ephy_string_shorten (const char *str, + gsize target_length); G_END_DECLS |