~strahinja/poe

ca0d4538e25739d5e1ad34efba441ea27c8e4bf3 — Страхиња Радић 1 year, 27 days ago 221a237 v1.7.2
Bugfix: Last bugfix broke moving to last msgid when obsolete entries are at end

Signed-off-by: Страхиња Радић <contact@strahinja.org>
4 files changed, 31 insertions(+), 25 deletions(-)

M draw.c
M draw.h
M po.c
M poe.c
M draw.c => draw.c +1 -0
@@ 127,6 127,7 @@ init_drawstate(struct DrawState* state, char* error, char* filename,
	state->fuzzy_count		 = 0;
	state->untranslated_count	 = 0;
	state->obsolete_count		 = 0;
	state->obsolete_at_end_count	 = 0;
	state->msgstr_index		 = 0;
	state->first_shown_msgid	 = state->msgid_number;
}

M draw.h => draw.h +1 -0
@@ 85,6 85,7 @@ struct DrawState {
	size_t fuzzy_count;
	size_t untranslated_count;
	size_t obsolete_count;
	size_t obsolete_at_end_count;
	size_t real_msgid_count; /* msgid_count + obsolete_count */
	int msgstr_index;	 /* with msgstr[] */
	size_t first_shown_msgid;

M po.c => po.c +13 -16
@@ 412,6 412,12 @@ load_file(struct DrawState* dstate, long* lineno, long* col)
#ifndef PLURAL_STRING
	int has_plural_msgid = 0;
#endif
	FILE* input = NULL;
	char input_line[MAXBUFLINE];
	/* lines to tolerate the lack of msgid */
	int msgid_counter = PO_DETECTION_LINES;
	int msgstr_index  = -1;
	size_t non_obsolete_sofar = 0;

	dstate->msgid_size = 0;
	if (!newchunk)


@@ 423,13 429,8 @@ load_file(struct DrawState* dstate, long* lineno, long* col)
	entry		    = dstate->entries;
	dstate->untranslated_count++;

	FILE* input = NULL;
	if (!(input = fopen(dstate->filename, "rt")))
		return LOAD_ERR_CANT_OPEN_FILE;
	char input_line[MAXBUFLINE];
	/* lines to tolerate the lack of msgid */
	int msgid_counter = PO_DETECTION_LINES;
	int msgstr_index  = -1;
	while (!feof(input))
	{
		if (!fgets(input_line, MAXBUFLINE, input))


@@ 494,19 495,15 @@ load_file(struct DrawState* dstate, long* lineno, long* col)
	update_statistics(dstate->entries, dstate, entry);
	dstate->real_msgid_count = dstate->msgid_count + dstate->obsolete_count;

	current = dstate->entries;
	current			      = dstate->entries;
	dstate->obsolete_at_end_count = 0;
	non_obsolete_sofar = 0;
	while (current != dstate->entries + dstate->real_msgid_count)
	{
		char u8buf[4096];
		*u8buf = 0;
		if (current->msgid)
			unicode_string_to_u8(u8buf, current->msgid, 4096);
		*u8buf = 0;
		if (current->msgstr && current->msgstr[0])
			unicode_string_to_u8(u8buf, current->msgstr[0], 4096);
		*u8buf = 0;
		if (current->comments && current->comments[0])
			unicode_string_to_u8(u8buf, current->comments[0], 4096);
		if (!current->obsolete)
			non_obsolete_sofar++;
		else if (non_obsolete_sofar == dstate->msgid_count)
			dstate->obsolete_at_end_count++;
		if (!current->obsolete && current->msgid && current->msgstr)
			update_warning(current->msgid, *current->msgstr,
				&current->warning);

M poe.c => poe.c +16 -9
@@ 60,19 60,23 @@ cancel_callback(struct DrawState* state, struct tb_event* ev)
void
goto_msgid(struct DrawState* state, const size_t msgid_number)
{
	if (msgid_number > state->real_msgid_count + 1)
	size_t last_non_obsolete
		= state->real_msgid_count - state->obsolete_at_end_count;

	if (msgid_number > state->real_msgid_count)
		return;

	state->msgid_number = msgid_number;

	if (state->msgid_number < state->first_shown_msgid)
		state->first_shown_msgid = state->msgid_number;
	else if (state->msgid_number
		> state->first_shown_msgid + state->maxy - 2)
		state->first_shown_msgid
			= state->msgid_number - (state->maxy - 2);
	else if (state->real_msgid_count < state->msgid_number + state->maxy - 2)
		state->first_shown_msgid = (state->real_msgid_count
					> state->maxy - 2
				? state->real_msgid_count - (state->maxy - 2)
	else if (last_non_obsolete < state->msgid_number + state->maxy - 2)
		state->first_shown_msgid = (last_non_obsolete > state->maxy - 2
				? last_non_obsolete - (state->maxy - 2)
				: 1);
	else
		;


@@ 553,16 557,17 @@ next_msgid(struct DrawState* state, const int delta)
{
	size_t ret   = state->msgid_number;
	size_t start = ret;
	size_t last_non_obsolete
		= state->real_msgid_count - state->obsolete_at_end_count;

	while (ret < state->real_msgid_count + 1)
	while (ret < last_non_obsolete + 1)
	{
		ret++;
		if (!state->entries[ret - 1].obsolete && ret >= start + delta)
			break;
	}

	return ret == state->real_msgid_count + 1 ? state->real_msgid_count
						  : ret;
	return ret == last_non_obsolete + 1 ? last_non_obsolete : ret;
}

void


@@ 1298,7 1303,9 @@ move_list_down(struct DrawState* state)
int
move_list_end(struct DrawState* state)
{
	goto_msgid(state, state->real_msgid_count);
	goto_msgid(state,
		next_msgid(state,
			state->real_msgid_count - state->msgid_number));
	return 0;
}