[evolution-data-server/openismus-work-master: 40/41] ECollator: Use the private EAlphabetIndex
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/openismus-work-master: 40/41] ECollator: Use the private EAlphabetIndex
- Date: Fri, 7 Jun 2013 13:53:24 +0000 (UTC)
commit 437c43bd907414d754274e0f43cc421aa60ef1b4
Author: Tristan Van Berkom <tristanvb openismus com>
Date: Fri Jun 7 22:44:08 2013 +0900
ECollator: Use the private EAlphabetIndex
This allows ECollator to export 2 new APIs:
o e_collator_get_index_labels()
List the alphabet for the given locale
o e_collator_get_index()
Determine what position in the alphabet a given word belongs
libedataserver/e-collator.c | 72 +++++++++++++++++++++++++++++++++++++++++--
libedataserver/e-collator.h | 35 ++++++++++++--------
2 files changed, 90 insertions(+), 17 deletions(-)
---
diff --git a/libedataserver/e-collator.c b/libedataserver/e-collator.c
index 8636f3d..a337ad9 100644
--- a/libedataserver/e-collator.c
+++ b/libedataserver/e-collator.c
@@ -31,6 +31,7 @@
#include <unicode/ustring.h>
#include "e-collator.h"
+#include "e-alphabet-index-private.h"
#define CONVERT_BUFFER_LEN 512
#define COLLATION_KEY_BUFFER_LEN 1024
@@ -47,9 +48,16 @@ G_DEFINE_BOXED_TYPE (ECollator,
struct _ECollator
{
- UCollator *coll;
+ UCollator *coll;
+
+ EAlphabetIndex *alpha_index;
+ gchar **labels;
+ gint n_labels;
+ gint underflow;
+ gint inflow;
+ gint overflow;
- gint ref_count;
+ gint ref_count;
};
/*****************************************************
@@ -100,6 +108,7 @@ print_available_locales (void)
static gchar *
canonicalize_locale (const gchar *posix_locale,
+ gchar **language_code,
GError **error)
{
UErrorCode status = U_ZERO_ERROR;
@@ -159,6 +168,9 @@ canonicalize_locale (const gchar *posix_locale,
g_free (icu_locale);
+ if (language_code)
+ *language_code = g_strdup (language_buffer);
+
return final_locale;
}
@@ -259,6 +271,7 @@ e_collator_new (const gchar *locale,
UCollator *coll;
UErrorCode status = U_ZERO_ERROR;
gchar *icu_locale;
+ gchar *language_code = NULL;
g_return_val_if_fail (locale && locale[0], NULL);
@@ -266,7 +279,7 @@ e_collator_new (const gchar *locale,
print_available_locales ();
#endif
- icu_locale = canonicalize_locale (locale, error);
+ icu_locale = canonicalize_locale (locale, &language_code, error);
if (!icu_locale)
return NULL;
@@ -279,6 +292,7 @@ e_collator_new (const gchar *locale,
icu_locale,
u_errorName (status));
+ g_free (language_code);
g_free (icu_locale);
ucol_close (coll);
return NULL;
@@ -292,6 +306,16 @@ e_collator_new (const gchar *locale,
collator->coll = coll;
collator->ref_count = 1;
+ /* Setup the AlphabeticIndex */
+ collator->alpha_index = _e_alphabet_index_cxx_new_for_language (language_code);
+ collator->labels = _e_alphabet_index_cxx_get_labels (collator->alpha_index,
+ &collator->n_labels,
+ &collator->underflow,
+ &collator->inflow,
+ &collator->overflow);
+
+ g_free (language_code);
+
return collator;
}
@@ -339,6 +363,9 @@ e_collator_unref (ECollator *collator)
if (collator->coll)
ucol_close (collator->coll);
+ _e_alphabet_index_cxx_free (collator->alpha_index);
+ g_strfreev (collator->labels);
+
g_slice_free (ECollator, collator);
}
}
@@ -488,3 +515,42 @@ e_collator_collate (ECollator *collator,
return success;
}
+
+/**
+ * e_collator_get_index_labels:
+ *
+ *
+ */
+const gchar *const *
+e_collator_get_index_labels (ECollator *collator,
+ gint *n_labels,
+ gint *underflow,
+ gint *inflow,
+ gint *overflow)
+{
+ g_return_val_if_fail (collator != NULL, NULL);
+
+ if (n_labels)
+ *n_labels = collator->n_labels;
+ if (underflow)
+ *underflow = collator->underflow;
+ if (inflow)
+ *inflow = collator->inflow;
+ if (overflow)
+ *overflow = collator->overflow;
+
+ return (const gchar *const *)collator->labels;
+}
+
+/**
+ * e_collator_get_index:
+ *
+ */
+gint
+e_collator_get_index (ECollator *collator,
+ const gchar *str)
+{
+ g_return_val_if_fail (collator != NULL, -1);
+
+ return _e_alphabet_index_cxx_get_index (collator->alpha_index, str ? str : "");
+}
diff --git a/libedataserver/e-collator.h b/libedataserver/e-collator.h
index 5d19273..cac3c5c 100644
--- a/libedataserver/e-collator.h
+++ b/libedataserver/e-collator.h
@@ -66,20 +66,27 @@ typedef enum {
*/
typedef struct _ECollator ECollator;
-GType e_collator_get_type (void);
-GQuark e_collator_error_quark (void);
-ECollator *e_collator_new (const gchar *locale,
- GError **error);
-ECollator *e_collator_ref (ECollator *collator);
-void e_collator_unref (ECollator *collator);
-gchar *e_collator_generate_key (ECollator *collator,
- const gchar *str,
- GError **error);
-gboolean e_collator_collate (ECollator *collator,
- const gchar *str_a,
- const gchar *str_b,
- gint *result,
- GError **error);
+GType e_collator_get_type (void);
+GQuark e_collator_error_quark (void);
+ECollator *e_collator_new (const gchar *locale,
+ GError **error);
+ECollator *e_collator_ref (ECollator *collator);
+void e_collator_unref (ECollator *collator);
+gchar *e_collator_generate_key (ECollator *collator,
+ const gchar *str,
+ GError **error);
+gboolean e_collator_collate (ECollator *collator,
+ const gchar *str_a,
+ const gchar *str_b,
+ gint *result,
+ GError **error);
+const gchar *const *e_collator_get_index_labels (ECollator *collator,
+ gint *n_labels,
+ gint *underflow,
+ gint *inflow,
+ gint *overflow);
+gint e_collator_get_index (ECollator *collator,
+ const gchar *str);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]