retval = g_strdup ("");
else if (strcmp(content_type, "text/html") == 0) {
tmp_sig = g_strconcat ("\n", signature, NULL);
- retval = modest_text_utils_convert_to_html_body(tmp_sig);
+ retval = modest_text_utils_convert_to_html_body(tmp_sig, -1, TRUE);
g_free (tmp_sig);
} else {
retval = g_strconcat (text, "\n", signature, NULL);
}
static void
-modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data)
+modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data, gssize n)
{
guint i;
gboolean space_seen = FALSE;
- gsize len;
guint break_dist = 0; /* distance since last break point */
- len = strlen (data);
+ if (n == -1)
+ n = strlen (data);
/* replace with special html chars where needed*/
- for (i = 0; i != len; ++i) {
+ for (i = 0; i != n; ++i) {
char kar = data[i];
if (space_seen && kar != ' ') {
"</head>"
"<body>");
- modest_text_utils_convert_buffer_to_html (html, data);
+ modest_text_utils_convert_buffer_to_html (html, data, -1);
g_string_append (html, "</body></html>");
}
gchar *
-modest_text_utils_convert_to_html_body (const gchar *data)
+modest_text_utils_convert_to_html_body (const gchar *data, gssize n, gboolean hyperlinkify)
{
GString *html;
- gsize len;
if (!data)
return NULL;
- len = strlen (data);
- html = g_string_sized_new (1.5 * len); /* just a guess... */
+ if (n == -1)
+ n = strlen (data);
+ html = g_string_sized_new (1.5 * n); /* just a guess... */
- modest_text_utils_convert_buffer_to_html (html, data);
+ modest_text_utils_convert_buffer_to_html (html, data, n);
- if (len < HYPERLINKIFY_MAX_LENGTH)
+ if (hyperlinkify && (n < HYPERLINKIFY_MAX_LENGTH))
hyperlinkify_plain_text (html);
return g_string_free (html, FALSE);
if (signature == NULL)
signature_result = g_strdup ("");
else
- signature_result = modest_text_utils_convert_to_html_body (signature);
+ signature_result = modest_text_utils_convert_to_html_body (signature, -1, TRUE);
attachments_string = quoted_attachments (attachments);
- q_attachments_string = modest_text_utils_convert_to_html_body (attachments_string);
- q_cite = modest_text_utils_convert_to_html_body (cite);
- html_text = modest_text_utils_convert_to_html_body (text);
+ q_attachments_string = modest_text_utils_convert_to_html_body (attachments_string, -1, TRUE);
+ q_cite = modest_text_utils_convert_to_html_body (cite, -1, TRUE);
+ html_text = modest_text_utils_convert_to_html_body (text, -1, TRUE);
result = g_strdup_printf (format, signature_result, q_cite, html_text, q_attachments_string);
g_free (q_cite);
g_free (html_text);
return match2->offset - match1->offset;
}
+static gboolean url_matches_block = 0;
+static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
+
+
+static gboolean
+compile_patterns ()
+{
+ guint i;
+ const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t);
+ for (i = 0; i != pattern_num; ++i) {
+ patterns[i].preg = g_slice_new0 (regex_t);
+
+ /* this should not happen */
+ g_return_val_if_fail (regcomp (patterns[i].preg, patterns[i].regex,
+ REG_ICASE|REG_EXTENDED|REG_NEWLINE) == 0, FALSE);
+ }
+ return TRUE;
+}
+
+static void
+free_patterns ()
+{
+ guint i;
+ const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t);
+ for (i = 0; i != pattern_num; ++i) {
+ regfree (patterns[i].preg);
+ g_slice_free (regex_t, patterns[i].preg);
+ } /* don't free patterns itself -- it's static */
+}
+
+void
+modest_text_utils_hyperlinkify_begin (void)
+{
+ if (url_matches_block == 0)
+ compile_patterns ();
+ url_matches_block ++;
+}
+
+void
+modest_text_utils_hyperlinkify_end (void)
+{
+ url_matches_block--;
+ if (url_matches_block <= 0)
+ free_patterns ();
+}
+
static GSList*
get_url_matches (GString *txt)
guint rv, i, offset = 0;
GSList *match_list = NULL;
- static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t);
/* initalize the regexps */
- for (i = 0; i != pattern_num; ++i) {
- patterns[i].preg = g_slice_new0 (regex_t);
+ modest_text_utils_hyperlinkify_begin ();
- /* this should not happen */
- g_return_val_if_fail (regcomp (patterns[i].preg, patterns[i].regex,
- REG_ICASE|REG_EXTENDED|REG_NEWLINE) == 0, NULL);
- }
/* find all the matches */
for (i = 0; i != pattern_num; ++i) {
offset = 0;
}
}
- for (i = 0; i != pattern_num; ++i) {
- regfree (patterns[i].preg);
- g_slice_free (regex_t, patterns[i].preg);
- } /* don't free patterns itself -- it's static */
+ modest_text_utils_hyperlinkify_end ();
/* now sort the list, so the matches are in reverse order of occurence.
* that way, we can do the replacements starting from the end, so we don't need
}
-gchar*
-modest_text_utils_get_display_address (const gchar *address)
+/* for optimization reasons, we change the string in-place */
+void
+modest_text_utils_get_display_address (gchar *address)
{
- gchar *display;
- gchar **tokens;
- gint i = 0;
+ int i;
if (!address)
- return NULL;
-
- g_return_val_if_fail (g_utf8_validate (address, -1, NULL), NULL);
+ return;
- tokens = g_strsplit_set ((const gchar*) address, "<>()", 3);
-
- /* Note that if any of the delimiters is the first character
- then g_strsplit_set will return "" as the first string */
- while (tokens[i] != NULL) {
- if (strlen ((char *) (tokens[i])) != 0)
- break;
- i++;
+ /* should not be needed, and otherwise, we probably won't screw up the address
+ * more than it already is :)
+ * g_return_val_if_fail (g_utf8_validate (address, -1, NULL), NULL);
+ * */
+
+ /* remove leading whitespace */
+ if (address[0] == ' ')
+ g_strchug (address);
+
+ for (i = 0; address[i]; ++i) {
+ if (address[i] == '<') {
+ if (G_UNLIKELY(i == 0))
+ return; /* there's nothing else, leave it */
+ else {
+ address[i] = '\0'; /* terminate the string here */
+ return;
+ }
+ }
}
+}
+
- display = g_strdup (tokens [i]);
- g_strchug (display);
- /* Free the other tokens */
- g_strfreev (tokens);
- return display;
-}
gchar *
modest_text_utils_get_email_address (const gchar *full_address)
}
-gchar*
+const gchar*
modest_text_utils_get_display_date (time_t date)
{
time_t now;
- static const guint BUF_SIZE = 64;
+#define DATE_BUF_SIZE 64
static const guint ONE_DAY = 24 * 60 * 60; /* seconds in one day */
- gchar date_buf[BUF_SIZE];
- gchar today_buf [BUF_SIZE];
+ static gchar date_buf[DATE_BUF_SIZE];
- modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
+ gchar today_buf [DATE_BUF_SIZE];
+
+ modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%x", date);
now = time (NULL);
/* it's within the last 24 hours, but double check */
/* use the localized dates */
- modest_text_utils_strftime (today_buf, BUF_SIZE, "%x", now);
+ modest_text_utils_strftime (today_buf, DATE_BUF_SIZE, "%x", now);
/* if it's today, use the time instead */
if (strcmp (date_buf, today_buf) == 0)
- modest_text_utils_strftime (date_buf, BUF_SIZE, "%X", date);
+ modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%X", date);
}
- return g_strdup(date_buf);
+ return date_buf;
}
+
gboolean
modest_text_utils_validate_folder_name (const gchar *folder_name)
{
regex_t rx;
const gchar* domain_regex = "^[a-z0-9]([.]?[a-z0-9-])*[a-z0-9]$";
+ memset (&rx, 0, sizeof(regex_t)); /* coverity wants this... */
+
if (!domain)
return FALSE;