чување 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:
| M | draw.c | | | 8 | +++++--- |
| M | po.c | | | 12 | ++++-------- |
| M | poe.c | | | 51 | +++++++++++++++++++++++++-------------------------- |
| M | util.c | | | 90 | ++++++++++++++++++++++++++++++++++--------------------------------------------- |
| M | util.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);