diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmds.c | 32 | ||||
-rw-r--r-- | src/editfns.c | 6 | ||||
-rw-r--r-- | src/lisp.h | 4 | ||||
-rw-r--r-- | src/search.c | 92 |
4 files changed, 67 insertions, 67 deletions
diff --git a/src/cmds.c b/src/cmds.c index 1f81b9986a7..239e3be5c07 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -121,28 +121,36 @@ it as a line moved across, even though there is no next line to go to its beginning. */) (Lisp_Object n) { - ptrdiff_t opoint = PT, pos, pos_byte, shortage, count; + ptrdiff_t opoint = PT, pos, pos_byte, count; + bool excessive = false; if (NILP (n)) count = 1; else { - CHECK_FIXNUM (n); - count = XFIXNUM (n); + CHECK_INTEGER (n); + if (FIXNUMP (n) + && -BUF_BYTES_MAX <= XFIXNUM (n) && XFIXNUM (n) <= BUF_BYTES_MAX) + count = XFIXNUM (n); + else + { + count = !NILP (Fnatnump (n)) ? BUF_BYTES_MAX : -BUF_BYTES_MAX; + excessive = true; + } } - shortage = scan_newline_from_point (count, &pos, &pos_byte); + ptrdiff_t counted = scan_newline_from_point (count, &pos, &pos_byte); SET_PT_BOTH (pos, pos_byte); - if (shortage > 0 - && (count <= 0 - || (ZV > BEGV - && PT != opoint - && (FETCH_BYTE (PT_BYTE - 1) != '\n')))) - shortage--; - - return make_fixnum (count <= 0 ? - shortage : shortage); + ptrdiff_t shortage = count - (count <= 0) - counted; + if (shortage != 0) + shortage -= (count <= 0 ? -1 + : (BEGV < ZV && PT != opoint + && FETCH_BYTE (PT_BYTE - 1) != '\n')); + return (excessive + ? CALLN (Fplus, make_fixnum (shortage - count), n) + : make_fixnum (shortage)); } DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p", diff --git a/src/editfns.c b/src/editfns.c index 01376b06373..3edfd1dc201 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -668,7 +668,7 @@ Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil. */) /* It is possible that NEW_POS is not within the same field as OLD_POS; try to move NEW_POS so that it is. */ { - ptrdiff_t shortage; + ptrdiff_t counted; Lisp_Object field_bound; if (fwd) @@ -691,8 +691,8 @@ Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil. */) there's an intervening newline or not. */ || (find_newline (XFIXNAT (new_pos), -1, XFIXNAT (field_bound), -1, - fwd ? -1 : 1, &shortage, NULL, 1), - shortage != 0))) + fwd ? -1 : 1, &counted, NULL, 1), + counted == 0))) /* Constrain NEW_POS to FIELD_BOUND. */ new_pos = field_bound; diff --git a/src/lisp.h b/src/lisp.h index 78bc423bed7..c5631e28453 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4271,8 +4271,8 @@ extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, Lisp_Object); extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool); -extern ptrdiff_t scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, - ptrdiff_t, bool); +extern void scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, + ptrdiff_t, bool); extern ptrdiff_t scan_newline_from_point (ptrdiff_t, ptrdiff_t *, ptrdiff_t *); extern ptrdiff_t find_newline_no_quit (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t *); diff --git a/src/search.c b/src/search.c index 059f8fc4d2e..17bc8d0c948 100644 --- a/src/search.c +++ b/src/search.c @@ -647,14 +647,16 @@ newline_cache_on_off (struct buffer *buf) If COUNT is zero, do anything you please; run rogue, for all I care. If END is zero, use BEGV or ZV instead, as appropriate for the - direction indicated by COUNT. + direction indicated by COUNT. If START_BYTE is -1 it is unknown, + and similarly for END_BYTE. - If we find COUNT instances, set *SHORTAGE to zero, and return the + If we find COUNT instances, set *COUNTED to COUNT, and return the position past the COUNTth match. Note that for reverse motion this is not the same as the usual convention for Emacs motion commands. - If we don't find COUNT instances before reaching END, set *SHORTAGE - to the number of newlines left unfound, and return END. + If we don't find COUNT instances before reaching END, set *COUNTED + to the number of newlines left found (negated if COUNT is negative), + and return END. If BYTEPOS is not NULL, set *BYTEPOS to the byte position corresponding to the returned character position. @@ -664,23 +666,17 @@ newline_cache_on_off (struct buffer *buf) ptrdiff_t find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, - ptrdiff_t end_byte, ptrdiff_t count, ptrdiff_t *shortage, + ptrdiff_t end_byte, ptrdiff_t count, ptrdiff_t *counted, ptrdiff_t *bytepos, bool allow_quit) { struct region_cache *newline_cache; - int direction; struct buffer *cache_buffer; - if (count > 0) + if (!end) { - direction = 1; - if (!end) + if (count > 0) end = ZV, end_byte = ZV_BYTE; - } - else - { - direction = -1; - if (!end) + else end = BEGV, end_byte = BEGV_BYTE; } if (end_byte == -1) @@ -692,8 +688,8 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, else cache_buffer = current_buffer; - if (shortage != 0) - *shortage = 0; + if (counted) + *counted = count; if (count > 0) while (start != end) @@ -936,8 +932,8 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, } } - if (shortage) - *shortage = count * direction; + if (counted) + *counted -= count; if (bytepos) { *bytepos = start_byte == -1 ? CHAR_TO_BYTE (start) : start_byte; @@ -952,30 +948,28 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, We report the resulting position by calling TEMP_SET_PT_BOTH. If we find COUNT instances. we position after (always after, - even if scanning backwards) the COUNTth match, and return 0. + even if scanning backwards) the COUNTth match. If we don't find COUNT instances before reaching the end of the - buffer (or the beginning, if scanning backwards), we return - the number of line boundaries left unfound, and position at + buffer (or the beginning, if scanning backwards), we position at the limit we bumped up against. If ALLOW_QUIT, check for quitting. That's good to do except in special cases. */ -ptrdiff_t +void scan_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t limit, ptrdiff_t limit_byte, ptrdiff_t count, bool allow_quit) { - ptrdiff_t charpos, bytepos, shortage; + ptrdiff_t charpos, bytepos, counted; charpos = find_newline (start, start_byte, limit, limit_byte, - count, &shortage, &bytepos, allow_quit); - if (shortage) + count, &counted, &bytepos, allow_quit); + if (counted != count) TEMP_SET_PT_BOTH (limit, limit_byte); else TEMP_SET_PT_BOTH (charpos, bytepos); - return shortage; } /* Like above, but always scan from point and report the @@ -985,19 +979,19 @@ ptrdiff_t scan_newline_from_point (ptrdiff_t count, ptrdiff_t *charpos, ptrdiff_t *bytepos) { - ptrdiff_t shortage; + ptrdiff_t counted; if (count <= 0) *charpos = find_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1, - &shortage, bytepos, 1); + &counted, bytepos, 1); else *charpos = find_newline (PT, PT_BYTE, ZV, ZV_BYTE, count, - &shortage, bytepos, 1); - return shortage; + &counted, bytepos, 1); + return counted; } /* Like find_newline, but doesn't allow QUITting and doesn't return - SHORTAGE. */ + COUNTED. */ ptrdiff_t find_newline_no_quit (ptrdiff_t from, ptrdiff_t frombyte, ptrdiff_t cnt, ptrdiff_t *bytepos) @@ -1013,10 +1007,10 @@ ptrdiff_t find_before_next_newline (ptrdiff_t from, ptrdiff_t to, ptrdiff_t cnt, ptrdiff_t *bytepos) { - ptrdiff_t shortage; - ptrdiff_t pos = find_newline (from, -1, to, -1, cnt, &shortage, bytepos, 1); + ptrdiff_t counted; + ptrdiff_t pos = find_newline (from, -1, to, -1, cnt, &counted, bytepos, 1); - if (shortage == 0) + if (counted == cnt) { if (bytepos) DEC_BOTH (pos, *bytepos); @@ -3210,7 +3204,7 @@ DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0, /* Like find_newline, but doesn't use the cache, and only searches forward. */ static ptrdiff_t find_newline1 (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, - ptrdiff_t end_byte, ptrdiff_t count, ptrdiff_t *shortage, + ptrdiff_t end_byte, ptrdiff_t count, ptrdiff_t *counted, ptrdiff_t *bytepos, bool allow_quit) { if (count > 0) @@ -3226,8 +3220,8 @@ find_newline1 (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, if (end_byte == -1) end_byte = CHAR_TO_BYTE (end); - if (shortage != 0) - *shortage = 0; + if (counted) + *counted = count; if (count > 0) while (start != end) @@ -3284,8 +3278,8 @@ find_newline1 (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, } } - if (shortage) - *shortage = count; + if (counted) + *counted -= count; if (bytepos) { *bytepos = start_byte == -1 ? CHAR_TO_BYTE (start) : start_byte; @@ -3306,7 +3300,7 @@ the buffer. If the buffer doesn't have a cache, the value is nil. */) (Lisp_Object buffer) { struct buffer *buf, *old = NULL; - ptrdiff_t shortage, nl_count_cache, nl_count_buf; + ptrdiff_t nl_count_cache, nl_count_buf; Lisp_Object cache_newlines, buf_newlines, val; ptrdiff_t from, found, i; @@ -3332,8 +3326,7 @@ the buffer. If the buffer doesn't have a cache, the value is nil. */) /* How many newlines are there according to the cache? */ find_newline (BEGV, BEGV_BYTE, ZV, ZV_BYTE, - TYPE_MAXIMUM (ptrdiff_t), &shortage, NULL, true); - nl_count_cache = TYPE_MAXIMUM (ptrdiff_t) - shortage; + TYPE_MAXIMUM (ptrdiff_t), &nl_count_cache, NULL, true); /* Create vector and populate it. */ cache_newlines = make_uninit_vector (nl_count_cache); @@ -3342,11 +3335,11 @@ the buffer. If the buffer doesn't have a cache, the value is nil. */) { for (from = BEGV, found = from, i = 0; from < ZV; from = found, i++) { - ptrdiff_t from_byte = CHAR_TO_BYTE (from); + ptrdiff_t from_byte = CHAR_TO_BYTE (from), counted; - found = find_newline (from, from_byte, 0, -1, 1, &shortage, + found = find_newline (from, from_byte, 0, -1, 1, &counted, NULL, true); - if (shortage != 0 || i >= nl_count_cache) + if (counted == 0 || i >= nl_count_cache) break; ASET (cache_newlines, i, make_fixnum (found - 1)); } @@ -3357,18 +3350,17 @@ the buffer. If the buffer doesn't have a cache, the value is nil. */) /* Now do the same, but without using the cache. */ find_newline1 (BEGV, BEGV_BYTE, ZV, ZV_BYTE, - TYPE_MAXIMUM (ptrdiff_t), &shortage, NULL, true); - nl_count_buf = TYPE_MAXIMUM (ptrdiff_t) - shortage; + TYPE_MAXIMUM (ptrdiff_t), &nl_count_buf, NULL, true); buf_newlines = make_uninit_vector (nl_count_buf); if (nl_count_buf) { for (from = BEGV, found = from, i = 0; from < ZV; from = found, i++) { - ptrdiff_t from_byte = CHAR_TO_BYTE (from); + ptrdiff_t from_byte = CHAR_TO_BYTE (from), counted; - found = find_newline1 (from, from_byte, 0, -1, 1, &shortage, + found = find_newline1 (from, from_byte, 0, -1, 1, &counted, NULL, true); - if (shortage != 0 || i >= nl_count_buf) + if (counted == 0 || i >= nl_count_buf) break; ASET (buf_newlines, i, make_fixnum (found - 1)); } |