#include <modest-tny-platform-factory.h>
#include <modest-text-utils.h>
#include <modest-runtime.h>
-
+#include <ctype.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
void
modest_text_utils_address_range_at_position (const gchar *recipients_list,
- gint position,
- gint *start,
- gint *end)
+ guint position,
+ guint *start,
+ guint *end)
{
gchar *current = NULL;
gint range_start = 0;
gint index;
gboolean is_quoted = FALSE;
+ g_return_if_fail (recipients_list);
+ g_return_if_fail (position < g_utf8_strlen(recipients_list, -1));
+
index = 0;
- for (current = (gchar *) recipients_list; *current != '\0'; current = g_utf8_find_next_char (current, NULL)) {
+ for (current = (gchar *) recipients_list; *current != '\0';
+ current = g_utf8_find_next_char (current, NULL)) {
gunichar c = g_utf8_get_char (current);
if ((c == ',') && (!is_quoted)) {
gint
modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insensitive)
{
- gint result = 0;
- gchar *n1, *n2;
- /* work even when s1 and/or s2 == NULL */
+/* work even when s1 and/or s2 == NULL */
if (G_UNLIKELY(s1 == s2))
return 0;
-
- /* if it's not case sensitive */
- if (!insensitive)
- return strcmp (s1 ? s1 : "", s2 ? s2 : "");
-
- n1 = g_utf8_collate_key (s1 ? s1 : "", -1);
- n2 = g_utf8_collate_key (s2 ? s2 : "", -1);
+ if (G_UNLIKELY(!s1))
+ return -1;
+ if (G_UNLIKELY(!s2))
+ return 1;
- result = strcmp (n1, n2);
+ /* if it's not case sensitive */
+ if (!insensitive) {
- g_free (n1);
- g_free (n2);
+ /* optimization: short cut if first char is ascii */
+ if (((s1[0] & 0xf0)== 0) && ((s2[0] & 0xf0) == 0))
+ return s1[0] - s2[0];
+
+ return g_utf8_collate (s1, s2);
+
+ } else {
+ gint result;
+ gchar *n1, *n2;
+
+ /* optimization: short cut iif first char is ascii */
+ if (((s1[0] & 0xf0) == 0) && ((s2[0] & 0xf0) == 0))
+ return tolower(s1[0]) - tolower(s2[0]);
+
+ n1 = g_utf8_strdown (s1, -1);
+ n2 = g_utf8_strdown (s2, -1);
+
+ result = g_utf8_collate (n1, n2);
+
+ g_free (n1);
+ g_free (n2);
- return result;
+ return result;
+ }
}
-gchar*
+const gchar*
modest_text_utils_get_display_date (time_t date)
{
- time_t now;
- static const guint 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];
+#define DATE_BUF_SIZE 64
+ static gchar date_buf[DATE_BUF_SIZE];
+
+ /* calculate the # of days since epoch for
+ * for today and for the date provided
+ * based on idea from pvanhoof */
+ int day = time(NULL) / (24 * 60 * 60);
+ int date_day = date / (24 * 60 * 60);
- modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
+ /* if it's today, show the time, if it's not today, show the date instead */
- now = time (NULL);
+ if (day == date_day) /* is the date today? */
+ modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%X", date);
+ else
+ modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%x", date);
- /* we check if the date is within the last 24h, if not, we don't
- * have to do the extra, expensive strftime, which was very visible
- * in the profiles.
- */
- if (abs(now - date) < ONE_DAY) {
-
- /* it's within the last 24 hours, but double check */
- /* use the localized dates */
- modest_text_utils_strftime (today_buf, 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);
- }
-
- return g_strdup(date_buf);
+ return date_buf; /* this is a static buffer, don't free! */
}
+
gboolean
modest_text_utils_validate_folder_name (const gchar *folder_name)
{