aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/buffer.c b/src/buffer.c
index cc7d4e4817c..70598a7a22a 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -131,6 +131,23 @@ CHECK_OVERLAY (Lisp_Object x)
131 CHECK_TYPE (OVERLAYP (x), Qoverlayp, x); 131 CHECK_TYPE (OVERLAYP (x), Qoverlayp, x);
132} 132}
133 133
134/* Convert the position POS to an EMACS_INT that fits in a fixnum.
135 Yield POS's value if POS is already a fixnum, POS's marker position
136 if POS is a marker, and MOST_NEGATIVE_FIXNUM or
137 MOST_POSITIVE_FIXNUM if POS is a negative or positive bignum.
138 Signal an error if POS is not of the proper form. */
139
140EMACS_INT
141fix_position (Lisp_Object pos)
142{
143 if (FIXNUMP (pos))
144 return XFIXNUM (pos);
145 if (MARKERP (pos))
146 return marker_position (pos);
147 CHECK_TYPE (BIGNUMP (pos), Qinteger_or_marker_p, pos);
148 return !NILP (Fnatnump (pos)) ? MOST_POSITIVE_FIXNUM : MOST_NEGATIVE_FIXNUM;
149}
150
134/* These setters are used only in this file, so they can be private. 151/* These setters are used only in this file, so they can be private.
135 The public setters are inline functions defined in buffer.h. */ 152 The public setters are inline functions defined in buffer.h. */
136static void 153static void
@@ -2257,19 +2274,20 @@ so the buffer is truly empty after this. */)
2257} 2274}
2258 2275
2259void 2276void
2260validate_region (register Lisp_Object *b, register Lisp_Object *e) 2277validate_region (Lisp_Object *b, Lisp_Object *e)
2261{ 2278{
2262 CHECK_FIXNUM_COERCE_MARKER (*b); 2279 EMACS_INT beg = fix_position (*b), end = fix_position (*e);
2263 CHECK_FIXNUM_COERCE_MARKER (*e);
2264 2280
2265 if (XFIXNUM (*b) > XFIXNUM (*e)) 2281 if (end < beg)
2266 { 2282 {
2267 Lisp_Object tem; 2283 EMACS_INT tem = beg; beg = end; end = tem;
2268 tem = *b; *b = *e; *e = tem;
2269 } 2284 }
2270 2285
2271 if (! (BEGV <= XFIXNUM (*b) && XFIXNUM (*e) <= ZV)) 2286 if (! (BEGV <= beg && end <= ZV))
2272 args_out_of_range_3 (Fcurrent_buffer (), *b, *e); 2287 args_out_of_range_3 (Fcurrent_buffer (), *b, *e);
2288
2289 *b = make_fixnum (beg);
2290 *e = make_fixnum (end);
2273} 2291}
2274 2292
2275/* Advance BYTE_POS up to a character boundary 2293/* Advance BYTE_POS up to a character boundary