Skip to content

Commit

Permalink
Add lists of locales and ids to the global scope.
Browse files Browse the repository at this point in the history
  • Loading branch information
arcusfelis committed Dec 18, 2011
1 parent c8243dd commit 127357d
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 13 deletions.
11 changes: 10 additions & 1 deletion c_src/i18n_collation.cpp
Expand Up @@ -30,6 +30,9 @@
#if I18N_COLLATION
static UCollator* base_col;

static ErlNifEnv * global_collation_env;
static ERL_NIF_TERM available_locales;

/* Export for i18n_search module */
ErlNifResourceType* collator_type = 0;

Expand Down Expand Up @@ -396,7 +399,7 @@ ERL_NIF_TERM collator_locales(ErlNifEnv* env, int argc,
if (argc != 0)
return enif_make_badarg(env);

return generate_available(env, ucol_getAvailable, ucol_countAvailable());
return enif_make_copy(env, available_locales);
}


Expand All @@ -421,13 +424,19 @@ int i18n_collation_load(ErlNifEnv *env, void ** /*priv_data*/,
collator_type = enif_open_resource_type(env, NULL, "collator_type",
collator_dtor, flags, NULL);
if (collator_type == NULL) return 4;

global_collation_env = enif_alloc_env();

available_locales = generate_available(global_collation_env,
ucol_getAvailable, ucol_countAvailable());

return 0;
}

void i18n_collation_unload(ErlNifEnv* /*env*/, void* /*priv*/)
{
ucol_close(base_col);
enif_free_env(global_collation_env);
return;
}

Expand Down
9 changes: 6 additions & 3 deletions c_src/i18n_date.cpp
Expand Up @@ -45,9 +45,10 @@ static ErlNifResourceType* calendar_type = 0;
static int field_to_pos[UCAL_FIELD_COUNT];
static int pos_to_field[UCAL_FIELD_COUNT];
static int POS_MAX;
static ERL_NIF_TERM available_timezones;
static ERL_NIF_TERM available_locales;

static ErlNifEnv * global_date_env;
static ERL_NIF_TERM available_locales;
static ERL_NIF_TERM available_timezones;

