It isn't really neded.
We can easily remove doc from doc_next_mark_all() as it isn't used.
We can also have a version of doc_prev_mark_all() that only gets
called when we *know* there is a previos mark, as we do ni mark_to_mark.
Signed-off-by: NeilBrown <neil@brown.name>
for (m = doc_first_mark_all(ed->docs);
m;
- m = doc_next_mark_all(ed->docs, m))
+ m = doc_next_mark_all(m))
if (m->ref.p == d->home) {
mark_step2(ed->docs, m, 1, 1);
doc_notify_change(ed->docs, m);
return;
for (m = doc_first_mark_all(ed->docs);
m;
- m = doc_next_mark_all(ed->docs, m))
+ m = doc_next_mark_all(m))
if (p->siblings.next == &m->ref.p->siblings) {
mark_step2(ed->docs, m, 0, 1);
doc_notify_change(ed->docs, m);
return NULL;
}
-struct mark *doc_next_mark_all(struct doc *d, struct mark *m)
+struct mark *doc_next_mark_all(struct mark *m)
{
if (m->all.next)
return hlist_next_entry(m, all);
return NULL;
}
-struct mark *doc_prev_mark_all(struct doc *d, struct mark *m)
+struct mark *doc_prev_mark_all_safe(struct doc *d, struct mark *m)
{
if (d->marks.first != &m->all)
return hlist_prev_entry(m, all);
return NULL;
}
+struct mark *doc_prev_mark_all(struct mark *m)
+{
+ /* Must never be called on first mark */
+ return hlist_prev_entry(m, all);
+}
+
struct mark *doc_new_mark(struct doc *d, int view)
{
p->m.rpos = m->rpos;
}
-void mark_to_mark(struct doc *d, struct mark *m, struct mark *target)
+void mark_to_mark(struct mark *m, struct mark *target)
{
if (m->viewnum == MARK_POINT) {
return;
}
while (mark_ordered(m, target)) {
- struct mark *n = doc_next_mark_all(d, m);
+ struct mark *n = doc_next_mark_all(m);
mark_forward_over(m, n);
}
while (mark_ordered(target, m)) {
- struct mark *n = doc_prev_mark_all(d, m);
+ struct mark *n = doc_prev_mark_all(m);
mark_backward_over(m, n);
}
m->ref = target->ref;
void mark_free(struct mark *m);
struct mark *doc_new_mark(struct doc *d, int view);
struct mark *doc_first_mark_all(struct doc *d);
-struct mark *doc_next_mark_all(struct doc *d, struct mark *m);
-struct mark *doc_prev_mark_all(struct doc *d, struct mark *m);
+struct mark *doc_next_mark_all(struct mark *m);
+struct mark *doc_prev_mark_all(struct mark *m);
+struct mark *doc_prev_mark_all_safe(struct doc *d, struct mark *m);
struct mark *doc_first_mark(struct doc *d, int viewnum);
struct mark *doc_next_mark(struct doc *d, struct mark *m);
struct mark *doc_prev_mark(struct doc *d, struct mark *m);
void doc_notify_change(struct doc *d, struct mark *m);
void doc_check_consistent(struct doc *d);
void point_to_mark(struct point *p, struct mark *m);
-void mark_to_mark(struct doc *d, struct mark *m, struct mark *target);
+void mark_to_mark(struct mark *m, struct mark *target);
int mark_same(struct doc *d, struct mark *m1, struct mark *m2);
int mark_same2(struct doc *d, struct mark *m1, struct mark *m2, struct cmd_info *ci);
int mark_same_pane(struct pane *p, struct mark *m1, struct mark *m2,
else
de1 = list_next_entry(de1, lst);
for (m2 = m; m2 && m2->ref.d == de;
- m2 = doc_next_mark_all(d, m2))
+ m2 = doc_next_mark_all(m2))
m2->ref.d = de1;
attr_free(&de->attrs);
free(de->name);
de2 = list_first_entry_or_null(&new, struct dir_ent, lst);
while (m && m->ref.d && de1 && strcmp(m->ref.d->name, de1->name) < 0) {
prev = m;
- m = doc_next_mark_all(d, m);
+ m = doc_next_mark_all(m);
}
}
if (!donotify) {
i = text_advance_towards(t, &m->ref, &end);
if (i == 0)
break;
- while ((m2 = doc_next_mark_all(d, m)) != NULL &&
+ while ((m2 = doc_next_mark_all(m)) != NULL &&
m2->ref.c == m->ref.c &&
m2->ref.o <= m->ref.o)
mark_forward_over(m, m2);
i = text_retreat_towards(t, &m->ref, &end);
if (i == 0)
break;
- while ((m2 = doc_prev_mark_all(d, m)) != NULL &&
+ while ((m2 = doc_prev_mark_all_safe(d, m)) != NULL &&
m2->ref.c == m->ref.c &&
m2->ref.o >= m->ref.o)
mark_backward_over(m, m2);
&start, &end) == 0)
break;
- early = doc_prev_mark_all(d, m);
+ early = doc_prev_mark_all_safe(d, m);
if (early && !text_ref_same(t, &early->ref, &start))
early = NULL;
}
}
- for (m = doc_first_mark_all(d); m; m = doc_next_mark_all(d, m))
+ for (m = doc_first_mark_all(d); m; m = doc_next_mark_all(m))
text_ref_consistent(t, &m->ref);
prev = NULL;
- for (m = doc_first_mark_all(d); m; m = doc_next_mark_all(d, m)) {
+ for (m = doc_first_mark_all(d); m; m = doc_next_mark_all(m)) {
if (prev) {
struct doc_ref r = prev->ref;
int i;
if (!mark_ordered(pm, end)) {
myend = mark_dup(pm, 1);
- mark_to_mark(d, pm, end);
+ mark_to_mark(pm, end);
} else
myend = mark_dup(end, 1);
l = count_bytes(t, pm, myend);
mark_free(myend);
text_del(t, &pm->ref, l, &first);
- for (m = doc_prev_mark_all(d, pm);
+ for (m = doc_prev_mark_all_safe(d, pm);
m && text_update_prior_after_change(t, &m->ref, &pm->ref, &pm->ref);
- m = doc_prev_mark_all(d, m))
+ m = doc_prev_mark_all_safe(d, m))
;
- for (m = doc_next_mark_all(d, pm);
+ for (m = doc_next_mark_all(pm);
m && text_update_following_after_change(t, &m->ref, &pm->ref, &pm->ref);
- m = doc_next_mark_all(d, m))
+ m = doc_next_mark_all(m))
;
text_check_consistent(t);
}
- early = doc_prev_mark_all(d, pm);
+ early = doc_prev_mark_all_safe(d, pm);
if (early && !mark_same(d, early, pm))
early = NULL;
struct mark *m;
text_add_str(t, &pm->ref, str, &start, &first);
- for (m = doc_prev_mark_all(d, pm);
+ for (m = doc_prev_mark_all_safe(d, pm);
m && text_update_prior_after_change(t, &m->ref, &start, &pm->ref);
- m = doc_prev_mark_all(d, m))
+ m = doc_prev_mark_all_safe(d, m))
;
- for (m = doc_next_mark_all(d, pm);
+ for (m = doc_next_mark_all(pm);
m && text_update_following_after_change(t, &m->ref, &start, &pm->ref);
- m = doc_next_mark_all(d, m))
+ m = doc_next_mark_all(m))
;
text_check_consistent(t);
/* need to use the boundary */
if (!boundary)
return 1;
- mark_to_mark(d, m, boundary);
+ mark_to_mark(m, boundary);
mark_free(boundary);
return 1;
}
strncmp(ci2.str, cd->prefix, plen) == 0)
break;
/* have a match, so move the mark to here. */
- mark_to_mark(d, ci->mark, ci2.mark);
+ mark_to_mark(ci->mark, ci2.mark);
}
mark_free(ci2.mark);
return 1;
*/
struct cmd_info ci2 = {0}, ci3 = {0};
struct complete_data *cd = ci->home->data;
- struct pane *dp = doc_get_pane(ci->home);
- struct doc *d = dp->data;
int plen;
int ret;
if (ci2.mark != ci->mark) {
if (ret > 0)
/* move ci->mark back to ci2.mark */
- mark_to_mark(d, ci->mark, ci2.mark);
+ mark_to_mark(ci->mark, ci2.mark);
mark_free(ci2.mark);
}
return ret;