]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-string-parser.c
Reorder header inclusions accordingly to the Telepathy coding style
[empathy.git] / libempathy-gtk / empathy-string-parser.c
index 5c3fb197294771af86ae8b34351c8791876577a5..7cbd290f3ee34a593b7ea1aee5a05fd277e7a76c 100644 (file)
  * Authors: Xavier Claessens <xclaesse@gmail.com>
  */
 
-#include <config.h>
-
-#include <string.h>
-
+#include "config.h"
 #include "empathy-string-parser.h"
+
 #include "empathy-smiley-manager.h"
 #include "empathy-ui-utils.h"
 
 #define SCHEMES           "([a-zA-Z\\+]+)"
-#define INVALID_CHARS     "\\s\"'"
-#define INVALID_CHARS_EXT INVALID_CHARS "\\[\\]<>(){},;:?"
-#define BODY              "([^"INVALID_CHARS"]+)"
-#define BODY_END          "([^"INVALID_CHARS"]*)[^"INVALID_CHARS_EXT".]"
-#define BODY_STRICT       "([^"INVALID_CHARS_EXT"]+)"
+#define INVALID_CHARS     "\\s\"<>"
+#define INVALID_CHARS_EXT INVALID_CHARS "\\[\\](){},;:"
+#define INVALID_CHARS_FULL INVALID_CHARS_EXT "?'"
+#define BODY              "([^"INVALID_CHARS_FULL"])([^"INVALID_CHARS_EXT"]*)"
+#define BODY_END          "([^"INVALID_CHARS"]*)[^"INVALID_CHARS_FULL".]"
 #define URI_REGEX         "("SCHEMES"://"BODY_END")" \
                          "|((www|ftp)\\."BODY_END")" \
-                         "|((mailto:)?"BODY_STRICT"@"BODY"\\."BODY_END")"
+                         "|((mailto:)?"BODY"@"BODY"\\."BODY_END")"
 
 static GRegex *
 uri_regex_dup_singleton (void)
@@ -43,7 +41,14 @@ uri_regex_dup_singleton (void)
 
        /* We intentionally leak the regex so it's not recomputed */
        if (!uri_regex) {
-               uri_regex = g_regex_new (URI_REGEX, 0, 0, NULL);
+               GError *error = NULL;
+
+               uri_regex = g_regex_new (URI_REGEX, 0, 0, &error);
+               if (uri_regex == NULL) {
+                       g_warning ("Failed to create reg exp: %s", error->message);
+                       g_error_free (error);
+                       return NULL;
+               }
        }
 
        return g_regex_ref (uri_regex);
@@ -75,6 +80,11 @@ empathy_string_match_link (const gchar *text,
        gint        last = 0;
 
        uri_regex = uri_regex_dup_singleton ();
+       if (uri_regex == NULL) {
+               empathy_string_parser_substr (text, len, sub_parsers, user_data);
+               return;
+       }
+
        match = g_regex_match_full (uri_regex, text, len, 0, 0, &match_info, NULL);
        if (match) {
                gint s = 0, e = 0;
@@ -161,20 +171,24 @@ empathy_string_replace_link (const gchar *text,
 {
        GString *string = user_data;
        gchar *real_url;
-       gchar *escaped;
+       gchar *title;
+       gchar *markup;
 
        real_url = empathy_make_absolute_url_len (text, len);
 
-       /* The thing we are making a link of may contain
-        * characters which need escaping */
-       escaped = g_markup_escape_text (text, len);
+       /* Need to copy manually, because g_markup_printf_escaped does not work
+        * with string precision pitfalls. */
+       title = g_strndup (text, len);
 
        /* Append the link inside <a href=""></a> tag */
-       g_string_append_printf (string, "<a href=\"%s\">%s</a>",
-                               real_url, escaped);
+       markup = g_markup_printf_escaped ("<a href=\"%s\">%s</a>",
+                       real_url, title);
+
+       g_string_append (string, markup);
 
        g_free (real_url);
-       g_free (escaped);
+       g_free (title);
+       g_free (markup);
 }
 
 void
@@ -185,9 +199,23 @@ empathy_string_replace_escaped (const gchar *text,
 {
        GString *string = user_data;
        gchar *escaped;
+       guint i;
+       gsize escaped_len, old_len;
 
        escaped = g_markup_escape_text (text, len);
-       g_string_append (string, escaped);
+       escaped_len = strlen (escaped);
+
+       /* Allocate more space to string (we really need a g_string_extend...) */
+       old_len = string->len;
+       g_string_set_size (string, old_len + escaped_len);
+       g_string_truncate (string, old_len);
+
+       /* Remove '\r' */
+       for (i = 0; i < escaped_len; i++) {
+               if (escaped[i] != '\r')
+                       g_string_append_c (string, escaped[i]);
+       }
+
        g_free (escaped);
 }