aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorKenichi Handa2013-09-12 23:48:18 +0900
committerKenichi Handa2013-09-12 23:48:18 +0900
commit56d968a488c68563c5eae8264b7d3adfee9dc684 (patch)
tree712adf1c2f7e12ac9d169958ea63760ad42fc6ce /src/data.c
parentb5623270b6047528786d4550cebe0b228ecadb6b (diff)
parent4dfa4b9bd944fa385b248b5b0b56e95979119420 (diff)
downloademacs-56d968a488c68563c5eae8264b7d3adfee9dc684.tar.gz
emacs-56d968a488c68563c5eae8264b7d3adfee9dc684.zip
merge trunk
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c81
1 files changed, 48 insertions, 33 deletions
diff --git a/src/data.c b/src/data.c
index 9f4bd1f1c02..51b0266eca1 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2255,10 +2255,8 @@ bool-vector. IDX starts at 0. */)
2255 2255
2256/* Arithmetic functions */ 2256/* Arithmetic functions */
2257 2257
2258enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal }; 2258Lisp_Object
2259 2259arithcompare (Lisp_Object num1, Lisp_Object num2, enum Arith_Comparison comparison)
2260static Lisp_Object
2261arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison)
2262{ 2260{
2263 double f1 = 0, f2 = 0; 2261 double f1 = 0, f2 = 0;
2264 bool floatp = 0; 2262 bool floatp = 0;
@@ -2275,32 +2273,32 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison)
2275 2273
2276 switch (comparison) 2274 switch (comparison)
2277 { 2275 {
2278 case equal: 2276 case ARITH_EQUAL:
2279 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2)) 2277 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2280 return Qt; 2278 return Qt;
2281 return Qnil; 2279 return Qnil;
2282 2280
2283 case notequal: 2281 case ARITH_NOTEQUAL:
2284 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2)) 2282 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2285 return Qt; 2283 return Qt;
2286 return Qnil; 2284 return Qnil;
2287 2285
2288 case less: 2286 case ARITH_LESS:
2289 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2)) 2287 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2290 return Qt; 2288 return Qt;
2291 return Qnil; 2289 return Qnil;
2292 2290
2293 case less_or_equal: 2291 case ARITH_LESS_OR_EQUAL:
2294 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2)) 2292 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2295 return Qt; 2293 return Qt;
2296 return Qnil; 2294 return Qnil;
2297 2295
2298 case grtr: 2296 case ARITH_GRTR:
2299 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2)) 2297 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2300 return Qt; 2298 return Qt;
2301 return Qnil; 2299 return Qnil;
2302 2300
2303 case grtr_or_equal: 2301 case ARITH_GRTR_OR_EQUAL:
2304 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2)) 2302 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2305 return Qt; 2303 return Qt;
2306 return Qnil; 2304 return Qnil;
@@ -2310,48 +2308,65 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison)
2310 } 2308 }
2311} 2309}
2312 2310
2313DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0, 2311static Lisp_Object
2314 doc: /* Return t if two args, both numbers or markers, are equal. */) 2312arithcompare_driver (ptrdiff_t nargs, Lisp_Object *args,
2315 (register Lisp_Object num1, Lisp_Object num2) 2313 enum Arith_Comparison comparison)
2316{ 2314{
2317 return arithcompare (num1, num2, equal); 2315 for (ptrdiff_t argnum = 1; argnum < nargs; ++argnum)
2316 {
2317 if (EQ (Qnil, arithcompare (args[argnum-1], args[argnum], comparison)))
2318 return Qnil;
2319 }
2320 return Qt;
2318} 2321}
2319 2322
2320DEFUN ("<", Flss, Slss, 2, 2, 0, 2323DEFUN ("=", Feqlsign, Seqlsign, 1, MANY, 0,
2321 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */) 2324 doc: /* Return t if args, all numbers or markers, are equal.
2322 (register Lisp_Object num1, Lisp_Object num2) 2325usage: (= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2326 (ptrdiff_t nargs, Lisp_Object *args)
2323{ 2327{
2324 return arithcompare (num1, num2, less); 2328 return arithcompare_driver (nargs, args, ARITH_EQUAL);
2325} 2329}
2326 2330
2327DEFUN (">", Fgtr, Sgtr, 2, 2, 0, 2331DEFUN ("<", Flss, Slss, 1, MANY, 0,
2328 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */) 2332 doc: /* Return t if each arg is less than the next arg. All must be numbers or markers.
2329 (register Lisp_Object num1, Lisp_Object num2) 2333usage: (< NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2334 (ptrdiff_t nargs, Lisp_Object *args)
2330{ 2335{
2331 return arithcompare (num1, num2, grtr); 2336 return arithcompare_driver (nargs, args, ARITH_LESS);
2332} 2337}
2333 2338
2334DEFUN ("<=", Fleq, Sleq, 2, 2, 0, 2339DEFUN (">", Fgtr, Sgtr, 1, MANY, 0,
2335 doc: /* Return t if first arg is less than or equal to second arg. 2340 doc: /* Return t if each arg is greater than the next arg. All must be numbers or markers.
2336Both must be numbers or markers. */) 2341usage: (> NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2337 (register Lisp_Object num1, Lisp_Object num2) 2342 (ptrdiff_t nargs, Lisp_Object *args)
2338{ 2343{
2339 return arithcompare (num1, num2, less_or_equal); 2344 return arithcompare_driver (nargs, args, ARITH_GRTR);
2340} 2345}
2341 2346
2342DEFUN (">=", Fgeq, Sgeq, 2, 2, 0, 2347DEFUN ("<=", Fleq, Sleq, 1, MANY, 0,
2343 doc: /* Return t if first arg is greater than or equal to second arg. 2348 doc: /* Return t if each arg is less than or equal to the next arg.
2344Both must be numbers or markers. */) 2349All must be numbers or markers.
2345 (register Lisp_Object num1, Lisp_Object num2) 2350usage: (<= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2351 (ptrdiff_t nargs, Lisp_Object *args)
2352{
2353 return arithcompare_driver (nargs, args, ARITH_LESS_OR_EQUAL);
2354}
2355
2356DEFUN (">=", Fgeq, Sgeq, 1, MANY, 0,
2357 doc: /* Return t if each arg is greater than or equal to the next arg.
2358All must be numbers or markers.
2359usage: (= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2360 (ptrdiff_t nargs, Lisp_Object *args)
2346{ 2361{
2347 return arithcompare (num1, num2, grtr_or_equal); 2362 return arithcompare_driver (nargs, args, ARITH_GRTR_OR_EQUAL);
2348} 2363}
2349 2364
2350DEFUN ("/=", Fneq, Sneq, 2, 2, 0, 2365DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2351 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */) 2366 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2352 (register Lisp_Object num1, Lisp_Object num2) 2367 (register Lisp_Object num1, Lisp_Object num2)
2353{ 2368{
2354 return arithcompare (num1, num2, notequal); 2369 return arithcompare (num1, num2, ARITH_NOTEQUAL);
2355} 2370}
2356 2371
2357DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, 2372DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,