From c6d76158b597d6c9bcfe222129d2897fececc45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 22 Dec 2016 14:36:20 +0100 Subject: 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 --- text.c | 4 ++-- text.h | 4 +++- vis-operators.c | 4 ++-- 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 #include +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); -- cgit v1.2.3