/* Called from erl_nif. */
static void calendar_dtor(ErlNifEnv* /*env*/, void* obj)
Expand Down Expand Up @@ -984,7 +985,9 @@ int i18n_date_load(ErlNifEnv *env, void ** /*priv_data*/,
available_locales = generate_available(global_date_env,
ucal_getAvailable, ucal_countAvailable());

available_timezones = get_timezone_ids(global_date_env);
available_timezones = get_timezone_ids(env);
available_timezones = reverse_list(env, available_timezones);
available_timezones = enif_make_copy(global_date_env, available_timezones);



Expand Down
24 changes: 24 additions & 0 deletions c_src/i18n_nif.cpp
Expand Up @@ -52,6 +52,20 @@ ERL_NIF_TERM ATOM_ICU_VERSION, ATOM_UNICODE_VERSION;



/**
* Reverse an Erlang list.
*/
ERL_NIF_TERM reverse_list(ErlNifEnv *env, ERL_NIF_TERM tail) {
ERL_NIF_TERM out = enif_make_list(env, 0);
ERL_NIF_TERM head;

while(enif_get_list_cell(env, tail, &head, &tail))
out = enif_make_list_cell(env, head, out);

return out;
}




/* Define an interface for errors. */
Expand Down Expand Up @@ -205,6 +219,7 @@ ERL_NIF_TERM enum_to_term(ErlNifEnv* env, StringEnumeration* en) {




/**
* Generate a list if locales.
*/
Expand Down Expand Up @@ -385,13 +400,22 @@ static int upgrade(ErlNifEnv* /*env*/, void** /*priv*/, void** /*old_priv*/,

static void unload(ErlNifEnv* env, void* priv)
{
#if I18N_STRING
i18n_string_unload(env, priv);
#endif

#if I18N_COLLATION
i18n_collation_unload(env, priv);
#endif

#if I18N_DATE
i18n_date_unload(env, priv);
#endif

#if I18N_TRANS
i18n_trans_unload(env, priv);
#endif

return;
}

Expand Down
1 change: 1 addition & 0 deletions c_src/i18n_nif.h
Expand Up @@ -142,6 +142,7 @@ extern ERL_NIF_TERM ATOM_RESOURCE;
extern ERL_NIF_TERM ATOM_SEARCH;


ERL_NIF_TERM reverse_list(ErlNifEnv *env, ERL_NIF_TERM list);


/* Define an interface for errors. */
Expand Down
15 changes: 14 additions & 1 deletion c_src/i18n_string.cpp
Expand Up @@ -34,6 +34,8 @@

static ErlNifResourceType* iterator_type = 0;

static ErlNifEnv * global_string_env;
static ERL_NIF_TERM available_locales;



Expand Down Expand Up @@ -841,7 +843,7 @@ ERL_NIF_TERM iterator_locales(ErlNifEnv* env, int argc, const
if (argc != 0)
return enif_make_badarg(env);

return generate_available(env, ubrk_getAvailable, ubrk_countAvailable());
return enif_make_copy(env, available_locales);
}


Expand All @@ -856,9 +858,20 @@ int i18n_string_load(ErlNifEnv *env, void ** /*priv_data*/,

if (iterator_type == NULL) return 1;

global_string_env = enif_alloc_env();

available_locales = generate_available(global_string_env,
ubrk_getAvailable, ubrk_countAvailable());

return 0;
}

void i18n_string_unload(ErlNifEnv* /*env*/, void* /*priv*/)
{
enif_free_env(global_string_env);
return;
}

#endif


Expand Down
1 change: 1 addition & 0 deletions c_src/i18n_string.h
Expand Up @@ -54,4 +54,5 @@ NIF_EXPORT(non_case_compare)

int i18n_string_load(ErlNifEnv *, void **,
ERL_NIF_TERM);
void i18n_string_unload(ErlNifEnv*, void*);
#endif
40 changes: 32 additions & 8 deletions c_src/i18n_trans.cpp
Expand Up @@ -31,6 +31,9 @@
#if I18N_TRANS
static ErlNifResourceType* trans_type = 0;

static ErlNifEnv * global_trans_env;
static ERL_NIF_TERM available_ids;



/* Called from erl_nif. */
Expand Down Expand Up @@ -75,17 +78,13 @@ static int parseDir(const char * type)
}


ERL_NIF_TERM trans_ids(ErlNifEnv* env, int argc,
const ERL_NIF_TERM /*argv*/[])
static ERL_NIF_TERM
get_trans_ids(ErlNifEnv* env, UErrorCode& status)
{
ERL_NIF_TERM out;
UEnumeration* en;
UErrorCode status = U_ZERO_ERROR;
UEnumeration* en;

if (argc != 0)
return enif_make_badarg(env);

en = utrans_openIDs(&status);
en = utrans_openIDs(&status);
CHECK(env, status);

out = enum_to_term(env, en);
Expand All @@ -94,6 +93,15 @@ ERL_NIF_TERM trans_ids(ErlNifEnv* env, int argc,
return out;
}

ERL_NIF_TERM trans_ids(ErlNifEnv* env, int argc,
const ERL_NIF_TERM /*argv*/[])
{
if (argc != 0)
return enif_make_badarg(env);

return enif_make_copy(env, available_ids);
}


/* Get a transliterator */
ERL_NIF_TERM get_transliterator(ErlNifEnv* env, int argc,
Expand Down Expand Up @@ -170,12 +178,28 @@ ERL_NIF_TERM trans(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
int i18n_trans_load(ErlNifEnv *env, void ** /*priv_data*/,
ERL_NIF_TERM /*load_info*/)
{
UErrorCode status = U_ZERO_ERROR;

ErlNifResourceFlags flags = (ErlNifResourceFlags)(ERL_NIF_RT_CREATE |
ERL_NIF_RT_TAKEOVER);

trans_type = enif_open_resource_type(env, NULL, "trans_type",
trans_dtor, flags, NULL);

global_trans_env = enif_alloc_env();

available_ids = get_trans_ids(env, status);
if (U_FAILURE(status))
return 1000;
available_ids = reverse_list(env, available_ids);
available_ids = enif_make_copy(global_trans_env, available_ids);

return 0;
}

void i18n_trans_unload(ErlNifEnv* /*env*/, void* /*priv*/)
{
enif_free_env(global_trans_env);
return;
}
#endif
1 change: 1 addition & 0 deletions c_src/i18n_trans.h
Expand Up @@ -34,5 +34,6 @@ NIF_EXPORT(get_transliterator)

int i18n_trans_load(ErlNifEnv *, void **,
ERL_NIF_TERM);
void i18n_trans_unload(ErlNifEnv*, void*);

#endif

0 comments on commit 127357d

Please sign in to comment.