aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-12-22 14:36:20 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-12-22 18:11:04 +0100
commitc6d76158b597d6c9bcfe222129d2897fececc45f (patch)
tree6aae2f997b019d51dc8916b8c08007e28d91ef11
parent0f15c4af6c68edb3fa8e3331260e1da43121827f (diff)
downloadvis-c6d76158b597d6c9bcfe222129d2897fececc45f.tar.gz
vis-c6d76158b597d6c9bcfe222129d2897fececc45f.tar.xz
text: introduce EMARK to denote an invalid mark
Technically this macro name is in the reserved namespace of errno.h. The same is true for EPOS. Maybe we should rename them at some point, but for now the short names are convenient. Fix #443 Close #444
-rw-r--r--text.c4
-rw-r--r--text.h4
-rw-r--r--vis-operators.c4
3 files changed, 7 insertions, 5 deletions
diff --git a/text.c b/text.c
index ace6b2d..0084ae3 100644
--- a/text.c
+++ b/text.c
@@ -1634,14 +1634,14 @@ Mark text_mark_set(Text *txt, size_t pos) {
return (Mark)&txt->end;
Location loc = piece_get_extern(txt, pos);
if (!loc.piece)
- return (Mark)NULL;
+ return EMARK;
return (Mark)(loc.piece->data + loc.off);
}
size_t text_mark_get(Text *txt, Mark mark) {
size_t cur = 0;
- if (!mark)
+ if (mark == EMARK)
return EPOS;
if (mark == (Mark)&txt->begin)
return 0;
diff --git a/text.h b/text.h
index 3a5baa8..fbd06b9 100644
--- a/text.h
+++ b/text.h
@@ -9,6 +9,9 @@
#include <sys/types.h>
#include <sys/stat.h>
+typedef uintptr_t Mark;
+
+#define EMARK ((Mark)0) /* invalid mark */
#define EPOS ((size_t)-1) /* invalid position */
typedef size_t Filepos;
@@ -100,7 +103,6 @@ bool text_iterator_codepoint_prev(Iterator *it, char *c);
bool text_iterator_char_next(Iterator*, char *c);
bool text_iterator_char_prev(Iterator*, char *c);
-typedef uintptr_t Mark;
/* mark position `pos', the returned mark can be used to later retrieve
* the same text segment */
Mark text_mark_set(Text*, size_t pos);
diff --git a/vis-operators.c b/vis-operators.c
index 51f03ab..8d28dc4 100644
--- a/vis-operators.c
+++ b/vis-operators.c
@@ -185,7 +185,7 @@ static size_t op_cursor(Vis *vis, Text *txt, OperatorContext *c) {
static size_t op_join(Vis *vis, Text *txt, OperatorContext *c) {
size_t pos = text_line_begin(txt, c->range.end), prev_pos;
- Mark mark = NULL;
+ Mark mark = EMARK;
/* if operator and range are both linewise, skip last line break */
if (c->linewise && text_range_is_linewise(txt, &c->range)) {
@@ -208,7 +208,7 @@ static size_t op_join(Vis *vis, Text *txt, OperatorContext *c) {
if (text_byte_get(txt, pos-1, &prev) && !isspace((unsigned char)prev) &&
text_byte_get(txt, pos, &next) && next != '\r' && next != '\n')
text_insert(txt, pos, c->arg->s, len);
- if (!mark)
+ if (mark == EMARK)
mark = text_mark_set(txt, pos);
} while (pos != prev_pos);