diff --git a/.gitignore b/.gitignore index d5e8e1b10..3dcf24224 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ Thumbs.db *.cfg *.cmd tmp/ +tests/orders.txt tests/config.lua tests/reports/ tests/data/185.dat diff --git a/.travis.yml b/.travis.yml index 62e60194f..c6a21d0e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ addons: apt: packages: - libbsd-dev + - libdb-dev - liblua5.1-dev - libtolua-dev - libncurses5-dev diff --git a/s/travis-build b/s/travis-build index a678b1de2..64b278710 100755 --- a/s/travis-build +++ b/s/travis-build @@ -31,8 +31,8 @@ cppcheck_tests() { set -e [ -z $BUILD ] && BUILD=Debug ; export BUILD -s/cmake-init # cppcheck_tests +s/cmake-init --db=sqlite s/build cd process make diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a7edbcc4..4e8db8bf9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -85,6 +85,11 @@ TOLUA_BINDING(eressea.pkg bind_eressea.h) TOLUA_BINDING(settings.pkg kenel/config.h) ENDIF() +set (PARSER_SRC + ${DB_SRC} + ${UTIL_SRC} + ) + set (ERESSEA_SRC vortex.c academy.c @@ -104,7 +109,6 @@ set (ERESSEA_SRC items.c json.c jsonconf.c - keyword.c laws.c lighthouse.c magic.c @@ -113,6 +117,7 @@ set (ERESSEA_SRC morale.c move.c names.c + orderdb.c orderfile.c piracy.c prefix.c @@ -138,9 +143,11 @@ set (ERESSEA_SRC ${TRIGGERS_SRC} ${ATTRIBUTES_SRC} ${KERNEL_SRC} - ${DB_SRC} - ${UTIL_SRC} -) + ) + +set(CHECK_SRC + checker.c + ) set(SERVER_SRC bind_building.c @@ -161,7 +168,7 @@ set(SERVER_SRC console.c helpers.c main.c -) + ) if (CURSES_FOUND) set (SERVER_SRC ${SERVER_SRC} @@ -176,24 +183,29 @@ if(NOT IWYU_PATH) message(STATUS "Could not find the program include-what-you-use") endif() - add_library(version STATIC ${VERSION_SRC}) -add_library(game ${ERESSEA_SRC}) +add_library(parser ${PARSER_SRC}) +target_link_libraries(parser + ${CLIBS_LIBRARIES} + ${CRYPTO_LIBRARIES} + ) -#add_executable(checker ${CHECK_SRC}) + +add_executable(checker ${CHECK_SRC}) +target_link_libraries(checker parser) + +add_library(game ${ERESSEA_SRC}) +target_link_libraries(game parser version) add_executable(eressea ${SERVER_SRC}) if (IWYU_PATH) set_property(TARGET eressea PROPERTY C_INCLUDE_WHAT_YOU_USE ${IWYU_PATH}) endif(IWYU_PATH) -target_link_libraries(game version) target_link_libraries(eressea game ${TOLUA_LIBRARIES} ${LUA_LIBRARIES} ${STORAGE_LIBRARIES} - ${CLIBS_LIBRARIES} - ${CRYPTO_LIBRARIES} ${CJSON_LIBRARIES} ${INIPARSER_LIBRARIES} ) @@ -211,7 +223,6 @@ set(TESTS_SRC guard.test.c json.test.c jsonconf.test.c - keyword.test.c laws.test.c lighthouse.test.c magic.test.c @@ -219,6 +230,7 @@ set(TESTS_SRC monsters.test.c move.test.c names.test.c + orderdb.test.c orderfile.test.c piracy.test.c prefix.test.c @@ -254,7 +266,6 @@ target_link_libraries(test_eressea ${LUA_LIBRARIES} ${CLIBS_LIBRARIES} ${STORAGE_LIBRARIES} - ${CRYPTO_LIBRARIES} ${CJSON_LIBRARIES} ${INIPARSER_LIBRARIES} ) @@ -286,8 +297,7 @@ if (HAVE_STRDUP) endif(HAVE_STRDUP) if (HAVE_LIBBSD) -target_link_libraries(test_eressea bsd) -target_link_libraries(eressea bsd) +target_link_libraries(parser bsd) endif (HAVE_LIBBSD) if (SQLITE3_FOUND) diff --git a/src/alchemy.c b/src/alchemy.c index 4b7e961a6..d2dd64a04 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -33,8 +33,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include -#include +#include +#include #include #include #include diff --git a/src/attributes/attributes.c b/src/attributes/attributes.c index 6bf78da63..400282ae7 100644 --- a/src/attributes/attributes.c +++ b/src/attributes/attributes.c @@ -53,9 +53,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/attributes/dict.c b/src/attributes/dict.c index bc5e94204..70e88219d 100644 --- a/src/attributes/dict.c +++ b/src/attributes/dict.c @@ -29,10 +29,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include -#include +#include #include #include diff --git a/src/attributes/follow.c b/src/attributes/follow.c index 8c5e14526..caeecee54 100644 --- a/src/attributes/follow.c +++ b/src/attributes/follow.c @@ -22,8 +22,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include -#include +#include +#include #include #include diff --git a/src/attributes/hate.c b/src/attributes/hate.c index c260de335..cef483cf6 100644 --- a/src/attributes/hate.c +++ b/src/attributes/hate.c @@ -22,8 +22,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include -#include -#include +#include +#include #include #include diff --git a/src/attributes/iceberg.c b/src/attributes/iceberg.c index e36e6303a..192ae9032 100644 --- a/src/attributes/iceberg.c +++ b/src/attributes/iceberg.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "iceberg.h" -#include +#include attrib_type at_iceberg = { "iceberg_drift", diff --git a/src/attributes/key.c b/src/attributes/key.c index 1808c561f..76a18c876 100644 --- a/src/attributes/key.c +++ b/src/attributes/key.c @@ -20,8 +20,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "key.h" -#include -#include +#include +#include #include #include diff --git a/src/attributes/key.test.c b/src/attributes/key.test.c index 79a7bde1d..fc09fc391 100644 --- a/src/attributes/key.test.c +++ b/src/attributes/key.test.c @@ -2,7 +2,7 @@ #include "key.h" #include "dict.h" -#include +#include #include #include #include diff --git a/src/attributes/movement.c b/src/attributes/movement.c index 7b49291c2..01c75ffae 100644 --- a/src/attributes/movement.c +++ b/src/attributes/movement.c @@ -20,8 +20,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "movement.h" -#include -#include +#include +#include #include #include diff --git a/src/attributes/otherfaction.c b/src/attributes/otherfaction.c index 343460057..fcf05da05 100644 --- a/src/attributes/otherfaction.c +++ b/src/attributes/otherfaction.c @@ -23,8 +23,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include -#include +#include +#include #include #include diff --git a/src/attributes/otherfaction.test.c b/src/attributes/otherfaction.test.c index 8417ed3e3..e4f7c95b9 100644 --- a/src/attributes/otherfaction.test.c +++ b/src/attributes/otherfaction.test.c @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include diff --git a/src/attributes/overrideroads.c b/src/attributes/overrideroads.c index ef466de2d..d96d115d9 100644 --- a/src/attributes/overrideroads.c +++ b/src/attributes/overrideroads.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "overrideroads.h" -#include +#include attrib_type at_overrideroads = { "roads_override", NULL, NULL, NULL, a_writestring, a_readstring diff --git a/src/attributes/racename.c b/src/attributes/racename.c index c46fb0c4b..9374f1238 100644 --- a/src/attributes/racename.c +++ b/src/attributes/racename.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "racename.h" -#include +#include #include /* libc includes */ diff --git a/src/attributes/raceprefix.c b/src/attributes/raceprefix.c index 233d17e40..84997b909 100644 --- a/src/attributes/raceprefix.c +++ b/src/attributes/raceprefix.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "raceprefix.h" -#include +#include #include #include diff --git a/src/attributes/reduceproduction.c b/src/attributes/reduceproduction.c index 01041380a..0ae0abbea 100644 --- a/src/attributes/reduceproduction.c +++ b/src/attributes/reduceproduction.c @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include static int age_reduceproduction(attrib * a, void *owner) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 82bdf22ca..ae46980c3 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -23,8 +23,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include -#include +#include +#include #include #include diff --git a/src/attributes/stealth.c b/src/attributes/stealth.c index db2ec5304..ae00e8721 100644 --- a/src/attributes/stealth.c +++ b/src/attributes/stealth.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/attributes/targetregion.c b/src/attributes/targetregion.c index 7ef1fe84a..600d2e184 100644 --- a/src/attributes/targetregion.c +++ b/src/attributes/targetregion.c @@ -22,8 +22,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include -#include +#include +#include #include #include diff --git a/src/automate.c b/src/automate.c index 6af40d649..530b9ee39 100644 --- a/src/automate.c +++ b/src/automate.c @@ -6,10 +6,10 @@ #include "kernel/region.h" #include "kernel/unit.h" +#include "util/keyword.h" #include "util/log.h" #include "automate.h" -#include "keyword.h" #include "laws.h" #include "study.h" diff --git a/src/battle.c b/src/battle.c index aa5de9f71..ae914ab05 100644 --- a/src/battle.c +++ b/src/battle.c @@ -60,7 +60,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include +#include #include #include #include diff --git a/src/battle.test.c b/src/battle.test.c index 8cfbb0d2a..a2ea561d4 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -3,7 +3,6 @@ #include "battle.h" #include "guard.h" -#include "keyword.h" #include "reports.h" #include "skill.h" @@ -22,6 +21,7 @@ #include #include +#include "util/keyword.h" #include #include #include diff --git a/src/bind_eressea.c b/src/bind_eressea.c index 9f73c4a29..4d3918899 100755 --- a/src/bind_eressea.c +++ b/src/bind_eressea.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -21,7 +22,7 @@ void eressea_free_game(void) { free_gamedata(); init_resources(); - init_locales(); + init_locales(init_locale); } int eressea_read_game(const char * filename) { @@ -34,7 +35,13 @@ int eressea_write_game(const char * filename) { } int eressea_read_orders(const char * filename) { - return readorders(filename); + FILE * F = fopen(filename, "r"); + if (!F) { + perror(filename); + return -1; + } + log_info("reading orders from %s", filename); + return parseorders(F); } int eressea_export_json(const char * filename, int flags) { diff --git a/src/bind_process.c b/src/bind_process.c index 58f90076f..f9f99284e 100755 --- a/src/bind_process.c +++ b/src/bind_process.c @@ -4,20 +4,22 @@ #include "bind_process.h" +#include "battle.h" +#include "economy.h" +#include "laws.h" +#include "magic.h" +#include "market.h" +#include "move.h" +#include "study.h" + #include #include #include #include #include #include -#include "battle.h" -#include "economy.h" -#include "keyword.h" -#include "laws.h" -#include "magic.h" -#include "market.h" -#include "move.h" -#include "study.h" + +#include "util/keyword.h" #define PROC_LAND_REGION 0x0001 #define PROC_LONG_ORDER 0x0002 diff --git a/src/bind_region.c b/src/bind_region.c index 3b0e7f3a3..9d7897829 100644 --- a/src/bind_region.c +++ b/src/bind_region.c @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/bind_ship.c b/src/bind_ship.c index 2a1d75271..d335d996d 100644 --- a/src/bind_ship.c +++ b/src/bind_ship.c @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/bind_storage.c b/src/bind_storage.c index aa7935312..5df148bb4 100644 --- a/src/bind_storage.c +++ b/src/bind_storage.c @@ -6,7 +6,7 @@ #include -#include +#include #include #include diff --git a/src/bind_unit.c b/src/bind_unit.c index 9f6c39163..3f2a037ea 100644 --- a/src/bind_unit.c +++ b/src/bind_unit.c @@ -11,9 +11,9 @@ #include "skill.h" /* util includes */ -#include +#include #include -#include +#include #include #include #include "util/variant.h" diff --git a/src/bindings.c b/src/bindings.c index b2da38eba..caac5b99c 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -47,7 +47,7 @@ #include -#include +#include #include #include #include diff --git a/src/chaos.c b/src/chaos.c index 1ec431b7e..615113656 100644 --- a/src/chaos.c +++ b/src/chaos.c @@ -34,7 +34,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include +#include #include #include diff --git a/src/checker.c b/src/checker.c new file mode 100644 index 000000000..27648e7af --- /dev/null +++ b/src/checker.c @@ -0,0 +1,92 @@ +#ifdef _MSV_VER +#include +#endif + +#include "util/order_parser.h" +#include "util/keyword.h" +#include "util/language.h" +#include "util/path.h" +#include "util/pofile.h" + +#include +#include +#include +#include + +typedef struct parser_state { + FILE * F; +} parser_state; + +static void handle_order(void *userData, const char *str) { + parser_state * state = (parser_state*)userData; + fputs(str, state->F); + fputc('\n', state->F); +} + +int parsefile(FILE *F) { + OP_Parser parser; + char buf[1024]; + int done = 0, err = 0; + parser_state state = { NULL }; + + state.F = stdout; + + parser = OP_ParserCreate(); + OP_SetOrderHandler(parser, handle_order); + OP_SetUserData(parser, &state); + + while (!done) { + size_t len = (int)fread(buf, 1, sizeof(buf), F); + if (ferror(F)) { + /* TODO: error message */ + err = errno; + break; + } + done = feof(F); + if (OP_Parse(parser, buf, len, done) == OP_STATUS_ERROR) { + /* TODO: error message */ + err = (int)OP_GetErrorCode(parser); + break; + } + } + OP_ParserFree(parser); + return err; +} + +static int handle_po(const char *msgid, const char *msgstr, const char *msgctxt, void *data) { + struct locale *lang = (struct locale *)data; + if (msgctxt) { + if (strcmp(msgctxt, "keyword") == 0) { + keyword_t kwd = findkeyword(msgid); + init_keyword(lang, kwd, msgstr); + locale_setstring(lang, mkname("keyword", keywords[kwd]), msgstr); + } + } + return 0; +} + +static void read_config(const char *respath) { + char path[PATH_MAX]; + struct locale *lang; + lang = get_or_create_locale("de"); + path_join(respath, "translations/strings.de.po", path, sizeof(path)); + pofile_read(path, handle_po, lang); +} + +int main(int argc, char **argv) { + FILE * F = stdin; + if (argc > 1) { + const char *filename = argv[1]; + F = fopen(filename, "r"); + if (!F) { + perror(filename); + return -1; + } + } + read_config("../git"); + parsefile(F); + if (F != stdin) { + fclose(F); + } + return 0; +} diff --git a/src/creport.c b/src/creport.c index ce67493da..475a04b1e 100644 --- a/src/creport.c +++ b/src/creport.c @@ -64,7 +64,7 @@ without prior permission by the authors of Eressea. #include "kernel/unit.h" /* util includes */ -#include +#include #include #include #include diff --git a/src/creport.test.c b/src/creport.test.c index bacf8def0..6bd5bfba8 100644 --- a/src/creport.test.c +++ b/src/creport.test.c @@ -3,7 +3,6 @@ #include "move.h" #include "spy.h" #include "travelthru.h" -#include "keyword.h" #include #include @@ -17,6 +16,7 @@ #include #include +#include "util/keyword.h" #include #include #include diff --git a/src/economy.c b/src/economy.c index f0c930a3f..1d3f6685f 100644 --- a/src/economy.c +++ b/src/economy.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef _MSC_VER #include #endif -#include + #include "economy.h" #include "alchemy.h" @@ -45,10 +45,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* kernel includes */ #include "kernel/ally.h" +#include "kernel/attrib.h" #include "kernel/building.h" #include "kernel/calendar.h" +#include "kernel/config.h" #include "kernel/curse.h" #include "kernel/equipment.h" +#include "kernel/event.h" #include "kernel/faction.h" #include "kernel/item.h" #include "kernel/messages.h" @@ -64,13 +67,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/unit.h" /* util includes */ -#include #include -#include #include #include #include #include +#include "util/param.h" #include #include diff --git a/src/economy.test.c b/src/economy.test.c index 1a40c03db..0b213ba7e 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include diff --git a/src/eressea.c b/src/eressea.c index 0bf1454ee..e1767811c 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -1,14 +1,13 @@ #include #include "eressea.h" +#include "kernel/building.h" #include "kernel/calendar.h" #include "kernel/config.h" #include "kernel/curse.h" -#include "kernel/faction.h" -#include "kernel/building.h" #include "kernel/equipment.h" +#include "kernel/faction.h" #include "kernel/item.h" -#include "kernel/database.h" #include "util/functions.h" #include "util/language.h" @@ -28,6 +27,7 @@ #include "creport.h" #include "report.h" #include "names.h" +#include "orderdb.h" #include "reports.h" #include "spells.h" #include "vortex.h" @@ -54,12 +54,12 @@ void game_done(void) free_locales(); #endif kernel_done(); - dblib_close(); + orderdb_close(); } void game_init(void) { - dblib_open(); + orderdb_open(); errno = 0; kernel_init(); register_triggers(); diff --git a/src/gamedb.c b/src/gamedb.c index e570d61e8..2ca2dba73 100644 --- a/src/gamedb.c +++ b/src/gamedb.c @@ -6,7 +6,6 @@ #include "kernel/config.h" #include "kernel/calendar.h" -#include "kernel/database.h" #include "kernel/faction.h" #include "kernel/db/driver.h" @@ -21,7 +20,7 @@ int gamedb_update(void) err = db_driver_open(DB_GAME, dbname); if (err == 0) { for (f = factions; f; f = f->next) { - int uid = dblib_save_faction(f, turn); + int uid = db_driver_faction_save(f->uid, f->no, turn, f->email, f->_password); if (uid > 0) { f->uid = uid; } diff --git a/src/give.c b/src/give.c index c47f9b9e2..4b1dbb0ac 100644 --- a/src/give.c +++ b/src/give.c @@ -25,6 +25,8 @@ #include /* kernel includes */ +#include +#include #include #include #include @@ -41,11 +43,10 @@ #include /* util includes */ -#include #include -#include #include #include +#include #include /* libc includes */ diff --git a/src/give.test.c b/src/give.test.c index 9c07c8cd0..06c0ecf96 100644 --- a/src/give.test.c +++ b/src/give.test.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include diff --git a/src/gmtool.c b/src/gmtool.c index 270f0f677..cd0580fcc 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -30,7 +30,7 @@ #include "kernel/ship.h" #include "kernel/terrain.h" -#include +#include #include #include #include diff --git a/src/helpers.c b/src/helpers.c index 01fa19abc..223089c9c 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -19,10 +19,10 @@ without prior permission by the authors of Eressea. #include "alchemy.h" #include "magic.h" -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/src/items.c b/src/items.c index 574c1da3b..72bd6d713 100644 --- a/src/items.c +++ b/src/items.c @@ -5,7 +5,6 @@ #include "alchemy.h" #include "skill.h" -#include "keyword.h" #include "direction.h" #include "study.h" #include "economy.h" @@ -33,8 +32,9 @@ #include #include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/items/speedsail.c b/src/items/speedsail.c index b224d6d6d..e6d3d1386 100644 --- a/src/items/speedsail.c +++ b/src/items/speedsail.c @@ -31,7 +31,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include diff --git a/src/jsonconf.c b/src/jsonconf.c index 51116691f..ff442f990 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -29,9 +29,10 @@ without prior permission by the authors of Eressea. #include "kernel/spellbook.h" /* util includes */ -#include "util/attrib.h" +#include "kernel/attrib.h" #include "util/crmessage.h" #include "util/functions.h" +#include "util/keyword.h" #include "util/language.h" #include "util/log.h" #include "util/message.h" @@ -42,7 +43,6 @@ without prior permission by the authors of Eressea. /* game modules */ #include "direction.h" -#include "keyword.h" #include "move.h" #include "prefix.h" #include "skill.h" diff --git a/src/jsonconf.test.c b/src/jsonconf.test.c index 9e0e8f6b6..1fc27d3e6 100644 --- a/src/jsonconf.test.c +++ b/src/jsonconf.test.c @@ -15,11 +15,11 @@ #include "kernel/order.h" #include "kernel/terrain.h" +#include "util/keyword.h" #include "util/language.h" #include "kernel/calendar.h" #include "direction.h" -#include "keyword.h" #include "move.h" #include "prefix.h" diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index db448bf11..06f58fc1b 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 2.6) project(kernel C) -SET(_DBFILES db/critbit.c) +SET(_DBFILES db/memory.c) IF(SQLITE3_FOUND) SET(_DBFILES db/sqlite.c) @@ -12,6 +12,7 @@ ENDIF(SQLITE3_FOUND) SET(_TEST_FILES alliance.test.c ally.test.c +attrib.test.c build.test.c building.test.c # callbacks.test.c @@ -22,12 +23,13 @@ config.test.c curse.test.c database.test.c equipment.test.c +# event.test.c faction.test.c +gamedata.test.c group.test.c item.test.c messages.test.c order.test.c -orderdb.test.c # pathfinder.test.c plane.test.c pool.test.c @@ -47,6 +49,7 @@ SET(_FILES ${_DBFILES} alliance.c ally.c +attrib.c build.c building.c callbacks.c @@ -55,14 +58,14 @@ command.c config.c connection.c curse.c -database.c equipment.c +event.c faction.c +gamedata.c group.c item.c messages.c order.c -orderdb.c pathfinder.c plane.c pool.c diff --git a/src/kernel/alliance.c b/src/kernel/alliance.c index d5dda0143..1996c5aad 100644 --- a/src/kernel/alliance.c +++ b/src/kernel/alliance.c @@ -27,7 +27,7 @@ without prior permission by the authors of Eressea. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/kernel/ally.c b/src/kernel/ally.c index 4fadf9c04..1fd7c0efd 100644 --- a/src/kernel/ally.c +++ b/src/kernel/ally.c @@ -10,9 +10,9 @@ #include "objtypes.h" #include "plane.h" -#include +#include #include -#include +#include #include diff --git a/src/util/attrib.c b/src/kernel/attrib.c similarity index 99% rename from src/util/attrib.c rename to src/kernel/attrib.c index defb4ff1e..d84a8c8e9 100644 --- a/src/util/attrib.c +++ b/src/kernel/attrib.c @@ -19,12 +19,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "attrib.h" -#include "gamedata.h" -#include "log.h" -#include "variant.h" -#include "storage.h" -#include "strings.h" +#include +#include +#include +#include +#include #include #include diff --git a/src/util/attrib.h b/src/kernel/attrib.h similarity index 99% rename from src/util/attrib.h rename to src/kernel/attrib.h index b7a081d8c..65c41aa71 100644 --- a/src/util/attrib.h +++ b/src/kernel/attrib.h @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define ATTRIB_H #include -#include "variant.h" +#include #ifdef __cplusplus extern "C" { #endif diff --git a/src/util/attrib.test.c b/src/kernel/attrib.test.c similarity index 99% rename from src/util/attrib.test.c rename to src/kernel/attrib.test.c index d266196e6..918b768fd 100644 --- a/src/util/attrib.test.c +++ b/src/kernel/attrib.test.c @@ -1,7 +1,7 @@ #include #include "attrib.h" -#include +#include #include #include diff --git a/src/kernel/build.c b/src/kernel/build.c index 4e3dc4721..a3b1c0e50 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -33,10 +33,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* kernel includes */ #include #include -#include +#include #include #include +#include #include +#include #include #include #include @@ -52,12 +54,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* from libutil */ -#include #include -#include #include #include #include +#include #include #include @@ -79,7 +80,7 @@ struct building *getbuilding(const struct region *r) ship *getship(const struct region * r) { - ship *sh, *sx = findship(getshipid()); + ship *sh, *sx = findship(getid()); for (sh = r->ships; sh; sh = sh->next) { if (sh == sx) return sh; diff --git a/src/kernel/build.test.c b/src/kernel/build.test.c index 9bae742c2..2607b2dfb 100644 --- a/src/kernel/build.test.c +++ b/src/kernel/build.test.c @@ -1,19 +1,24 @@ +#ifdef _MSC_VER #include -#include +#endif -#include #include "alchemy.h" -#include "types.h" #include "build.h" -#include "guard.h" -#include "order.h" -#include "unit.h" #include "building.h" +#include "config.h" #include "faction.h" -#include "region.h" -#include "race.h" +#include "guard.h" #include "item.h" -#include +#include "messages.h" +#include "order.h" +#include "race.h" +#include "region.h" +#include "types.h" +#include "unit.h" + +#include "util/language.h" +#include "util/param.h" + #include #include diff --git a/src/kernel/building.c b/src/kernel/building.c index 75cad30f7..f5698eaa9 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -38,13 +38,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "lighthouse.h" /* util includes */ -#include +#include #include -#include +#include #include -#include +#include #include #include +#include #include #include #include @@ -128,14 +129,6 @@ static void free_buildingtype(void *ptr) { free(btype); } -void free_buildingtypes(void) { - cb_clear(&cb_bldgtypes); - selist_foreach(buildingtypes, free_buildingtype); - selist_free(buildingtypes); - buildingtypes = 0; - ++bt_changes; -} - building_type *bt_get_or_create(const char *name) { assert(name && name[0]); @@ -264,17 +257,28 @@ building *findbuilding(int i) static local_names *bnames; -/* Find the building type for a given localized name (as seen by the user). Useful for parsing - * orders. The inverse of locale_string(lang, btype->_name), sort of. */ -const building_type *findbuildingtype(const char *name, - const struct locale *lang) -{ - variant type; - local_names *bn = bnames; +static void free_bnames(void) { + while (bnames) { + local_names *bn = bnames; + bnames = bnames->next; + freetokens(bn->names); + free(bn); + } +} +static local_names *get_bnames(const struct locale *lang) +{ + static int config; + local_names *bn; + + if (bt_changed(&config)) { + free_bnames(); + } + bn = bnames; while (bn) { - if (bn->lang == lang) + if (bn->lang == lang) { break; + } bn = bn->next; } if (!bn) { @@ -291,14 +295,26 @@ const building_type *findbuildingtype(const char *name, const char *n = LOC(lang, btype->_name); if (!n) { log_error("building type %s has no translation in %s", - btype->_name, locale_name(lang)); - } else { + btype->_name, locale_name(lang)); + } + else { + variant type; type.v = (void *)btype; addtoken((struct tnode **)&bn->names, n, type); } } bnames = bn; } + return bn; +} + +/* Find the building type for a given localized name (as seen by the user). Useful for parsing + * orders. The inverse of locale_string(lang, btype->_name), sort of. */ +const building_type *findbuildingtype(const char *name, + const struct locale *lang) +{ + variant type; + local_names *bn = get_bnames(lang); if (findtoken(bn->names, name, &type) == E_TOK_NOMATCH) return NULL; return (const building_type *)type.v; @@ -870,3 +886,12 @@ int cmp_current_owner(const building * b, const building * a) } return 0; } + +void free_buildingtypes(void) { + free_bnames(); + cb_clear(&cb_bldgtypes); + selist_foreach(buildingtypes, free_buildingtype); + selist_free(buildingtypes); + buildingtypes = 0; + ++bt_changes; +} diff --git a/src/kernel/config.c b/src/kernel/config.c index eee2ec0f5..15387dca7 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -33,7 +33,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "faction.h" #include "group.h" #include "item.h" -#include "keyword.h" #include "messages.h" #include "move.h" #include "objtypes.h" @@ -50,15 +49,18 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "unit.h" /* util includes */ -#include +#include +#include + #include #include -#include +#include #include #include #include #include #include +#include #include #include #include @@ -91,54 +93,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif struct settings global; -const char *parameters[MAXPARAMS] = { - "LOCALE", - "ALLES", - "JEDEM", - "BAUERN", - "BURG", - "EINHEIT", - "PRIVAT", - "HINTEN", - "KOMMANDO", - "KRAEUTER", - "NICHT", - "NAECHSTER", - "PARTEI", - "ERESSEA", - "PERSONEN", - "REGION", - "SCHIFF", - "SILBER", - "STRASSEN", - "TEMP", - "FLIEHE", - "GEBAEUDE", - "GIB", /* HELFE GIB */ - "KAEMPFE", - "DURCHREISE", - "BEWACHE", - "ZAUBER", - "PAUSE", - "VORNE", - "AGGRESSIV", - "DEFENSIV", - "STUFE", - "HELFE", - "FREMDES", - "AURA", - "HINTER", - "VOR", - "ANZAHL", - "GEGENSTAENDE", - "TRAENKE", - "GRUPPE", - "PARTEITARNUNG", - "BAEUME", - "ALLIANZ", - "AUTO" -}; - int findoption(const char *s, const struct locale *lang) { void **tokens = get_translations(lang, UT_OPTIONS); @@ -150,78 +104,6 @@ int findoption(const char *s, const struct locale *lang) return NODIRECTION; } -param_t findparam(const char *s, const struct locale * lang) -{ - param_t result = NOPARAM; - char buffer[64]; - char * str = s ? transliterate(buffer, sizeof(buffer) - sizeof(int), s) : 0; - - if (str && *str) { - int i; - void * match; - void **tokens = get_translations(lang, UT_PARAMS); - critbit_tree *cb = (critbit_tree *)*tokens; - if (!cb) { - log_warning("no parameters defined in locale %s", locale_name(lang)); - } - else if (cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) { - cb_get_kv(match, &i, sizeof(int)); - result = (param_t)i; - } - } - return result; -} - -param_t findparam_block(const char *s, const struct locale *lang, bool any_locale) -{ - param_t p; - if (!s || s[0] == '@') { - return NOPARAM; - } - p = findparam(s, lang); - if (any_locale && p==NOPARAM) { - const struct locale *loc; - for (loc=locales;loc;loc=nextlocale(loc)) { - if (loc!=lang) { - p = findparam(s, loc); - if (p==P_FACTION || p==P_GAMENAME) { - break; - } - } - } - } - return p; -} - -param_t findparam_ex(const char *s, const struct locale * lang) -{ - param_t result = findparam(s, lang); - - if (result == NOPARAM) { - const building_type *btype = findbuildingtype(s, lang); - if (btype != NULL) - return P_GEBAEUDE; - } - return (result == P_BUILDING) ? P_GEBAEUDE : result; -} - -bool isparam(const char *s, const struct locale * lang, param_t param) -{ - assert(s); - if (s[0] > '@') { - param_t p = (param == P_GEBAEUDE) ? findparam_ex(s, lang) : findparam(s, lang); - return p == param; - } - return false; -} - -param_t getparam(const struct locale * lang) -{ - char token[64]; - const char *s = gettoken(token, sizeof(token)); - return s ? findparam(s, lang) : NOPARAM; -} - /* -- Erschaffung neuer Einheiten ------------------------------ */ static const char *forbidden[] = { "t", "te", "tem", "temp", NULL }; @@ -267,17 +149,6 @@ int newcontainerid(void) return random_no; } -static const char * parameter_key(int i) -{ - assert(i < MAXPARAMS && i >= 0); - return parameters[i]; -} - -void init_parameters(struct locale *lang) { - init_translations(lang, UT_PARAMS, parameter_key, MAXPARAMS); -} - - void init_terrains_translation(const struct locale *lang) { void **tokens; const terrain_type *terrain; @@ -368,6 +239,7 @@ static void init_magic(struct locale *lang) free(sstr); } } + void init_locale(struct locale *lang) { init_magic(lang); diff --git a/src/kernel/config.h b/src/kernel/config.h index e104d4a1a..95df10ae9 100644 --- a/src/kernel/config.h +++ b/src/kernel/config.h @@ -44,12 +44,6 @@ extern "C" { int findoption(const char *s, const struct locale *lang); - param_t findparam(const char *s, const struct locale *lang); - param_t findparam_block(const char *s, const struct locale *lang, bool any_locale); - param_t findparam_ex(const char *s, const struct locale * lang); - bool isparam(const char *s, const struct locale * lang, param_t param); - param_t getparam(const struct locale *lang); - const char * game_name(void); const char * game_mailcmd(void); int game_id(void); @@ -132,12 +126,9 @@ extern "C" { struct order *default_order(const struct locale *lang); - void init_parameters(struct locale *lang); - void free_gamedata(void); void free_config(void); - extern const char *parameters[]; extern settings global; #ifdef __cplusplus diff --git a/src/kernel/config.test.c b/src/kernel/config.test.c index e99ba9d08..f5d29877a 100644 --- a/src/kernel/config.test.c +++ b/src/kernel/config.test.c @@ -5,9 +5,12 @@ #include #include #include -#include + #include -#include +#include +#include + +#include #include diff --git a/src/kernel/connection.c b/src/kernel/connection.c index ddaf163c1..7fc1213e0 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -26,9 +26,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "terrain.h" #include "unit.h" -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/curse.c b/src/kernel/curse.c index f6be51dac..62e7ab9b2 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -34,9 +34,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "unit.h" /* util includes */ -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/curse.test.c b/src/kernel/curse.test.c index 9c74544e1..da0806914 100644 --- a/src/kernel/curse.test.c +++ b/src/kernel/curse.test.c @@ -4,9 +4,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/database.c b/src/kernel/database.c deleted file mode 100644 index 137665e31..000000000 --- a/src/kernel/database.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "database.h" - -#include - -#include -#include -#include -#include - -#include - -#include "db/driver.h" - -order_data *dblib_load_order(int id) -{ - if (id > 0) { - return db_driver_order_load(id); - } - return NULL; -} - -int dblib_save_order(order_data *od) -{ - if (od->_str) { - return db_driver_order_save(od); - } - return 0; -} - -int dblib_save_faction(const faction *f, int turn) { - return db_driver_faction_save(f->uid, f->no, turn, f->email, f->_password); -} - -void dblib_open(void) -{ - const char *dbname; - - dbname = config_get("game.dbswap"); - db_driver_open(DB_SWAP, dbname); -} - -void dblib_close(void) -{ - db_driver_close(DB_SWAP); -} diff --git a/src/kernel/database.h b/src/kernel/database.h deleted file mode 100644 index e3bdf11d1..000000000 --- a/src/kernel/database.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef H_DATABASE -#define H_DATABASE - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - struct order_data; - struct faction; - - void dblib_open(void); - void dblib_close(void); - - struct order_data *dblib_load_order(int id); - int dblib_save_order(struct order_data *od); - int dblib_save_faction(const struct faction *f, int turn); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/kernel/database.test.c b/src/kernel/database.test.c index cde4edc11..3ec44896e 100644 --- a/src/kernel/database.test.c +++ b/src/kernel/database.test.c @@ -1,8 +1,9 @@ #include #include #include +#include -#include "database.h" +#include "db/driver.h" #include "orderdb.h" #include @@ -39,9 +40,9 @@ static void test_update_faction(CuTest *tc) { test_setup(); f = test_create_faction(NULL); - uid = dblib_save_faction(f, 0); + uid = db_driver_faction_save(f->uid, f->no, 0, f->email, f->_password); f->uid = uid; - uid = dblib_save_faction(f, 0); + uid = db_driver_faction_save(f->uid, f->no, 0, f->email, f->_password); CuAssertIntEquals(tc, f->uid, uid); test_teardown(); } diff --git a/src/kernel/db/berkeley.c b/src/kernel/db/berkeley.c index 778e0bfe7..9a10e4bf8 100644 --- a/src/kernel/db/berkeley.c +++ b/src/kernel/db/berkeley.c @@ -4,36 +4,35 @@ #include #include "driver.h" -#include -#include - #include #include static DB *g_dbp; -void db_driver_open(void) +void db_driver_open(database_t db, const char *dbname) { - int ret; - u_int32_t flags = DB_CREATE; - const char * dbname; + if (db == DB_SWAP) { + int ret; + u_int32_t flags = DB_CREATE; - dbname = config_get("game.dbname"); - ret = db_create(&g_dbp, NULL, 0); - assert(ret==0); + ret = db_create(&g_dbp, NULL, 0); + assert(ret == 0); - ret = g_dbp->open(g_dbp, NULL, dbname, NULL, DB_RECNO, flags, 0); - assert(ret==0); + ret = g_dbp->open(g_dbp, NULL, dbname, NULL, DB_RECNO, flags, 0); + assert(ret == 0); + } } -void db_driver_close(void) +void db_driver_close(database_t db) { - int ret; - ret = g_dbp->close(g_dbp, 0); - assert(ret==0); + if (db == DB_SWAP) { + int ret; + ret = g_dbp->close(g_dbp, 0); + assert(ret == 0); + } } -int db_driver_order_save(struct order_data *od) +int db_driver_order_save(const char *str) { int ret; DBT key, data; @@ -46,18 +45,13 @@ int db_driver_order_save(struct order_data *od) key.size = key.ulen = sizeof(recno); key.flags = DB_DBT_USERMEM; data.data = (void *)od->_str; - data.size = data.ulen = strlen(od->_str) + 1; + data.size = data.ulen = strlen(str) + 1; data.flags = DB_DBT_USERMEM; ret = g_dbp->put(g_dbp, NULL, &key, &data, DB_APPEND); assert(ret == 0); return (int)recno; } -int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password) -{ - return -1; -} - struct order_data *db_driver_order_load(int id) { int ret; @@ -79,3 +73,8 @@ struct order_data *db_driver_order_load(int id) return od; } +int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password) +{ + return -1; +} + diff --git a/src/kernel/db/critbit.c b/src/kernel/db/critbit.c deleted file mode 100644 index 69bac159e..000000000 --- a/src/kernel/db/critbit.c +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include "driver.h" - -#include -#include - -#include - -#include -#include -#include - -static critbit_tree cb_orders = { 0 }; -static int auto_id = -1; - -struct cb_entry { - int id; - order_data *data; -}; - -order_data *db_driver_order_load(int id) -{ - void * match; - - assert(id>0); - if (cb_find_prefix(&cb_orders, &id, sizeof(id), &match, 1, 0) > 0) { - struct cb_entry *ent = (struct cb_entry *)match; - order_data * od = ent->data; - ++od->_refcount; - return od; - } - return NULL; -} - -int db_driver_order_save(order_data *od) -{ - struct cb_entry ent; - - assert(od && od->_str); - ++od->_refcount; - ent.id = ++auto_id; - ent.data = od; - cb_insert(&cb_orders, &ent, sizeof(ent)); - return ent.id; -} - -int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password) -{ - return -1; -} - -static int free_data_cb(const void *match, const void *key, size_t keylen, - void *udata) -{ - struct cb_entry * ent = (struct cb_entry *)match; - order_data *od = ent->data; - odata_release(od); - return 0; -} - -void db_driver_open(void) -{ - assert(auto_id == -1); - auto_id = 0; -} - -void db_driver_close(void) -{ - cb_foreach(&cb_orders, NULL, 0, free_data_cb, NULL); - cb_clear(&cb_orders); - auto_id = -1; -} diff --git a/src/kernel/db/driver.h b/src/kernel/db/driver.h index 26b0461e3..9632cb5db 100644 --- a/src/kernel/db/driver.h +++ b/src/kernel/db/driver.h @@ -1,7 +1,11 @@ #pragma once +#include + struct order_data; +extern void odata_create(struct order_data **pdata, size_t len, const char *str); + typedef enum database_t { DB_SWAP, DB_GAME, @@ -9,6 +13,6 @@ typedef enum database_t { int db_driver_open(database_t db, const char *dbname); void db_driver_close(database_t db); -int db_driver_order_save(struct order_data *od); +int db_driver_order_save(const char *str); struct order_data *db_driver_order_load(int id); int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password); diff --git a/src/kernel/db/memory.c b/src/kernel/db/memory.c new file mode 100644 index 000000000..0f572a99e --- /dev/null +++ b/src/kernel/db/memory.c @@ -0,0 +1,70 @@ +#ifdef _MSC_VER +#include +#endif +#include "driver.h" + +#include +#include + +#include + +#include +#include +#include + +static selist * g_orders; +static int auto_id = -1; + +struct order_data *db_driver_order_load(int id) +{ + void * match; + + assert(id>0); + match = selist_get(g_orders, id - 1); + if (match) { + char * str = (char *)match; + struct order_data * od = NULL; + odata_create(&od, strlen(str), str); + return od; + } + return NULL; +} + +int db_driver_order_save(const char * str) +{ + assert(str); + selist_push(&g_orders, str_strdup(str)); + return ++auto_id; +} + +int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password) +{ + return -1; +} + +static void free_data_cb(void *match) +{ + char *str = (char *)match; + free(str); +} + +int db_driver_open(database_t db, const char *dbname) +{ + (void)dbname; + if (db == DB_SWAP) { + assert(auto_id == -1); + auto_id = 0; + return 0; + } + return -1; +} + +void db_driver_close(database_t db) +{ + if (db == DB_SWAP) { + selist_foreach(g_orders, free_data_cb); + selist_free(g_orders); + g_orders = NULL; + auto_id = -1; + } +} diff --git a/src/kernel/db/sqlite.c b/src/kernel/db/sqlite.c index 70cacaf48..ffdcc8e67 100644 --- a/src/kernel/db/sqlite.c +++ b/src/kernel/db/sqlite.c @@ -1,8 +1,6 @@ #include #include -#include -#include #include @@ -25,9 +23,9 @@ static sqlite3_stmt * g_stmt_insert_faction; static int g_order_batchsize; static int g_order_tx_size; -order_data *db_driver_order_load(int id) +struct order_data *db_driver_order_load(int id) { - order_data * od = NULL; + struct order_data * od = NULL; int err; ERRNO_CHECK(); @@ -58,12 +56,12 @@ order_data *db_driver_order_load(int id) return NULL; } -int db_driver_order_save(order_data *od) +int db_driver_order_save(const char *str) { int err; sqlite3_int64 id; - assert(od && od->_str); + assert(str); ERRNO_CHECK(); @@ -76,7 +74,7 @@ int db_driver_order_save(order_data *od) err = sqlite3_reset(g_stmt_insert_order); assert(err == SQLITE_OK); - err = sqlite3_bind_text(g_stmt_insert_order, 1, od->_str, -1, SQLITE_STATIC); + err = sqlite3_bind_text(g_stmt_insert_order, 1, str, -1, SQLITE_STATIC); assert(err == SQLITE_OK); err = sqlite3_step(g_stmt_insert_order); assert(err == SQLITE_DONE); diff --git a/src/util/event.c b/src/kernel/event.c similarity index 98% rename from src/util/event.c rename to src/kernel/event.c index d6aa6f338..f1ff825f5 100644 --- a/src/util/event.c +++ b/src/kernel/event.c @@ -18,12 +18,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "event.h" +#include "attrib.h" /* util includes */ -#include "attrib.h" -#include "gamedata.h" -#include "log.h" -#include "strings.h" +#include +#include +#include #include diff --git a/src/util/event.h b/src/kernel/event.h similarity index 99% rename from src/util/event.h rename to src/kernel/event.h index ad4ca373d..c6c880c4c 100644 --- a/src/util/event.h +++ b/src/kernel/event.h @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. extern "C" { #endif -#include "variant.h" +#include struct attrib; struct trigger; diff --git a/src/kernel/faction.c b/src/kernel/faction.c index 6e85988f4..a78cd943a 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -42,10 +42,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/util/gamedata.c b/src/kernel/gamedata.c similarity index 98% rename from src/util/gamedata.c rename to src/kernel/gamedata.c index cd3fa01a7..4173332c4 100644 --- a/src/util/gamedata.c +++ b/src/kernel/gamedata.c @@ -1,7 +1,8 @@ #include #include "gamedata.h" -#include "log.h" + +#include #include #include diff --git a/src/util/gamedata.h b/src/kernel/gamedata.h similarity index 100% rename from src/util/gamedata.h rename to src/kernel/gamedata.h diff --git a/src/util/gamedata.test.c b/src/kernel/gamedata.test.c similarity index 100% rename from src/util/gamedata.test.c rename to src/kernel/gamedata.test.c diff --git a/src/kernel/group.c b/src/kernel/group.c index 48434ff5a..54aa87aeb 100755 --- a/src/kernel/group.c +++ b/src/kernel/group.c @@ -30,9 +30,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/group.test.c b/src/kernel/group.test.c index 5581fee69..1c6d6339e 100644 --- a/src/kernel/group.test.c +++ b/src/kernel/group.test.c @@ -8,8 +8,8 @@ #include "region.h" #include "save.h" -#include -#include +#include +#include #include #include diff --git a/src/kernel/item.c b/src/kernel/item.c index 4e707a48c..aab734759 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -35,7 +35,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "unit.h" /* util includes */ -#include +#include #include #include #include diff --git a/src/kernel/order.c b/src/kernel/order.c index 2fd7c6eb8..c0c1e82fb 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -14,13 +14,13 @@ #include #include "order.h" -#include "orderdb.h" #include "skill.h" -#include "keyword.h" #include +#include "util/keyword.h" #include #include +#include #include #include @@ -36,6 +36,36 @@ # define ORD_KEYWORD(ord) (keyword_t)((ord)->command & 0xFFFF) # define OD_STRING(odata) ((odata) ? (odata)->_str : NULL) +void odata_create(order_data **pdata, size_t len, const char *str) +{ + order_data *data; + char *result; + + assert(pdata); + data = malloc(sizeof(order_data) + len + 1); + data->_refcount = 1; + result = (char *)(data + 1); + data->_str = (len > 0) ? result : NULL; + if (str) { + strcpy(result, str); + } + *pdata = data; +} + +void odata_release(order_data * od) +{ + if (od) { + if (--od->_refcount == 0) { + free(od); + } + } +} + +void odata_addref(order_data *od) +{ + ++od->_refcount; +} + void replace_order(order ** dlist, order * orig, const order * src) { assert(src); diff --git a/src/kernel/order.h b/src/kernel/order.h index b0d771b67..ca57d0179 100644 --- a/src/kernel/order.h +++ b/src/kernel/order.h @@ -13,7 +13,8 @@ #ifndef KRNL_ORDER_H #define KRNL_ORDER_H -#include "keyword.h" +#include + #include #include @@ -37,6 +38,18 @@ extern "C" { #define CMD_PERSIST 0x020000 #define CMD_DEFAULT 0x040000 + typedef struct order_data { + const char *_str; + int _refcount; + } order_data; + + extern order_data *odata_load(int id); + extern int odata_save(order_data *od); + + void odata_create(order_data **pdata, size_t len, const char *str); + void odata_release(order_data * od); + void odata_addref(order_data *od); + typedef struct order { struct order *next; /* do not access this data: */ diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c index c4a55177b..d1dd6a371 100644 --- a/src/kernel/order.test.c +++ b/src/kernel/order.test.c @@ -5,6 +5,7 @@ #include #include +#include "util/param.h" #include #include diff --git a/src/kernel/orderdb.c b/src/kernel/orderdb.c index b30131be4..42248c0ef 100644 --- a/src/kernel/orderdb.c +++ b/src/kernel/orderdb.c @@ -1,5 +1,8 @@ #include -#include "database.h" + +#include "kernel/config.h" +#include "kernel/db/driver.h" + #include "orderdb.h" #include @@ -10,42 +13,31 @@ #include #include -void odata_create(order_data **pdata, size_t len, const char *str) +void orderdb_open(void) { - order_data *data; - char *result; + const char *dbname; - assert(pdata); - data = malloc(sizeof(order_data) + len + 1); - data->_refcount = 1; - result = (char *)(data + 1); - data->_str = (len > 0) ? result : NULL; - if (str) { - strcpy(result, str); - } - *pdata = data; + dbname = config_get("game.dbswap"); + db_driver_open(DB_SWAP, dbname); } -void odata_release(order_data * od) +void orderdb_close(void) { - if (od) { - if (--od->_refcount == 0) { - free(od); - } - } -} - -void odata_addref(order_data *od) -{ - ++od->_refcount; + db_driver_close(DB_SWAP); } order_data *odata_load(int id) { - return dblib_load_order(id); + if (id > 0) { + return db_driver_order_load(id); + } + return NULL; } int odata_save(order_data *od) { - return dblib_save_order(od); + if (od->_str) { + return db_driver_order_save(od->_str); + } + return 0; } diff --git a/src/kernel/orderdb.h b/src/kernel/orderdb.h index 800732c5e..e17bdfea8 100644 --- a/src/kernel/orderdb.h +++ b/src/kernel/orderdb.h @@ -7,17 +7,8 @@ extern "C" { #endif - typedef struct order_data { - const char *_str; - int _refcount; - } order_data; - - void odata_create(order_data **pdata, size_t len, const char *str); - void odata_release(order_data * od); - void odata_addref(order_data *od); - - order_data *odata_load(int id); - int odata_save(order_data *od); + void orderdb_open(void); + void orderdb_close(void); #ifdef __cplusplus } diff --git a/src/kernel/plane.c b/src/kernel/plane.c index 533dab92a..71c0dbd86 100644 --- a/src/kernel/plane.c +++ b/src/kernel/plane.c @@ -25,7 +25,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "faction.h" /* util includes */ -#include +#include #include #include #include diff --git a/src/kernel/race.c b/src/kernel/race.c index ecdb7ae3d..31d437992 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -37,7 +37,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "unit.h" /* util includes */ -#include +#include #include #include #include diff --git a/src/kernel/region.c b/src/kernel/region.c index 29f7222e1..377bf1e22 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -42,8 +42,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include -#include +#include +#include #include #include #include diff --git a/src/kernel/save.c b/src/kernel/save.c index e7cb90d2a..cdc951fad 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -57,13 +57,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include +#include #include -#include +#include #include -#include +#include #include -#include +#include #include #include #include @@ -101,9 +101,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* exported symbols symbols */ int firstx = 0, firsty = 0; -/* TODO: is this still important? */ -int enc_gamedata = ENCODING_UTF8; - static void read_alliances(gamedata *data) { storage *store = data->store; diff --git a/src/kernel/save.test.c b/src/kernel/save.test.c index d9ba52862..8e738863f 100644 --- a/src/kernel/save.test.c +++ b/src/kernel/save.test.c @@ -17,10 +17,10 @@ #include #include #include -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/kernel/ship.c b/src/kernel/ship.c index 4719945b0..6fcea4935 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -34,12 +34,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "skill.h" /* util includes */ -#include +#include #include -#include +#include #include #include #include +#include #include #include diff --git a/src/kernel/ship.test.c b/src/kernel/ship.test.c index 074876dd5..c50fdfa8d 100644 --- a/src/kernel/ship.test.c +++ b/src/kernel/ship.test.c @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include diff --git a/src/kernel/skills.c b/src/kernel/skills.c index a15fb4463..ea2022872 100644 --- a/src/kernel/skills.c +++ b/src/kernel/skills.c @@ -24,7 +24,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "region.h" #include "unit.h" -#include +#include #include #include #include diff --git a/src/kernel/spellbook.c b/src/kernel/spellbook.c index 868f9757c..d230992cf 100644 --- a/src/kernel/spellbook.c +++ b/src/kernel/spellbook.c @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include "spellbook.h" diff --git a/src/kernel/terrain.c b/src/kernel/terrain.c index c7e007891..bec8fa8e8 100644 --- a/src/kernel/terrain.c +++ b/src/kernel/terrain.c @@ -30,7 +30,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "terrainid.h" #include -#include +#include #include /* libc includes */ diff --git a/src/kernel/types.h b/src/kernel/types.h index 48a4326fa..d4f46ae8d 100644 --- a/src/kernel/types.h +++ b/src/kernel/types.h @@ -83,58 +83,6 @@ typedef enum { ST_FLEE } status_t; -/* ----------------- Parameter --------------------------------- */ - -typedef enum { - P_LOCALE, - P_ANY, - P_EACH, - P_PEASANT, - P_BUILDING, - P_UNIT, - P_PRIVAT, - P_BEHIND, - P_CONTROL, - P_HERBS, - P_NOT, - P_NEXT, - P_FACTION, - P_GAMENAME, - P_PERSON, - P_REGION, - P_SHIP, - P_MONEY, - P_ROAD, - P_TEMP, - P_FLEE, - P_GEBAEUDE, - P_GIVE, - P_FIGHT, - P_TRAVEL, - P_GUARD, - P_ZAUBER, - P_PAUSE, - P_VORNE, - P_AGGRO, - P_CHICKEN, - P_LEVEL, - P_HELP, - P_FOREIGN, - P_AURA, - P_AFTER, - P_BEFORE, - P_NUMBER, - P_ITEMS, - P_POTIONS, - P_GROUP, - P_FACTIONSTEALTH, - P_TREES, - P_ALLIANCE, - P_AUTO, - MAXPARAMS, - NOPARAM -} param_t; - typedef enum { /* Fehler und Meldungen im Report */ MSG_BATTLE, MSG_EVENT, @@ -156,8 +104,6 @@ enum { /* Message-Level */ ML_MAX }; -extern const char *parameters[MAXPARAMS]; - /* --------------- Reports Typen ------------------------------- */ enum { diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 30971310d..9b6c3e9ee 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -21,12 +21,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "unit.h" #include "ally.h" +#include "attrib.h" #include "building.h" #include "calendar.h" -#include "faction.h" -#include "group.h" #include "connection.h" #include "curse.h" +#include "event.h" +#include "faction.h" +#include "gamedata.h" +#include "group.h" +#include "guard.h" #include "item.h" #include "move.h" #include "order.h" @@ -47,18 +51,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include "guard.h" - /* util includes */ -#include #include -#include -#include -#include #include #include #include #include +#include #include #include #include diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 4b0ba2af6..29596f866 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/laws.c b/src/laws.c index d9e05917a..7e2250a59 100644 --- a/src/laws.c +++ b/src/laws.c @@ -29,7 +29,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "automate.h" #include "battle.h" #include "economy.h" -#include "keyword.h" #include "market.h" #include "morale.h" #include "monsters.h" @@ -71,15 +70,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/unit.h" /* util includes */ -#include +#include #include -#include +#include #include +#include "util/keyword.h" #include #include #include #include #include +#include #include #include #include @@ -127,7 +128,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define DMRISE 0.1F /* weekly chance that demand goes up */ #define DMRISEHAFEN 0.2F /* weekly chance that demand goes up with harbor */ -/* - exported global symbols ----------------------------------- */ +param_t findparam_ex(const char *s, const struct locale * lang) +{ + param_t result = findparam(s, lang); + + if (result == NOPARAM) { + const building_type *btype = findbuildingtype(s, lang); + if (btype != NULL) + return P_GEBAEUDE; + } + return (result == P_BUILDING) ? P_GEBAEUDE : result; +} int NewbieImmunity(void) { @@ -1952,7 +1963,7 @@ int mail_cmd(unit * u, struct order *ord) } case P_FACTION: - n = getfactionid(); + n = getid(); for (u2 = r->units; u2; u2 = u2->next) { if (u2->faction->no == n && seefaction(u->faction, r, u2, 0)) { diff --git a/src/laws.h b/src/laws.h index 383b099ae..c30479b38 100755 --- a/src/laws.h +++ b/src/laws.h @@ -19,13 +19,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef H_GC_LAWS #define H_GC_LAWS -#include #include #ifdef __cplusplus extern "C" { #endif + enum param_t; + struct locale; struct unit; struct region; struct building; @@ -115,6 +116,8 @@ extern "C" { bool IsImmune(const struct faction *f); bool help_enter(struct unit *uo, struct unit *u); + enum param_t findparam_ex(const char *s, const struct locale * lang); + #ifdef __cplusplus } #endif diff --git a/src/laws.test.c b/src/laws.test.c index 778ee3323..e7951a7ce 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -20,10 +20,11 @@ #include #include -#include +#include #include #include #include +#include #include #include @@ -391,6 +392,27 @@ static void test_unit_limit(CuTest * tc) test_teardown(); } +static void test_findparam_ex(CuTest *tc) +{ + struct locale *lang; + + test_setup(); + lang = test_create_locale(); + locale_setstring(lang, "temple", "TEMPEL"); + test_create_buildingtype("temple"); + + CuAssertIntEquals(tc, P_GEBAEUDE, findparam_ex("TEMPEL", lang)); + CuAssertIntEquals(tc, P_GEBAEUDE, findparam_ex( + locale_string(lang, parameters[P_BUILDING], false), lang)); + CuAssertIntEquals(tc, P_SHIP, findparam_ex( + locale_string(lang, parameters[P_SHIP], false), lang)); + CuAssertIntEquals(tc, P_FACTION, findparam_ex( + locale_string(lang, parameters[P_FACTION], false), lang)); + CuAssertIntEquals(tc, P_UNIT, findparam_ex( + locale_string(lang, parameters[P_UNIT], false), lang)); + test_teardown(); +} + static void test_maketemp(CuTest * tc) { faction *f; @@ -1761,6 +1783,7 @@ CuSuite *get_laws_suite(void) CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_maketemp_default_order); SUITE_ADD_TEST(suite, test_maketemp); + SUITE_ADD_TEST(suite, test_findparam_ex); SUITE_ADD_TEST(suite, test_nmr_warnings); SUITE_ADD_TEST(suite, test_ally_cmd); SUITE_ADD_TEST(suite, test_name_cmd); diff --git a/src/lighthouse.c b/src/lighthouse.c index 4ef830cfc..c6c7b9915 100644 --- a/src/lighthouse.c +++ b/src/lighthouse.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/lighthouse.test.c b/src/lighthouse.test.c index d9accd49e..9dc6d2999 100644 --- a/src/lighthouse.test.c +++ b/src/lighthouse.test.c @@ -2,7 +2,7 @@ #include "lighthouse.h" -#include +#include #include #include #include diff --git a/src/magic.c b/src/magic.c index 7464e286d..99a9ecf86 100644 --- a/src/magic.c +++ b/src/magic.c @@ -62,14 +62,15 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include #include +#include #include #include #include diff --git a/src/magic.test.c b/src/magic.test.c index 95c2d250d..1b64cdf53 100644 --- a/src/magic.test.c +++ b/src/magic.test.c @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include diff --git a/src/market.c b/src/market.c index 87be18f95..0bd2fd647 100644 --- a/src/market.c +++ b/src/market.c @@ -16,7 +16,7 @@ without prior permission by the authors of Eressea. #include -#include +#include #include #include diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index 88240d0b3..65585441c 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -31,7 +31,7 @@ #include /* util includes */ -#include +#include #include #include #include diff --git a/src/modules/gmcmd.c b/src/modules/gmcmd.c index 20e090114..4cc573f16 100644 --- a/src/modules/gmcmd.c +++ b/src/modules/gmcmd.c @@ -32,8 +32,8 @@ #include /* util includes */ -#include -#include +#include +#include #include #include diff --git a/src/modules/museum.c b/src/modules/museum.c index 67ce12bd1..7e3a04f2d 100644 --- a/src/modules/museum.c +++ b/src/modules/museum.c @@ -38,10 +38,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include -#include +#include #include #include #include diff --git a/src/modules/xmas.c b/src/modules/xmas.c index b76f14eab..aa296866a 100644 --- a/src/modules/xmas.c +++ b/src/modules/xmas.c @@ -25,10 +25,10 @@ #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include diff --git a/src/monsters.c b/src/monsters.c index d009f8bda..867d601c6 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -27,17 +27,18 @@ #include "give.h" #include "guard.h" #include "laws.h" -#include "keyword.h" #include "study.h" #include "move.h" /* kernel includes */ +#include "kernel/attrib.h" #include "kernel/build.h" #include "kernel/building.h" #include "kernel/calendar.h" #include "kernel/config.h" #include "kernel/curse.h" #include "kernel/equipment.h" +#include "kernel/event.h" #include "kernel/faction.h" #include "kernel/item.h" #include "kernel/messages.h" @@ -52,10 +53,9 @@ #include "kernel/unit.h" /* util includes */ -#include #include -#include -#include +#include "util/keyword.h" +#include "util/language.h" #include #include #include diff --git a/src/monsters.test.c b/src/monsters.test.c index 54b3f7f87..4ea3a32a3 100644 --- a/src/monsters.test.c +++ b/src/monsters.test.c @@ -18,7 +18,7 @@ #include "skill.h" #include "study.h" -#include +#include #include #include #include diff --git a/src/move.c b/src/move.c index 63453d970..222588651 100644 --- a/src/move.c +++ b/src/move.c @@ -23,6 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* kernel includes */ #include "kernel/ally.h" +#include "kernel/attrib.h" #include "kernel/build.h" #include "kernel/building.h" #include "kernel/calendar.h" @@ -30,6 +31,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/connection.h" #include "kernel/curse.h" #include "kernel/faction.h" +#include "kernel/gamedata.h" #include "kernel/item.h" #include "kernel/messages.h" #include "kernel/order.h" @@ -72,13 +74,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include #include -#include #include #include #include #include +#include #include #include #include @@ -2265,7 +2266,7 @@ int follow_ship(unit * u, order * ord) return 0; } - id = getshipid(); + id = getid(); if (id <= 0) { cmistake(u, ord, 20, MSG_MOVE); @@ -2549,7 +2550,7 @@ void follow_unit(unit * u) } } else if (p == P_SHIP) { - id = getshipid(); + id = getid(); if (id <= 0) { /* cmistake(u, ord, 20, MSG_MOVE); */ } diff --git a/src/move.test.c b/src/move.test.c index f01915e2a..e782bb748 100644 --- a/src/move.test.c +++ b/src/move.test.c @@ -2,12 +2,12 @@ #include #include "move.h" -#include "keyword.h" #include "lighthouse.h" -#include +#include #include #include +#include #include #include #include @@ -17,7 +17,7 @@ #include #include -#include +#include "util/keyword.h" #include #include #include diff --git a/src/orderdb.c b/src/orderdb.c new file mode 100644 index 000000000..42248c0ef --- /dev/null +++ b/src/orderdb.c @@ -0,0 +1,43 @@ +#include + +#include "kernel/config.h" +#include "kernel/db/driver.h" + +#include "orderdb.h" + +#include + +#include + +#include +#include +#include + +void orderdb_open(void) +{ + const char *dbname; + + dbname = config_get("game.dbswap"); + db_driver_open(DB_SWAP, dbname); +} + +void orderdb_close(void) +{ + db_driver_close(DB_SWAP); +} + +order_data *odata_load(int id) +{ + if (id > 0) { + return db_driver_order_load(id); + } + return NULL; +} + +int odata_save(order_data *od) +{ + if (od->_str) { + return db_driver_order_save(od->_str); + } + return 0; +} diff --git a/src/orderdb.h b/src/orderdb.h new file mode 100644 index 000000000..cc809b1a6 --- /dev/null +++ b/src/orderdb.h @@ -0,0 +1,25 @@ +#ifndef H_ORDERDB +#define H_ORDERDB + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct order_data { + const char *_str; + int _refcount; + } order_data; + + void odata_create(order_data **pdata, size_t len, const char *str); + void odata_release(order_data * od); + void odata_addref(order_data *od); + + void orderdb_open(void); + void orderdb_close(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/kernel/orderdb.test.c b/src/orderdb.test.c similarity index 100% rename from src/kernel/orderdb.test.c rename to src/orderdb.test.c diff --git a/src/orderfile.c b/src/orderfile.c index 9771b7e14..90b44477b 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -1,5 +1,4 @@ #include -#include #include "orderfile.h" #include "kernel/calendar.h" @@ -8,17 +7,46 @@ #include "kernel/order.h" #include "kernel/unit.h" -#include -#include -#include -#include -#include -#include +#include "util/base36.h" +#include "util/message.h" +#include "util/language.h" +#include "util/log.h" +#include "util/filereader.h" +#include "util/param.h" +#include "util/parser.h" +#include "util/order_parser.h" #include +#include #include #include +static void begin_orders(unit *u) { + if (u->flags & UFL_ORDERS) { + order **ordp; + /* alle wiederholbaren, langen befehle werden gesichert: */ + u->flags |= UFL_ORDERS; + u->old_orders = u->orders; + ordp = &u->old_orders; + while (*ordp) { + order *ord = *ordp; + keyword_t kwd = getkeyword(ord); + if (!is_repeated(kwd)) { + *ordp = ord->next; + ord->next = NULL; + free_order(ord); + } + else { + ordp = &ord->next; + } + } + } + else { + free_orders(&u->orders); + } + u->orders = NULL; +} + static unit *unitorders(input *in, faction *f) { int i; @@ -33,29 +61,7 @@ static unit *unitorders(input *in, faction *f) if (u && u->faction == f) { order **ordp; - if (!fval(u, UFL_ORDERS)) { - /* alle wiederholbaren, langen befehle werden gesichert: */ - fset(u, UFL_ORDERS); - u->old_orders = u->orders; - ordp = &u->old_orders; - while (*ordp) { - order *ord = *ordp; - keyword_t kwd = getkeyword(ord); - if (!is_repeated(kwd)) { - *ordp = ord->next; - ord->next = NULL; - free_order(ord); - } - else { - ordp = &ord->next; - } - } - } - else { - free_orders(&u->orders); - } - u->orders = 0; - + begin_orders(u); ordp = &u->orders; for (;;) { @@ -125,7 +131,7 @@ static faction *factionorders(void) int fid = getid(); faction *f = findfaction(fid); - if (f != NULL && !fval(f, FFL_NPC)) { + if (f != NULL && (f->flags & FFL_NPC) == 0) { char token[128]; const char *pass = gettoken(token, sizeof(token)); @@ -223,23 +229,143 @@ int read_orders(input *in) static const char * file_getbuf(void *data) { FILE *F = (FILE *)data; - return getbuf(F, ENCODING_UTF8); + return getbuf(F); } -int readorders(const char *filename) -{ - input in; - int result; - FILE *F = fopen(filename, "r"); +typedef struct parser_state { + unit *u; + faction *f; + order **next_order; +} parser_state; - if (!F) { - perror(filename); - return -1; +static void handle_faction(void *userData, int no, const char *password) { + parser_state *state = (parser_state *)userData; + faction * f = state->f = findfaction(no); + if (!f) { + log_debug("orders for unknown faction %s", itoa36(no)); } - log_info("reading orders from %s", filename); + else { + if (checkpasswd(f, password)) { + f->lastorders = turn; + } + else { + log_debug("invalid password for faction %s", itoa36(no)); + ADDMSG(&f->msgs, msg_message("wrongpasswd", "password", password)); + } + state->u = NULL; + state->next_order = NULL; + } +} + +static void handle_unit(void *userData, int no) { + parser_state *state = (parser_state *)userData; + unit * u = findunit(no); + + state->u = NULL; + if (!u) { + /* TODO: error message */ + } + else if (u->faction != state->f) { + /* TODO: error message */ + } + else { + state->u = u; + begin_orders(u); + state->next_order = &u->orders; + } +} + +static void handle_order(void *userData, const char *str) { + parser_state *state = (parser_state *)userData; + const char * tok, *input = str; + char buffer[16]; + const struct locale *lang; + param_t p; + faction * f = state->f; + + lang = f ? f->locale : default_locale; + tok = parse_token(&input, buffer, sizeof(buffer)); + p = findparam(tok, lang); + if (p == P_FACTION || p == P_GAMENAME) { + tok = parse_token(&input, buffer, sizeof(buffer)); + if (tok) { + int no = atoi36(tok); + tok = parse_token(&input, buffer, sizeof(buffer)); + handle_faction(userData, no, tok); + } + else { + /* TODO: log_error() */ + } + } + else if (p == P_UNIT) { + tok = parse_token(&input, buffer, sizeof(buffer)); + if (tok) { + int no = atoi36(tok); + handle_unit(userData, no); + } + } + else if (p == P_NEXT) { + state->f = NULL; + state->u = NULL; + state->next_order = NULL; + } + else if (p == P_REGION) { + state->u = NULL; + state->next_order = NULL; + } + else if (state->u) { + unit * u = state->u; + order * ord = parse_order(str, lang); + if (ord) { + *state->next_order = ord; + state->next_order = &ord->next; + } + else { + ADDMSG(&u->faction->msgs, msg_message("parse_error", "unit command", u, str)); + } + } +} + +int parseorders(FILE *F) +{ + char buf[4096]; + int done = 0, err = 0; + OP_Parser parser; + parser_state state = { NULL, NULL }; + + parser = OP_ParserCreate(); + if (!parser) { + /* TODO: error message */ + return errno; + } + OP_SetOrderHandler(parser, handle_order); + OP_SetUserData(parser, &state); + + while (!done) { + size_t len = (int)fread(buf, 1, sizeof(buf), F); + if (ferror(F)) { + /* TODO: error message */ + err = errno; + break; + } + done = feof(F); + if (OP_Parse(parser, buf, len, done) == OP_STATUS_ERROR) { + /* TODO: error message */ + err = (int)OP_GetErrorCode(parser); + break; + } + } + OP_ParserFree(parser); + return err; +} + +int readorders(FILE *F) +{ + int result; + + input in; in.getbuf = file_getbuf; in.data = F; result = read_orders(&in); - fclose(F); return result; } diff --git a/src/orderfile.h b/src/orderfile.h index 43b86042e..f4260aa67 100644 --- a/src/orderfile.h +++ b/src/orderfile.h @@ -1,7 +1,7 @@ #ifndef H_ORDERFILE #define H_ORDERFILE -#include +#include #ifdef __cplusplus extern "C" { @@ -13,7 +13,8 @@ extern "C" { } input; int read_orders(struct input *in); - int readorders(const char *filename); + int readorders(FILE *F); + int parseorders(FILE *F); #ifdef __cplusplus } diff --git a/src/piracy.c b/src/piracy.c index 46977c3d8..b7307c070 100644 --- a/src/piracy.c +++ b/src/piracy.c @@ -2,10 +2,10 @@ #include "piracy.h" #include "direction.h" -#include "keyword.h" #include "move.h" #include +#include #include #include #include @@ -15,9 +15,9 @@ #include #include -#include #include #include +#include "util/keyword.h" #include #include #include diff --git a/src/platform.h b/src/platform.h index fdc3760f9..7b52782e3 100644 --- a/src/platform.h +++ b/src/platform.h @@ -4,8 +4,6 @@ #define _LP64 0 /* fix a warning in pdcurses 3.4 */ #endif -#ifdef _MSC_VER - /* @see https://developercommunity.visualstudio.com/content/problem/69874/warning-c4001-in-standard-library-stringh-header.html */ #if _MSC_VER >= 1900 #pragma warning(disable: 4710 4820 4001) @@ -17,10 +15,5 @@ #pragma warning(disable: 4214) // bit field types other than int #endif -/* @see https://insanecoding.blogspot.no/2007/11/pathmax-simply-isnt.html */ -#define PATH_MAX 260 - -#endif - #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) diff --git a/src/races/races.c b/src/races/races.c index 44ca5d95e..7eede1b38 100644 --- a/src/races/races.c +++ b/src/races/races.c @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include diff --git a/src/randenc.c b/src/randenc.c index 820d3760f..79998c14b 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -56,7 +56,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/unit.h" /* util includes */ -#include "util/attrib.h" +#include "kernel/attrib.h" #include "util/language.h" #include "util/lists.h" #include "util/log.h" diff --git a/src/renumber.c b/src/renumber.c index 45ee0cccc..a4653e1a0 100644 --- a/src/renumber.c +++ b/src/renumber.c @@ -1,6 +1,9 @@ #include #include "renumber.h" +#include "laws.h" + +#include #include #include #include @@ -9,8 +12,8 @@ #include #include -#include #include +#include #include #include diff --git a/src/renumber.test.c b/src/renumber.test.c index 98ca9b48b..8d44b92da 100644 --- a/src/renumber.test.c +++ b/src/renumber.test.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include diff --git a/src/report.c b/src/report.c index 29f124cef..1d40941c4 100644 --- a/src/report.c +++ b/src/report.c @@ -19,7 +19,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef _MSC_VER #include #endif -#include #include "report.h" #include "reports.h" @@ -50,8 +49,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "teleport.h" /* kernel includes */ +#include "kernel/alliance.h" #include "kernel/ally.h" +#include "kernel/attrib.h" #include "kernel/calendar.h" +#include "kernel/config.h" #include "kernel/connection.h" #include "kernel/build.h" #include "kernel/building.h" @@ -74,10 +76,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/terrain.h" #include "kernel/terrainid.h" #include "kernel/unit.h" -#include "kernel/alliance.h" /* util includes */ -#include #include #include "util/bsdstring.h" #include @@ -86,6 +86,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include "util/param.h" #include #include diff --git a/src/report.test.c b/src/report.test.c index 4fa97825c..3c49b14fc 100644 --- a/src/report.test.c +++ b/src/report.test.c @@ -2,7 +2,6 @@ #include "report.h" #include "move.h" #include "travelthru.h" -#include "keyword.h" #include #include @@ -15,6 +14,8 @@ #include #include +#include "util/keyword.h" +#include "util/param.h" #include #include #include diff --git a/src/reports.c b/src/reports.c index 25c331a9f..879e7ad3d 100644 --- a/src/reports.c +++ b/src/reports.c @@ -62,7 +62,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/unit.h" /* util includes */ -#include "util/attrib.h" +#include "kernel/attrib.h" #include "util/base36.h" #include "util/bsdstring.h" #include "util/functions.h" diff --git a/src/reports.test.c b/src/reports.test.c index 65b5b06b0..0f5ca6b1f 100644 --- a/src/reports.test.c +++ b/src/reports.test.c @@ -2,7 +2,7 @@ #include "reports.h" #include "guard.h" -#include "keyword.h" +#include "util/keyword.h" #include "lighthouse.h" #include "laws.h" #include "move.h" @@ -25,7 +25,7 @@ #include "kernel/spellbook.h" #include "kernel/terrain.h" -#include "util/attrib.h" +#include "kernel/attrib.h" #include "util/language.h" #include "util/lists.h" #include "util/message.h" diff --git a/src/skill.c b/src/skill.c index b279ab488..3d91a2598 100644 --- a/src/skill.c +++ b/src/skill.c @@ -5,6 +5,8 @@ #include #include #include +#include + #include #include diff --git a/src/spells.c b/src/spells.c index 02cbe43b5..00f256f26 100644 --- a/src/spells.c +++ b/src/spells.c @@ -70,10 +70,10 @@ /* util includes */ #include -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/spells.test.c b/src/spells.test.c index e6150cb46..5950fab16 100644 --- a/src/spells.test.c +++ b/src/spells.test.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/spells/borders.c b/src/spells/borders.c index c30726641..5d99b1307 100644 --- a/src/spells/borders.c +++ b/src/spells/borders.c @@ -13,8 +13,8 @@ #include #include -#include -#include +#include +#include #include #include #include diff --git a/src/spells/combatspells.c b/src/spells/combatspells.c index 06a78c4f4..6d6b846c3 100644 --- a/src/spells/combatspells.c +++ b/src/spells/combatspells.c @@ -36,7 +36,7 @@ #include /* util includes */ -#include +#include #include #include #include diff --git a/src/spells/flyingship.c b/src/spells/flyingship.c index e23f6906b..2b830da2e 100644 --- a/src/spells/flyingship.c +++ b/src/spells/flyingship.c @@ -11,7 +11,7 @@ #include #include -#include +#include #include diff --git a/src/spells/magicresistance.test.c b/src/spells/magicresistance.test.c index cbfdeb4af..390134c56 100644 --- a/src/spells/magicresistance.test.c +++ b/src/spells/magicresistance.test.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include "spells.h" diff --git a/src/spells/unitcurse.c b/src/spells/unitcurse.c index a99eb082c..d0b381050 100644 --- a/src/spells/unitcurse.c +++ b/src/spells/unitcurse.c @@ -23,7 +23,7 @@ #include /* util includes */ -#include +#include #include #include #include diff --git a/src/spy.c b/src/spy.c index 9dc9de35a..53a5b4321 100644 --- a/src/spy.c +++ b/src/spy.c @@ -27,6 +27,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "study.h" /* kernel includes */ +#include #include #include #include @@ -44,8 +45,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include #include +#include #include #include #include diff --git a/src/spy.test.c b/src/spy.test.c index d8b879e3f..d1f616fab 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -11,9 +11,11 @@ #include #include #include -#include +#include + #include #include +#include "util/param.h" #include #include diff --git a/src/study.c b/src/study.c index c978e69ad..ff961dc13 100644 --- a/src/study.c +++ b/src/study.c @@ -32,6 +32,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include +#include #include #include #include @@ -46,10 +47,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include #include #include #include +#include #include #include #include diff --git a/src/study.test.c b/src/study.test.c index a63be7cf1..3a94bf810 100644 --- a/src/study.test.c +++ b/src/study.test.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/test_eressea.c b/src/test_eressea.c index d91c225ae..9897c4bf0 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -82,6 +81,7 @@ int RunAllTests(int argc, char *argv[]) ADD_SUITE(functions); ADD_SUITE(gamedata); ADD_SUITE(language); + ADD_SUITE(order_parser); ADD_SUITE(parser); ADD_SUITE(password); ADD_SUITE(umlaut); diff --git a/src/tests.c b/src/tests.c index 2dc5bccc6..cad296e57 100644 --- a/src/tests.c +++ b/src/tests.c @@ -1,11 +1,10 @@ #include #include "tests.h" -#include "keyword.h" #include "prefix.h" #include "reports.h" -#include "kernel/calendar.h" #include "vortex.h" +#include "kernel/calendar.h" #include #include #include @@ -24,11 +23,14 @@ #include #include #include + #include +#include "util/keyword.h" #include #include #include #include +#include "util/param.h" #include #include @@ -418,7 +420,9 @@ building_type * test_create_buildingtype(const char * name) con->materials[0].rtype = get_resourcetype(R_STONE); } if (default_locale) { - locale_setstring(default_locale, name, name); + if (locale_getstring(default_locale, name) == NULL) { + locale_setstring(default_locale, name, name); + } } return btype; } diff --git a/src/tests.h b/src/tests.h index 441db9e16..0f3af1972 100644 --- a/src/tests.h +++ b/src/tests.h @@ -1,7 +1,6 @@ #ifndef ERESSEA_TESTS_H #define ERESSEA_TESTS_H -#include #include #ifdef __cplusplus @@ -10,6 +9,8 @@ extern "C" { #define ASSERT_DBL_DELTA 0.001 + enum param_t; + struct region; struct unit; struct faction; @@ -61,7 +62,7 @@ extern "C" { struct spell * test_create_spell(void); int test_set_item(struct unit * u, const struct item_type *itype, int value); - void test_translate_param(const struct locale *lang, param_t param, const char *text); + void test_translate_param(const struct locale *lang, enum param_t param, const char *text); const char * test_get_messagetype(const struct message *msg); struct message * test_find_messagetype_ex(struct message_list *msgs, const char *name, struct message *prev); struct message * test_find_messagetype(struct message_list *msgs, const char *name); diff --git a/src/travelthru.c b/src/travelthru.c index fa6293f53..5a1af28eb 100644 --- a/src/travelthru.c +++ b/src/travelthru.c @@ -27,7 +27,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include diff --git a/src/travelthru.test.c b/src/travelthru.test.c index 8a38891b1..b4f0e3dca 100644 --- a/src/travelthru.test.c +++ b/src/travelthru.test.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include "travelthru.h" diff --git a/src/triggers/changefaction.c b/src/triggers/changefaction.c index f34cb98bd..8aa73168d 100644 --- a/src/triggers/changefaction.c +++ b/src/triggers/changefaction.c @@ -24,10 +24,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/changerace.c b/src/triggers/changerace.c index abc605c35..5a834314a 100644 --- a/src/triggers/changerace.c +++ b/src/triggers/changerace.c @@ -24,10 +24,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/clonedied.c b/src/triggers/clonedied.c index 62c4c3343..c6593c2a4 100644 --- a/src/triggers/clonedied.c +++ b/src/triggers/clonedied.c @@ -26,10 +26,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/createcurse.c b/src/triggers/createcurse.c index bd7422587..544b9aafe 100644 --- a/src/triggers/createcurse.c +++ b/src/triggers/createcurse.c @@ -24,10 +24,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/createunit.c b/src/triggers/createunit.c index f152d3766..d4dd8f983 100644 --- a/src/triggers/createunit.c +++ b/src/triggers/createunit.c @@ -26,10 +26,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/gate.c b/src/triggers/gate.c index 4c2c7a9cd..065be8cf8 100644 --- a/src/triggers/gate.c +++ b/src/triggers/gate.c @@ -18,9 +18,9 @@ #include /* util includes */ -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/triggers/giveitem.c b/src/triggers/giveitem.c index 08e4f0147..118497c86 100644 --- a/src/triggers/giveitem.c +++ b/src/triggers/giveitem.c @@ -24,10 +24,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/killunit.c b/src/triggers/killunit.c index bca630177..0338da4af 100644 --- a/src/triggers/killunit.c +++ b/src/triggers/killunit.c @@ -23,10 +23,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/shock.c b/src/triggers/shock.c index 7eae6f31a..9a9d1c74b 100644 --- a/src/triggers/shock.c +++ b/src/triggers/shock.c @@ -29,10 +29,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/shock.test.c b/src/triggers/shock.test.c index 43b8d394b..4bbd4de88 100644 --- a/src/triggers/shock.test.c +++ b/src/triggers/shock.test.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include diff --git a/src/triggers/timeout.c b/src/triggers/timeout.c index 5179bd832..8e8a6b9bf 100644 --- a/src/triggers/timeout.c +++ b/src/triggers/timeout.c @@ -20,9 +20,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "timeout.h" /* util includes */ -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/triggers/triggers.c b/src/triggers/triggers.c index 8826fcba2..13504f216 100644 --- a/src/triggers/triggers.c +++ b/src/triggers/triggers.c @@ -31,7 +31,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include /* libc includes */ #include diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index 90059666a..362ee4fb2 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -3,21 +3,21 @@ project(util C) add_subdirectory (crypto) SET(_TEST_FILES -attrib.test.c base36.test.c # bsdstring.test.c # crmessage.test.c # dice.test.c -# event.test.c # filereader.test.c functions.test.c -gamedata.test.c # goodies.test.c +keyword.test.c language.test.c # lists.test.c # log.test.c message.test.c # nrmessage.test.c +order_parser.test.c +# param.test.c parser.test.c password.test.c # rand.test.c @@ -33,22 +33,22 @@ variant.test.c ) SET(_FILES -attrib.c base36.c bsdstring.c crmessage.c dice.c -event.c filereader.c functions.c -gamedata.c goodies.c +keyword.c language.c lists.c log.c message.c mt19937ar.c nrmessage.c +order_parser.c +param.c parser.c password.c path.c diff --git a/src/util/filereader.c b/src/util/filereader.c index e477b445c..5ead2166f 100644 --- a/src/util/filereader.c +++ b/src/util/filereader.c @@ -39,150 +39,6 @@ static int eatwhite(const char *ptr, size_t * total_size) return ret; } -static const char *getbuf_latin1(FILE * F) -{ - bool cont = false; - char quote = 0; - bool comment = false; - char *cp = fbuf; - char *tail = lbuf + MAXLINE - 2; - - tail[1] = '@'; /* if this gets overwritten by fgets then the line was very long. */ - do { - const char *bp = fgets(lbuf, MAXLINE, F); - - if (bp == NULL) - return NULL; - while (*bp && isspace(*(unsigned char *)bp)) - ++bp; /* eatwhite */ - - comment = (bool)(comment && cont); - quote = (bool)(quote && cont); - - if (tail[1] == 0) { - /* we read he maximum number of bytes! */ - if (tail[0] != '\n') { - /* it wasn't enough space to finish the line, eat the rest */ - for (;;) { - tail[1] = '@'; - bp = fgets(lbuf, MAXLINE, F); - if (bp == NULL) - return NULL; - if (tail[1]) { - /* read enough this time to end the line */ - break; - } - } - comment = false; - cont = false; - bp = NULL; - continue; - } - else { - tail[1] = '@'; - } - } - cont = false; - while (*bp && cp < fbuf + MAXLINE) { - int c = *(unsigned char *)bp; - - if (c == '\n' || c == '\r') { - /* line breaks, shmine breaks */ - break; - } - if (c == COMMENT_CHAR && !quote) { - /* comment begins. we need to keep going, to look for CONTINUE_CHAR */ - comment = true; - ++bp; - continue; - } - if (!comment && (c == '"' || c == '\'')) { - if (quote == c) { - quote = 0; - if (cp < fbuf + MAXLINE) - *cp++ = *bp; - ++bp; - continue; - } - else if (!quote) { - quote = *bp++; - if (cp < fbuf + MAXLINE) - *cp++ = quote; - continue; - } - } - - if (iscntrl(c)) { - if (!comment && cp < fbuf + MAXLINE) { - *cp++ = isspace(c) ? ' ' : '?'; - } - ++bp; - continue; - } - else if (isspace(c)) { - if (!quote) { - ++bp; - while (*bp && isspace(*(unsigned char *)bp)) - ++bp; /* eatwhite */ - if (!comment && *bp && *bp != COMMENT_CHAR && cp < fbuf + MAXLINE) - *(cp++) = ' '; - } - else if (!comment && cp + 1 <= fbuf + MAXLINE) { - *(cp++) = *(bp++); - } - else { - ++bp; - } - continue; - } - else if (c == CONTINUE_CHAR) { - const char *handle_end = ++bp; - while (*handle_end && isspace(*(unsigned char *)handle_end)) - ++handle_end; /* eatwhite */ - if (*handle_end == '\0') { - bp = handle_end; - cont = true; - continue; - } - if (comment) { - ++bp; - continue; - } - } - else if (comment) { - ++bp; - continue; - } - - if (c < 0x80) { - if (cp + 1 <= fbuf + MAXLINE) { - *(cp++) = *(bp++); - } - } - else { - char inbuf = (char)c; - size_t inbytes = 1; - size_t outbytes = MAXLINE - (cp - fbuf); - int ret = unicode_latin1_to_utf8(cp, &outbytes, &inbuf, &inbytes); - if (ret > 0) - cp += ret; - else { - log_error("input data was not iso-8859-1! assuming utf-8\n"); - return NULL; - } - - ++bp; - continue; - } - } - if (cp == fbuf + MAXLINE) { - --cp; - } - *cp = 0; - } while (cont || cp == fbuf); - return fbuf; -} - static const char *getbuf_utf8(FILE * F) { bool cont = false; @@ -336,9 +192,7 @@ static const char *getbuf_utf8(FILE * F) return fbuf; } -const char *getbuf(FILE * F, int encoding) +const char *getbuf(FILE * F) { - if (encoding == ENCODING_UTF8) - return getbuf_utf8(F); - return getbuf_latin1(F); + return getbuf_utf8(F); } diff --git a/src/util/filereader.h b/src/util/filereader.h index eb09d14e1..a80afa65f 100644 --- a/src/util/filereader.h +++ b/src/util/filereader.h @@ -15,10 +15,7 @@ extern "C" { #endif -#define ENCODING_UTF8 0 -#define ENCODING_LATIN1 1 - - const char *getbuf(FILE *, int encoding); + const char *getbuf(FILE *); #ifdef __cplusplus } diff --git a/src/keyword.c b/src/util/keyword.c similarity index 100% rename from src/keyword.c rename to src/util/keyword.c diff --git a/src/keyword.h b/src/util/keyword.h similarity index 98% rename from src/keyword.h rename to src/util/keyword.h index bd4ab02d0..7bb11c485 100644 --- a/src/keyword.h +++ b/src/util/keyword.h @@ -1,7 +1,6 @@ #ifndef H_KEYWORD_H #define H_KEYWORD_H -#include "kernel/types.h" #include #ifdef __cplusplus diff --git a/src/keyword.test.c b/src/util/keyword.test.c similarity index 100% rename from src/keyword.test.c rename to src/util/keyword.test.c diff --git a/src/util/language.c b/src/util/language.c index 77a7d2a4e..afc9d01d0 100644 --- a/src/util/language.c +++ b/src/util/language.c @@ -353,29 +353,20 @@ void *get_translation(const struct locale *lang, const char *str, int index) { return NULL; } -void locale_foreach(void(*callback)(const struct locale *, const char *)) { - const locale * lang; - for (lang = locales; lang; lang = lang->next) { - callback(lang, lang->name); - } -} - const char *localenames[] = { "de", "en", NULL }; -extern void init_locale(struct locale *lang); - static int locale_init = 0; -void init_locales(void) +void init_locales(locale_handler init) { locale * lang; if (locale_init) return; assert(locales); - for (lang = locales; lang; lang = lang->next) { - init_locale(lang); + for (lang = locales; lang; lang = nextlocale(lang)) { + init(lang); } locale_init = 1; } diff --git a/src/util/language.h b/src/util/language.h index f269a5f06..735fd4a95 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -39,7 +39,8 @@ extern "C" { /** managing multiple locales: **/ struct locale *get_locale(const char *name); struct locale *get_or_create_locale(const char *key); - void init_locales(void); + typedef void(*locale_handler)(struct locale *lang); + void init_locales(locale_handler callback); void free_locales(void); void reset_locales(void); @@ -57,7 +58,6 @@ extern "C" { void make_locales(const char *str); - void locale_foreach(void(*callback)(const struct locale *lang, const char *name)); void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt); #define LOC(lang, s) (lang?locale_string(lang, s, true):s) diff --git a/src/util/log.c b/src/util/log.c index 4b29332a8..b8549d60e 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -12,8 +12,9 @@ without prior permission by the authors of Eressea. #include #include "log.h" -#include "unicode.h" +#include "path.h" #include "strings.h" +#include "unicode.h" #include #include diff --git a/src/util/order_parser.c b/src/util/order_parser.c new file mode 100644 index 000000000..21268f163 --- /dev/null +++ b/src/util/order_parser.c @@ -0,0 +1,287 @@ +#ifdef _MSC_VER +#include +#endif + +#include "order_parser.h" + +#include +#include +#include +#include + +struct OrderParserStruct { + void *m_userData; + char *m_buffer; + char *m_bufferPtr; + size_t m_bufferSize; + const char *m_bufferEnd; + OP_OrderHandler m_orderHandler; + enum OP_Error m_errorCode; + int m_lineNumber; +}; + +enum OP_Error OP_GetErrorCode(OP_Parser parser) { + return parser->m_errorCode; +} + +void OP_SetOrderHandler(OP_Parser parser, OP_OrderHandler handler) { + parser->m_orderHandler = handler; +} + +void OP_SetUserData(OP_Parser parser, void *userData) { + parser->m_userData = userData; +} + +static void buffer_free(OP_Parser parser) +{ + /* TODO: recycle buffers, reduce mallocs. */ + free(parser->m_buffer); + parser->m_bufferSize = 0; + parser->m_bufferEnd = parser->m_bufferPtr = parser->m_buffer = NULL; +} + +void OP_ParserReset(OP_Parser parser) { + parser->m_lineNumber = 1; + buffer_free(parser); +} + + +OP_Parser OP_ParserCreate(void) +{ + OP_Parser parser = calloc(1, sizeof(struct OrderParserStruct)); + OP_ParserReset(parser); + return parser; +} + +void OP_ParserFree(OP_Parser parser) { + free(parser->m_buffer); + free(parser); +} + +static enum OP_Error buffer_append(OP_Parser parser, const char *s, int len) +{ + size_t total = len + 1; + size_t remain = parser->m_bufferEnd - parser->m_bufferPtr; + total += remain; + if (remain > 0) { + /* there is remaining data in the buffer, should we move it to the front? */ + if (total <= parser->m_bufferSize) { + /* reuse existing buffer */ + memmove(parser->m_buffer, parser->m_bufferPtr, remain); + memcpy(parser->m_buffer + remain, s, len); + parser->m_buffer[total - 1] = '\0'; + parser->m_bufferPtr = parser->m_buffer; + parser->m_bufferEnd = parser->m_bufferPtr + total - 1; + return OP_ERROR_NONE; + } + } + else if (parser->m_bufferPtr >= parser->m_bufferEnd) { + buffer_free(parser); + } + + if (parser->m_buffer == NULL) { + parser->m_bufferSize = len + 1; + parser->m_buffer = malloc(parser->m_bufferSize); + if (!parser->m_buffer) { + return OP_ERROR_NO_MEMORY; + } + memcpy(parser->m_buffer, s, len); + parser->m_buffer[len] = '\0'; + parser->m_bufferPtr = parser->m_buffer; + parser->m_bufferEnd = parser->m_buffer + len; + } + else { + char * buffer; + /* TODO: recycle buffers, reduce mallocs. */ + if (parser->m_bufferSize < total) { + parser->m_bufferSize = total; + buffer = malloc(parser->m_bufferSize); + if (!buffer) { + return OP_ERROR_NO_MEMORY; + } + memcpy(buffer, parser->m_bufferPtr, total - len - 1); + memcpy(buffer + total - len - 1, s, len); + free(parser->m_buffer); + parser->m_buffer = buffer; + } + else { + memcpy(parser->m_buffer, parser->m_bufferPtr, total - len); + memcpy(parser->m_buffer + total - len, s, len); + } + parser->m_buffer[total - 1] = '\0'; + parser->m_bufferPtr = parser->m_buffer; + parser->m_bufferEnd = parser->m_buffer + total - 1; + } + return OP_ERROR_NONE; +} + +static char *skip_spaces(char *pos) { + char *next; + for (next = pos; *next && *next != '\n'; ++next) { + wint_t wch = *(unsigned char *)next; + /* TODO: handle unicode whitespace */ + if (!iswspace(wch)) break; + } + return next; +} + +static enum OP_Error handle_line(OP_Parser parser) { + if (parser->m_orderHandler) { + char * str = skip_spaces(parser->m_bufferPtr); + if (*str) { + parser->m_orderHandler(parser->m_userData, str); + } + } + return OP_ERROR_NONE; +} + +static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) +{ + char * pos = strpbrk(parser->m_bufferPtr, "\\;\n"); + while (pos) { + enum OP_Error code; + size_t len = pos - parser->m_bufferPtr; + char *next; + int continue_comment = 0; + + switch (*pos) { + case '\n': + *pos = '\0'; + code = handle_line(parser); + ++parser->m_lineNumber; + if (code != OP_ERROR_NONE) { + parser->m_errorCode = code; + return OP_STATUS_ERROR; + } + parser->m_bufferPtr = pos + 1; + pos = strpbrk(parser->m_bufferPtr, "\\;\n"); + break; + case '\\': + /* if this is the last non-space before the line break, then lines need to be joined */ + next = skip_spaces(pos + 1); + if (*next == '\n') { + ptrdiff_t shift = (next + 1 - pos); + assert(shift > 0); + memmove(parser->m_bufferPtr + shift, parser->m_bufferPtr, len); + parser->m_bufferPtr += shift; + pos = strpbrk(next + 1, "\\;\n"); + ++parser->m_lineNumber; + } + else { + /* this is not multi-line input yet, so do nothing */ + if (pos[1] == '\0') { + /* end of available input */ + if (isFinal) { + /* input ends on a pointless backslash, kill it */ + pos[0] = '\0'; + pos = NULL; + } + else { + /* backslash is followed by data that we do not know */ + pos = NULL; + } + } + else { + pos = strpbrk(pos + 1, "\\;\n"); + } + } + break; + case ';': + /* the current line ends in a comment */ + *pos++ = '\0'; + handle_line(parser); + /* find the end of the comment so we can skip it. + * obs: multi-line comments are possible with a backslash. */ + do { + next = strpbrk(pos, "\\\n"); + if (next) { + if (*next == '\n') { + /* no more lines in this comment, we're done: */ + ++parser->m_lineNumber; + break; /* exit loop */ + } + else { + /* is this backslash the final character? */ + next = skip_spaces(next + 1); + if (*next == '\n') { + /* we have a multi-line comment! */ + pos = next + 1; + ++parser->m_lineNumber; + } + else if (*next == '\0') { + /* cannot find the EOL char yet, stream is dry. keep ; and \ */ + continue_comment = 2; + } + else { + /* keep looking for a backslash */ + pos = next; + } + } + } + } while (next && *next); + + if (!next) { + /* we exhausted the buffer before we finished the line */ + if (isFinal) { + /* this comment was at the end of the file, it just has no newline. done! */ + return OP_STATUS_OK; + } + else { + /* there is more of this line in the next buffer, save the semicolon */ + continue_comment = 1; + } + } + else { + if (*next) { + /* end comment parsing, begin parsing a new line */ + pos = next + 1; + continue_comment = 0; + } + else if (!continue_comment) { + /* reached end of input naturally, need more data to finish */ + continue_comment = 1; + } + } + + if (continue_comment) { + ptrdiff_t skip = parser->m_bufferEnd - parser->m_bufferPtr; + assert(skip >= continue_comment); + if (skip >= continue_comment) { + /* should always be true */ + parser->m_bufferPtr += (skip - continue_comment); + parser->m_bufferPtr[0] = ';'; + } + if (continue_comment == 2) { + parser->m_bufferPtr[1] = '\\'; + } + continue_comment = 0; + return OP_STATUS_OK; + } + /* continue the outer loop */ + parser->m_bufferPtr = pos; + pos = strpbrk(pos, "\\;\n"); + break; + default: + parser->m_errorCode = OP_ERROR_SYNTAX; + return OP_STATUS_ERROR; + } + } + if (isFinal && parser->m_bufferPtr < parser->m_bufferEnd) { + /* this line ends without a line break */ + handle_line(parser); + } + return OP_STATUS_OK; +} + +enum OP_Status OP_Parse(OP_Parser parser, const char *s, int len, int isFinal) +{ + enum OP_Error code; + + code = buffer_append(parser, s, len); + if (code != OP_ERROR_NONE) { + parser->m_errorCode = code; + return OP_STATUS_ERROR; + } + + return parse_buffer(parser, isFinal); +} diff --git a/src/util/order_parser.h b/src/util/order_parser.h new file mode 100644 index 000000000..159fd6594 --- /dev/null +++ b/src/util/order_parser.h @@ -0,0 +1,42 @@ +#pragma once +/* + * +-------------------+ Christian Schlittchen + * | | Enno Rehling + * | Eressea PBEM host | Katja Zedel + * | (c) 1998 - 2007 | + * | | This program may not be used, modified or distributed + * +-------------------+ without prior permission by the authors of Eressea. + * + */ + +#ifndef UTIL_ORDER_PARSER_H +#define UTIL_ORDER_PARSER_H + +#include +#include + +struct OrderParserStruct; +typedef struct OrderParserStruct *OP_Parser; + +enum OP_Status { + OP_STATUS_ERROR = 0, + OP_STATUS_OK = 1 +}; + +enum OP_Error { + OP_ERROR_NONE, + OP_ERROR_NO_MEMORY, + OP_ERROR_SYNTAX +}; + +typedef void(*OP_OrderHandler) (void *userData, const char *str); + +OP_Parser OP_ParserCreate(void); +void OP_ParserFree(OP_Parser parser); +void OP_ParserReset(OP_Parser parser); +enum OP_Status OP_Parse(OP_Parser parser, const char *s, int len, int isFinal); +void OP_SetOrderHandler(OP_Parser parser, OP_OrderHandler handler); +void OP_SetUserData(OP_Parser parser, void *userData); +enum OP_Error OP_GetErrorCode(OP_Parser parser); + +#endif diff --git a/src/util/order_parser.test.c b/src/util/order_parser.test.c new file mode 100644 index 000000000..d43f661fb --- /dev/null +++ b/src/util/order_parser.test.c @@ -0,0 +1,132 @@ +#ifdef _MSC_VER +#include +#endif + +#include "order_parser.h" +#include "strings.h" + +#include + +#include + +static void test_parse_noop(CuTest *tc) { + OP_Parser parser; + parser = OP_ParserCreate(); + CuAssertPtrNotNull(tc, parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World", 11, 1)); + OP_ParserFree(parser); +} + +static void copy_line(void *udata, const char *str) { + char *dst = (char *)udata; + if (dst) { + strcpy(dst, str); + } +} + +static void test_parse_orders(CuTest *tc) { + OP_Parser parser; + char lastline[1024]; + + parser = OP_ParserCreate(); + OP_SetUserData(parser, lastline); + OP_SetOrderHandler(parser, copy_line); + CuAssertPtrNotNull(tc, parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World", 11, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Error;\nHello World", 18, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World;\\\nError", 19, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World;\\", 13, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nError", 6, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello \\", 7, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nWorld", 6, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World\n", 12, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\\\n World", 13, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello;World", 11, 1)); + CuAssertStrEquals(tc, "Hello", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\\World", 11, 1)); + CuAssertStrEquals(tc, "Hello\\World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, ";\n", 2, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World", 11, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, ";Hello \\", 8, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nWorld\n", 7, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Enno", 4, 1)); + CuAssertStrEquals(tc, "Enno", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, ";Hello", 6, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "World\n", 6, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Enno", 4, 1)); + CuAssertStrEquals(tc, "Enno", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\\World \\", 14, 1)); + CuAssertStrEquals(tc, "Hello\\World ", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\n", 6, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "World\n", 6, 1)); + CuAssertStrEquals(tc, "World", lastline); + OP_ParserReset(parser); + + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\n", 6, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "World\n", 6, 1)); + CuAssertStrEquals(tc, "World", lastline); + OP_ParserReset(parser); + lastline[0] = 0; + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello \\", 7, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nWorld", 6, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserFree(parser); +} + +CuSuite *get_order_parser_suite(void) +{ + CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_parse_noop); + SUITE_ADD_TEST(suite, test_parse_orders); + return suite; +} diff --git a/src/util/param.c b/src/util/param.c new file mode 100644 index 000000000..31066a4a9 --- /dev/null +++ b/src/util/param.c @@ -0,0 +1,134 @@ +#ifdef _MSC_VER +#include +#endif + +#include "language.h" +#include "log.h" +#include "param.h" +#include "parser.h" +#include "umlaut.h" + +#include + +#include +#include + +const char *parameters[MAXPARAMS] = { + "LOCALE", + "ALLES", + "JEDEM", + "BAUERN", + "BURG", + "EINHEIT", + "PRIVAT", + "HINTEN", + "KOMMANDO", + "KRAEUTER", + "NICHT", + "NAECHSTER", + "PARTEI", + "ERESSEA", + "PERSONEN", + "REGION", + "SCHIFF", + "SILBER", + "STRASSEN", + "TEMP", + "FLIEHE", + "GEBAEUDE", + "GIB", /* HELFE GIB */ + "KAEMPFE", + "DURCHREISE", + "BEWACHE", + "ZAUBER", + "PAUSE", + "VORNE", + "AGGRESSIV", + "DEFENSIV", + "STUFE", + "HELFE", + "FREMDES", + "AURA", + "HINTER", + "VOR", + "ANZAHL", + "GEGENSTAENDE", + "TRAENKE", + "GRUPPE", + "PARTEITARNUNG", + "BAEUME", + "ALLIANZ", + "AUTO" +}; + +param_t findparam(const char *s, const struct locale * lang) +{ + param_t result = NOPARAM; + char buffer[64]; + char * str = s ? transliterate(buffer, sizeof(buffer) - sizeof(int), s) : 0; + + if (str && *str) { + int i; + void * match; + void **tokens = get_translations(lang, UT_PARAMS); + critbit_tree *cb = (critbit_tree *)*tokens; + if (!cb) { + log_warning("no parameters defined in locale %s", locale_name(lang)); + } + else if (cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) { + cb_get_kv(match, &i, sizeof(int)); + result = (param_t)i; + } + } + return result; +} + +param_t findparam_block(const char *s, const struct locale *lang, bool any_locale) +{ + param_t p; + if (!s || s[0] == '@') { + return NOPARAM; + } + p = findparam(s, lang); + if (any_locale && p == NOPARAM) { + const struct locale *loc; + for (loc = locales; loc; loc = nextlocale(loc)) { + if (loc != lang) { + p = findparam(s, loc); + if (p == P_FACTION || p == P_GAMENAME) { + break; + } + } + } + } + return p; +} + +bool isparam(const char *s, const struct locale * lang, param_t param) +{ + assert(s); + assert(param != P_GEBAEUDE); + assert(param != P_BUILDING); + if (s[0] > '@') { + param_t p = findparam(s, lang); + return p == param; + } + return false; +} + +param_t getparam(const struct locale * lang) +{ + char token[64]; + const char *s = gettoken(token, sizeof(token)); + return s ? findparam(s, lang) : NOPARAM; +} + +static const char * parameter_key(int i) +{ + assert(i < MAXPARAMS && i >= 0); + return parameters[i]; +} + +void init_parameters(struct locale *lang) { + init_translations(lang, UT_PARAMS, parameter_key, MAXPARAMS); +} diff --git a/src/util/param.h b/src/util/param.h new file mode 100644 index 000000000..42d34ee57 --- /dev/null +++ b/src/util/param.h @@ -0,0 +1,77 @@ +#pragma once + +#ifndef H_PARAM_H +#define H_PARAM_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct locale; + + typedef enum param_t { + P_LOCALE, + P_ANY, + P_EACH, + P_PEASANT, + P_BUILDING, + P_UNIT, + P_PRIVAT, + P_BEHIND, + P_CONTROL, + P_HERBS, + P_NOT, + P_NEXT, + P_FACTION, + P_GAMENAME, + P_PERSON, + P_REGION, + P_SHIP, + P_MONEY, + P_ROAD, + P_TEMP, + P_FLEE, + P_GEBAEUDE, + P_GIVE, + P_FIGHT, + P_TRAVEL, + P_GUARD, + P_ZAUBER, + P_PAUSE, + P_VORNE, + P_AGGRO, + P_CHICKEN, + P_LEVEL, + P_HELP, + P_FOREIGN, + P_AURA, + P_AFTER, + P_BEFORE, + P_NUMBER, + P_ITEMS, + P_POTIONS, + P_GROUP, + P_FACTIONSTEALTH, + P_TREES, + P_ALLIANCE, + P_AUTO, + MAXPARAMS, + NOPARAM + } param_t; + + extern const char *parameters[MAXPARAMS]; + + param_t findparam(const char *s, const struct locale *lang); + param_t findparam_block(const char *s, const struct locale *lang, bool any_locale); + bool isparam(const char *s, const struct locale * lang, param_t param); + param_t getparam(const struct locale *lang); + + void init_parameters(struct locale *lang); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/util/parser.c b/src/util/parser.c index 1ba913c2c..edcb5e3d6 100644 --- a/src/util/parser.c +++ b/src/util/parser.c @@ -1,4 +1,6 @@ +#ifdef _MSC_VER #include +#endif #include "parser.h" #include "unicode.h" #include "base36.h" diff --git a/src/util/parser.h b/src/util/parser.h index 7242da1bb..a540aa2ac 100644 --- a/src/util/parser.h +++ b/src/util/parser.h @@ -33,9 +33,6 @@ extern "C" { int getid(void); unsigned int atoip(const char *s); -#define getshipid() getid() -#define getfactionid() getid() - #ifdef __cplusplus } #endif diff --git a/src/util/path.h b/src/util/path.h index 5a4e22270..649777171 100644 --- a/src/util/path.h +++ b/src/util/path.h @@ -1,4 +1,10 @@ +#pragma once #include +#ifdef _MSC_VER +/* @see https://insanecoding.blogspot.no/2007/11/pathmax-simply-isnt.html */ +#define PATH_MAX 260 +#endif + char * path_join(const char *p1, const char *p2, char *dst, size_t len); diff --git a/src/volcano.c b/src/volcano.c index 7bddd6097..d4d045045 100644 --- a/src/volcano.c +++ b/src/volcano.c @@ -36,7 +36,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/volcano.test.c b/src/volcano.test.c index c62febc0d..3ca670c7c 100644 --- a/src/volcano.test.c +++ b/src/volcano.test.c @@ -8,7 +8,7 @@ #include #include -#include +#include #include diff --git a/src/vortex.c b/src/vortex.c index 69d767c1b..805b407c4 100644 --- a/src/vortex.c +++ b/src/vortex.c @@ -4,8 +4,8 @@ #include #include -#include -#include +#include +#include #include #include #include diff --git a/src/wormhole.c b/src/wormhole.c index 2000018ab..382e64d16 100644 --- a/src/wormhole.c +++ b/src/wormhole.c @@ -24,8 +24,8 @@ #include /* util includes */ -#include -#include +#include +#include #include #include #include diff --git a/src/wormhole.test.c b/src/wormhole.test.c index b8baaa79a..bec4a5ff8 100644 --- a/src/wormhole.test.c +++ b/src/wormhole.test.c @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include