diff options
| author | Aldrik Ramaekers <aldrik.ramaekers@protonmail.com> | 2020-02-02 22:01:20 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik.ramaekers@protonmail.com> | 2020-02-02 22:01:20 +0100 |
| commit | a3e583b4c706cd65f049987c3dcb1d38cb7bd3dc (patch) | |
| tree | e6ab331eb69c41c44d31cb4817c3842cd486cb9b /src | |
| parent | a3952601d5bfb66bc0061584166ca12c536efef1 (diff) | |
saving
Diffstat (limited to 'src')
| -rw-r--r-- | src/mo_edit.c | 49 | ||||
| -rw-r--r-- | src/save.c | 232 | ||||
| -rw-r--r-- | src/save.h | 4 |
3 files changed, 99 insertions, 186 deletions
diff --git a/src/mo_edit.c b/src/mo_edit.c index 92e4b54..87e184f 100644 --- a/src/mo_edit.c +++ b/src/mo_edit.c @@ -105,7 +105,7 @@ bool term_has_missing_translations(term *t) for (s32 i = 0; i < t->translations.length; i++) { translation *tr = array_at(&t->translations, i); - if (!tr->value) return true; + if (string_equals(tr->value, "")) return true; } return false; @@ -184,7 +184,8 @@ void add_language_to_project(char *buffer) term *t = array_at(¤t_project->terms, x); translation new_t; - new_t.value = 0; + new_t.value = mem_alloc(MAX_INPUT_LENGTH); + string_copyn(new_t.value, "", MAX_INPUT_LENGTH); new_t.language_id = l.id; array_push(&t->translations, &new_t); @@ -297,7 +298,8 @@ s32 add_term_to_project() language *l = array_at(¤t_project->languages, i); translation tr; - tr.value = 0; + tr.value = mem_alloc(MAX_INPUT_LENGTH); + string_copyn(tr.value, "", MAX_INPUT_LENGTH); tr.language_id = l->id; array_push(&t.translations, &tr); } @@ -316,15 +318,7 @@ void save_term_changes() translation *tr = array_at(&t->translations, i); textbox_state *tb = &tb_translation_list[i]; - if (strlen(tb->buffer) || tr->value) - { - if (!tr->value) - { - tr->value = mem_alloc(MAX_INPUT_LENGTH); - } - - string_copyn(tr->value, tb->buffer, MAX_INPUT_LENGTH); - } + string_copyn(tr->value, tb->buffer, MAX_INPUT_LENGTH); } } @@ -352,8 +346,14 @@ void load_config(settings_config *config) { string_copyn(project_path, path, MAX_INPUT_LENGTH); - start_new_project(); - load_project_from_file(project_path); + if (platform_directory_exists(project_path)) + { + load_project_from_folder(project_path); + } + else + { + string_copyn(project_path, "", MAX_INPUT_LENGTH); + } } if (locale_id) @@ -471,7 +471,6 @@ int main(int argc, char **argv) // TODO(Aldrik): translate if (ui_push_menu_item("Load Project", "Ctrl + O")) { - start_new_project(); load_project(); } // TODO(Aldrik): translate @@ -480,18 +479,13 @@ int main(int argc, char **argv) if (string_equals(project_path, "")) save_project(); else - save_project_to_file(project_path); + save_project_to_folder(project_path); } // TODO(Aldrik): translate if (ui_push_menu_item("Save Project As", "Ctrl + E")) { save_project(); } - // TODO(Aldrik): translate - if (ui_push_menu_item("Export MO files", "Ctrl + X")) - { - // TODO(Aldrik): export mo files - } ui_push_menu_item_separator(); if (ui_push_menu_item(localize("quit"), "Ctrl + Q")) { @@ -651,12 +645,12 @@ int main(int argc, char **argv) TEXTBOX_WIDTH = global_ui_context.layout.width - 130; - if (!tr->value && !strlen(tb_translation_list[i].buffer)) + if (!strlen(tb_translation_list[i].buffer)) { ui_push_rect(10, MISSING_TRANSLATION_COLOR); } - else if (tr->value && string_equals(tb_translation_list[i].buffer, - tr->value)) + else if (string_equals(tb_translation_list[i].buffer, + tr->value)) { ui_push_rect(10, global_ui_context.style.background); } @@ -777,7 +771,6 @@ int main(int argc, char **argv) if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_O)) { - start_new_project(); load_project(); } if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_S)) @@ -785,16 +778,12 @@ int main(int argc, char **argv) if (string_equals(project_path, "")) save_project(); else - save_project_to_file(project_path); + save_project_to_folder(project_path); } if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_E)) { save_project(); } - if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_X)) - { - // TODO(Aldrik): export mo files - } if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_Q)) { window.is_open = false; @@ -4,93 +4,92 @@ * All rights reserved. */ -static void write_json_file(char *buffer, s32 length) +void start_new_project(); + +void write_mo_file(char *buffer, s32 buffer_size, s32 language_id) { - cJSON *result = cJSON_CreateObject(); - if (cJSON_AddNumberToObject(result, "next_language_id", - global_language_id) == NULL) - return; - - cJSON *langs = cJSON_AddArrayToObject(result, "languages"); - if (!langs) return; - - for (s32 i = 0; i < current_project->languages.length; i++) + s32 identifier_table_size = current_project->terms.length * 8; + s32 translation_table_size = current_project->terms.length * 8; + + mo_header header; + header.magic_number = 0x950412de; + header.file_format_revision = 0; + header.number_of_strings = current_project->terms.length; + header.identifier_table_offset = 0x40; // keep empty bytes (0x2-0x4) for format changes + header.translation_table_offset = header.identifier_table_offset + identifier_table_size; + header.hashtable_size = 0; + header.hashtable_offset = header.translation_table_offset + translation_table_size; + + s32 current_data_write_offset = header.hashtable_offset+header.hashtable_size; + + // write identifier table and data + mo_entry *identifier_table = (mo_entry*)(buffer + header.identifier_table_offset); + for (s32 i = 0; i < current_project->terms.length; i++) { - cJSON *item = cJSON_CreateObject(); - language *lang = array_at(¤t_project->languages, i); + term *t = array_at(¤t_project->terms, i); - if (cJSON_AddStringToObject(item, "name", lang->name) == NULL) - return; + mo_entry new_identifier_entry; + new_identifier_entry.length = strlen(t->name); + new_identifier_entry.offset = current_data_write_offset; - if (cJSON_AddNumberToObject(item, "id", lang->id) == NULL) - return; + memcpy(buffer+current_data_write_offset, t->name, new_identifier_entry.length); + current_data_write_offset += new_identifier_entry.length+1; - cJSON_AddItemToArray(langs, item); + identifier_table[i] = new_identifier_entry; } - cJSON *terms = cJSON_AddArrayToObject(result, "terms"); - if (!terms) return; - + // write translation table and data + mo_entry *translation_table = (mo_entry*)(buffer + header.translation_table_offset); for (s32 i = 0; i < current_project->terms.length; i++) { - cJSON *item = cJSON_CreateObject(); - term *trm = array_at(¤t_project->terms, i); - - if (cJSON_AddStringToObject(item, "name", trm->name) == NULL) - return; + term *t = array_at(¤t_project->terms, i); - cJSON *translations = cJSON_AddArrayToObject(item, "translations"); - if (!translations) return; + mo_entry new_translation_entry; - for (s32 x = 0; x < trm->translations.length; x++) + for (s32 x = 0; x < t->translations.length; x++) { - cJSON *sub_item = cJSON_CreateObject(); - translation *tr = array_at(&trm->translations, x); + translation *tr = array_at(&t->translations, x); - if (cJSON_AddNumberToObject(sub_item, "language_id", tr->language_id) == NULL) - return; - - if (tr->value) + if (tr->language_id == language_id) { - if (cJSON_AddStringToObject(sub_item, "value", tr->value) == NULL) - return; + new_translation_entry.length = strlen(tr->value); + new_translation_entry.offset = current_data_write_offset; + + memcpy(buffer+current_data_write_offset, tr->value, new_translation_entry.length); + current_data_write_offset += new_translation_entry.length+1; } - else - { - if (cJSON_AddNumberToObject(sub_item, "value", 0) == NULL) - return; - } - - cJSON_AddItemToArray(translations, sub_item); } - cJSON_AddItemToArray(terms, item); + translation_table[i] = new_translation_entry; } - cJSON_PrintPreallocated(result, buffer, length, true); - cJSON_Delete(result); + memcpy(buffer, &header, sizeof(mo_header)); } -void save_project_to_file(char *path_buf) +void save_project_to_folder(char *path_buf) { - s32 size = ((current_project->terms.length+1)* - (current_project->languages.length+1)*MAX_INPUT_LENGTH)*2; - - char *buffer = mem_alloc(size); - memset(buffer, 0, size); - - char *file_extension = get_file_extension(path_buf); - if (string_equals(file_extension, ".json") || string_equals(file_extension, "")) - { - write_json_file(buffer, size); - } - - if (string_equals(file_extension, "")) + for (s32 i = 0; i < current_project->languages.length; i++) { - string_appendn(path_buf, ".json", MAX_INPUT_LENGTH); + language *lang = array_at(¤t_project->languages, i); + + s32 size = ((current_project->terms.length+1)*MAX_INPUT_LENGTH)*2; + + char *buffer = mem_alloc(size); + memset(buffer, 0, size); + + write_mo_file(buffer, size, lang->id); + + char complete_path_buf[MAX_INPUT_LENGTH]; +#ifdef OS_WIN + sprintf(complete_path_buf, "%s\\%s.mo", path_buf, lang->name); +#endif +#ifdef OS_LINUX + sprintf(complete_path_buf, "%s/%s.mo", path_buf, lang->name); +#endif + + platform_write_file_content(complete_path_buf, "wb", buffer, size); + mem_free(buffer); } - - platform_write_file_content(path_buf, "w", buffer, size); } static void *save_project_d(void *arg) @@ -102,11 +101,11 @@ static void *save_project_d(void *arg) snprintf(start_path, MAX_INPUT_LENGTH, "%s%s", binary_path, ""); char default_save_file_extension[50]; - string_copyn(default_save_file_extension, "json", 50); + string_copyn(default_save_file_extension, "", 50); struct open_dialog_args *args = mem_alloc(sizeof(struct open_dialog_args)); args->buffer = path_buf; - args->type = SAVE_FILE; + args->type = OPEN_DIRECTORY; args->file_filter = SAVE_FILE_EXTENSION; args->start_path = start_path; args->default_save_file_extension = default_save_file_extension; @@ -124,7 +123,7 @@ static void *save_project_d(void *arg) if (!platform_directory_exists(tmp_dir_buffer)) return 0; string_copyn(project_path, path_buf, MAX_INPUT_LENGTH); - save_project_to_file(path_buf); + save_project_to_folder(path_buf); return 0; } @@ -139,107 +138,32 @@ void save_project() thread_detach(&thr); } -static bool read_json_file(char *buffer, s32 size) +bool read_mo_file(char *buffer, s32 buffer_size) { - cJSON *result = cJSON_Parse(buffer); - if (!result) return false; - - cJSON *nlid = cJSON_GetObjectItem(result, "next_language_id"); - global_language_id = nlid->valueint; - - cJSON *language_list = cJSON_GetObjectItem(result, "languages"); - cJSON *lang; - cJSON_ArrayForEach(lang, language_list) - { - language new_language; - - //// - cJSON *langid = cJSON_GetObjectItem(lang, "id"); - new_language.id = langid->valueint; - - //// - cJSON *langname = cJSON_GetObjectItem(lang, "name"); - new_language.name = mem_alloc(MAX_INPUT_LENGTH); - string_copyn(new_language.name, langname->valuestring, MAX_INPUT_LENGTH); - - array_push(¤t_project->languages, &new_language); - } - - cJSON *term_list = cJSON_GetObjectItem(result, "terms"); - cJSON *term_dat; - cJSON_ArrayForEach(term_dat, term_list) - { - term new_term; - - //// - cJSON *term_datname = cJSON_GetObjectItem(term_dat, "name"); - new_term.name = mem_alloc(MAX_INPUT_LENGTH); - string_copyn(new_term.name, term_datname->valuestring, MAX_INPUT_LENGTH); - - new_term.translations = array_create(sizeof(translation)); - array_reserve(&new_term.translations, current_project->languages.length); - - cJSON *trans_list = cJSON_GetObjectItem(term_dat, "translations"); - cJSON *trans_dat; - cJSON_ArrayForEach(trans_dat, trans_list) - { - translation new_translation; - - //// - cJSON *trans_datlanid = cJSON_GetObjectItem(trans_dat, "language_id"); - new_translation.language_id = trans_datlanid->valueint; - - //// - cJSON *trans_datname = cJSON_GetObjectItem(trans_dat, "value"); - new_translation.value = mem_alloc(MAX_INPUT_LENGTH); - - if (cJSON_IsString(trans_datname)) - { - new_translation.value = mem_alloc(MAX_INPUT_LENGTH); - string_copyn(new_translation.value, trans_datname->valuestring, MAX_INPUT_LENGTH); - } - else - new_translation.value = 0; - - array_push(&new_term.translations, &new_translation); - } - - array_push(¤t_project->terms, &new_term); - } - return true; } -void load_project_from_file(char *path_buf) +void load_project_from_folder(char *path_buf) { - char *file_extension = get_file_extension(path_buf); - if (!string_equals(file_extension, ".json")) + if (!platform_directory_exists(path_buf)) { - platform_show_message(main_window, localize("invalid_search_result_file"), localize("error_importing_results")); + // TODO(Aldrik): localize + platform_show_message(main_window, "Error loading project", "Project directory does not exist"); return; } - file_content content = platform_read_file_content(path_buf, "r"); + start_new_project(); +#if 0 + // foreach file in path_buf + file_content content = platform_read_file_content(path_buf, "rb"); if (!content.content || content.file_error) { platform_destroy_file_content(&content); return; } - - if (string_equals(file_extension, ".json")) - { - bool result = read_json_file(content.content, content.content_length); - if (!result) goto failed_to_load_file; - } - - platform_destroy_file_content(&content); - return; - - failed_to_load_file: - platform_show_message(main_window, localize("invalid_search_result_file"), localize("error_importing_results")); - platform_destroy_file_content(&content); +#endif } static void* load_project_d(void *arg) @@ -251,11 +175,11 @@ static void* load_project_d(void *arg) snprintf(start_path, MAX_INPUT_LENGTH, "%s%s", binary_path, ""); char default_save_file_extension[50]; - string_copyn(default_save_file_extension, "json", 50); + string_copyn(default_save_file_extension, "", 50); struct open_dialog_args *args = mem_alloc(sizeof(struct open_dialog_args)); args->buffer = path_buf; - args->type = OPEN_FILE; + args->type = OPEN_DIRECTORY; args->file_filter = SAVE_FILE_EXTENSION; args->start_path = start_path; args->default_save_file_extension = default_save_file_extension; @@ -266,7 +190,7 @@ static void* load_project_d(void *arg) if (!platform_file_exists(path_buf)) return 0; string_copyn(project_path, path_buf, MAX_INPUT_LENGTH); - load_project_from_file(path_buf); + load_project_from_folder(path_buf); return 0; } @@ -9,9 +9,9 @@ #define SAVE_FILE_EXTENSION "*.json" -void load_project_from_file(char *path_buf); +void load_project_from_folder(char *path_buf); void load_project(); -void save_project_to_file(char *path_buf); +void save_project_to_folder(char *path_buf); void save_project(); #endif
\ No newline at end of file |
