begin binding locales (need to init_locales in the right place, still).

fix indentation in some places.
add some assertions.
This commit is contained in:
Enno Rehling 2014-06-14 07:52:32 -07:00
parent 24dc006e43
commit 812cb98dff
13 changed files with 310 additions and 93 deletions

View File

@ -265,6 +265,10 @@
<F N="../src/bind_faction.c"/> <F N="../src/bind_faction.c"/>
<F N="../src/bind_gmtool.c"/> <F N="../src/bind_gmtool.c"/>
<F N="../src/bind_hashtable.c"/> <F N="../src/bind_hashtable.c"/>
<F N="../src/bind_locale.c"/>
<F N="../src/bind_locale.h"/>
<F N="../src/bind_log.c"/>
<F N="../src/bind_log.h"/>
<F N="../src/bind_message.c"/> <F N="../src/bind_message.c"/>
<F N="../src/bind_monsters.c"/> <F N="../src/bind_monsters.c"/>
<F N="../src/bind_process.c"/> <F N="../src/bind_process.c"/>
@ -281,6 +285,9 @@
<F N="../src/gmtool.c"/> <F N="../src/gmtool.c"/>
<F N="../src/helpers.c"/> <F N="../src/helpers.c"/>
<F N="../src/listbox.c"/> <F N="../src/listbox.c"/>
<F N="../src/locale.pkg"/>
<F N="../src/locale.pkg.c"/>
<F N="../src/log.pkg.c"/>
<F N="../src/main.c"/> <F N="../src/main.c"/>
<F N="../src/process.pkg.c"/> <F N="../src/process.pkg.c"/>
<F N="../src/settings.pkg.c"/> <F N="../src/settings.pkg.c"/>

View File

@ -278,11 +278,12 @@
<Folder <Folder
Name="Other Files" Name="Other Files"
Filters=""> Filters="">
<F N="../scripts/tests/config.lua"/> <F N="../tests/config.lua"/>
<F N="../scripts/tests/rules.lua"/> <F N="../tests/init.lua"/>
<F N="../scripts/runtests.lua"/> <F N="../tests/locale.lua"/>
<F N="../scripts/tests/settings.lua"/> <F N="../tests/regions.lua"/>
<F N="../scripts/tests/ships.lua"/> <F N="../tests/settings.lua"/>
<F N="../tests/ships.lua"/>
</Folder> </Folder>
</Files> </Files>
</Project> </Project>

View File

@ -49,6 +49,7 @@ ENDMACRO(TOLUA_BINDING)
IF(NOT MSVC) IF(NOT MSVC)
TOLUA_BINDING(log.pkg util/log.h) TOLUA_BINDING(log.pkg util/log.h)
TOLUA_BINDING(locale.pkg bind_locale.h)
TOLUA_BINDING(config.pkg bind_config.h) TOLUA_BINDING(config.pkg bind_config.h)
TOLUA_BINDING(process.pkg bind_process.h) TOLUA_BINDING(process.pkg bind_process.h)
TOLUA_BINDING(eressea.pkg bind_eressea.h) TOLUA_BINDING(eressea.pkg bind_eressea.h)
@ -87,12 +88,14 @@ set(SERVER_SRC
console.c console.c
helpers.c helpers.c
config.pkg.c config.pkg.c
locale.pkg.c
log.pkg.c log.pkg.c
process.pkg.c process.pkg.c
eressea.pkg.c eressea.pkg.c
settings.pkg.c settings.pkg.c
bind_building.c bind_building.c
bind_config.c bind_config.c
bind_locale.c
bind_eressea.c bind_eressea.c
bind_faction.c bind_faction.c
bind_hashtable.c bind_hashtable.c

21
src/bind_locale.c Normal file
View File

@ -0,0 +1,21 @@
#include "bind_locale.h"
#include "util/language.h"
void locale_create(const char *lang) {
make_locale(lang);
}
void locale_set(const char *lang, const char *key, const char *str) {
struct locale *loc = find_locale(lang);
if (loc) {
locale_setstring(loc, key, str);
}
}
const char * locale_get(const char *lang, const char *key) {
struct locale *loc = find_locale(lang);
if (loc) {
return locale_getstring(loc, key);
}
return 0;
}

15
src/bind_locale.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef H_BIND_LOCALE_H
#define H_BIND_LOCALE_H
#ifdef __cplusplus
extern "C" {
#endif
void locale_create(const char *lang);
void locale_set(const char *lang, const char *key, const char *str);
const char * locale_get(const char *lang, const char *key);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -131,7 +131,7 @@ static int tolua_ship_create(lua_State * L)
tolua_pushusertype(L, (void *)sh, TOLUA_CAST "ship"); tolua_pushusertype(L, (void *)sh, TOLUA_CAST "ship");
return 1; return 1;
} else { } else {
log_error("Unkown ship type '%s'\n", sname); log_error("Unknown ship type '%s'\n", sname);
} }
} }
return 0; return 0;

