mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-14 05:33:59 -04:00
grid: refactor: replace {uri,curly}_range_append() with range_append()
Also add range_append_by_ref(), with replaces uri_range_append_no_strdup().
This commit is contained in:
parent
cb4a74e10b
commit
0d3f2f27e3
1 changed files with 70 additions and 49 deletions
119
grid.c
119
grid.c
|
|
@ -194,55 +194,62 @@ range_insert(struct row_ranges *ranges, size_t idx, int start, int end,
|
||||||
move_count * sizeof(ranges->v[0]));
|
move_count * sizeof(ranges->v[0]));
|
||||||
|
|
||||||
ranges->count++;
|
ranges->count++;
|
||||||
ranges->v[idx] = (struct row_range){
|
|
||||||
.start = start,
|
struct row_range *r = &ranges->v[idx];
|
||||||
.end = end,
|
r->start = start;
|
||||||
};
|
r->end = end;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ROW_RANGE_URI:
|
case ROW_RANGE_URI:
|
||||||
ranges->v[idx].uri.id = data->uri.id;
|
r->uri.id = data->uri.id;
|
||||||
ranges->v[idx].uri.uri = xstrdup(data->uri.uri);
|
r->uri.uri = xstrdup(data->uri.uri);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ROW_RANGE_CURLY:
|
case ROW_RANGE_CURLY:
|
||||||
ranges->v[idx].curly = data->curly;
|
r->curly = data->curly;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
uri_range_append_no_strdup(struct row_data *extra, int start, int end,
|
range_append_by_ref(struct row_ranges *ranges, int start, int end,
|
||||||
uint64_t id, char *uri)
|
enum row_range_type type, const union row_range_data *data)
|
||||||
{
|
{
|
||||||
range_ensure_size(&extra->uri_ranges, 1);
|
range_ensure_size(ranges, 1);
|
||||||
extra->uri_ranges.v[extra->uri_ranges.count++] = (struct row_range){
|
|
||||||
.start = start,
|
struct row_range *r = &ranges->v[ranges->count++];
|
||||||
.end = end,
|
|
||||||
.uri = {
|
r->start = start;
|
||||||
.id = id,
|
r->end = end;
|
||||||
.uri = uri,
|
|
||||||
},
|
switch (type) {
|
||||||
};
|
case ROW_RANGE_URI:
|
||||||
|
r->uri.id = data->uri.id;;
|
||||||
|
r->uri.uri = data->uri.uri;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ROW_RANGE_CURLY:
|
||||||
|
r->curly = data->curly;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
uri_range_append(struct row_data *extra, int start, int end, uint64_t id,
|
range_append(struct row_ranges *ranges, int start, int end,
|
||||||
const char *uri)
|
enum row_range_type type, const union row_range_data *data)
|
||||||
{
|
{
|
||||||
uri_range_append_no_strdup(extra, start, end, id, xstrdup(uri));
|
switch (type) {
|
||||||
}
|
case ROW_RANGE_URI:
|
||||||
|
range_append_by_ref(
|
||||||
|
ranges, start, end, type,
|
||||||
|
&(union row_range_data){.uri = {.id = data->uri.id,
|
||||||
|
.uri = xstrdup(data->uri.uri)}});
|
||||||
|
break;
|
||||||
|
|
||||||
static void
|
case ROW_RANGE_CURLY:
|
||||||
curly_range_append(struct row_data *extra, int start, int end,
|
range_append_by_ref(ranges, start, end, type, data);
|
||||||
struct curly_range_data data)
|
break;
|
||||||
{
|
}
|
||||||
range_ensure_size(&extra->curly_ranges, 1);
|
|
||||||
extra->curly_ranges.v[extra->curly_ranges.count++] = (struct row_range){
|
|
||||||
.start = start,
|
|
||||||
.end = end,
|
|
||||||
.curly = data,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -304,14 +311,16 @@ grid_snapshot(const struct grid *grid)
|
||||||
|
|
||||||
for (int i = 0; i < extra->uri_ranges.count; i++) {
|
for (int i = 0; i < extra->uri_ranges.count; i++) {
|
||||||
const struct row_range *range = &extra->uri_ranges.v[i];
|
const struct row_range *range = &extra->uri_ranges.v[i];
|
||||||
uri_range_append(
|
range_append(
|
||||||
clone_extra,
|
&clone_extra->uri_ranges,
|
||||||
range->start, range->end, range->uri.id, range->uri.uri);
|
range->start, range->end, ROW_RANGE_URI, &range->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < extra->curly_ranges.count; i++) {
|
for (int i = 0; i < extra->curly_ranges.count; i++) {
|
||||||
const struct row_range *range = &extra->curly_ranges.v[i];
|
const struct row_range *range = &extra->curly_ranges.v[i];
|
||||||
curly_range_append(clone_extra, range->start, range->end, range->curly);
|
range_append_by_ref(
|
||||||
|
&clone_extra->curly_ranges, range->start, range->end,
|
||||||
|
ROW_RANGE_CURLY, &range->data);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
clone_row->extra = NULL;
|
clone_row->extra = NULL;
|
||||||
|
|
@ -539,7 +548,7 @@ grid_resize_without_reflow(
|
||||||
|
|
||||||
const int start = range->start;
|
const int start = range->start;
|
||||||
const int end = min(range->end, new_cols - 1);
|
const int end = min(range->end, new_cols - 1);
|
||||||
uri_range_append(new_extra, start, end, range->uri.id, range->uri.uri);
|
range_append(&new_extra->uri_ranges, start, end, ROW_RANGE_URI, &range->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < old_extra->curly_ranges.count; i++) {
|
for (int i = 0; i < old_extra->curly_ranges.count; i++) {
|
||||||
|
|
@ -552,7 +561,7 @@ grid_resize_without_reflow(
|
||||||
|
|
||||||
const int start = range->start;
|
const int start = range->start;
|
||||||
const int end = min(range->end, new_cols - 1);
|
const int end = min(range->end, new_cols - 1);
|
||||||
curly_range_append(new_extra, start, end, range->curly);
|
range_append_by_ref(&new_extra->curly_ranges, start, end, ROW_RANGE_CURLY, &range->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -629,8 +638,11 @@ reflow_uri_range_start(struct row_range *range, struct row *new_row,
|
||||||
int new_col_idx)
|
int new_col_idx)
|
||||||
{
|
{
|
||||||
ensure_row_has_extra_data(new_row);
|
ensure_row_has_extra_data(new_row);
|
||||||
uri_range_append_no_strdup(
|
range_append_by_ref(
|
||||||
new_row->extra, new_col_idx, -1, range->uri.id, range->uri.uri);
|
&new_row->extra->uri_ranges, new_col_idx, -1,
|
||||||
|
ROW_RANGE_URI, &range->data);
|
||||||
|
|
||||||
|
/* The reflowed range now owns the URI string */
|
||||||
range->uri.uri = NULL;
|
range->uri.uri = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -654,7 +666,8 @@ reflow_curly_range_start(struct row_range *range, struct row *new_row,
|
||||||
int new_col_idx)
|
int new_col_idx)
|
||||||
{
|
{
|
||||||
ensure_row_has_extra_data(new_row);
|
ensure_row_has_extra_data(new_row);
|
||||||
curly_range_append(new_row->extra, new_col_idx, -1, range->curly);
|
range_append_by_ref(&new_row->extra->curly_ranges, new_col_idx, -1,
|
||||||
|
ROW_RANGE_CURLY, &range->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -732,7 +745,8 @@ _line_wrap(struct grid *old_grid, struct row **new_grid, struct row *row,
|
||||||
|
|
||||||
/* Open a new range on the new/current row */
|
/* Open a new range on the new/current row */
|
||||||
ensure_row_has_extra_data(new_row);
|
ensure_row_has_extra_data(new_row);
|
||||||
uri_range_append(new_row->extra, 0, -1, range->uri.id, range->uri.uri);
|
range_append(&new_row->extra->uri_ranges, 0, -1,
|
||||||
|
ROW_RANGE_URI, &range->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -747,7 +761,8 @@ _line_wrap(struct grid *old_grid, struct row **new_grid, struct row *row,
|
||||||
|
|
||||||
/* Open a new range on the new/current row */
|
/* Open a new range on the new/current row */
|
||||||
ensure_row_has_extra_data(new_row);
|
ensure_row_has_extra_data(new_row);
|
||||||
curly_range_append(new_row->extra, 0, -1, range->curly);
|
range_append(&new_row->extra->curly_ranges, 0, -1,
|
||||||
|
ROW_RANGE_CURLY, &range->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1589,13 +1604,19 @@ UNITTEST
|
||||||
{
|
{
|
||||||
struct row_data row_data = {.uri_ranges = {0}};
|
struct row_data row_data = {.uri_ranges = {0}};
|
||||||
struct row row = {.extra = &row_data};
|
struct row row = {.extra = &row_data};
|
||||||
|
const union row_range_data data = {
|
||||||
|
.uri = {
|
||||||
|
.id = 0,
|
||||||
|
.uri = (char *)"dummy",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/* Try erasing a row without any URIs */
|
/* Try erasing a row without any URIs */
|
||||||
grid_row_uri_range_erase(&row, 0, 200);
|
grid_row_uri_range_erase(&row, 0, 200);
|
||||||
xassert(row_data.uri_ranges.count == 0);
|
xassert(row_data.uri_ranges.count == 0);
|
||||||
|
|
||||||
uri_range_append(&row_data, 1, 10, 0, "dummy");
|
range_append(&row_data.uri_ranges, 1, 10, ROW_RANGE_URI, &data);
|
||||||
uri_range_append(&row_data, 11, 20, 0, "dummy");
|
range_append(&row_data.uri_ranges, 11, 20, ROW_RANGE_URI, &data);
|
||||||
xassert(row_data.uri_ranges.count == 2);
|
xassert(row_data.uri_ranges.count == 2);
|
||||||
xassert(row_data.uri_ranges.v[1].start == 11);
|
xassert(row_data.uri_ranges.v[1].start == 11);
|
||||||
xassert(row_data.uri_ranges.v[1].end == 20);
|
xassert(row_data.uri_ranges.v[1].end == 20);
|
||||||
|
|
@ -1610,8 +1631,8 @@ UNITTEST
|
||||||
|
|
||||||
/* Two URIs, then erase second half of the first, first half of
|
/* Two URIs, then erase second half of the first, first half of
|
||||||
the second */
|
the second */
|
||||||
uri_range_append(&row_data, 1, 10, 0, "dummy");
|
range_append(&row_data.uri_ranges, 1, 10, ROW_RANGE_URI, &data);
|
||||||
uri_range_append(&row_data, 11, 20, 0, "dummy");
|
range_append(&row_data.uri_ranges, 11, 20, ROW_RANGE_URI, &data);
|
||||||
grid_row_uri_range_erase(&row, 5, 15);
|
grid_row_uri_range_erase(&row, 5, 15);
|
||||||
xassert(row_data.uri_ranges.count == 2);
|
xassert(row_data.uri_ranges.count == 2);
|
||||||
xassert(row_data.uri_ranges.v[0].start == 1);
|
xassert(row_data.uri_ranges.v[0].start == 1);
|
||||||
|
|
@ -1626,7 +1647,7 @@ UNITTEST
|
||||||
row_data.uri_ranges.count = 0;
|
row_data.uri_ranges.count = 0;
|
||||||
|
|
||||||
/* One URI, erase middle part of it */
|
/* One URI, erase middle part of it */
|
||||||
uri_range_append(&row_data, 1, 10, 0, "dummy");
|
range_append(&row_data.uri_ranges, 1, 10, ROW_RANGE_URI, &data);
|
||||||
grid_row_uri_range_erase(&row, 5, 6);
|
grid_row_uri_range_erase(&row, 5, 6);
|
||||||
xassert(row_data.uri_ranges.count == 2);
|
xassert(row_data.uri_ranges.count == 2);
|
||||||
xassert(row_data.uri_ranges.v[0].start == 1);
|
xassert(row_data.uri_ranges.v[0].start == 1);
|
||||||
|
|
@ -1657,7 +1678,7 @@ UNITTEST
|
||||||
free(row_data.uri_ranges.v);
|
free(row_data.uri_ranges.v);
|
||||||
row_data.uri_ranges.v = NULL;
|
row_data.uri_ranges.v = NULL;
|
||||||
row_data.uri_ranges.size = 0;
|
row_data.uri_ranges.size = 0;
|
||||||
uri_range_append(&row_data, 1, 10, 0, "dummy");
|
range_append(&row_data.uri_ranges, 1, 10, ROW_RANGE_URI, &data);
|
||||||
xassert(row_data.uri_ranges.size == 1);
|
xassert(row_data.uri_ranges.size == 1);
|
||||||
|
|
||||||
grid_row_uri_range_erase(&row, 5, 7);
|
grid_row_uri_range_erase(&row, 5, 7);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue