summaryrefslogtreecommitdiff
path: root/src/save.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/save.c')
-rw-r--r--src/save.c282
1 files changed, 0 insertions, 282 deletions
diff --git a/src/save.c b/src/save.c
deleted file mode 100644
index ded92b4..0000000
--- a/src/save.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
-* BSD 2-Clause “Simplified” License
-* Copyright (c) 2019, Aldrik Ramaekers, aldrik.ramaekers@protonmail.com
-* All rights reserved.
-*/
-
-void start_new_project();
-s32 add_language_to_project(char *buffer);
-
-s32 write_mo_file(char *buffer, s32 buffer_size, s32 language_id)
-{
- s32 identifier_table_size = current_project->terms.length * 8;
- s32 translation_table_size = current_project->terms.length * 8;
-
- s32 size_written = 0;
-
- 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++)
- {
- term *t = array_at(&current_project->terms, i);
-
- mo_entry new_identifier_entry;
- new_identifier_entry.length = strlen(t->name);
- new_identifier_entry.offset = current_data_write_offset;
-
- memcpy(buffer+current_data_write_offset, t->name, new_identifier_entry.length);
- current_data_write_offset += new_identifier_entry.length+1;
- identifier_table[i] = new_identifier_entry;
- }
-
- // 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++)
- {
- term *t = array_at(&current_project->terms, i);
-
- mo_entry new_translation_entry;
-
- for (s32 x = 0; x < t->translations.length; x++)
- {
- translation *tr = array_at(&t->translations, x);
-
- if (tr->language_id == language_id)
- {
- 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;
- break;
- }
- }
-
- translation_table[i] = new_translation_entry;
- }
-
- size_written = current_data_write_offset;
-
- memcpy(buffer, &header, sizeof(mo_header));
- return size_written;
-}
-
-void save_project_to_folder(char *path_buf)
-{
- for (s32 i = 0; i < current_project->languages.length; i++)
- {
- 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);
-
- s32 size_written = 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_written);
- mem_free(buffer);
- }
-}
-
-static void *save_project_d(void *arg)
-{
- char path_buf[MAX_INPUT_LENGTH];
- path_buf[0] = 0;
-
- char start_path[MAX_INPUT_LENGTH];
- snprintf(start_path, MAX_INPUT_LENGTH, "%s%s", binary_path, "");
-
- char default_save_file_extension[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_DIRECTORY;
- args->file_filter = SAVE_FILE_EXTENSION;
- args->start_path = start_path;
- args->default_save_file_extension = default_save_file_extension;
-
- platform_open_file_dialog_block(args);
-
- char tmp_dir_buffer[MAX_INPUT_LENGTH];
- get_directory_from_path(tmp_dir_buffer, path_buf);
-
- char tmp_name_buffer[MAX_INPUT_LENGTH];
- get_name_from_path(tmp_name_buffer, path_buf);
-
- if (string_equals(path_buf, "")) return 0;
- if (string_equals(tmp_name_buffer, "")) return 0;
- if (!platform_directory_exists(tmp_dir_buffer)) return 0;
-
- string_copyn(project_path, path_buf, MAX_INPUT_LENGTH);
- save_project_to_folder(path_buf);
- return 0;
-}
-
-void save_project()
-{
- thread thr;
- thr.valid = false;
-
- while (!thr.valid)
- thr = thread_start(save_project_d, 0);
-
- thread_detach(&thr);
-}
-
-bool read_mo_file(char *buffer, s32 buffer_size, s32 language_id)
-{
- mo_header header = *((mo_header*)buffer);
-
- mo_entry *identifiers = (mo_entry*)(buffer + header.identifier_table_offset);
- mo_entry *translations = (mo_entry*)(buffer + header.translation_table_offset);
-
- if (current_project->terms.length == 0)
- {
- for (s32 i = 0; i < header.number_of_strings; i++)
- {
- term t;
- t.name = mem_alloc(MAX_TERM_NAME_LENGTH);
- t.translations = array_create(sizeof(translation));
- array_reserve(&t.translations, current_project->languages.length);
-
- string_copyn(t.name, buffer+identifiers[i].offset, MAX_INPUT_LENGTH);
- array_push(&current_project->terms, &t);
- }
- }
- else if (current_project->terms.length != header.number_of_strings)
- {
- platform_show_message(main_window, localize("warning"), localize("file_is_missing_terms"));
- }
-
- for (s32 i = 0; i < current_project->terms.length; i++)
- {
- term *t = array_at(&current_project->terms, i);
-
- translation tr;
- tr.value = mem_alloc(MAX_INPUT_LENGTH);
- string_copyn(tr.value, buffer+translations[i].offset, MAX_INPUT_LENGTH);
- tr.language_id = language_id;
- array_push(&t->translations, &tr);
- }
-
- return true;
-}
-
-
-void load_project_from_folder(char *path_buf)
-{
- if (!platform_directory_exists(path_buf))
- {
- platform_show_message(main_window, localize("error_loading_project"), localize("project_directory_does_not_exist"));
- return;
- }
-
- start_new_project();
-
- array files = array_create(sizeof(found_file));
- array filters = get_filters("*.mo");
-
- bool is_cancelled = false;
-
- char total_path[MAX_INPUT_LENGTH];
- total_path[0] = 0;
- string_copyn(total_path, path_buf, MAX_INPUT_LENGTH);
-
-#ifdef OS_WIN
- string_appendn(total_path, "\\", MAX_INPUT_LENGTH);
-#endif
-#ifdef OS_LINUX
- string_appendn(total_path, "/", MAX_INPUT_LENGTH);
-#endif
-
- platform_list_files_block(&files, total_path, filters, false, 0, false, &is_cancelled);
- for (s32 i = 0; i < files.length; i++)
- {
- found_file *file = array_at(&files, i);
-
- file_content content = platform_read_file_content(file->path, "rb");
- if (content.content && !content.file_error)
- {
- char name[MAX_INPUT_LENGTH];
- get_name_from_path(name, file->path);
- name[strlen(name)-3] = 0; // remove .mo extension
-
- language l;
- l.name = mem_alloc(MAX_INPUT_LENGTH);
- string_copyn(l.name, name, MAX_INPUT_LENGTH);
- l.id = global_language_id++;
- array_push(&current_project->languages, &l);
-
- read_mo_file(content.content, content.content_length, l.id);
- }
- platform_destroy_file_content(&content);
- }
- array_destroy(&filters);
-
- for (s32 i = 0; i < files.length; i++)
- {
- found_file *match = array_at(&files, i);
- mem_free(match->matched_filter);
- mem_free(match->path);
- }
- array_destroy(&files);
-}
-
-static void* load_project_d(void *arg)
-{
- char path_buf[MAX_INPUT_LENGTH];
- path_buf[0] = 0;
-
- char start_path[MAX_INPUT_LENGTH];
- snprintf(start_path, MAX_INPUT_LENGTH, "%s%s", binary_path, "");
-
- char default_save_file_extension[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_DIRECTORY;
- args->file_filter = SAVE_FILE_EXTENSION;
- args->start_path = start_path;
- args->default_save_file_extension = default_save_file_extension;
-
- platform_open_file_dialog_block(args);
-
- if (string_equals(path_buf, "")) return 0;
- if (!platform_file_exists(path_buf)) return 0;
-
- string_copyn(project_path, path_buf, MAX_INPUT_LENGTH);
- load_project_from_folder(path_buf);
- return 0;
-}
-
-void load_project()
-{
- thread thr;
- thr.valid = false;
-
- while (!thr.valid)
- thr = thread_start(load_project_d, 0);
- thread_detach(&thr);
-} \ No newline at end of file