View File

@ -86,6 +86,7 @@ TOLUA_PKG(eressea);
TOLUA_PKG(process); TOLUA_PKG(process);
TOLUA_PKG(settings); TOLUA_PKG(settings);
TOLUA_PKG(config); TOLUA_PKG(config);
TOLUA_PKG(locale);
TOLUA_PKG(log); TOLUA_PKG(log);
int log_lua_error(lua_State * L) int log_lua_error(lua_State * L)
@ -782,8 +783,7 @@ static int config_get_locales(lua_State * L)
{ {
const struct locale *lang; const struct locale *lang;
int i = 0, n = 0; int i = 0, n = 0;
for (lang = locales; lang; lang = nextlocale(lang)) for (lang = locales; lang; lang = nextlocale(lang)) ++n;
++n;
lua_createtable(L, n, 0); lua_createtable(L, n, 0);
for (lang = locales; lang; lang = nextlocale(lang)) { for (lang = locales; lang; lang = nextlocale(lang)) {
tolua_pushstring(L, TOLUA_CAST locale_name(lang)); tolua_pushstring(L, TOLUA_CAST locale_name(lang));
@ -1061,6 +1061,7 @@ int tolua_bindings_open(lua_State * L)
tolua_process_open(L); tolua_process_open(L);
tolua_settings_open(L); tolua_settings_open(L);
tolua_config_open(L); tolua_config_open(L);
tolua_locale_open(L);
tolua_log_open(L); tolua_log_open(L);
/* register user types */ /* register user types */

View File

@ -1351,6 +1351,8 @@ keyword_t findkeyword(const char *s, const struct locale * lang)
keyword_t result = NOKEYWORD; keyword_t result = NOKEYWORD;
char buffer[64]; char buffer[64];
assert(lang);
assert(s);
while (*s == '@') ++s; while (*s == '@') ++s;
if (*s) { if (*s) {
@ -1361,6 +1363,7 @@ keyword_t findkeyword(const char *s, const struct locale * lang)
const void * match; const void * match;
void **tokens = get_translations(lang, UT_KEYWORDS); void **tokens = get_translations(lang, UT_KEYWORDS);
critbit_tree *cb = (critbit_tree *)*tokens; critbit_tree *cb = (critbit_tree *)*tokens;
assert(cb);
if (cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) { if (cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) {
cb_get_kv(match, &i, sizeof(int)); cb_get_kv(match, &i, sizeof(int));
result = (keyword_t)i; result = (keyword_t)i;
@ -1965,6 +1968,7 @@ static void init_translations(const struct locale *lang, int ut, const char * (*
for (i = 0; i != maxstrings; ++i) { for (i = 0; i != maxstrings; ++i) {
const char * s = string_cb(i); const char * s = string_cb(i);
const char * key = s ? locale_string(lang, s) : 0; const char * key = s ? locale_string(lang, s) : 0;
key = key ? key : s;
if (key) { if (key) {
char * str = transliterate(buffer, sizeof(buffer)-sizeof(int), key); char * str = transliterate(buffer, sizeof(buffer)-sizeof(int), key);
if (str) { if (str) {
@ -2020,8 +2024,7 @@ static void init_locale(const struct locale *lang)
tok = strtok(sstr, " "); tok = strtok(sstr, " ");
while (tok) { while (tok) {
for (i = 0; i != MAXMAGIETYP; ++i) { for (i = 0; i != MAXMAGIETYP; ++i) {
if (strcmp(tok, magic_school[i]) == 0) if (strcmp(tok, magic_school[i]) == 0) break;
break;
} }
assert(i != MAXMAGIETYP); assert(i != MAXMAGIETYP);
var.i = i; var.i = i;
@ -2048,8 +2051,7 @@ static void init_locale(const struct locale *lang)
tokens = get_translations(lang, UT_OPTIONS); tokens = get_translations(lang, UT_OPTIONS);
for (i = 0; i != MAXOPTIONS; ++i) { for (i = 0; i != MAXOPTIONS; ++i) {
var.i = i; var.i = i;
if (options[i]) if (options[i]) addtoken(tokens, LOC(lang, options[i]), var);
addtoken(tokens, LOC(lang, options[i]), var);
} }
tokens = get_translations(lang, UT_TERRAINS); tokens = get_translations(lang, UT_TERRAINS);
@ -2182,7 +2184,9 @@ void init_locales(void)
int l; int l;
for (l = 0; localenames[l]; ++l) { for (l = 0; localenames[l]; ++l) {
const struct locale *lang = find_locale(localenames[l]); const struct locale *lang = find_locale(localenames[l]);
if (lang) if (!lang) {
lang = make_locale(localenames[l]);
}
init_locale(lang); init_locale(lang);
} }
} }

View File

@ -338,8 +338,11 @@ order *create_order(keyword_t kwd, const struct locale * lang,
order *parse_order(const char *s, const struct locale * lang) order *parse_order(const char *s, const struct locale * lang)
{ {
while (*s && !isalnum(*(unsigned char *)s) && !ispunct(*(unsigned char *)s)) assert(lang);
assert(s);
while (*s && !isalnum(*(unsigned char *)s) && !ispunct(*(unsigned char *)s)) {
++s; ++s;
}
if (*s != 0) { if (*s != 0) {
keyword_t kwd; keyword_t kwd;
const char *sptr; const char *sptr;
@ -352,8 +355,7 @@ order *parse_order(const char *s, const struct locale * lang)
sptr = s; sptr = s;
kwd = findkeyword(parse_token(&sptr), lang); kwd = findkeyword(parse_token(&sptr), lang);
if (kwd != NOKEYWORD) { if (kwd != NOKEYWORD) {
while (isxspace(*(unsigned char *)sptr)) while (isxspace(*(unsigned char *)sptr)) ++sptr;
++sptr;
s = sptr; s = sptr;
} }
return create_order_i(kwd, s, persistent, lang); return create_order_i(kwd, s, persistent, lang);

9
src/locale.pkg Normal file
View File

@ -0,0 +1,9 @@
$#include "bind_locale.h"
module eressea {
module locale {
void locale_create @ create(const char *lang);
void locale_set @ set(const char *lang, const char *key, const char *str);
const char * locale_get @ get(const char *lang, const char *key);
}
}

139
src/locale.pkg.c Normal file
View File

@ -0,0 +1,139 @@
/*
** Lua binding: locale
*/
#include "tolua.h"
#ifndef __cplusplus
#include <stdlib.h>
#endif
#ifdef __cplusplus
extern "C" int tolua_bnd_takeownership (lua_State* L); // from tolua_map.c
#else
int tolua_bnd_takeownership (lua_State* L); /* from tolua_map.c */
#endif
#include <string.h>
/* Exported function */
TOLUA_API int tolua_locale_open (lua_State* tolua_S);
LUALIB_API int luaopen_locale (lua_State* tolua_S);
#include "bind_locale.h"
/* function to register type */
static void tolua_reg_types (lua_State* tolua_S)
{
}
/* function: locale_create */
static int tolua_locale_eressea_locale_create00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isstring(tolua_S,1,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const char* lang = ((const char*) tolua_tostring(tolua_S,1,0));
{
locale_create(lang);
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err);
return 0;
#endif
}
/* function: locale_set */
static int tolua_locale_eressea_locale_set00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isstring(tolua_S,1,0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isstring(tolua_S,3,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,4,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const char* lang = ((const char*) tolua_tostring(tolua_S,1,0));
const char* key = ((const char*) tolua_tostring(tolua_S,2,0));
const char* str = ((const char*) tolua_tostring(tolua_S,3,0));
{
locale_set(lang,key,str);
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'set'.",&tolua_err);
return 0;
#endif
}
/* function: locale_get */
static int tolua_locale_eressea_locale_get00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isstring(tolua_S,1,0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const char* lang = ((const char*) tolua_tostring(tolua_S,1,0));
const char* key = ((const char*) tolua_tostring(tolua_S,2,0));
{
const char* tolua_ret = (const char*) locale_get(lang,key);
tolua_pushstring(tolua_S,(const char*)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'get'.",&tolua_err);
return 0;
#endif
}
/* Open lib function */
LUALIB_API int luaopen_locale (lua_State* tolua_S)
{
tolua_open(tolua_S);
tolua_reg_types(tolua_S);
tolua_module(tolua_S,NULL,0);
tolua_beginmodule(tolua_S,NULL);
tolua_module(tolua_S,"eressea",0);
tolua_beginmodule(tolua_S,"eressea");
tolua_module(tolua_S,"locale",0);
tolua_beginmodule(tolua_S,"locale");
tolua_function(tolua_S,"create",tolua_locale_eressea_locale_create00);
tolua_function(tolua_S,"set",tolua_locale_eressea_locale_set00);
tolua_function(tolua_S,"get",tolua_locale_eressea_locale_get00);
tolua_endmodule(tolua_S);
tolua_endmodule(tolua_S);
tolua_endmodule(tolua_S);
return 1;
}
/* Open tolua function */
TOLUA_API int tolua_locale_open (lua_State* tolua_S)
{
lua_pushcfunction(tolua_S, luaopen_locale);
lua_pushstring(tolua_S, "locale");
lua_call(tolua_S, 1, 0);
return 1;
}

View File

@ -8,7 +8,6 @@ end
function test_read_race() function test_read_race()
local f local f
eressea.free_game()
f = faction.create("orc@example.com", "orc", "en") f = faction.create("orc@example.com", "orc", "en")
assert_equal(nil, f) assert_equal(nil, f)
assert_not_nil(eressea.config) assert_not_nil(eressea.config)
@ -19,7 +18,6 @@ end
function test_read_ship() function test_read_ship()
local s local s
eressea.free_game()
s = ship.create(nil, "boat") s = ship.create(nil, "boat")
assert_equal(nil, s) assert_equal(nil, s)
assert_not_nil(eressea.config) assert_not_nil(eressea.config)

17
tests/locale.lua Normal file
View File

@ -0,0 +1,17 @@
require "lunit"
module("tests.eressea.locale", package.seeall, lunit.testcase )
function setup()
eressea.free_game()
end
function test_get_set()
local loc = "en"
assert_not_nil(eressea.locale)
eressea.locale.create(loc)
assert_equal(nil, eressea.locale.get(loc, "move"))
eressea.locale.set(loc, "move", "MOVE")
assert_equal("MOVE", eressea.locale.get(loc, "move"))
end