summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mo_edit.c49
-rw-r--r--src/save.c232
-rw-r--r--src/save.h4
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(&current_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(&current_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;
diff --git a/src/save.c b/src/save.c
index a2e9770..a929d88 100644
--- a/src/save.c
+++ b/src/save.c
@@ -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(&current_project->languages, i);
+ term *t = array_at(&current_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(&current_project->terms, i);
-
- if (cJSON_AddStringToObject(item, "name", trm->name) == NULL)
- return;
+ term *t = array_at(&current_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(&current_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(&current_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(&current_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;
}
diff --git a/src/save.h b/src/save.h
index 5641b44..afcfea5 100644
--- a/src/save.h
+++ b/src/save.h
@@ -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