poe

Уређивач .po фајлова
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 0f382d2c0b0df6ba7e1465b73ec0529f23a1d046
родитељ 6a07c6affce863bb9ead19ac5c1bed15b394a133
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Wed, 15 Dec 2021 22:21:13 +0100

Continued WIP, remove actual_lines

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mdraw.c | 8+++++---
Mpo.c | 12++++--------
Mpoe.c | 51+++++++++++++++++++++++++--------------------------
Mutil.c | 90++++++++++++++++++++++++++++++++++---------------------------------------------
Mutil.h | 13++++++-------
измењених датотека: 5, додавања: 79(+), брисања: 95(-)

diff --git a/draw.c b/draw.c @@ -213,12 +213,14 @@ split(const uint32_t* s, const size_t num_lines, const size_t wrap) if (!s) return NULL; - size_t nlines = num_lines != 0 ? num_lines - : u32_lines_in_string(s, NULL, wrap); + size_t nlines = num_lines; struct BufferLine* newbuf = NULL; struct BufferLine* pnewbuf = NULL; const uint32_t* ps = s; + if (!nlines) + nlines = u32_lines_in_string(s, wrap); + newbuf = calloc(nlines, sizeof(struct BufferLine)); if (!newbuf) return NULL; @@ -231,7 +233,7 @@ split(const uint32_t* s, const size_t num_lines, const size_t wrap) if (!newtext) return NULL; pnewbuf->text = newtext; - size_t len = u32_line_length(ps, wrap); + size_t len = u32_line_length(ps, NULL, wrap); if (wrap > 0 && len > wrap) { pnewbuf->length = u32_strncpy(pnewbuf->text, ps, diff --git a/po.c b/po.c @@ -592,9 +592,8 @@ save_loop_entries_start: if (current->msgid) { size_t msgid_size = current->msgid_size * UTF8REPMAX; - size_t actual_lines = 0; size_t num_lines = u32_lines_in_string(current->msgid, - &actual_lines, SAVE_WRAP_WIDTH); + SAVE_WRAP_WIDTH); if (num_lines > 1) { struct BufferLine* msgid_split = split(current->msgid, @@ -646,9 +645,8 @@ save_loop_entries_start: { size_t msgid_plural_size = current->msgid_plural_size * UTF8REPMAX; - size_t actual_lines = 0; size_t num_lines = u32_lines_in_string(current->msgid_plural, - &actual_lines, SAVE_WRAP_WIDTH); + SAVE_WRAP_WIDTH); if (num_lines > 1) { struct BufferLine* msgid_split @@ -698,9 +696,8 @@ save_loop_entries_start: if (current->msgstr_count == 1) { - size_t actual_lines = 0; size_t num_lines = u32_lines_in_string(*current->msgstr, - &actual_lines, SAVE_WRAP_WIDTH); + SAVE_WRAP_WIDTH); if (num_lines > 1) { int first_entry = current == entries && !current->msgid; @@ -776,9 +773,8 @@ save_loop_entries_start: { for (size_t m = 0; m < current->msgstr_count; m++) { - size_t actual_lines = 0; size_t num_lines = u32_lines_in_string(*current->msgstr, - &actual_lines, SAVE_WRAP_WIDTH); + SAVE_WRAP_WIDTH); if (num_lines > 1) { struct BufferLine* msgstr_split diff --git a/poe.c b/poe.c @@ -214,9 +214,9 @@ load_info(struct DrawState* state) { struct PoEntry* first = &state->entries[0]; struct PoEntry* current = &state->entries[state->msgid_number - 1]; - size_t msgid_num_lines = u32_lines_in_string(current->msgid, NULL, 0); + size_t msgid_num_lines = u32_lines_in_string(current->msgid, 0); size_t msgid_plural_num_lines - = u32_lines_in_string(current->msgid_plural, NULL, 0); + = u32_lines_in_string(current->msgid_plural, 0); size_t num_lines = 0; struct BufferLine* newbuf = NULL; struct BufferLine* pnewbuf = NULL; @@ -406,8 +406,7 @@ load_msgstr(struct DrawState* state) size_t num_lines = current->msgstr_count == 0 ? 1 : u32_lines_in_string( - *(current->msgstr + msgstr_index), - NULL, 0); + *(current->msgstr + msgstr_index), 0); struct BufferLine* newbuf = NULL; struct BufferLine* pnewbuf = NULL; @@ -755,12 +754,12 @@ move_search_prev_word(struct DrawState* state) int i = state->search_column; uint32_t* pline = state->search; - if (i > 0 && is_word_boundary(pline[i - 1])) + if (i > 0 && u32_is_word_boundary(pline[i - 1])) i--; - while (i > 0 && is_word_boundary(pline[i])) + while (i > 0 && u32_is_word_boundary(pline[i])) i--; - while (i > 0 && !is_word_boundary(pline[i]) - && !is_word_boundary(pline[i - 1])) + while (i > 0 && !u32_is_word_boundary(pline[i]) + && !u32_is_word_boundary(pline[i - 1])) i--; state->search_column = i; @@ -786,9 +785,9 @@ move_search_next_word(struct DrawState* state) uint32_t* pline = state->search; size_t len = u32_strlen(state->search); - while (i < len && !is_word_boundary(pline[i])) + while (i < len && !u32_is_word_boundary(pline[i])) i++; - while (i < len && is_word_boundary(pline[i])) + while (i < len && u32_is_word_boundary(pline[i])) i++; state->search_column = i; state->search_display_column @@ -812,12 +811,12 @@ erase_search_prev_word(struct DrawState* state) uint32_t* pline = state->search; - if (i > 0 && is_word_boundary(pline[i - 1])) + if (i > 0 && u32_is_word_boundary(pline[i - 1])) i--; - while (i > 0 && is_word_boundary(pline[i])) + while (i > 0 && u32_is_word_boundary(pline[i])) i--; - while (i > 0 && !is_word_boundary(pline[i]) - && !is_word_boundary(pline[i - 1])) + while (i > 0 && !u32_is_word_boundary(pline[i]) + && !u32_is_word_boundary(pline[i - 1])) i--; int d = state->search_column - i; @@ -866,7 +865,7 @@ copy_msgid_to_input(struct DrawState* state) } struct PoEntry* current = &state->entries[state->msgid_number - 1]; - size_t msgid_num_lines = u32_lines_in_string(current->msgid, NULL, 0); + size_t msgid_num_lines = u32_lines_in_string(current->msgid, 0); size_t lines_to_init = state->input_rows_count < msgid_num_lines ? msgid_num_lines - state->input_rows_count : 0; @@ -946,7 +945,7 @@ yank_msgstr_to_paste_buffer(struct DrawState* state) msgstr_num_lines = u32_lines_in_string(*(current->msgstr + state->msgstr_index), - NULL, 0); + 0); lines_to_init = state->paste_rows_count < msgstr_num_lines ? msgstr_num_lines - state->paste_rows_count : 0; @@ -1444,12 +1443,12 @@ move_prev_word(struct DrawState* state) int i = state->input_column; uint32_t* pline = state->input_buffer[state->input_row].text; - if (i > 0 && is_word_boundary(pline[i - 1])) + if (i > 0 && u32_is_word_boundary(pline[i - 1])) i--; - while (i > 0 && is_word_boundary(pline[i])) + while (i > 0 && u32_is_word_boundary(pline[i])) i--; - while (i > 0 && !is_word_boundary(pline[i]) - && !is_word_boundary(pline[i - 1])) + while (i > 0 && !u32_is_word_boundary(pline[i]) + && !u32_is_word_boundary(pline[i - 1])) i--; state->input_column = i; @@ -1473,9 +1472,9 @@ move_next_word(struct DrawState* state) uint32_t* pline = state->input_buffer[state->input_row].text; size_t len = state->input_buffer[state->input_row].length; - while (i < len && !is_word_boundary(pline[i])) + while (i < len && !u32_is_word_boundary(pline[i])) i++; - while (i < len && is_word_boundary(pline[i])) + while (i < len && u32_is_word_boundary(pline[i])) i++; state->input_column = i; state->input_display_column = display_length(state, @@ -1501,12 +1500,12 @@ erase_prev_word(struct DrawState* state) uint32_t* pline = state->input_buffer[state->input_row].text; - if (i > 0 && is_word_boundary(pline[i - 1])) + if (i > 0 && u32_is_word_boundary(pline[i - 1])) i--; - while (i > 0 && is_word_boundary(pline[i])) + while (i > 0 && u32_is_word_boundary(pline[i])) i--; - while (i > 0 && !is_word_boundary(pline[i]) - && !is_word_boundary(pline[i - 1])) + while (i > 0 && !u32_is_word_boundary(pline[i]) + && !u32_is_word_boundary(pline[i - 1])) i--; int d = state->input_column - i; diff --git a/util.c b/util.c @@ -216,7 +216,7 @@ u8_u32_strncpy(char* to, const uint32_t* from, size_t max) } size_t -u8_line_length(const char* s, const size_t wrap) +u8_line_length(const char* s, const char** sptr, const size_t wrap) { size_t len = 0; if (!s) @@ -224,11 +224,13 @@ u8_line_length(const char* s, const size_t wrap) const char* ps = s; size_t last_nonblank = 0; int have_last_nonblank = 0; + if (sptr) + *sptr = ps; while (*ps) { if (wrap > 0 && ps > s + wrap) return have_last_nonblank ? last_nonblank + 1 : wrap; - if (!is_word_boundary(*ps) && is_word_boundary(*(ps + 1))) + if (!u8_is_word_boundary(*ps) && u8_is_word_boundary(*(ps + 1))) { last_nonblank = ps - s; have_last_nonblank = 1; @@ -237,12 +239,14 @@ u8_line_length(const char* s, const size_t wrap) return len; ps++; len++; + if (sptr) + *sptr = ps; } return len; } size_t -u32_line_length(const uint32_t* s, const size_t wrap) +u32_line_length(const uint32_t* s, const uint32_t** sptr, const size_t wrap) { size_t len = 0; if (!s) @@ -250,11 +254,13 @@ u32_line_length(const uint32_t* s, const size_t wrap) const uint32_t* ps = s; size_t last_nonblank = 0; int have_last_nonblank = 0; + if (sptr) + *sptr = ps; while (*ps) { if (wrap > 0 && ps > s + wrap) return have_last_nonblank ? last_nonblank : wrap; - if (!is_word_boundary(*ps) && is_word_boundary(*(ps + 1))) + if (!u32_is_word_boundary(*ps) && u32_is_word_boundary(*(ps + 1))) { last_nonblank = ps - s; have_last_nonblank = 1; @@ -263,82 +269,64 @@ u32_line_length(const uint32_t* s, const size_t wrap) return len; ps++; len++; + if (sptr) + *sptr = ps; } return len; } -/* actual_lines - doesn't take into account empty lines - * wrap - if >0, also wrap lines +/* wrap - if >0, also wrap lines * */ size_t -u8_lines_in_string(const char* s, size_t* actual_lines, const size_t wrap) +u8_lines_in_string(const char* s, const size_t wrap) { size_t result = 1; - if (actual_lines) - *actual_lines = 1; - const char* ps = s; + const char* ps = NULL; + size_t len = 0; + if (!s) return result; + + ps = s; while (*ps) { - if (*ps == '\\' && *(ps + 1) == 'n') - { - result++; - if (actual_lines) - { - (*actual_lines)++; - if (!*(ps + 2) - || (*(ps + 2) == '\\' - && *(ps + 3) == 'n')) - (*actual_lines)--; - } - ps++; - } - /* TODO: Check is_word_boundary */ - else if (wrap > 0 && ps == s + wrap) - result++; - ps++; + len = u8_line_length(s, &ps, wrap); + ps += len; + result++; } return result; } -/* actual_lines - output; number of nonempty lines - * wrap - if >0, also wrap lines +/* wrap - if >0, also wrap lines * */ size_t -u32_lines_in_string(const uint32_t* s, size_t* actual_lines, const size_t wrap) +u32_lines_in_string(const uint32_t* s, const size_t wrap) { size_t result = 1; - if (actual_lines) - *actual_lines = 1; - const uint32_t* ps = s; + const uint32_t* ps = NULL; + size_t len = 0; + if (!s) return result; + + ps = s; while (*ps) { - if (*ps == '\\' && *(ps + 1) == 'n') - { - result++; - if (actual_lines) - { - (*actual_lines)++; - if (!*(ps + 2) - || (*(ps + 2) == '\\' - && *(ps + 3) == 'n')) - (*actual_lines)--; - } - ps++; - } - /* TODO: Check is_word_boundary */ - else if (wrap > 0 && ps == s + wrap) - result++; - ps++; + len = u32_line_length(s, &ps, wrap); + ps += len; + result++; } return result; } int -is_word_boundary(const uint32_t ch) +u8_is_word_boundary(const uint8_t ch) +{ + return u32_strchr((uint32_t*)L" \t()[]{},.;:/\\", ch) != NULL; +} + +int +u32_is_word_boundary(const uint32_t ch) { return u32_strchr((uint32_t*)L" \t()[]{},.;:/\\", ch) != NULL; } diff --git a/util.h b/util.h @@ -39,13 +39,12 @@ size_t u32_strncpy(uint32_t* to, const uint32_t* from, size_t max); size_t u32_strncat(uint32_t* to, const uint32_t* from, size_t max); size_t u32_u8_strncpy(uint32_t* to, const char* from, size_t max); size_t u8_u32_strncpy(char* to, const uint32_t* from, size_t max); -size_t u8_line_length(const char* s, const size_t wrap); -size_t u32_line_length(const uint32_t* s, const size_t wrap); -size_t u8_lines_in_string(const char* s, size_t* actual_lines, - const size_t wrap); -size_t u32_lines_in_string(const uint32_t* s, size_t* actual_lines, - const size_t wrap); -int is_word_boundary(const uint32_t ch); +size_t u8_line_length(const char* s, const char** sptr, const size_t wrap); +size_t u32_line_length(const uint32_t* s, const uint32_t** sptr, const size_t wrap); +size_t u8_lines_in_string(const char* s, const size_t wrap); +size_t u32_lines_in_string(const uint32_t* s, const size_t wrap); +int u8_is_word_boundary(const uint8_t ch); +int u32_is_word_boundary(const uint32_t ch); int starts_with(const char* s, const char* with); int u32_starts_with(const uint32_t* s, const uint32_t* with); const char* u8_basename(const char* path);