From 17f7aa2c0af472331b0b54141526681e44830719 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 27 Sep 2018 19:52:54 +0200 Subject: [PATCH 01/32] start new branch for a syntax checker --- src/CMakeLists.txt | 10 +++++++--- src/checker.c | 8 ++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 src/checker.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eacc879e5..e84a1bb18 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -140,7 +140,11 @@ set (ERESSEA_SRC ${KERNEL_SRC} ${DB_SRC} ${UTIL_SRC} -) + ) + +set(CHECK_SRC + checker.c + ) set(SERVER_SRC bind_building.c @@ -161,7 +165,7 @@ set(SERVER_SRC console.c helpers.c main.c -) + ) if (CURSES_FOUND) set (SERVER_SRC ${SERVER_SRC} @@ -176,10 +180,10 @@ 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_executable(eressea ${SERVER_SRC}) +add_executable(checker ${CHECK_SRC}) if (IWYU_PATH) set_property(TARGET eressea PROPERTY C_INCLUDE_WHAT_YOU_USE ${IWYU_PATH}) endif(IWYU_PATH) diff --git a/src/checker.c b/src/checker.c new file mode 100644 index 000000000..eec1db26f --- /dev/null +++ b/src/checker.c @@ -0,0 +1,8 @@ +#ifdef _MSV_VER +#include +#endif + +int main(int argc, char **argv) { + return 0; +} + From 7b9e72e559f43a62c6fe38f22e90cd30354fc928 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 28 Sep 2018 20:50:24 +0200 Subject: [PATCH 02/32] reduce dependeny spaghetti for database code. --- src/CMakeLists.txt | 1 + src/bind_eressea.c | 9 +++++++- src/checker.c | 14 ++++++++++++ src/eressea.c | 10 ++++----- src/gamedb.c | 3 +-- src/kernel/CMakeLists.txt | 1 - src/kernel/database.c | 46 -------------------------------------- src/kernel/database.h | 23 ------------------- src/kernel/database.test.c | 6 ++--- src/kernel/db/berkeley.c | 45 ++++++++++++++++++------------------- src/kernel/db/driver.h | 6 ++++- src/kernel/db/sqlite.c | 12 +++++----- src/kernel/orderdb.c | 28 ++++++++++++++++++++--- src/kernel/orderdb.h | 3 +++ src/orderfile.c | 9 +------- src/orderfile.h | 4 ++-- src/test_eressea.c | 1 - tests/orders.txt | 3 +++ 18 files changed, 98 insertions(+), 126 deletions(-) delete mode 100644 src/kernel/database.c delete mode 100644 src/kernel/database.h create mode 100644 tests/orders.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e84a1bb18..fb21a9d50 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -144,6 +144,7 @@ set (ERESSEA_SRC set(CHECK_SRC checker.c + orderfile.c ) set(SERVER_SRC diff --git a/src/bind_eressea.c b/src/bind_eressea.c index 9f73c4a29..34640137b 100755 --- a/src/bind_eressea.c +++ b/src/bind_eressea.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -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 readorders(F); } int eressea_export_json(const char * filename, int flags) { diff --git a/src/checker.c b/src/checker.c index eec1db26f..1a07897a0 100644 --- a/src/checker.c +++ b/src/checker.c @@ -2,7 +2,21 @@ #include #endif +#include +#include "orderfile.h" + 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; + } + readorders(F); + fclose(F); + } return 0; } diff --git a/src/eressea.c b/src/eressea.c index 0bf1454ee..382e23fa3 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -1,14 +1,14 @@ #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 "kernel/orderdb.h" #include "util/functions.h" #include "util/language.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/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index db448bf11..53161efe7 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -55,7 +55,6 @@ command.c config.c connection.c curse.c -database.c equipment.c faction.c group.c 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..df777a580 100644 --- a/src/kernel/database.test.c +++ b/src/kernel/database.test.c @@ -2,7 +2,7 @@ #include #include -#include "database.h" +#include "db/driver.h" #include "orderdb.h" #include @@ -39,9 +39,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/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/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/kernel/orderdb.c b/src/kernel/orderdb.c index b30131be4..c4c4746f0 100644 --- a/src/kernel/orderdb.c +++ b/src/kernel/orderdb.c @@ -1,5 +1,8 @@ #include -#include "database.h" + +#include "config.h" +#include "db/driver.h" + #include "orderdb.h" #include @@ -10,6 +13,19 @@ #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); +} + void odata_create(order_data **pdata, size_t len, const char *str) { order_data *data; @@ -42,10 +58,16 @@ void odata_addref(order_data *od) 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..33f8b6fce 100644 --- a/src/kernel/orderdb.h +++ b/src/kernel/orderdb.h @@ -19,6 +19,9 @@ extern "C" { order_data *odata_load(int id); int odata_save(order_data *od); + void orderdb_open(void); + void orderdb_close(void); + #ifdef __cplusplus } #endif diff --git a/src/orderfile.c b/src/orderfile.c index 9771b7e14..a2c7a6c87 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -226,20 +226,13 @@ static const char * file_getbuf(void *data) return getbuf(F, ENCODING_UTF8); } -int readorders(const char *filename) +int readorders(FILE *F) { input in; int result; - FILE *F = fopen(filename, "r"); - if (!F) { - perror(filename); - return -1; - } - log_info("reading orders from %s", filename); 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..fa051993e 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,7 @@ extern "C" { } input; int read_orders(struct input *in); - int readorders(const char *filename); + int readorders(FILE *F); #ifdef __cplusplus } diff --git a/src/test_eressea.c b/src/test_eressea.c index d91c225ae..439fee1d6 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include diff --git a/tests/orders.txt b/tests/orders.txt new file mode 100644 index 000000000..a4a4f7456 --- /dev/null +++ b/tests/orders.txt @@ -0,0 +1,3 @@ +ERESSEA uhfr "Hodor" +EINHEIT 8bz3 +BENENNEN EINHEIT 'Goldene Herde' From 91c49659ef2983edd5f0fba814f3fdf13f2a5667 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 28 Sep 2018 21:02:32 +0200 Subject: [PATCH 03/32] orderdb is glue code, belongs outside of kernel. --- src/CMakeLists.txt | 2 ++ src/eressea.c | 2 +- src/kernel/CMakeLists.txt | 2 -- src/kernel/database.test.c | 1 + src/kernel/order.c | 31 +++++++++++++++++++++++- src/kernel/order.h | 12 +++++++++ src/kernel/orderdb.c | 34 ++------------------------ src/kernel/orderdb.h | 12 --------- src/orderdb.c | 43 +++++++++++++++++++++++++++++++++ src/orderdb.h | 25 +++++++++++++++++++ src/{kernel => }/orderdb.test.c | 0 11 files changed, 116 insertions(+), 48 deletions(-) create mode 100644 src/orderdb.c create mode 100644 src/orderdb.h rename src/{kernel => }/orderdb.test.c (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fb21a9d50..5800d1814 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -113,6 +113,7 @@ set (ERESSEA_SRC morale.c move.c names.c + orderdb.c orderfile.c piracy.c prefix.c @@ -221,6 +222,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 diff --git a/src/eressea.c b/src/eressea.c index 382e23fa3..e1767811c 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -8,7 +8,6 @@ #include "kernel/equipment.h" #include "kernel/faction.h" #include "kernel/item.h" -#include "kernel/orderdb.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" diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 53161efe7..562562d8a 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -27,7 +27,6 @@ group.test.c item.test.c messages.test.c order.test.c -orderdb.test.c # pathfinder.test.c plane.test.c pool.test.c @@ -61,7 +60,6 @@ group.c item.c messages.c order.c -orderdb.c pathfinder.c plane.c pool.c diff --git a/src/kernel/database.test.c b/src/kernel/database.test.c index df777a580..3ec44896e 100644 --- a/src/kernel/database.test.c +++ b/src/kernel/database.test.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "db/driver.h" #include "orderdb.h" diff --git a/src/kernel/order.c b/src/kernel/order.c index 2fd7c6eb8..e30ea6097 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -14,7 +14,6 @@ #include #include "order.h" -#include "orderdb.h" #include "skill.h" #include "keyword.h" @@ -36,6 +35,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..c5406b39e 100644 --- a/src/kernel/order.h +++ b/src/kernel/order.h @@ -37,6 +37,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/orderdb.c b/src/kernel/orderdb.c index c4c4746f0..42248c0ef 100644 --- a/src/kernel/orderdb.c +++ b/src/kernel/orderdb.c @@ -1,7 +1,7 @@ #include -#include "config.h" -#include "db/driver.h" +#include "kernel/config.h" +#include "kernel/db/driver.h" #include "orderdb.h" @@ -26,36 +26,6 @@ void orderdb_close(void) db_driver_close(DB_SWAP); } -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; -} - order_data *odata_load(int id) { if (id > 0) { diff --git a/src/kernel/orderdb.h b/src/kernel/orderdb.h index 33f8b6fce..e17bdfea8 100644 --- a/src/kernel/orderdb.h +++ b/src/kernel/orderdb.h @@ -7,18 +7,6 @@ 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); 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 From b47a41541f9da29186523a5b7367894c304f3050 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 28 Sep 2018 21:43:20 +0200 Subject: [PATCH 04/32] write a new (expensive) in-memory db driver for orders. --- src/kernel/CMakeLists.txt | 2 +- src/kernel/db/critbit.c | 72 --------------------------------------- src/kernel/db/memory.c | 69 +++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 73 deletions(-) delete mode 100644 src/kernel/db/critbit.c create mode 100644 src/kernel/db/memory.c diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 562562d8a..756f691cc 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) 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/memory.c b/src/kernel/db/memory.c new file mode 100644 index 000000000..5fbaade4c --- /dev/null +++ b/src/kernel/db/memory.c @@ -0,0 +1,69 @@ +#include +#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 int free_data_cb(const void *match) +{ + char *str = (char *)match; + free(str); + return 0; +} + +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; + } +} From b18f8ca9fb96a48ab752c82c6c2da0953da1154f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 09:56:05 +0200 Subject: [PATCH 05/32] change database selection, fix in-memory db --- s/cmake-init | 35 ++++++++++++++++++++++++++++++++++- src/CMakeLists.txt | 4 +++- src/kernel/db/memory.c | 5 +++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/s/cmake-init b/s/cmake-init index 781db1ea7..eea222334 100755 --- a/s/cmake-init +++ b/s/cmake-init @@ -1,13 +1,46 @@ #!/bin/sh -ERESSEA_DB=db +ERESSEA_DB=memory pkg-config --exists sqlite3 && ERESSEA_DB=sqlite + +GETOPT=getopt +GETOPT_LONG=1 + +if [ "Darwin" = "$(uname)" ] ; then + if [ -x "/usr/local/opt/gnu-getopt/bin/getopt" ] ; then + GETOPT="/usr/local/opt/gnu-getopt/bin/getopt" + else + GETOPT_LONG=0 + fi +fi + +if [ $GETOPT_LONG -eq 1 ]; then + options=$(${GETOPT} -o d: -l db: -- "$@") +else # assume GNU getopt (long arguments) + options=$(${GETOPT} d: "$@") +fi + # Parse command line arguments +eval set -- "$options" +until [ -z "$1" ] ; do + case $1 in + -d|--db) + ERESSEA_DB=$2 + shift + ;; + --) shift; break;; + (-*) echo "$0: error - unrecognized option $1" 1>&2; exit 1;; + (*) break;; + esac + shift +done while [ ! -z "$1" ] ; do if [ "$1" = "--with-db" ] ; then ERESSEA_DB=db elif [ "$1" = "--with-sqlite" ] ; then ERESSEA_DB=sqlite +elif [ "$1" = "--with-memory" ] ; then +ERESSEA_DB=memory fi shift 1 done diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5800d1814..d819675b8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -184,8 +184,10 @@ endif() add_library(version STATIC ${VERSION_SRC}) add_library(game ${ERESSEA_SRC}) + +#add_executable(checker ${CHECK_SRC}) + add_executable(eressea ${SERVER_SRC}) -add_executable(checker ${CHECK_SRC}) if (IWYU_PATH) set_property(TARGET eressea PROPERTY C_INCLUDE_WHAT_YOU_USE ${IWYU_PATH}) endif(IWYU_PATH) diff --git a/src/kernel/db/memory.c b/src/kernel/db/memory.c index 5fbaade4c..0f572a99e 100644 --- a/src/kernel/db/memory.c +++ b/src/kernel/db/memory.c @@ -1,4 +1,6 @@ +#ifdef _MSC_VER #include +#endif #include "driver.h" #include @@ -40,11 +42,10 @@ int db_driver_faction_save(int id, int no, int turn, const char *email, const ch return -1; } -static int free_data_cb(const void *match) +static void free_data_cb(void *match) { char *str = (char *)match; free(str); - return 0; } int db_driver_open(database_t db, const char *dbname) From 735c890eceafb24304427bfefb35b7b05d387574 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 09:58:23 +0200 Subject: [PATCH 06/32] explicitly build sqlite on travis --- .travis.yml | 1 + s/travis-build | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) 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 From 5dcb9075ac7a1f5a9bc32020af84250ee7cb9b7b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 11:19:59 +0200 Subject: [PATCH 07/32] we have a library that contains the parser --- src/CMakeLists.txt | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d819675b8..be26a30a4 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 @@ -139,13 +144,10 @@ set (ERESSEA_SRC ${TRIGGERS_SRC} ${ATTRIBUTES_SRC} ${KERNEL_SRC} - ${DB_SRC} - ${UTIL_SRC} ) set(CHECK_SRC checker.c - orderfile.c ) set(SERVER_SRC @@ -183,22 +185,28 @@ if(NOT IWYU_PATH) endif() add_library(version STATIC ${VERSION_SRC}) -add_library(game ${ERESSEA_SRC}) +add_library(parser ${PARSER_SRC}) +target_link_libraries(parser + ${CRYPTO_LIBRARIES} + ) + #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} ) @@ -260,7 +268,6 @@ target_link_libraries(test_eressea ${LUA_LIBRARIES} ${CLIBS_LIBRARIES} ${STORAGE_LIBRARIES} - ${CRYPTO_LIBRARIES} ${CJSON_LIBRARIES} ${INIPARSER_LIBRARIES} ) From a373807189538a2299b6705587d0aa6f91f41820 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 11:37:17 +0200 Subject: [PATCH 08/32] move attrib and event modules to kernel --- src/alchemy.c | 2 +- src/attributes/attributes.c | 4 ++-- src/attributes/dict.c | 2 +- src/attributes/follow.c | 2 +- src/attributes/hate.c | 2 +- src/attributes/iceberg.c | 2 +- src/attributes/key.c | 2 +- src/attributes/key.test.c | 2 +- src/attributes/movement.c | 2 +- src/attributes/otherfaction.c | 2 +- src/attributes/otherfaction.test.c | 2 +- src/attributes/overrideroads.c | 2 +- src/attributes/racename.c | 2 +- src/attributes/raceprefix.c | 2 +- src/attributes/reduceproduction.c | 2 +- src/attributes/seenspell.c | 2 +- src/attributes/stealth.c | 2 +- src/attributes/targetregion.c | 2 +- src/battle.c | 2 +- src/bind_region.c | 2 +- src/bind_ship.c | 2 +- src/bind_unit.c | 4 ++-- src/bindings.c | 2 +- src/chaos.c | 2 +- src/creport.c | 2 +- src/economy.c | 4 ++-- src/economy.test.c | 2 +- src/give.c | 4 ++-- src/gmtool.c | 2 +- src/helpers.c | 4 ++-- src/items.c | 4 ++-- src/items/speedsail.c | 2 +- src/jsonconf.c | 2 +- src/kernel/CMakeLists.txt | 4 ++++ src/kernel/alliance.c | 2 +- src/kernel/ally.c | 2 +- src/{util => kernel}/attrib.c | 10 +++++----- src/{util => kernel}/attrib.h | 2 +- src/{util => kernel}/attrib.test.c | 0 src/kernel/build.c | 4 ++-- src/kernel/building.c | 4 ++-- src/kernel/config.c | 4 ++-- src/kernel/config.test.c | 2 +- src/kernel/connection.c | 2 +- src/kernel/curse.c | 2 +- src/kernel/curse.test.c | 2 +- src/{util => kernel}/event.c | 8 ++++---- src/{util => kernel}/event.h | 2 +- src/kernel/faction.c | 4 ++-- src/kernel/group.c | 2 +- src/kernel/group.test.c | 2 +- src/kernel/item.c | 2 +- src/kernel/plane.c | 2 +- src/kernel/race.c | 2 +- src/kernel/region.c | 2 +- src/kernel/save.c | 4 ++-- src/kernel/save.test.c | 4 ++-- src/kernel/ship.c | 4 ++-- src/kernel/ship.test.c | 2 +- src/kernel/skills.c | 2 +- src/kernel/terrain.c | 2 +- src/kernel/unit.c | 4 ++-- src/kernel/unit.test.c | 2 +- src/laws.c | 4 ++-- src/laws.test.c | 2 +- src/lighthouse.c | 2 +- src/lighthouse.test.c | 2 +- src/magic.c | 4 ++-- src/magic.test.c | 2 +- src/market.c | 2 +- src/modules/autoseed.c | 2 +- src/modules/gmcmd.c | 2 +- src/modules/museum.c | 2 +- src/modules/xmas.c | 4 ++-- src/monsters.c | 4 ++-- src/monsters.test.c | 2 +- src/move.c | 2 +- src/move.test.c | 2 +- src/piracy.c | 2 +- src/races/races.c | 2 +- src/randenc.c | 2 +- src/renumber.c | 2 +- src/report.c | 2 +- src/reports.c | 2 +- src/reports.test.c | 2 +- src/spells.c | 4 ++-- src/spells.test.c | 2 +- src/spells/borders.c | 2 +- src/spells/combatspells.c | 2 +- src/spells/magicresistance.test.c | 2 +- src/spy.c | 2 +- src/spy.test.c | 2 +- src/study.c | 2 +- src/study.test.c | 2 +- src/travelthru.c | 2 +- src/travelthru.test.c | 2 +- src/triggers/changefaction.c | 4 ++-- src/triggers/changerace.c | 4 ++-- src/triggers/clonedied.c | 4 ++-- src/triggers/createcurse.c | 4 ++-- src/triggers/createunit.c | 4 ++-- src/triggers/gate.c | 4 ++-- src/triggers/giveitem.c | 4 ++-- src/triggers/killunit.c | 4 ++-- src/triggers/shock.c | 4 ++-- src/triggers/shock.test.c | 2 +- src/triggers/timeout.c | 4 ++-- src/triggers/triggers.c | 2 +- src/util/CMakeLists.txt | 4 ---- src/volcano.c | 2 +- src/volcano.test.c | 2 +- src/vortex.c | 2 +- src/wormhole.c | 2 +- src/wormhole.test.c | 2 +- 114 files changed, 151 insertions(+), 151 deletions(-) rename src/{util => kernel}/attrib.c (99%) rename src/{util => kernel}/attrib.h (99%) rename src/{util => kernel}/attrib.test.c (100%) rename src/{util => kernel}/event.c (98%) rename src/{util => kernel}/event.h (99%) diff --git a/src/alchemy.c b/src/alchemy.c index 4b7e961a6..fb0516359 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -33,7 +33,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/attributes/attributes.c b/src/attributes/attributes.c index 6bf78da63..cf75efc58 100644 --- a/src/attributes/attributes.c +++ b/src/attributes/attributes.c @@ -53,8 +53,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/dict.c b/src/attributes/dict.c index bc5e94204..aa34886a6 100644 --- a/src/attributes/dict.c +++ b/src/attributes/dict.c @@ -29,7 +29,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/attributes/follow.c b/src/attributes/follow.c index 8c5e14526..07fffbfd6 100644 --- a/src/attributes/follow.c +++ b/src/attributes/follow.c @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include +#include #include #include diff --git a/src/attributes/hate.c b/src/attributes/hate.c index c260de335..aff71d0e7 100644 --- a/src/attributes/hate.c +++ b/src/attributes/hate.c @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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..462c7a63b 100644 --- a/src/attributes/key.c +++ b/src/attributes/key.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "key.h" -#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..552ff51aa 100644 --- a/src/attributes/movement.c +++ b/src/attributes/movement.c @@ -20,7 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "movement.h" -#include +#include #include #include diff --git a/src/attributes/otherfaction.c b/src/attributes/otherfaction.c index 343460057..87b29f252 100644 --- a/src/attributes/otherfaction.c +++ b/src/attributes/otherfaction.c @@ -23,7 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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..6108465cd 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -23,7 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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..f67689052 100644 --- a/src/attributes/targetregion.c +++ b/src/attributes/targetregion.c @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include +#include #include #include 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/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_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/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/economy.c b/src/economy.c index f0c930a3f..15b907a25 100644 --- a/src/economy.c +++ b/src/economy.c @@ -64,9 +64,9 @@ 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 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/give.c b/src/give.c index c47f9b9e2..02d5c622d 100644 --- a/src/give.c +++ b/src/give.c @@ -41,9 +41,9 @@ #include /* util includes */ -#include +#include #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..2835b153d 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -19,8 +19,8 @@ without prior permission by the authors of Eressea. #include "alchemy.h" #include "magic.h" -#include -#include +#include +#include #include #include #include diff --git a/src/items.c b/src/items.c index 574c1da3b..665220e8f 100644 --- a/src/items.c +++ b/src/items.c @@ -33,8 +33,8 @@ #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..dc11ee563 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -29,7 +29,7 @@ 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/language.h" diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 756f691cc..093a41429 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -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,6 +23,7 @@ config.test.c curse.test.c database.test.c equipment.test.c +# event.test.c faction.test.c group.test.c item.test.c @@ -46,6 +48,7 @@ SET(_FILES ${_DBFILES} alliance.c ally.c +attrib.c build.c building.c callbacks.c @@ -55,6 +58,7 @@ config.c connection.c curse.c equipment.c +event.c faction.c group.c item.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..a2536c7d9 100644 --- a/src/kernel/ally.c +++ b/src/kernel/ally.c @@ -10,7 +10,7 @@ #include "objtypes.h" #include "plane.h" -#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..375997df4 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 100% rename from src/util/attrib.test.c rename to src/kernel/attrib.test.c diff --git a/src/kernel/build.c b/src/kernel/build.c index 4e3dc4721..0891f1005 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -52,9 +52,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* from libutil */ -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/building.c b/src/kernel/building.c index 75cad30f7..9627567ab 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -38,9 +38,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "lighthouse.h" /* util includes */ -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/config.c b/src/kernel/config.c index eee2ec0f5..e31564b8d 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -50,10 +50,10 @@ 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 diff --git a/src/kernel/config.test.c b/src/kernel/config.test.c index e99ba9d08..e060a838e 100644 --- a/src/kernel/config.test.c +++ b/src/kernel/config.test.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include diff --git a/src/kernel/connection.c b/src/kernel/connection.c index ddaf163c1..c66bd06e0 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -26,7 +26,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "terrain.h" #include "unit.h" -#include +#include #include #include #include diff --git a/src/kernel/curse.c b/src/kernel/curse.c index f6be51dac..5f0c4a776 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -34,7 +34,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/curse.test.c b/src/kernel/curse.test.c index 9c74544e1..23a5ad54f 100644 --- a/src/kernel/curse.test.c +++ b/src/kernel/curse.test.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include 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..ab095a008 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..dea4ca54f 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -42,9 +42,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.c b/src/kernel/group.c index 48434ff5a..9ebbf244d 100755 --- a/src/kernel/group.c +++ b/src/kernel/group.c @@ -30,7 +30,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/kernel/group.test.c b/src/kernel/group.test.c index 5581fee69..5d1a28f6b 100644 --- a/src/kernel/group.test.c +++ b/src/kernel/group.test.c @@ -9,7 +9,7 @@ #include "save.h" #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/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..2cb93b4a3 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -42,7 +42,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include +#include #include #include #include diff --git a/src/kernel/save.c b/src/kernel/save.c index e7cb90d2a..eb731e8d7 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -57,9 +57,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/save.test.c b/src/kernel/save.test.c index d9ba52862..04ef9b1bb 100644 --- a/src/kernel/save.test.c +++ b/src/kernel/save.test.c @@ -17,9 +17,9 @@ #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..20ed49d05 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -34,9 +34,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "skill.h" /* util includes */ -#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/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/unit.c b/src/kernel/unit.c index 30971310d..13b2b1bf2 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -50,9 +50,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "guard.h" /* util includes */ -#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..d7f8c53de 100644 --- a/src/laws.c +++ b/src/laws.c @@ -71,9 +71,9 @@ 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 diff --git a/src/laws.test.c b/src/laws.test.c index 778ee3323..5c799a393 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include #include 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..41aa0dbce 100644 --- a/src/magic.c +++ b/src/magic.c @@ -62,9 +62,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/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..56386f2a6 100644 --- a/src/modules/gmcmd.c +++ b/src/modules/gmcmd.c @@ -32,7 +32,7 @@ #include /* util includes */ -#include +#include #include #include diff --git a/src/modules/museum.c b/src/modules/museum.c index 67ce12bd1..b5cbf05ce 100644 --- a/src/modules/museum.c +++ b/src/modules/museum.c @@ -38,7 +38,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/modules/xmas.c b/src/modules/xmas.c index b76f14eab..b4fd2cd24 100644 --- a/src/modules/xmas.c +++ b/src/modules/xmas.c @@ -25,9 +25,9 @@ #include /* util includes */ -#include +#include #include -#include +#include #include #include #include diff --git a/src/monsters.c b/src/monsters.c index d009f8bda..505c6c272 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -52,9 +52,9 @@ #include "kernel/unit.h" /* util includes */ -#include +#include #include -#include +#include #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..b633d0ff7 100644 --- a/src/move.c +++ b/src/move.c @@ -72,7 +72,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include +#include #include #include #include diff --git a/src/move.test.c b/src/move.test.c index f01915e2a..4e9e4760d 100644 --- a/src/move.test.c +++ b/src/move.test.c @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/piracy.c b/src/piracy.c index 46977c3d8..86b9b4904 100644 --- a/src/piracy.c +++ b/src/piracy.c @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include 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..8a72be2a5 100644 --- a/src/renumber.c +++ b/src/renumber.c @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include diff --git a/src/report.c b/src/report.c index 29f124cef..bc47cb1a4 100644 --- a/src/report.c +++ b/src/report.c @@ -77,7 +77,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "kernel/alliance.h" /* util includes */ -#include +#include #include #include "util/bsdstring.h" #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..29f14c634 100644 --- a/src/reports.test.c +++ b/src/reports.test.c @@ -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/spells.c b/src/spells.c index 02cbe43b5..1238c1dae 100644 --- a/src/spells.c +++ b/src/spells.c @@ -70,9 +70,9 @@ /* util includes */ #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..ff15ea971 100644 --- a/src/spells/borders.c +++ b/src/spells/borders.c @@ -13,7 +13,7 @@ #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/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/spy.c b/src/spy.c index 9dc9de35a..98245e806 100644 --- a/src/spy.c +++ b/src/spy.c @@ -44,7 +44,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#include +#include #include #include #include diff --git a/src/spy.test.c b/src/spy.test.c index d8b879e3f..dfe2886e7 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/study.c b/src/study.c index c978e69ad..a3dfa2e33 100644 --- a/src/study.c +++ b/src/study.c @@ -46,7 +46,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* util includes */ -#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/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..44edec269 100644 --- a/src/triggers/changefaction.c +++ b/src/triggers/changefaction.c @@ -24,9 +24,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/triggers/changerace.c b/src/triggers/changerace.c index abc605c35..758df4dc6 100644 --- a/src/triggers/changerace.c +++ b/src/triggers/changerace.c @@ -24,9 +24,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/triggers/clonedied.c b/src/triggers/clonedied.c index 62c4c3343..5713a2b6c 100644 --- a/src/triggers/clonedied.c +++ b/src/triggers/clonedied.c @@ -26,9 +26,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/triggers/createcurse.c b/src/triggers/createcurse.c index bd7422587..666c82a0f 100644 --- a/src/triggers/createcurse.c +++ b/src/triggers/createcurse.c @@ -24,9 +24,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/triggers/createunit.c b/src/triggers/createunit.c index f152d3766..4ce2730dc 100644 --- a/src/triggers/createunit.c +++ b/src/triggers/createunit.c @@ -26,9 +26,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/triggers/gate.c b/src/triggers/gate.c index 4c2c7a9cd..8690d5752 100644 --- a/src/triggers/gate.c +++ b/src/triggers/gate.c @@ -18,8 +18,8 @@ #include /* util includes */ -#include -#include +#include +#include #include #include #include diff --git a/src/triggers/giveitem.c b/src/triggers/giveitem.c index 08e4f0147..7815350a1 100644 --- a/src/triggers/giveitem.c +++ b/src/triggers/giveitem.c @@ -24,9 +24,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/triggers/killunit.c b/src/triggers/killunit.c index bca630177..37e55b25b 100644 --- a/src/triggers/killunit.c +++ b/src/triggers/killunit.c @@ -23,9 +23,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/triggers/shock.c b/src/triggers/shock.c index 7eae6f31a..767f0fd17 100644 --- a/src/triggers/shock.c +++ b/src/triggers/shock.c @@ -29,9 +29,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/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..8acaaa38b 100644 --- a/src/triggers/timeout.c +++ b/src/triggers/timeout.c @@ -20,8 +20,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "timeout.h" /* util includes */ -#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..d0e505af2 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -3,12 +3,10 @@ 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 @@ -33,12 +31,10 @@ variant.test.c ) SET(_FILES -attrib.c base36.c bsdstring.c crmessage.c dice.c -event.c filereader.c functions.c gamedata.c 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..948ad80fc 100644 --- a/src/vortex.c +++ b/src/vortex.c @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/wormhole.c b/src/wormhole.c index 2000018ab..5cf044d92 100644 --- a/src/wormhole.c +++ b/src/wormhole.c @@ -24,7 +24,7 @@ #include /* util includes */ -#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 From b22d838a578b1729721efe2c99c0b773803065e4 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 13:21:46 +0200 Subject: [PATCH 09/32] move gamedata.c to kernel --- src/alchemy.c | 2 +- src/attributes/attributes.c | 2 +- src/attributes/dict.c | 2 +- src/attributes/follow.c | 2 +- src/attributes/hate.c | 2 +- src/attributes/key.c | 2 +- src/attributes/movement.c | 2 +- src/attributes/otherfaction.c | 2 +- src/attributes/seenspell.c | 2 +- src/attributes/targetregion.c | 2 +- src/bind_storage.c | 2 +- src/helpers.c | 2 +- src/kernel/CMakeLists.txt | 2 ++ src/kernel/ally.c | 2 +- src/kernel/attrib.c | 2 +- src/kernel/attrib.test.c | 2 +- src/kernel/building.c | 2 +- src/kernel/connection.c | 2 +- src/kernel/curse.c | 2 +- src/kernel/curse.test.c | 2 +- src/kernel/event.c | 2 +- src/kernel/faction.c | 2 +- src/{util => kernel}/gamedata.c | 3 ++- src/{util => kernel}/gamedata.h | 0 src/{util => kernel}/gamedata.test.c | 0 src/kernel/group.c | 2 +- src/kernel/group.test.c | 2 +- src/kernel/region.c | 2 +- src/kernel/save.c | 4 ++-- src/kernel/save.test.c | 2 +- src/kernel/spellbook.c | 2 +- src/kernel/unit.c | 2 +- src/magic.c | 2 +- src/modules/gmcmd.c | 2 +- src/modules/museum.c | 2 +- src/modules/xmas.c | 2 +- src/move.c | 2 +- src/spells.c | 2 +- src/spells/borders.c | 2 +- src/spells/flyingship.c | 2 +- src/spells/unitcurse.c | 2 +- src/triggers/changefaction.c | 2 +- src/triggers/changerace.c | 2 +- src/triggers/clonedied.c | 2 +- src/triggers/createcurse.c | 2 +- src/triggers/createunit.c | 2 +- src/triggers/gate.c | 2 +- src/triggers/giveitem.c | 2 +- src/triggers/killunit.c | 2 +- src/triggers/shock.c | 2 +- src/triggers/timeout.c | 2 +- src/util/CMakeLists.txt | 2 -- src/vortex.c | 2 +- src/wormhole.c | 2 +- tests/orders.txt | 3 --- 55 files changed, 54 insertions(+), 56 deletions(-) rename src/{util => kernel}/gamedata.c (98%) rename src/{util => kernel}/gamedata.h (100%) rename src/{util => kernel}/gamedata.test.c (100%) delete mode 100644 tests/orders.txt diff --git a/src/alchemy.c b/src/alchemy.c index fb0516359..d2dd64a04 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -34,7 +34,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include -#include +#include #include #include #include diff --git a/src/attributes/attributes.c b/src/attributes/attributes.c index cf75efc58..400282ae7 100644 --- a/src/attributes/attributes.c +++ b/src/attributes/attributes.c @@ -55,7 +55,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include #include -#include +#include #include #include diff --git a/src/attributes/dict.c b/src/attributes/dict.c index aa34886a6..70e88219d 100644 --- a/src/attributes/dict.c +++ b/src/attributes/dict.c @@ -32,7 +32,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include diff --git a/src/attributes/follow.c b/src/attributes/follow.c index 07fffbfd6..caeecee54 100644 --- a/src/attributes/follow.c +++ b/src/attributes/follow.c @@ -23,7 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include +#include #include #include diff --git a/src/attributes/hate.c b/src/attributes/hate.c index aff71d0e7..cef483cf6 100644 --- a/src/attributes/hate.c +++ b/src/attributes/hate.c @@ -23,7 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include +#include #include #include diff --git a/src/attributes/key.c b/src/attributes/key.c index 462c7a63b..76a18c876 100644 --- a/src/attributes/key.c +++ b/src/attributes/key.c @@ -21,7 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "key.h" #include -#include +#include #include #include diff --git a/src/attributes/movement.c b/src/attributes/movement.c index 552ff51aa..01c75ffae 100644 --- a/src/attributes/movement.c +++ b/src/attributes/movement.c @@ -21,7 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "movement.h" #include -#include +#include #include #include diff --git a/src/attributes/otherfaction.c b/src/attributes/otherfaction.c index 87b29f252..fcf05da05 100644 --- a/src/attributes/otherfaction.c +++ b/src/attributes/otherfaction.c @@ -24,7 +24,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 6108465cd..ae46980c3 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -24,7 +24,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include diff --git a/src/attributes/targetregion.c b/src/attributes/targetregion.c index f67689052..600d2e184 100644 --- a/src/attributes/targetregion.c +++ b/src/attributes/targetregion.c @@ -23,7 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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/helpers.c b/src/helpers.c index 2835b153d..223089c9c 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -22,7 +22,7 @@ without prior permission by the authors of Eressea. #include #include #include -#include +#include #include #include #include diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 093a41429..06f58fc1b 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -25,6 +25,7 @@ database.test.c equipment.test.c # event.test.c faction.test.c +gamedata.test.c group.test.c item.test.c messages.test.c @@ -60,6 +61,7 @@ curse.c equipment.c event.c faction.c +gamedata.c group.c item.c messages.c diff --git a/src/kernel/ally.c b/src/kernel/ally.c index a2536c7d9..1fd7c0efd 100644 --- a/src/kernel/ally.c +++ b/src/kernel/ally.c @@ -12,7 +12,7 @@ #include #include -#include +#include #include diff --git a/src/kernel/attrib.c b/src/kernel/attrib.c index 375997df4..d84a8c8e9 100644 --- a/src/kernel/attrib.c +++ b/src/kernel/attrib.c @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include diff --git a/src/kernel/attrib.test.c b/src/kernel/attrib.test.c index d266196e6..918b768fd 100644 --- a/src/kernel/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/building.c b/src/kernel/building.c index 9627567ab..215c304e7 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -42,7 +42,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/kernel/connection.c b/src/kernel/connection.c index c66bd06e0..7fc1213e0 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -28,7 +28,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -#include +#include #include #include #include diff --git a/src/kernel/curse.c b/src/kernel/curse.c index 5f0c4a776..62e7ab9b2 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -36,7 +36,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include #include -#include +#include #include #include #include diff --git a/src/kernel/curse.test.c b/src/kernel/curse.test.c index 23a5ad54f..da0806914 100644 --- a/src/kernel/curse.test.c +++ b/src/kernel/curse.test.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/kernel/event.c b/src/kernel/event.c index ab095a008..f1ff825f5 100644 --- a/src/kernel/event.c +++ b/src/kernel/event.c @@ -21,7 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "attrib.h" /* util includes */ -#include +#include #include #include diff --git a/src/kernel/faction.c b/src/kernel/faction.c index dea4ca54f..a78cd943a 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -45,7 +45,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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 9ebbf244d..54aa87aeb 100755 --- a/src/kernel/group.c +++ b/src/kernel/group.c @@ -32,7 +32,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include #include -#include +#include #include #include #include diff --git a/src/kernel/group.test.c b/src/kernel/group.test.c index 5d1a28f6b..1c6d6339e 100644 --- a/src/kernel/group.test.c +++ b/src/kernel/group.test.c @@ -8,7 +8,7 @@ #include "region.h" #include "save.h" -#include +#include #include #include diff --git a/src/kernel/region.c b/src/kernel/region.c index 2cb93b4a3..377bf1e22 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -43,7 +43,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include #include -#include +#include #include #include #include diff --git a/src/kernel/save.c b/src/kernel/save.c index eb731e8d7..3bef185c3 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -61,9 +61,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include -#include +#include #include #include #include diff --git a/src/kernel/save.test.c b/src/kernel/save.test.c index 04ef9b1bb..8e738863f 100644 --- a/src/kernel/save.test.c +++ b/src/kernel/save.test.c @@ -20,7 +20,7 @@ #include #include #include -#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/unit.c b/src/kernel/unit.c index 13b2b1bf2..00d0aeece 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -53,7 +53,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/magic.c b/src/magic.c index 41aa0dbce..047ed167b 100644 --- a/src/magic.c +++ b/src/magic.c @@ -65,7 +65,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/modules/gmcmd.c b/src/modules/gmcmd.c index 56386f2a6..4cc573f16 100644 --- a/src/modules/gmcmd.c +++ b/src/modules/gmcmd.c @@ -33,7 +33,7 @@ /* util includes */ #include -#include +#include #include #include diff --git a/src/modules/museum.c b/src/modules/museum.c index b5cbf05ce..7e3a04f2d 100644 --- a/src/modules/museum.c +++ b/src/modules/museum.c @@ -41,7 +41,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/modules/xmas.c b/src/modules/xmas.c index b4fd2cd24..aa296866a 100644 --- a/src/modules/xmas.c +++ b/src/modules/xmas.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/move.c b/src/move.c index b633d0ff7..8de997480 100644 --- a/src/move.c +++ b/src/move.c @@ -74,7 +74,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/spells.c b/src/spells.c index 1238c1dae..00f256f26 100644 --- a/src/spells.c +++ b/src/spells.c @@ -73,7 +73,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/spells/borders.c b/src/spells/borders.c index ff15ea971..5d99b1307 100644 --- a/src/spells/borders.c +++ b/src/spells/borders.c @@ -14,7 +14,7 @@ #include #include -#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/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/triggers/changefaction.c b/src/triggers/changefaction.c index 44edec269..8aa73168d 100644 --- a/src/triggers/changefaction.c +++ b/src/triggers/changefaction.c @@ -27,7 +27,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/changerace.c b/src/triggers/changerace.c index 758df4dc6..5a834314a 100644 --- a/src/triggers/changerace.c +++ b/src/triggers/changerace.c @@ -27,7 +27,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/clonedied.c b/src/triggers/clonedied.c index 5713a2b6c..c6593c2a4 100644 --- a/src/triggers/clonedied.c +++ b/src/triggers/clonedied.c @@ -29,7 +29,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/createcurse.c b/src/triggers/createcurse.c index 666c82a0f..544b9aafe 100644 --- a/src/triggers/createcurse.c +++ b/src/triggers/createcurse.c @@ -27,7 +27,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/createunit.c b/src/triggers/createunit.c index 4ce2730dc..d4dd8f983 100644 --- a/src/triggers/createunit.c +++ b/src/triggers/createunit.c @@ -29,7 +29,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/gate.c b/src/triggers/gate.c index 8690d5752..065be8cf8 100644 --- a/src/triggers/gate.c +++ b/src/triggers/gate.c @@ -20,7 +20,7 @@ /* util includes */ #include #include -#include +#include #include #include #include diff --git a/src/triggers/giveitem.c b/src/triggers/giveitem.c index 7815350a1..118497c86 100644 --- a/src/triggers/giveitem.c +++ b/src/triggers/giveitem.c @@ -27,7 +27,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/killunit.c b/src/triggers/killunit.c index 37e55b25b..0338da4af 100644 --- a/src/triggers/killunit.c +++ b/src/triggers/killunit.c @@ -26,7 +26,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/shock.c b/src/triggers/shock.c index 767f0fd17..9a9d1c74b 100644 --- a/src/triggers/shock.c +++ b/src/triggers/shock.c @@ -32,7 +32,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include +#include #include #include #include diff --git a/src/triggers/timeout.c b/src/triggers/timeout.c index 8acaaa38b..8e8a6b9bf 100644 --- a/src/triggers/timeout.c +++ b/src/triggers/timeout.c @@ -22,7 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include #include -#include +#include #include #include diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index d0e505af2..4258a5edc 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -9,7 +9,6 @@ base36.test.c # dice.test.c # filereader.test.c functions.test.c -gamedata.test.c # goodies.test.c language.test.c # lists.test.c @@ -37,7 +36,6 @@ crmessage.c dice.c filereader.c functions.c -gamedata.c goodies.c language.c lists.c diff --git a/src/vortex.c b/src/vortex.c index 948ad80fc..805b407c4 100644 --- a/src/vortex.c +++ b/src/vortex.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/wormhole.c b/src/wormhole.c index 5cf044d92..382e64d16 100644 --- a/src/wormhole.c +++ b/src/wormhole.c @@ -25,7 +25,7 @@ /* util includes */ #include -#include +#include #include #include #include diff --git a/tests/orders.txt b/tests/orders.txt deleted file mode 100644 index a4a4f7456..000000000 --- a/tests/orders.txt +++ /dev/null @@ -1,3 +0,0 @@ -ERESSEA uhfr "Hodor" -EINHEIT 8bz3 -BENENNEN EINHEIT 'Goldene Herde' From 991fe8fd8da2e8b0d466b0941360561cbdce798f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 13:35:49 +0200 Subject: [PATCH 10/32] enable checker build. remove getid aliases from parser.h --- src/CMakeLists.txt | 4 ++-- src/checker.c | 4 ++-- src/kernel/build.c | 2 +- src/laws.c | 2 +- src/move.c | 4 ++-- src/util/parser.h | 3 --- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index be26a30a4..e6b83cfe1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -191,8 +191,8 @@ target_link_libraries(parser ) -#add_executable(checker ${CHECK_SRC}) -#target_link_libraries(checker parser) +add_executable(checker ${CHECK_SRC}) +target_link_libraries(checker parser) add_library(game ${ERESSEA_SRC}) target_link_libraries(game parser version) diff --git a/src/checker.c b/src/checker.c index 1a07897a0..302c80390 100644 --- a/src/checker.c +++ b/src/checker.c @@ -2,8 +2,9 @@ #include #endif +#include "util/parser.h" + #include -#include "orderfile.h" int main(int argc, char **argv) { FILE * F = stdin; @@ -14,7 +15,6 @@ int main(int argc, char **argv) { perror(filename); return -1; } - readorders(F); fclose(F); } return 0; diff --git a/src/kernel/build.c b/src/kernel/build.c index 0891f1005..82c629b0b 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -79,7 +79,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/laws.c b/src/laws.c index d7f8c53de..67e4567a9 100644 --- a/src/laws.c +++ b/src/laws.c @@ -1952,7 +1952,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/move.c b/src/move.c index 8de997480..124b846ca 100644 --- a/src/move.c +++ b/src/move.c @@ -2265,7 +2265,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 +2549,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/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 From bc5f2ea6d1c83db0325d1b2538a4d0d30f2c220f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 18:13:32 +0200 Subject: [PATCH 11/32] move keyword.[hc] to util --- src/CMakeLists.txt | 2 -- src/automate.c | 2 +- src/battle.test.c | 2 +- src/bind_process.c | 18 ++++++++++-------- src/creport.test.c | 2 +- src/items.c | 2 +- src/jsonconf.c | 2 +- src/jsonconf.test.c | 2 +- src/kernel/config.c | 5 +++-- src/kernel/order.c | 2 +- src/kernel/order.h | 3 ++- src/laws.c | 2 +- src/monsters.c | 8 ++++---- src/piracy.c | 4 ++-- src/util/CMakeLists.txt | 4 ++++ src/{ => util}/keyword.c | 0 src/{ => util}/keyword.h | 0 src/{ => util}/keyword.test.c | 0 src/util/order_parser.c | 33 +++++++++++++++++++++++++++++++++ src/util/order_parser.h | 34 ++++++++++++++++++++++++++++++++++ src/util/parser.c | 2 ++ 21 files changed, 102 insertions(+), 27 deletions(-) rename src/{ => util}/keyword.c (100%) rename src/{ => util}/keyword.h (100%) rename src/{ => util}/keyword.test.c (100%) create mode 100644 src/util/order_parser.c create mode 100644 src/util/order_parser.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e6b83cfe1..9ed0011e6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -109,7 +109,6 @@ set (ERESSEA_SRC items.c json.c jsonconf.c - keyword.c laws.c lighthouse.c magic.c @@ -224,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 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.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_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/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/items.c b/src/items.c index 665220e8f..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" @@ -35,6 +34,7 @@ #include #include +#include #include #include #include diff --git a/src/jsonconf.c b/src/jsonconf.c index dc11ee563..ff442f990 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -32,6 +32,7 @@ without prior permission by the authors of Eressea. #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/config.c b/src/kernel/config.c index e31564b8d..842324fe8 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" @@ -51,9 +50,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include +#include + #include #include -#include +#include #include #include #include diff --git a/src/kernel/order.c b/src/kernel/order.c index e30ea6097..6015b823d 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -15,9 +15,9 @@ #include "order.h" #include "skill.h" -#include "keyword.h" #include +#include "util/keyword.h" #include #include #include diff --git a/src/kernel/order.h b/src/kernel/order.h index c5406b39e..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 diff --git a/src/laws.c b/src/laws.c index 67e4567a9..8cec1e51b 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" @@ -75,6 +74,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include "util/keyword.h" #include #include #include diff --git a/src/monsters.c b/src/monsters.c index 505c6c272..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/piracy.c b/src/piracy.c index 86b9b4904..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/util/CMakeLists.txt b/src/util/CMakeLists.txt index 4258a5edc..61e2cf745 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -10,11 +10,13 @@ base36.test.c # filereader.test.c functions.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 parser.test.c password.test.c # rand.test.c @@ -37,12 +39,14 @@ dice.c filereader.c functions.c goodies.c +keyword.c language.c lists.c log.c message.c mt19937ar.c nrmessage.c +order_parser.c parser.c password.c path.c 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 100% rename from src/keyword.h rename to src/util/keyword.h 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/order_parser.c b/src/util/order_parser.c new file mode 100644 index 000000000..691686276 --- /dev/null +++ b/src/util/order_parser.c @@ -0,0 +1,33 @@ +#ifdef _MSC_VER +#include +#endif + +#include "order_parser.h" + +#include + +struct OrderParserStruct { + void *m_userData; + char *m_buffer; + char *m_bufferPtr; + const char *m_bufferEnd; + OP_FactionHandler m_factionHandler; + OP_UnitHandler m_unitHandler; + OP_OrderHandler m_orderHandler; + enum CR_Error m_errorCode; + int m_lineNumber; +}; + +OP_Parser OP_ParserCreate(void) +{ + return NULL; +} + +void OP_ParserFree(OP_Parser op) { + free(op); +} + +enum OP_Status OP_Parse(OP_Parser op, const char *s, int len, int isFinal) +{ + return OP_STATUS_OK; +} diff --git a/src/util/order_parser.h b/src/util/order_parser.h new file mode 100644 index 000000000..ee98b72a6 --- /dev/null +++ b/src/util/order_parser.h @@ -0,0 +1,34 @@ +#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 +}; + +typedef void(*OP_FactionHandler) (void *userData, int no, const char *password); +typedef void(*OP_UnitHandler) (void *userData, int no); +typedef void(*OP_OrderHandler) (void *userData, const char *str, size_t len); + +OP_Parser OP_ParserCreate(void); +void OP_ParserFree(OP_Parser op); +enum OP_Status OP_Parse(OP_Parser op, const char *s, int len, int isFinal); + +#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" From d3a37179efd165d5ebb0c92d39346519ae3d0348 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 19:32:39 +0200 Subject: [PATCH 12/32] add param.[hc], at last. --- src/economy.c | 8 ++- src/give.c | 5 +- src/give.test.c | 1 + src/kernel/build.c | 7 +- src/kernel/build.test.c | 23 ++++--- src/kernel/building.c | 1 + src/kernel/config.c | 132 +------------------------------------- src/kernel/config.h | 9 --- src/kernel/config.test.c | 5 +- src/kernel/order.c | 1 + src/kernel/order.test.c | 1 + src/kernel/ship.c | 1 + src/kernel/types.h | 54 ---------------- src/kernel/unit.c | 15 ++--- src/laws.c | 13 +++- src/laws.h | 5 +- src/laws.test.c | 1 + src/magic.c | 1 + src/move.c | 5 +- src/orderfile.c | 25 +++++--- src/renumber.c | 5 +- src/renumber.test.c | 1 + src/report.c | 7 +- src/reports.test.c | 2 +- src/skill.c | 2 + src/spy.c | 3 +- src/spy.test.c | 2 + src/study.c | 3 +- src/tests.c | 6 +- src/tests.h | 5 +- src/util/CMakeLists.txt | 2 + src/util/keyword.h | 1 - src/util/param.c | 134 +++++++++++++++++++++++++++++++++++++++ src/util/param.h | 77 ++++++++++++++++++++++ 34 files changed, 317 insertions(+), 246 deletions(-) create mode 100644 src/util/param.c create mode 100644 src/util/param.h diff --git a/src/economy.c b/src/economy.c index 15b907a25..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/give.c b/src/give.c index 02d5c622d..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/kernel/build.c b/src/kernel/build.c index 82c629b0b..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 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 215c304e7..d97085345 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -45,6 +45,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include #include #include #include diff --git a/src/kernel/config.c b/src/kernel/config.c index 842324fe8..75601e831 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -60,6 +60,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include #include #include #include @@ -92,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); @@ -151,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 }; @@ -268,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; 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 e060a838e..f5d29877a 100644 --- a/src/kernel/config.test.c +++ b/src/kernel/config.test.c @@ -5,8 +5,11 @@ #include #include #include -#include + #include +#include +#include + #include #include diff --git a/src/kernel/order.c b/src/kernel/order.c index 6015b823d..c0c1e82fb 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -20,6 +20,7 @@ #include "util/keyword.h" #include #include +#include #include #include 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/ship.c b/src/kernel/ship.c index 20ed49d05..6fcea4935 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -40,6 +40,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include #include #include 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 00d0aeece..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/laws.c b/src/laws.c index 8cec1e51b..7e2250a59 100644 --- a/src/laws.c +++ b/src/laws.c @@ -80,6 +80,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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) { 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 5c799a393..774ed6ecf 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include diff --git a/src/magic.c b/src/magic.c index 047ed167b..99a9ecf86 100644 --- a/src/magic.c +++ b/src/magic.c @@ -70,6 +70,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include #include #include #include diff --git a/src/move.c b/src/move.c index 124b846ca..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 diff --git a/src/orderfile.c b/src/orderfile.c index a2c7a6c87..97008f4db 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -1,5 +1,4 @@ #include -#include #include "orderfile.h" #include "kernel/calendar.h" @@ -8,12 +7,14 @@ #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 @@ -33,9 +34,9 @@ static unit *unitorders(input *in, faction *f) if (u && u->faction == f) { order **ordp; - if (!fval(u, UFL_ORDERS)) { + if (u->flags & UFL_ORDERS) { /* alle wiederholbaren, langen befehle werden gesichert: */ - fset(u, UFL_ORDERS); + u->flags |= UFL_ORDERS; u->old_orders = u->orders; ordp = &u->old_orders; while (*ordp) { @@ -125,7 +126,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)); @@ -151,6 +152,10 @@ int read_orders(input *in) int nfactions = 0; struct faction *f = NULL; const struct locale *lang = default_locale; + OP_Parser parser; + + parser = OP_ParserCreate(); + OP_ParserFree(parser); /* TODO: recognize UTF8 BOM */ b = in->getbuf(in->data); diff --git a/src/renumber.c b/src/renumber.c index 8a72be2a5..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 bc47cb1a4..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/reports.test.c b/src/reports.test.c index 29f14c634..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" 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/spy.c b/src/spy.c index 98245e806..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 dfe2886e7..d1f616fab 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -12,8 +12,10 @@ #include #include #include + #include #include +#include "util/param.h" #include #include diff --git a/src/study.c b/src/study.c index a3dfa2e33..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/tests.c b/src/tests.c index 2dc5bccc6..f270d9c58 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 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/util/CMakeLists.txt b/src/util/CMakeLists.txt index 61e2cf745..b4d067f57 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -17,6 +17,7 @@ language.test.c message.test.c # nrmessage.test.c # order_parser.test.c +# param.test.c parser.test.c password.test.c # rand.test.c @@ -47,6 +48,7 @@ message.c mt19937ar.c nrmessage.c order_parser.c +param.c parser.c password.c path.c diff --git a/src/util/keyword.h b/src/util/keyword.h index bd4ab02d0..7bb11c485 100644 --- a/src/util/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/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 From b03da543b658dddbea4d7225f9b4a9692c4a5c5b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 20:06:58 +0200 Subject: [PATCH 13/32] make findparam_ex part of laws, where building names are known. --- src/kernel/building.c | 60 ++++++++++++++++++++++++++++++------------- src/laws.test.c | 22 ++++++++++++++++ src/tests.c | 4 ++- 3 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/kernel/building.c b/src/kernel/building.c index d97085345..fe28b3752 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -129,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]); @@ -265,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() { + 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) { @@ -292,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; @@ -871,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/laws.test.c b/src/laws.test.c index 774ed6ecf..bb26ed872 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -392,6 +392,27 @@ static void test_unit_limit(CuTest * tc) test_teardown(); } +static void test_findparam_ex(CuTest *tc) +{ + struct locale *lang; + struct building_type *btype; + test_setup(); + lang = test_create_locale(); + locale_setstring(lang, "temple", "TEMPEL"); + btype = 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; @@ -1762,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/tests.c b/src/tests.c index f270d9c58..cad296e57 100644 --- a/src/tests.c +++ b/src/tests.c @@ -420,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; } From 965c8ce990d774e43644536c41c102e038d54913 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 29 Sep 2018 21:19:24 +0200 Subject: [PATCH 14/32] start putting the new parser into the server. --- src/orderfile.c | 148 ++++++++++++++++++++++++++++++++-------- src/util/order_parser.c | 20 +++++- src/util/order_parser.h | 6 +- 3 files changed, 145 insertions(+), 29 deletions(-) diff --git a/src/orderfile.c b/src/orderfile.c index 97008f4db..a4f47a4e3 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -20,6 +20,32 @@ #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; @@ -34,29 +60,7 @@ static unit *unitorders(input *in, faction *f) if (u && u->faction == f) { order **ordp; - if (u->flags & UFL_ORDERS) { - /* 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 = 0; - + begin_orders(u); ordp = &u->orders; for (;;) { @@ -152,10 +156,6 @@ int read_orders(input *in) int nfactions = 0; struct faction *f = NULL; const struct locale *lang = default_locale; - OP_Parser parser; - - parser = OP_ParserCreate(); - OP_ParserFree(parser); /* TODO: recognize UTF8 BOM */ b = in->getbuf(in->data); @@ -231,8 +231,101 @@ static const char * file_getbuf(void *data) return getbuf(F, ENCODING_UTF8); } +typedef struct parser_state { + unit *u; + faction *f; + order **next_order; +} parser_state; + +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)); + } + else { + if (!checkpasswd(f, password)) { + log_debug("invalid password for faction %s", itoa36(no)); + ADDMSG(&f->msgs, msg_message("wrongpasswd", "password", password)); + } + } +} + +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; + unit * u = state->u; + order *ord; + + ord = parse_order(str, u->faction->locale); + 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[2048]; + int done = 0, err = 0; + OP_Parser parser; + parser_state state = { NULL, NULL }; + + parser = OP_ParserCreate(); + if (!parser) { + /* TODO: error message */ + return errno; + } + OP_SetUnitHandler(parser, handle_unit); + OP_SetFactionHandler(parser, handle_faction); + 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 = -1; + break; + } + } + OP_ParserFree(parser); + return err; +} + int readorders(FILE *F) { +#undef NEW_PARSER +#ifdef NEW_PARSER + return parseorders(F); +#else input in; int result; @@ -240,4 +333,5 @@ int readorders(FILE *F) in.data = F; result = read_orders(&in); return result; +#endif } diff --git a/src/util/order_parser.c b/src/util/order_parser.c index 691686276..363f12c92 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -18,9 +18,27 @@ struct OrderParserStruct { int m_lineNumber; }; +void OP_SetUnitHandler(OP_Parser op, OP_UnitHandler handler) +{ + op->m_unitHandler = handler; +} + +void OP_SetFactionHandler(OP_Parser op, OP_FactionHandler handler) { + op->m_factionHandler = handler; +} + +void OP_SetOrderHandler(OP_Parser op, OP_OrderHandler handler) { + op->m_orderHandler = handler; +} + +void OP_SetUserData(OP_Parser op, void *userData) { + op->m_userData = userData; +} + OP_Parser OP_ParserCreate(void) { - return NULL; + OP_Parser parser = calloc(1, sizeof(struct OrderParserStruct)); + return parser; } void OP_ParserFree(OP_Parser op) { diff --git a/src/util/order_parser.h b/src/util/order_parser.h index ee98b72a6..7600ee3da 100644 --- a/src/util/order_parser.h +++ b/src/util/order_parser.h @@ -25,10 +25,14 @@ enum OP_Status { typedef void(*OP_FactionHandler) (void *userData, int no, const char *password); typedef void(*OP_UnitHandler) (void *userData, int no); -typedef void(*OP_OrderHandler) (void *userData, const char *str, size_t len); +typedef void(*OP_OrderHandler) (void *userData, const char *str); OP_Parser OP_ParserCreate(void); void OP_ParserFree(OP_Parser op); enum OP_Status OP_Parse(OP_Parser op, const char *s, int len, int isFinal); +void OP_SetUnitHandler(OP_Parser op, OP_UnitHandler handler); +void OP_SetFactionHandler(OP_Parser op, OP_FactionHandler handler); +void OP_SetOrderHandler(OP_Parser op, OP_OrderHandler handler); +void OP_SetUserData(OP_Parser op, void *userData); #endif From 0c6ec475987a589451a99786959c1aaff450f592 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Sep 2018 13:45:19 +0200 Subject: [PATCH 15/32] fix compilation --- src/kernel/building.c | 2 +- src/laws.test.c | 4 ++-- src/move.test.c | 6 +++--- src/orderfile.c | 1 + src/report.test.c | 3 ++- src/util/order_parser.c | 2 +- src/util/order_parser.h | 6 ++++++ 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/kernel/building.c b/src/kernel/building.c index fe28b3752..f5698eaa9 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -257,7 +257,7 @@ building *findbuilding(int i) static local_names *bnames; -static void free_bnames() { +static void free_bnames(void) { while (bnames) { local_names *bn = bnames; bnames = bnames->next; diff --git a/src/laws.test.c b/src/laws.test.c index bb26ed872..e7951a7ce 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -395,11 +395,11 @@ static void test_unit_limit(CuTest * tc) static void test_findparam_ex(CuTest *tc) { struct locale *lang; - struct building_type *btype; + test_setup(); lang = test_create_locale(); locale_setstring(lang, "temple", "TEMPEL"); - btype = test_create_buildingtype("temple"); + test_create_buildingtype("temple"); CuAssertIntEquals(tc, P_GEBAEUDE, findparam_ex("TEMPEL", lang)); CuAssertIntEquals(tc, P_GEBAEUDE, findparam_ex( diff --git a/src/move.test.c b/src/move.test.c index 4e9e4760d..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/orderfile.c b/src/orderfile.c index a4f47a4e3..48cc26a83 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -17,6 +17,7 @@ #include "util/order_parser.h" #include +#include #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/util/order_parser.c b/src/util/order_parser.c index 363f12c92..b0d6d2d10 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -14,7 +14,7 @@ struct OrderParserStruct { OP_FactionHandler m_factionHandler; OP_UnitHandler m_unitHandler; OP_OrderHandler m_orderHandler; - enum CR_Error m_errorCode; + enum OP_Error m_errorCode; int m_lineNumber; }; diff --git a/src/util/order_parser.h b/src/util/order_parser.h index 7600ee3da..c8f20e89e 100644 --- a/src/util/order_parser.h +++ b/src/util/order_parser.h @@ -23,6 +23,12 @@ enum OP_Status { OP_STATUS_OK = 1 }; +enum OP_Error { + OP_ERROR_NONE, + OP_ERROR_NO_MEMORY, + OP_ERROR_SYNTAX +}; + typedef void(*OP_FactionHandler) (void *userData, int no, const char *password); typedef void(*OP_UnitHandler) (void *userData, int no); typedef void(*OP_OrderHandler) (void *userData, const char *str); From fb8507e0d2fc87313006db5bd766394bb74ea07e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Sep 2018 15:02:03 +0200 Subject: [PATCH 16/32] support for non-utf8 encodings has rotted, kill it. --- src/kernel/save.c | 3 - src/orderfile.c | 2 +- src/util/filereader.c | 150 +----------------------------------------- src/util/filereader.h | 5 +- 4 files changed, 4 insertions(+), 156 deletions(-) diff --git a/src/kernel/save.c b/src/kernel/save.c index 3bef185c3..cdc951fad 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -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/orderfile.c b/src/orderfile.c index 48cc26a83..316724338 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -229,7 +229,7 @@ int read_orders(input *in) static const char * file_getbuf(void *data) { FILE *F = (FILE *)data; - return getbuf(F, ENCODING_UTF8); + return getbuf(F); } typedef struct parser_state { 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 } From a4f6c6f0053160884f7be547dc43d99d2465f6b2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Sep 2018 16:16:32 +0200 Subject: [PATCH 17/32] fix libbsd linking --- src/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9ed0011e6..0e4c342d4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -186,6 +186,7 @@ endif() add_library(version STATIC ${VERSION_SRC}) add_library(parser ${PARSER_SRC}) target_link_libraries(parser + bsd ${CRYPTO_LIBRARIES} ) @@ -297,8 +298,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) From 0c4d1ec2b246b907d1867407111dfb81b334a184 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Sep 2018 16:18:06 +0200 Subject: [PATCH 18/32] fix libbsd linking (MSVC) --- src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e4c342d4..8bb751258 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -186,7 +186,6 @@ endif() add_library(version STATIC ${VERSION_SRC}) add_library(parser ${PARSER_SRC}) target_link_libraries(parser - bsd ${CRYPTO_LIBRARIES} ) From b1cd9bcfef32668c5daf3b9a3d3b4da1e83781d7 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Sep 2018 19:47:34 +0200 Subject: [PATCH 19/32] Pretty good progress on the OrderParser implementaiton. Still finding bugs by unit-testing, though. --- .gitignore | 1 + src/test_eressea.c | 1 + src/util/CMakeLists.txt | 2 +- src/util/order_parser.c | 199 +++++++++++++++++++++++++++++++++-- src/util/order_parser.h | 13 +-- src/util/order_parser.test.c | 65 ++++++++++++ 6 files changed, 263 insertions(+), 18 deletions(-) create mode 100644 src/util/order_parser.test.c 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/src/test_eressea.c b/src/test_eressea.c index 439fee1d6..9897c4bf0 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -81,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/util/CMakeLists.txt b/src/util/CMakeLists.txt index b4d067f57..362ee4fb2 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -16,7 +16,7 @@ language.test.c # log.test.c message.test.c # nrmessage.test.c -# order_parser.test.c +order_parser.test.c # param.test.c parser.test.c password.test.c diff --git a/src/util/order_parser.c b/src/util/order_parser.c index b0d6d2d10..ec40f5615 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -4,7 +4,10 @@ #include "order_parser.h" +#include +#include #include +#include struct OrderParserStruct { void *m_userData; @@ -18,34 +21,208 @@ struct OrderParserStruct { int m_lineNumber; }; -void OP_SetUnitHandler(OP_Parser op, OP_UnitHandler handler) +void OP_SetUnitHandler(OP_Parser parser, OP_UnitHandler handler) { - op->m_unitHandler = handler; + parser->m_unitHandler = handler; } -void OP_SetFactionHandler(OP_Parser op, OP_FactionHandler handler) { - op->m_factionHandler = handler; +void OP_SetFactionHandler(OP_Parser parser, OP_FactionHandler handler) { + parser->m_factionHandler = handler; } -void OP_SetOrderHandler(OP_Parser op, OP_OrderHandler handler) { - op->m_orderHandler = handler; +void OP_SetOrderHandler(OP_Parser parser, OP_OrderHandler handler) { + parser->m_orderHandler = handler; } -void OP_SetUserData(OP_Parser op, void *userData) { - op->m_userData = userData; +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_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 op) { - free(op); +void OP_ParserFree(OP_Parser parser) { + free(parser->m_buffer); + free(parser); } -enum OP_Status OP_Parse(OP_Parser op, const char *s, int len, int isFinal) +static enum OP_Error buffer_append(OP_Parser parser, const char *s, int len) { + if (parser->m_buffer == NULL) { + parser->m_buffer = malloc(len + 1); + 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 { + size_t total = len; + char * buffer; + total += (parser->m_bufferEnd - parser->m_bufferPtr); + /* TODO: recycle buffers, reduce mallocs. */ + buffer = malloc(total + 1); + memcpy(buffer, parser->m_bufferPtr, total - len); + memcpy(buffer + total - len, s, len); + buffer[total] = '\0'; + free(parser->m_buffer); + parser->m_buffer = buffer; + if (!parser->m_buffer) { + return OP_ERROR_NO_MEMORY; + } + parser->m_bufferPtr = parser->m_buffer; + parser->m_bufferEnd = parser->m_buffer + total; + } + return OP_ERROR_NONE; +} + +static enum OP_Error handle_line(OP_Parser parser) { + if (parser->m_orderHandler) { + parser->m_orderHandler(parser->m_userData, parser->m_bufferPtr); + } + return OP_ERROR_NONE; +} + +static char *skip_spaces(char *pos) { + char *next; + for (next = pos; *next && *next != '\n'; ++next) { + /* TODO: handle unicode whitespace */ + if (!isspace(*next)) break; + } + return next; +} + +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; + + 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 */ + 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: */ + pos = next + 1; + ++parser->m_lineNumber; + break; + } + else { + /* is this backslash the final character? */ + next = skip_spaces(pos + 1); + if (*next == '\n') { + /* we have a multi-line comment! */ + pos = next + 1; + ++parser->m_lineNumber; + } + else { + /* keep looking for a backslash */ + pos = next; + } + } + } + } while (next && *next); + + if (next && pos < parser->m_bufferEnd) { + /* we skip the comment, and there is more data in the buffer */ + parser->m_bufferPtr = pos; + } + else { + /* we exhausted the buffer before we got to the end of the comment */ + if (isFinal) { + /* the input ended on this comment line, which is fine */ + return OP_STATUS_OK; + } + else { + /* skip what we have of the comment, keep the semicolon, keep going */ + ptrdiff_t skip = parser->m_bufferEnd - parser->m_bufferPtr; + if (skip > 1) { + parser->m_bufferPtr += (skip - 1); + parser->m_bufferPtr[0] = ';'; + } + } + } + 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; + + if (parser->m_bufferPtr >= parser->m_bufferEnd) { + buffer_free(parser); + } + + 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 index c8f20e89e..10a258875 100644 --- a/src/util/order_parser.h +++ b/src/util/order_parser.h @@ -34,11 +34,12 @@ typedef void(*OP_UnitHandler) (void *userData, int no); typedef void(*OP_OrderHandler) (void *userData, const char *str); OP_Parser OP_ParserCreate(void); -void OP_ParserFree(OP_Parser op); -enum OP_Status OP_Parse(OP_Parser op, const char *s, int len, int isFinal); -void OP_SetUnitHandler(OP_Parser op, OP_UnitHandler handler); -void OP_SetFactionHandler(OP_Parser op, OP_FactionHandler handler); -void OP_SetOrderHandler(OP_Parser op, OP_OrderHandler handler); -void OP_SetUserData(OP_Parser op, void *userData); +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_SetUnitHandler(OP_Parser parser, OP_UnitHandler handler); +void OP_SetFactionHandler(OP_Parser parser, OP_FactionHandler handler); +void OP_SetOrderHandler(OP_Parser parser, OP_OrderHandler handler); +void OP_SetUserData(OP_Parser parser, void *userData); #endif diff --git a/src/util/order_parser.test.c b/src/util/order_parser.test.c new file mode 100644 index 000000000..a4bc58e97 --- /dev/null +++ b/src/util/order_parser.test.c @@ -0,0 +1,65 @@ +#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); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World", 11, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World\n", 12, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\\\n World", 13, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello;World", 11, 1)); + CuAssertStrEquals(tc, "Hello", lastline); + OP_ParserReset(parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\\World", 11, 1)); + CuAssertStrEquals(tc, "Hello\\World", lastline); + OP_ParserReset(parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello ", 6, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "World", 5, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); + OP_ParserReset(parser); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello\\World \\", 14, 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; +} From 90b80aba898cc68e18a42270223e520b880f6427 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 1 Oct 2018 02:26:31 +0200 Subject: [PATCH 20/32] fix some more issues with buffer ending before decisions are finished. --- src/util/order_parser.c | 16 +++++++++++++++- src/util/order_parser.test.c | 12 ++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/util/order_parser.c b/src/util/order_parser.c index ec40f5615..8bf4c7e8d 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -144,7 +144,21 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) } else { /* this is not multi-line input yet, so do nothing */ - pos = strpbrk(pos + 1, "\\;\n"); + 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 ';': diff --git a/src/util/order_parser.test.c b/src/util/order_parser.test.c index a4bc58e97..e9a37fa76 100644 --- a/src/util/order_parser.test.c +++ b/src/util/order_parser.test.c @@ -32,27 +32,39 @@ static void test_parse_orders(CuTest *tc) { 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, "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, "Hello ", 6, 0)); CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "World", 5, 1)); CuAssertStrEquals(tc, "Hello World", 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 \\", 7, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nWorld", 6, 1)); + CuAssertStrEquals(tc, "Hello World", lastline); OP_ParserFree(parser); } From eed3ab3acfc54dce5082a75aa458e0291029ea92 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 1 Oct 2018 21:32:59 +0200 Subject: [PATCH 21/32] finish new order parser, maybe? --- src/orderfile.c | 50 +++++++++++++++++++++++++++++++---------- src/util/order_parser.c | 28 +++++++++-------------- src/util/order_parser.h | 4 ---- 3 files changed, 48 insertions(+), 34 deletions(-) diff --git a/src/orderfile.c b/src/orderfile.c index 316724338..ff19014ea 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -249,6 +249,8 @@ static void handle_faction(void *userData, int no, const char *password) { log_debug("invalid password for faction %s", itoa36(no)); ADDMSG(&f->msgs, msg_message("wrongpasswd", "password", password)); } + state->u = NULL; + state->next_order = NULL; } } @@ -272,20 +274,46 @@ static void handle_unit(void *userData, int no) { static void handle_order(void *userData, const char *str) { parser_state *state = (parser_state *)userData; - unit * u = state->u; - order *ord; + const char * tok, *input = str; + char buffer[16]; + const struct locale *lang; + param_t p; + faction * f = state->f; - ord = parse_order(str, u->faction->locale); - if (ord) { - *state->next_order = ord; - state->next_order = &ord->next; + 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 { - ADDMSG(&u->faction->msgs, msg_message("parse_error", "unit command", u, str)); + else if (p == P_UNIT) { + tok = parse_token(&input, buffer, sizeof(buffer)); + if (tok) { + int no = atoi36(tok); + handle_unit(userData, no); + } + } + 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[2048]; @@ -298,8 +326,6 @@ int parseorders(FILE *F) /* TODO: error message */ return errno; } - OP_SetUnitHandler(parser, handle_unit); - OP_SetFactionHandler(parser, handle_faction); OP_SetOrderHandler(parser, handle_order); OP_SetUserData(parser, &state); @@ -323,7 +349,7 @@ int parseorders(FILE *F) int readorders(FILE *F) { -#undef NEW_PARSER +#define NEW_PARSER #ifdef NEW_PARSER return parseorders(F); #else diff --git a/src/util/order_parser.c b/src/util/order_parser.c index 8bf4c7e8d..f303ff3f1 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -14,22 +14,11 @@ struct OrderParserStruct { char *m_buffer; char *m_bufferPtr; const char *m_bufferEnd; - OP_FactionHandler m_factionHandler; - OP_UnitHandler m_unitHandler; OP_OrderHandler m_orderHandler; enum OP_Error m_errorCode; int m_lineNumber; }; -void OP_SetUnitHandler(OP_Parser parser, OP_UnitHandler handler) -{ - parser->m_unitHandler = handler; -} - -void OP_SetFactionHandler(OP_Parser parser, OP_FactionHandler handler) { - parser->m_factionHandler = handler; -} - void OP_SetOrderHandler(OP_Parser parser, OP_OrderHandler handler) { parser->m_orderHandler = handler; } @@ -95,13 +84,6 @@ static enum OP_Error buffer_append(OP_Parser parser, const char *s, int len) return OP_ERROR_NONE; } -static enum OP_Error handle_line(OP_Parser parser) { - if (parser->m_orderHandler) { - parser->m_orderHandler(parser->m_userData, parser->m_bufferPtr); - } - return OP_ERROR_NONE; -} - static char *skip_spaces(char *pos) { char *next; for (next = pos; *next && *next != '\n'; ++next) { @@ -111,6 +93,16 @@ static char *skip_spaces(char *pos) { 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"); diff --git a/src/util/order_parser.h b/src/util/order_parser.h index 10a258875..fde29a380 100644 --- a/src/util/order_parser.h +++ b/src/util/order_parser.h @@ -29,16 +29,12 @@ enum OP_Error { OP_ERROR_SYNTAX }; -typedef void(*OP_FactionHandler) (void *userData, int no, const char *password); -typedef void(*OP_UnitHandler) (void *userData, int no); 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_SetUnitHandler(OP_Parser parser, OP_UnitHandler handler); -void OP_SetFactionHandler(OP_Parser parser, OP_FactionHandler handler); void OP_SetOrderHandler(OP_Parser parser, OP_OrderHandler handler); void OP_SetUserData(OP_Parser parser, void *userData); From e6b93ce79a70d6629ac9accccb64e29620785b9f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 2 Oct 2018 18:57:21 +0200 Subject: [PATCH 22/32] reset state when we meet the NEXT command. --- src/orderfile.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/orderfile.c b/src/orderfile.c index ff19014ea..8fdc75485 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -301,6 +301,15 @@ static void handle_order(void *userData, const char *str) { 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); From b439e48a22418b81a15c4b741cff7283c853d70b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 2 Oct 2018 19:02:22 +0200 Subject: [PATCH 23/32] some failing tests --- src/util/order_parser.test.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/util/order_parser.test.c b/src/util/order_parser.test.c index e9a37fa76..2d113655a 100644 --- a/src/util/order_parser.test.c +++ b/src/util/order_parser.test.c @@ -36,31 +36,52 @@ static void test_parse_orders(CuTest *tc) { 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 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, "Hello ", 6, 0)); - CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "World", 5, 1)); - CuAssertStrEquals(tc, "Hello World", lastline); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, ";Hello \\", 8, 0)); + CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nWorld\n", 7, 1)); + 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, 1)); + 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 \\", 7, 0)); CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "\nWorld", 6, 1)); From 6c1d266c1279d6230067eca5934012a3c65da91a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 2 Oct 2018 21:40:14 +0200 Subject: [PATCH 24/32] fix comment parsing at end of input --- src/orderfile.c | 2 +- src/util/order_parser.c | 56 +++++++++++++++++++++++++----------- src/util/order_parser.h | 1 + src/util/order_parser.test.c | 15 ++++++++-- 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/orderfile.c b/src/orderfile.c index 8fdc75485..33a9c19f7 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -348,7 +348,7 @@ int parseorders(FILE *F) done = feof(F); if (OP_Parse(parser, buf, len, done) == OP_STATUS_ERROR) { /* TODO: error message */ - err = -1; + err = (int)OP_GetErrorCode(parser); break; } } diff --git a/src/util/order_parser.c b/src/util/order_parser.c index f303ff3f1..88a42f0ab 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -5,7 +5,7 @@ #include "order_parser.h" #include -#include +#include #include #include @@ -19,6 +19,10 @@ struct OrderParserStruct { 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; } @@ -87,8 +91,9 @@ static enum OP_Error buffer_append(OP_Parser parser, const char *s, int len) 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 (!isspace(*next)) break; + if (!iswspace(wch)) break; } return next; } @@ -110,6 +115,7 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) enum OP_Error code; size_t len = pos - parser->m_bufferPtr; char *next; + int continue_comment = 0; switch (*pos) { case '\n': @@ -164,9 +170,8 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) if (next) { if (*next == '\n') { /* no more lines in this comment, we're done: */ - pos = next + 1; ++parser->m_lineNumber; - break; + break; /* exit loop */ } else { /* is this backslash the final character? */ @@ -184,25 +189,42 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) } } while (next && *next); - if (next && pos < parser->m_bufferEnd) { - /* we skip the comment, and there is more data in the buffer */ - parser->m_bufferPtr = pos; - } - else { - /* we exhausted the buffer before we got to the end of the comment */ + if (!next) { + /* we exhausted the buffer before we finished the line */ if (isFinal) { - /* the input ended on this comment line, which is fine */ + /* this comment was at the end of the file, it just has no newline. done! */ return OP_STATUS_OK; } else { - /* skip what we have of the comment, keep the semicolon, keep going */ - ptrdiff_t skip = parser->m_bufferEnd - parser->m_bufferPtr; - if (skip > 1) { - parser->m_bufferPtr += (skip - 1); - parser->m_bufferPtr[0] = ';'; - } + /* 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 { + /* 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; + continue_comment = 0; + if (skip > 0) { + /* should always be true */ + parser->m_bufferPtr += (skip - 1); + parser->m_bufferPtr[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; diff --git a/src/util/order_parser.h b/src/util/order_parser.h index fde29a380..159fd6594 100644 --- a/src/util/order_parser.h +++ b/src/util/order_parser.h @@ -37,5 +37,6 @@ 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 index 2d113655a..630bcc4d4 100644 --- a/src/util/order_parser.test.c +++ b/src/util/order_parser.test.c @@ -57,16 +57,22 @@ static void test_parse_orders(CuTest *tc) { 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, 1)); + 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, 1)); + 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); @@ -82,6 +88,11 @@ static void test_parse_orders(CuTest *tc) { 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)); From 854decc4f10548127aa2814d83b014826fc47f1f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 3 Oct 2018 10:37:34 +0200 Subject: [PATCH 25/32] comments split by a backslash are not handled right. --- src/util/order_parser.test.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/util/order_parser.test.c b/src/util/order_parser.test.c index 630bcc4d4..1034e3d0a 100644 --- a/src/util/order_parser.test.c +++ b/src/util/order_parser.test.c @@ -32,11 +32,17 @@ static void test_parse_orders(CuTest *tc) { 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, "Hello World;\nError", 18, 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); From fbce8f326af1d5ed11da3aafcc773747f584186c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 3 Oct 2018 19:47:32 +0200 Subject: [PATCH 26/32] fix error in multi-line comments at stream border. --- src/orderfile.c | 47 ++++++++++++++++++++++++++++-------- src/util/order_parser.c | 18 ++++++++++---- src/util/order_parser.test.c | 19 ++++++++++++++- 3 files changed, 68 insertions(+), 16 deletions(-) diff --git a/src/orderfile.c b/src/orderfile.c index 33a9c19f7..450e1b0c1 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -21,6 +21,9 @@ #include #include +static FILE *dlog; +static int orders_parsed, units_parsed, factions_parsed; + static void begin_orders(unit *u) { if (u->flags & UFL_ORDERS) { order **ordp; @@ -52,6 +55,7 @@ static unit *unitorders(input *in, faction *f) int i; unit *u; + ++units_parsed; if (!f) return NULL; @@ -109,6 +113,11 @@ static unit *unitorders(input *in, faction *f) } } /* Nun wird der Befehl erzeut und eingeh�ngt */ + ++orders_parsed; + if (dlog) { + fputs(s, dlog); + fputc('\n', dlog); + } *ordp = parse_order(s, u->faction->locale); if (*ordp) { ordp = &(*ordp)->next; @@ -131,6 +140,7 @@ static faction *factionorders(void) int fid = getid(); faction *f = findfaction(fid); + ++factions_parsed; if (f != NULL && (f->flags & FFL_NPC) == 0) { char token[128]; const char *pass = gettoken(token, sizeof(token)); @@ -241,6 +251,7 @@ typedef struct parser_state { static void handle_faction(void *userData, int no, const char *password) { parser_state *state = (parser_state *)userData; faction * f = state->f = findfaction(no); + ++factions_parsed; if (!f) { log_debug("orders for unknown faction %s", itoa36(no)); } @@ -258,6 +269,7 @@ static void handle_unit(void *userData, int no) { parser_state *state = (parser_state *)userData; unit * u = findunit(no); + ++units_parsed; state->u = NULL; if (!u) { /* TODO: error message */ @@ -313,6 +325,11 @@ static void handle_order(void *userData, const char *str) { else if (state->u) { unit * u = state->u; order * ord = parse_order(str, lang); + ++orders_parsed; + if (dlog) { + fputs(str, dlog); + fputc('\n', dlog); + } if (ord) { *state->next_order = ord; state->next_order = &ord->next; @@ -325,7 +342,7 @@ static void handle_order(void *userData, const char *str) { int parseorders(FILE *F) { - char buf[2048]; + char buf[4096]; int done = 0, err = 0; OP_Parser parser; parser_state state = { NULL, NULL }; @@ -356,18 +373,28 @@ int parseorders(FILE *F) return err; } +#define NEW_PARSER int readorders(FILE *F) { -#define NEW_PARSER -#ifdef NEW_PARSER - return parseorders(F); -#else - input in; int result; - in.getbuf = file_getbuf; - in.data = F; - result = read_orders(&in); - return result; + orders_parsed = 0; + units_parsed = 0; + factions_parsed = 0; + +#ifdef NEW_PARSER + dlog = fopen("orders.new.log", "w+"); + result = parseorders(F); +#else + dlog = fopen("orders.old.log", "w+"); + { + input in; + in.getbuf = file_getbuf; + in.data = F; + result = read_orders(&in); + } #endif + fclose(dlog); + log_debug("%d orders read.", orders_parsed); + return result; } diff --git a/src/util/order_parser.c b/src/util/order_parser.c index 88a42f0ab..55b03accd 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -175,12 +175,16 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) } else { /* is this backslash the final character? */ - next = skip_spaces(pos + 1); + 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; @@ -206,7 +210,7 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) pos = next + 1; continue_comment = 0; } - else { + else if (!continue_comment) { /* reached end of input naturally, need more data to finish */ continue_comment = 1; } @@ -214,12 +218,16 @@ static enum OP_Status parse_buffer(OP_Parser parser, int isFinal) if (continue_comment) { ptrdiff_t skip = parser->m_bufferEnd - parser->m_bufferPtr; - continue_comment = 0; - if (skip > 0) { + assert(skip >= continue_comment); + if (skip >= continue_comment) { /* should always be true */ - parser->m_bufferPtr += (skip - 1); + 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 */ diff --git a/src/util/order_parser.test.c b/src/util/order_parser.test.c index 1034e3d0a..d43f661fb 100644 --- a/src/util/order_parser.test.c +++ b/src/util/order_parser.test.c @@ -39,7 +39,24 @@ static void test_parse_orders(CuTest *tc) { OP_ParserReset(parser); lastline[0] = 0; - CuAssertIntEquals(tc, OP_STATUS_OK, OP_Parse(parser, "Hello World;\nError", 18, 1)); + 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); From 730b94fa4afd0d0384569b9d3800b08a41f35dfe Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 3 Oct 2018 20:29:45 +0200 Subject: [PATCH 27/32] reuse the internal buffer when we don't have to malloc. --- src/util/order_parser.c | 55 +++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/util/order_parser.c b/src/util/order_parser.c index 55b03accd..21268f163 100644 --- a/src/util/order_parser.c +++ b/src/util/order_parser.c @@ -13,6 +13,7 @@ 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; @@ -35,6 +36,7 @@ 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; } @@ -58,8 +60,28 @@ void OP_ParserFree(OP_Parser 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_buffer = malloc(len + 1); + parser->m_bufferSize = len + 1; + parser->m_buffer = malloc(parser->m_bufferSize); if (!parser->m_buffer) { return OP_ERROR_NO_MEMORY; } @@ -69,21 +91,26 @@ static enum OP_Error buffer_append(OP_Parser parser, const char *s, int len) parser->m_bufferEnd = parser->m_buffer + len; } else { - size_t total = len; char * buffer; - total += (parser->m_bufferEnd - parser->m_bufferPtr); /* TODO: recycle buffers, reduce mallocs. */ - buffer = malloc(total + 1); - memcpy(buffer, parser->m_bufferPtr, total - len); - memcpy(buffer + total - len, s, len); - buffer[total] = '\0'; - free(parser->m_buffer); - parser->m_buffer = buffer; - if (!parser->m_buffer) { - return OP_ERROR_NO_MEMORY; + 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; + parser->m_bufferEnd = parser->m_buffer + total - 1; } return OP_ERROR_NONE; } @@ -250,10 +277,6 @@ enum OP_Status OP_Parse(OP_Parser parser, const char *s, int len, int isFinal) { enum OP_Error code; - if (parser->m_bufferPtr >= parser->m_bufferEnd) { - buffer_free(parser); - } - code = buffer_append(parser, s, len); if (code != OP_ERROR_NONE) { parser->m_errorCode = code; From bbd57b6ae99604e131305338f36390513bf78964 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 3 Oct 2018 20:33:53 +0200 Subject: [PATCH 28/32] remove debug stuff, use new parser for the game. --- src/bind_eressea.c | 2 +- src/orderfile.c | 40 ++++------------------------------------ src/orderfile.h | 1 + 3 files changed, 6 insertions(+), 37 deletions(-) diff --git a/src/bind_eressea.c b/src/bind_eressea.c index 34640137b..e5acbac99 100755 --- a/src/bind_eressea.c +++ b/src/bind_eressea.c @@ -41,7 +41,7 @@ int eressea_read_orders(const char * filename) { return -1; } log_info("reading orders from %s", filename); - return readorders(F); + return parseorders(F); } int eressea_export_json(const char * filename, int flags) { diff --git a/src/orderfile.c b/src/orderfile.c index 450e1b0c1..1677321eb 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -21,9 +21,6 @@ #include #include -static FILE *dlog; -static int orders_parsed, units_parsed, factions_parsed; - static void begin_orders(unit *u) { if (u->flags & UFL_ORDERS) { order **ordp; @@ -55,7 +52,6 @@ static unit *unitorders(input *in, faction *f) int i; unit *u; - ++units_parsed; if (!f) return NULL; @@ -113,11 +109,6 @@ static unit *unitorders(input *in, faction *f) } } /* Nun wird der Befehl erzeut und eingeh�ngt */ - ++orders_parsed; - if (dlog) { - fputs(s, dlog); - fputc('\n', dlog); - } *ordp = parse_order(s, u->faction->locale); if (*ordp) { ordp = &(*ordp)->next; @@ -140,7 +131,6 @@ static faction *factionorders(void) int fid = getid(); faction *f = findfaction(fid); - ++factions_parsed; if (f != NULL && (f->flags & FFL_NPC) == 0) { char token[128]; const char *pass = gettoken(token, sizeof(token)); @@ -251,7 +241,6 @@ typedef struct parser_state { static void handle_faction(void *userData, int no, const char *password) { parser_state *state = (parser_state *)userData; faction * f = state->f = findfaction(no); - ++factions_parsed; if (!f) { log_debug("orders for unknown faction %s", itoa36(no)); } @@ -269,7 +258,6 @@ static void handle_unit(void *userData, int no) { parser_state *state = (parser_state *)userData; unit * u = findunit(no); - ++units_parsed; state->u = NULL; if (!u) { /* TODO: error message */ @@ -325,11 +313,6 @@ static void handle_order(void *userData, const char *str) { else if (state->u) { unit * u = state->u; order * ord = parse_order(str, lang); - ++orders_parsed; - if (dlog) { - fputs(str, dlog); - fputc('\n', dlog); - } if (ord) { *state->next_order = ord; state->next_order = &ord->next; @@ -373,28 +356,13 @@ int parseorders(FILE *F) return err; } -#define NEW_PARSER int readorders(FILE *F) { int result; - orders_parsed = 0; - units_parsed = 0; - factions_parsed = 0; - -#ifdef NEW_PARSER - dlog = fopen("orders.new.log", "w+"); - result = parseorders(F); -#else - dlog = fopen("orders.old.log", "w+"); - { - input in; - in.getbuf = file_getbuf; - in.data = F; - result = read_orders(&in); - } -#endif - fclose(dlog); - log_debug("%d orders read.", orders_parsed); + input in; + in.getbuf = file_getbuf; + in.data = F; + result = read_orders(&in); return result; } diff --git a/src/orderfile.h b/src/orderfile.h index fa051993e..f4260aa67 100644 --- a/src/orderfile.h +++ b/src/orderfile.h @@ -14,6 +14,7 @@ extern "C" { int read_orders(struct input *in); int readorders(FILE *F); + int parseorders(FILE *F); #ifdef __cplusplus } From 6b983079b7a92f9e7af9367df39836b47922f97d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 4 Oct 2018 04:47:20 +0200 Subject: [PATCH 29/32] remember to set faction.lastorders (NMR count was off). checker just removes comments now. --- src/checker.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- src/orderfile.c | 5 ++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/checker.c b/src/checker.c index 302c80390..f87b91891 100644 --- a/src/checker.c +++ b/src/checker.c @@ -2,10 +2,50 @@ #include #endif -#include "util/parser.h" +#include "util/order_parser.h" #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; +} + int main(int argc, char **argv) { FILE * F = stdin; if (argc >= 1) { @@ -15,8 +55,10 @@ int main(int argc, char **argv) { perror(filename); return -1; } + } + parsefile(F); + if (F != stdin) { fclose(F); } return 0; } - diff --git a/src/orderfile.c b/src/orderfile.c index 1677321eb..90b44477b 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -245,7 +245,10 @@ static void handle_faction(void *userData, int no, const char *password) { log_debug("orders for unknown faction %s", itoa36(no)); } else { - if (!checkpasswd(f, password)) { + 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)); } From 9a1bdf444439d0dfb7d18f0c37d3bea6b26a6f00 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 4 Oct 2018 10:49:53 +0200 Subject: [PATCH 30/32] fix checker build and arg parsing --- src/checker.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/checker.c b/src/checker.c index f87b91891..4138a372a 100644 --- a/src/checker.c +++ b/src/checker.c @@ -4,6 +4,7 @@ #include "util/order_parser.h" +#include #include typedef struct parser_state { @@ -48,7 +49,7 @@ int parsefile(FILE *F) { int main(int argc, char **argv) { FILE * F = stdin; - if (argc >= 1) { + if (argc > 1) { const char *filename = argv[1]; F = fopen(filename, "r"); if (!F) { From 4f8dd4cb0f017323688f9bb7bcf30fdc407e920b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 6 Oct 2018 20:47:23 +0200 Subject: [PATCH 31/32] checker is going to use locales, fix them up, too. --- src/CMakeLists.txt | 2 +- src/bind_eressea.c | 2 +- src/checker.c | 26 ++++++++++++++++++++++++++ src/kernel/config.c | 1 + src/platform.h | 7 ------- src/util/language.c | 15 +++------------ src/util/language.h | 4 ++-- src/util/log.c | 3 ++- src/util/path.h | 6 ++++++ 9 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8bb751258..4e8db8bf9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -186,6 +186,7 @@ endif() add_library(version STATIC ${VERSION_SRC}) add_library(parser ${PARSER_SRC}) target_link_libraries(parser + ${CLIBS_LIBRARIES} ${CRYPTO_LIBRARIES} ) @@ -205,7 +206,6 @@ target_link_libraries(eressea ${TOLUA_LIBRARIES} ${LUA_LIBRARIES} ${STORAGE_LIBRARIES} - ${CLIBS_LIBRARIES} ${CJSON_LIBRARIES} ${INIPARSER_LIBRARIES} ) diff --git a/src/bind_eressea.c b/src/bind_eressea.c index e5acbac99..4d3918899 100755 --- a/src/bind_eressea.c +++ b/src/bind_eressea.c @@ -22,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) { diff --git a/src/checker.c b/src/checker.c index 4138a372a..a2c29dd7c 100644 --- a/src/checker.c +++ b/src/checker.c @@ -3,9 +3,14 @@ #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 typedef struct parser_state { FILE * F; @@ -47,6 +52,26 @@ int parsefile(FILE *F) { 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) { @@ -57,6 +82,7 @@ int main(int argc, char **argv) { return -1; } } + read_config("../git"); parsefile(F); if (F != stdin) { fclose(F); diff --git a/src/kernel/config.c b/src/kernel/config.c index 75601e831..15387dca7 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -239,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/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/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/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); From 5964d551e3540e350e025662072a27643ff53047 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 6 Oct 2018 20:53:26 +0200 Subject: [PATCH 32/32] PATH_MAX is just a stupid constant --- src/checker.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/checker.c b/src/checker.c index a2c29dd7c..27648e7af 100644 --- a/src/checker.c +++ b/src/checker.c @@ -9,6 +9,7 @@ #include "util/pofile.h" #include +#include #include #include