poe

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

чување f812d1c31155a73a299cac13e72b8a2da5c3a511
родитељ efcfcb1c83d5cd3a14985846362387cced877ac3
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Mon, 12 Jul 2021 11:17:17 +0200

Fix: state.first_shown_msgid was sometimes <1, resulting in SIGSEGV

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

Diffstat:
Mdraw.c | 1-
Mpo.c | 15+++++----------
Mpoe.c | 38+++++++++++++++++++++-----------------
измењених датотека: 3, додавања: 26(+), брисања: 28(-)

diff --git a/draw.c b/draw.c @@ -834,7 +834,6 @@ draw_list_visible(const struct DrawState* state) flags_buf, MAXFLAGSBUF-1+2, MAXFLAGSBUF-1+2, 2, 0, LEFT, 0, 1, NULL, 0, 0)) return NULL; - /* TODO: Highlight */ if (current->msgid) u32_draw_string(MAXFLAGSBUF-1+2, cy, sel ? LIST_MSGID_SEL_FG : LIST_MSGID_FG, sel ? diff --git a/po.c b/po.c @@ -201,7 +201,8 @@ u32_set_msgstr(struct PoEntry* entry, const uint32_t* msgstr, int msgstr_index, entry->msgstr_count = msgstr_index + 1; if (!entry->msgstr) { - newmsgstr = calloc(entry->msgstr_count, sizeof(uint32_t*)); + newmsgstr = calloc(entry->msgstr_count, + sizeof(uint32_t*)); /* when the .po file is not a standard text file (no LF * at end) */ if (state->untranslated_count > 0) @@ -209,7 +210,8 @@ u32_set_msgstr(struct PoEntry* entry, const uint32_t* msgstr, int msgstr_index, } else newmsgstr = realloc(entry->msgstr, - entry->msgstr_count * sizeof(uint32_t*)); + entry->msgstr_count * + sizeof(uint32_t*)); if (!newmsgstr) return NULL; *(newmsgstr + msgstr_index) = NULL; @@ -378,20 +380,13 @@ load_file(struct DrawState* dstate, long* lineno, long* col) { if (entry->msgid) dstate->msgid_count++; - /* - *else if (entry->obsolete) - * dstate->obsolete_count++; - */ } - /* - *if (entry->msgid || entry->obsolete) - * dstate->untranslated_count--; - */ /* file has < PO_DETECTION_LINES */ if (msgid_counter > 0) return LOAD_ERR_NOT_PO_FILE; + dstate->first_shown_msgid = dstate->msgid_count > 0 ? 1 : 0; update_statistics(dstate->entries, dstate, entry); dstate->real_msgid_count = dstate->msgid_count + dstate->obsolete_count; diff --git a/poe.c b/poe.c @@ -862,11 +862,12 @@ next_match(struct DrawState* state) state->msgid_count > 0 ? 1 : 0; else if (state->msgid_count - state->msgid_number < (state->maxy-1)/2) - state->first_shown_msgid = - state->msgid_count - (state->maxy-2); + state->first_shown_msgid = MAX(1, + state->msgid_count - (state->maxy-2)); else - state->first_shown_msgid = state->msgid_number - - (state->maxy-1)/2; + state->first_shown_msgid = MAX(1, + state->msgid_number + - (state->maxy-1)/2); return; } @@ -898,11 +899,12 @@ prev_match(struct DrawState* state) state->msgid_count > 0 ? 1 : 0; else if (state->msgid_count - state->msgid_number < (state->maxy-1)/2) - state->first_shown_msgid = - state->msgid_count - (state->maxy-2); + state->first_shown_msgid = MAX(1, + state->msgid_count - (state->maxy-2)); else - state->first_shown_msgid = state->msgid_number - - (state->maxy-1)/2; + state->first_shown_msgid = MAX(1, + state->msgid_number + - (state->maxy-1)/2); return; } @@ -939,11 +941,12 @@ next_untranslated(struct DrawState* state) state->msgid_count > 0 ? 1 : 0; else if (state->msgid_count - state->msgid_number < (state->maxy-1)/2) - state->first_shown_msgid = - state->msgid_count - (state->maxy-2); + state->first_shown_msgid = MAX(1, + state->msgid_count - (state->maxy-2)); else - state->first_shown_msgid = state->msgid_number - - (state->maxy-1)/2; + state->first_shown_msgid = MAX(1, + state->msgid_number + - (state->maxy-1)/2); if (save_show_edit) { @@ -985,11 +988,12 @@ next_fuzzy(struct DrawState* state) state->msgid_count > 0 ? 1 : 0; else if (state->msgid_count - state->msgid_number < (state->maxy-1)/2) - state->first_shown_msgid = - state->msgid_count - (state->maxy-2); + state->first_shown_msgid = MAX(1, + state->msgid_count - (state->maxy-2)); else - state->first_shown_msgid = state->msgid_number - - (state->maxy-1)/2; + state->first_shown_msgid = MAX(1, + state->msgid_number + - (state->maxy-1)/2); if (save_show_edit) { @@ -1354,7 +1358,7 @@ move_list_end(struct DrawState* state) state->error[0] = 0; state->msgid_number = state->msgid_count; state->first_shown_msgid = state->msgid_count > 0 ? - state->msgid_number - (state->maxy - 2) : 0; + MAX(1, state->msgid_number - (state->maxy - 2)) : 0; } void