diff options
Diffstat (limited to 'lib/ephy-string.c')
-rw-r--r-- | lib/ephy-string.c | 397 |
1 files changed, 12 insertions, 385 deletions
diff --git a/lib/ephy-string.c b/lib/ephy-string.c index b97e0485c..79eaa215a 100644 --- a/lib/ephy-string.c +++ b/lib/ephy-string.c @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - + #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -25,9 +25,6 @@ #include <errno.h> #include <string.h> #include <glib.h> -#include <bonobo/bonobo-i18n.h> -#include <libgnomevfs/gnome-vfs-mime.h> -#include <libxml/parser.h> #define ELLIPSIS "\xe2\x80\xa6" @@ -40,7 +37,7 @@ * FIXME: this function is a big mess. While it is utf-8 safe now, * it can still split a sequence of combining characters */ -gchar * +char * ephy_string_shorten (const gchar *str, gint target_length) { gchar *new_str; @@ -57,91 +54,17 @@ ephy_string_shorten (const gchar *str, gint target_length) /* create string */ bytes = GPOINTER_TO_UINT (g_utf8_offset_to_pointer (str, target_length - 1) - str); - + new_str = g_new0 (gchar, bytes + strlen(ELLIPSIS) + 1); - + strncpy (new_str, str, bytes); strncpy (new_str + bytes, ELLIPSIS, strlen (ELLIPSIS)); return new_str; } -char * -ephy_string_double_underscores (const char *string) -{ - int underscores; - const char *p; - char *q; - char *escaped; - - if (string == NULL) { - return NULL; - } - - underscores = 0; - for (p = string; *p != '\0'; p++) { - underscores += (*p == '_'); - } - - if (underscores == 0) { - return g_strdup (string); - } - - escaped = g_new (char, strlen (string) + underscores + 1); - for (p = string, q = escaped; *p != '\0'; p++, q++) { - /* Add an extra underscore. */ - if (*p == '_') { - *q++ = '_'; - } - *q = *p; - } - *q = '\0'; - - return escaped; -} - -/** - * ephy_string_store_time_in_string: - * NOTE: str must be at least 256 chars long - */ -void -ephy_string_store_time_in_string (GDate *t, gchar *str, const char *format) -{ - int length; - - if (t > 0) - { - /* format into string */ - /* this is used whenever a brief date is needed, like - * in the history (for last visited, first time visited) */ - length = g_date_strftime (str, 255, - format ? format : _("%Y-%m-%d"), t); - str[length] = '\0'; - } - else - { - str[0] = '\0'; - } -} - -/** - * ephy_string_time_to_string: - */ -gchar * -ephy_string_time_to_string (GDate *t, - const char *format) -{ - gchar str[256]; - - /* write into stack string */ - ephy_string_store_time_in_string (t, str, format); - - /* copy in heap and return */ - return g_strdup (str); -} - gboolean -ephy_str_to_int (const char *string, gulong *integer) +ephy_string_to_int (const char *string, gulong *integer) { gulong result; char *parse_end; @@ -183,7 +106,7 @@ ephy_str_to_int (const char *string, gulong *integer) * of @remove_this. */ char * -ephy_str_strip_chr (const char *source, char remove_this) +ephy_string_strip_chr (const char *source, char remove_this) { char *result, *out; const char *in; @@ -204,313 +127,17 @@ ephy_str_strip_chr (const char *source, char remove_this) return result; } -int -ephy_strcasecmp (const char *string_a, const char *string_b) -{ - return g_ascii_strcasecmp (string_a == NULL ? "" : string_a, - string_b == NULL ? "" : string_b); -} - -int -ephy_strcasecmp_compare_func (gconstpointer string_a, gconstpointer string_b) -{ - return ephy_strcasecmp ((const char *) string_a, - (const char *) string_b); -} - -/** - * like strpbrk but ignores chars preceded by slashes, unless the - * slash is also preceded by a slash unless that later slash is - * preceded by another slash... ;-) - */ -static char * -ephy_strpbrk_unescaped (const char *s, const char *accept) -{ - gchar *ret = strpbrk (s, accept); - - if (!ret || ret == s || *(ret - 1) != '\\') - { - return ret; - } - else - { - gchar *c = ret - 1; - g_assert (*c == '\\'); - - while (c >= s && *c == '\\') c--; - - if ((ret - c) % 2 == 0) - { - return ephy_strpbrk_unescaped (ret + 1, accept); - } - else - { - return ret; - } - } -} - -/** - * like strstr but supports quoting, ignoring matches inside quoted text - */ -static char * -ephy_strstr_with_quotes (const char *haystack, const char *needle, - const char *quotes) -{ - gchar *quot = ephy_strpbrk_unescaped (haystack, quotes); - gchar *ret = strstr (haystack, needle); - - if (!quot || !ret || ret < quot) - { - return ret; - } - - quot = ephy_strpbrk_unescaped (quot + 1, quotes); - - if (quot) - { - return ephy_strstr_with_quotes (quot + 1, needle, quotes); - } - else - { - return NULL; - } -} - -/** - * like strpbrk but supports quoting, ignoring matches inside quoted text - */ -static char * -ephy_strpbrk_with_quotes (const char *haystack, const char *needles, - const char *quotes) -{ - gchar *quot = ephy_strpbrk_unescaped (haystack, quotes); - gchar *ret = strpbrk (haystack, needles); - - if (!quot || !ret || ret < quot) - { - return ret; - } - - quot = ephy_strpbrk_unescaped (quot + 1, quotes); - - if (quot) - { - return ephy_strpbrk_with_quotes (quot + 1, needles, quotes); - } - else - { - return NULL; - } -} - -/** - * Like g_strsplit, but does not split tokens betwen quotes. Ignores - * quotes preceded by '\'. - */ -gchar ** -ephy_strsplit_with_quotes (const gchar *string, - const gchar *delimiter, - gint max_tokens, - const gchar *quotes) -{ - GSList *string_list = NULL, *slist; - gchar **str_array, *s; - guint n = 0; - const gchar *remainder; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (delimiter != NULL, NULL); - g_return_val_if_fail (delimiter[0] != '\0', NULL); - - if (quotes == NULL) - { - return g_strsplit (string, delimiter, max_tokens); - } - - if (max_tokens < 1) - { - max_tokens = G_MAXINT; - } - - remainder = string; - s = ephy_strstr_with_quotes (remainder, delimiter, quotes); - if (s) - { - gsize delimiter_len = strlen (delimiter); - - while (--max_tokens && s) - { - gsize len; - gchar *new_string; - - len = s - remainder; - new_string = g_new (gchar, len + 1); - strncpy (new_string, remainder, len); - new_string[len] = 0; - string_list = g_slist_prepend (string_list, new_string); - n++; - remainder = s + delimiter_len; - s = ephy_strstr_with_quotes (remainder, delimiter, quotes); - } - } - if (*string) - { - n++; - string_list = g_slist_prepend (string_list, g_strdup (remainder)); - } - - str_array = g_new (gchar*, n + 1); - - str_array[n--] = NULL; - for (slist = string_list; slist; slist = slist->next) - { - str_array[n--] = slist->data; - } - - g_slist_free (string_list); - - return str_array; -} - -/** - * like ephy_strsplit_with_quotes, but matches any char in 'delimiters' as delimiter - * and does not return empty tokens - */ -gchar ** -ephy_strsplit_multiple_delimiters_with_quotes (const gchar *string, - const gchar *delimiters, - gint max_tokens, - const gchar *quotes) -{ - GSList *string_list = NULL, *slist; - gchar **str_array, *s; - guint n = 0; - const gchar *remainder; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (delimiters != NULL, NULL); - g_return_val_if_fail (delimiters[0] != '\0', NULL); - - if (quotes == NULL) - { - quotes = ""; - } - - if (max_tokens < 1) - { - max_tokens = G_MAXINT; - } - - remainder = string; - s = ephy_strpbrk_with_quotes (remainder, delimiters, quotes); - if (s) - { - const gsize delimiter_len = 1; /* only chars */ - - while (--max_tokens && s) - { - gsize len; - gchar *new_string; - - len = s - remainder; - if (len > 0) /* ignore empty strings */ - { - new_string = g_new (gchar, len + 1); - strncpy (new_string, remainder, len); - new_string[len] = 0; - string_list = g_slist_prepend (string_list, new_string); - n++; - } - remainder = s + delimiter_len; - s = ephy_strpbrk_with_quotes (remainder, delimiters, quotes); - } - } - if (*string) - { - n++; - string_list = g_slist_prepend (string_list, g_strdup (remainder)); - } - - str_array = g_new (gchar*, n + 1); - - str_array[n--] = NULL; - for (slist = string_list; slist; slist = slist->next) - { - str_array[n--] = slist->data; - } - - g_slist_free (string_list); - - return str_array; -} - -char * -ephy_str_replace_substring (const char *string, - const char *substring, - const char *replacement) -{ - int substring_length, replacement_length, result_length, remaining_length; - const char *p, *substring_position; - char *result, *result_position; - - g_return_val_if_fail (substring != NULL, g_strdup (string)); - g_return_val_if_fail (substring[0] != '\0', g_strdup (string)); - - if (string == NULL) - { - return NULL; - } - - substring_length = strlen (substring); - replacement_length = replacement == NULL ? 0 : strlen (replacement); - - result_length = strlen (string); - for (p = string; ; p = substring_position + substring_length) - { - substring_position = strstr (p, substring); - if (substring_position == NULL) - { - break; - } - result_length += replacement_length - substring_length; - } - - result = g_malloc (result_length + 1); - - result_position = result; - for (p = string; ; p = substring_position + substring_length) - { - substring_position = strstr (p, substring); - if (substring_position == NULL) - { - remaining_length = strlen (p); - memcpy (result_position, p, remaining_length); - result_position += remaining_length; - break; - } - memcpy (result_position, p, substring_position - p); - result_position += substring_position - p; - memcpy (result_position, replacement, replacement_length); - result_position += replacement_length; - } - g_assert (result_position - result == result_length); - result_position[0] = '\0'; - - return result; -} - /* copied from egg-toolbar-editor.c */ -gchar * -ephy_str_elide_underscores (const gchar *original) +char * +ephy_string_elide_underscores (const gchar *original) { gchar *q, *result; const gchar *p; gboolean last_underscore; - + q = result = g_malloc (strlen (original) + 1); last_underscore = FALSE; - + for (p = original; *p; p++) { if (!last_underscore && *p == '_') @@ -523,8 +150,8 @@ ephy_str_elide_underscores (const gchar *original) *q++ = *p; } } - + *q = '\0'; - + return result; } |