commit 23df52df987aad19c742bb0a64ca2544cfe730ea Author: Ahmed Siam Date: Mon Jun 5 11:40:09 2023 +0300 Use fread to load .dat file diff --git a/Makefile.am b/Makefile.am index 924c064..72f45d5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ export LOCALES_DIR=$(datadir)/$(PACKAGE_NAME) -export LOCALES_DATA=$(LOCALES_DIR)/$(PACKAGE_NAME) +export LOCALES_DATA=$(LOCALES_DIR)/locales.dat SUBDIRS = src locales diff --git a/locales/Makefile.am b/locales/Makefile.am index 63448f9..590e1cb 100644 --- a/locales/Makefile.am +++ b/locales/Makefile.am @@ -1,7 +1,7 @@ locales.dat: root.txt en.txt genrb -d . root.txt en.txt echo root.res en.res > package_list.txt - pkgdata -w -p locales --mode archive -d . package_list.txt + pkgdata -p locales --mode archive -d . package_list.txt localesdir = $(LOCALES_DIR) dist_locales_DATA = locales.dat diff --git a/src/Makefile.am b/src/Makefile.am index 60de62d..cee526f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,4 +2,4 @@ bin_PROGRAMS = icuformat test icuformat_SOURCES = icuformat.cpp i18n.cpp test_SOURCES = test.cpp i18n.cpp -AM_CPPFLAGS = -DLOCALES_DIR='"$(LOCALES_DIR)"' +AM_CPPFLAGS = -DLOCALES_DATA='"$(LOCALES_DATA)"' diff --git a/src/i18n.cpp b/src/i18n.cpp index 249b263..1c05e66 100644 --- a/src/i18n.cpp +++ b/src/i18n.cpp @@ -3,14 +3,40 @@ #include #include #include +#include +#include #include #include "i18n.h" -I18n::I18n(const char* locales_path) : resource("", "", status) +I18n::I18n(const char *locales_path) : resource("", "", status) { status = U_ZERO_ERROR; - u_setDataDirectory(locales_path); + FILE *file = fopen(locales_path, "r"); + if (file == NULL) { + std::cerr << "Error in opening data file!" << std::endl; + exit(EXIT_FAILURE); + } + size_t file_size = std::filesystem::file_size(std::filesystem::path{locales_path}); + + void *locales_data = malloc(file_size); + size_t success_reads = fread(locales_data, 1, file_size, file); + + if (success_reads != file_size) { + std::cerr << "Error in loading data file!" << std::endl; + exit(EXIT_FAILURE); + } + + udata_setAppData("locales", locales_data, &status); + + fclose(file); + free(locales_data); + + if (!U_SUCCESS(status)) { + std::cerr << "Error in loading data!" << std::endl; + std::cerr << u_errorName(status) << std::endl; + exit(EXIT_FAILURE); + } resource = icu::ResourceBundle("locales", icu::Locale().getName(), status); if (!U_SUCCESS(status)) { @@ -43,4 +69,5 @@ icu::UnicodeString I18n::format(const char* key, const std::vector args = {}); }; #endif \ No newline at end of file diff --git a/src/icuformat.cpp b/src/icuformat.cpp index c0d33a7..0ad6c4d 100644 --- a/src/icuformat.cpp +++ b/src/icuformat.cpp @@ -9,7 +9,7 @@ int main(int argc, char* argv[]) return 0; } - I18n i18n {LOCALES_DIR}; + I18n i18n {LOCALES_DATA}; std::vector arguments; for (int i = 2; i < argc; i++) { @@ -17,6 +17,5 @@ int main(int argc, char* argv[]) } std::cout << i18n.format(argv[1], arguments) << std::endl; - return 0; } \ No newline at end of file diff --git a/src/test.cpp b/src/test.cpp index 5f97550..7ddd4bb 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -1,29 +1,10 @@ #include #include -#include -#include #include "i18n.h" -int main() { - /* - UErrorCode status = U_ZERO_ERROR; - UDataMemory *locales_dat = NULL; - locales_dat = udata_open(LOCALES_DIR, "dat", "locales", &status); - if (!U_SUCCESS(status)) { - std::cerr << status << std::endl; - exit(EXIT_FAILURE); - } - // UDataInfo *pInfo = NULL; - // udata_getInfo(data, pInfo); - // std::cout << pInfo->size << std::endl; - udata_setAppData("locales.dat", udata_getMemory(locales_dat), &status); - if (!U_SUCCESS(status)) { - std::cerr << "setAppData" << std::endl; - std::cerr << status << std::endl; - exit(EXIT_FAILURE); - }*/ - I18n i18n {LOCALES_DIR}; +int main() { + I18n i18n {LOCALES_DATA}; std::cout << i18n.format("test_message") << std::endl; std::cout << i18n.format("complex_message", {"Ahmed", "Egypt"}) << std::endl;