2#ifndef arithmetique_header_included
3#define arithmetique_header_included
38#ifndef mp_get_memory_functions
39#if defined(__cplusplus)
42void mp_get_memory_functions(
void *(**alloc_func_ptr)(
size_t),
43 void *(**realloc_func_ptr)(
void *,
size_t,
size_t),
44 void (**free_func_ptr)(
void *,
size_t));
45#if defined(__cplusplus)
53#define WANT_OBFUSCATING_OPERATORS
69#ifndef __LONG_LONG_MAX__
70#define __LONG_LONG_MAX__ 9223372036854775807LL
73#define LONG_LONG_MAX __LONG_LONG_MAX__
75#define LONG_LONG_MIN (-LONG_LONG_MAX - 1)
77#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
91#if defined(LINEAR_VALUE_IS_LONGLONG)
93#define LINEAR_VALUE_STRING "long long int"
94typedef long long int Value;
95#if defined(WIN32) && !defined(unix)
97#define VALUE_FMT "%I64d"
99#define VALUE_FMT "%lld"
101#define VALUE_CONST(val) (val##LL)
108#define VALUE_NAN LONG_LONG_MIN
109#define VALUE_MIN (LONG_LONG_MIN + 1LL)
110#define VALUE_MAX LONG_LONG_MAX
111#define VALUE_SQRT_MIN long_to_value(LONG_MIN)
112#define VALUE_SQRT_MAX long_to_value(LONG_MAX)
113#define VALUE_ZERO (0LL)
114#define VALUE_ONE (1LL)
115#define VALUE_MONE (-1LL)
117#define VALUE_TO_LONG(val) \
118 ((long)((val) > (Value)LONG_MIN && (val) <= (Value)LONG_MAX) \
120 : (THROW(overflow_error), LONG_MIN))
122#define VALUE_TO_INT(val) \
123 ((int)((val) > (Value)INT_MIN && (val) <= (Value)INT_MAX) \
125 : (THROW(overflow_error), INT_MIN))
127#define VALUE_TO_DOUBLE(val) ((double)(val))
130#define VALUE_TO_FLOAT(val) ((float)((int)(val)))
145#elif defined(LINEAR_VALUE_IS_LONG)
147#define LINEAR_VALUE_STRING "long int"
149#define VALUE_FMT "%ld"
150#define VALUE_CONST(val) (val##L)
151#define VALUE_NAN LONG_MIN
152#define VALUE_MIN (LONG_MIN + 1L)
153#define VALUE_MAX LONG_MAX
154#define VALUE_SQRT_MIN int_to_value(INT_MIN)
155#define VALUE_SQRT_MAX int_to_value(INT_MAX)
158#define VALUE_MONE -1L
159#define VALUE_TO_LONG(val) (val)
160#define VALUE_TO_INT(val) ((int)(val))
161#define VALUE_TO_FLOAT(val) ((float)(val))
162#define VALUE_TO_DOUBLE(val) ((double)(val))
209#elif defined(LINEAR_VALUE_IS_CHARS)
211#define LINEAR_VALUE_STRING "char"
219#define VALUE_FMT "%s"
220#define VALUE_CONST(val) ((Value)(val))
221#define VALUE_NAN ((Value)(long)0xdadeebee)
222#define VALUE_MIN ((Value)(long)0xdeadbeef)
223#define VALUE_MAX ((Value)(long)0xfeedabee)
224#define VALUE_ZERO ((Value)0)
225#define VALUE_ONE ((Value)1)
226#define VALUE_MONE ((Value) - 1)
227#define VALUE_TO_LONG(val) (val.l)
228#define VALUE_TO_INT(val) (val.i)
229#define VALUE_TO_FLOAT(val) (val.f)
230#define VALUE_TO_DOUBLE(val) (val.d)
245#define LINEAR_VALUE_STRING "gmp"
247#define VALUE_FMT "%s"
253#define VALUE_TO_LONG(val) (mpz_get_si(val))
254#define VALUE_TO_INT(val) ((int)mpz_get_si(val))
255#define VALUE_TO_FLOAT(val) ((float)((int)mpz_get_si(val)))
256#define VALUE_TO_DOUBLE(val) (mpz_get_d(val))
271#define LINEAR_VALUE_STRING "cln"
272typedef cln::cl_I
Value;
273#define VALUE_FMT "%s"
275#define VALUE_TO_INT(val) (cln::cl_I_to_int(val))
276#define VALUE_TO_DOUBLE(val) (cln::double_approx(val))
293#define LINEAR_VALUE_STRING "int"
295#define VALUE_FMT "%d"
296#define VALUE_CONST(val) (val)
297#define VALUE_NAN INT_MIN
298#define VALUE_MIN (INT_MIN + 1)
299#define VALUE_MAX INT_MAX
303#define VALUE_TO_LONG(val) ((long)(val))
304#define VALUE_TO_INT(val) ((int)(val))
305#define VALUE_TO_FLOAT(val) ((float)(val))
306#define VALUE_TO_DOUBLE(val) ((double)(val))
321#define value_init(val) ((val).word = ((cln::cl_uint)cl_FN_tag) << cl_tag_shift)
322#define value_assign(v1, v2) ((v1) = (v2))
323#define value_set_si(val, i) ((val) = (i))
324#define value_set_double(val, d) ((val) = cln::truncate1(cln::cl_R(d)))
325#define value_clear(val) ((val) = 0)
326#define value_read(val, str) ((val) = (str))
327#define value_print(Dst, fmt, val) \
329 std::ostringstream strm; \
331 fprintf((Dst), (fmt), strm.str().c_str()); \
333#define value_swap(v1, v2) \
343#define value_eq(v1, v2) ((v1) == (v2))
344#define value_ne(v1, v2) ((v1) != (v2))
345#define value_gt(v1, v2) ((v1) > (v2))
346#define value_ge(v1, v2) ((v1) >= (v2))
347#define value_lt(v1, v2) ((v1) < (v2))
348#define value_le(v1, v2) ((v1) <= (v2))
350#define value_abs_eq(v1, v2) (cln::abs(v1) == cln::abs(v2))
351#define value_abs_ne(v1, v2) (cln::abs(v1) != cln::abs(v2))
352#define value_abs_gt(v1, v2) (cln::abs(v1) > cln::abs(v2))
353#define value_abs_ge(v1, v2) (cln::abs(v1) >= cln::abs(v2))
354#define value_abs_lt(v1, v2) (cln::abs(v1) < cln::abs(v2))
355#define value_abs_le(v1, v2) (cln::abs(v1) <= cln::abs(v2))
357#define value_sign(val) (cln::signum(val))
358#define value_cmp(v1, v2) (cln::compare((v1), (v2)))
360#define value_addto(ref, val1, val2) ((ref) = (val1) + (val2))
361#define value_add_int(ref, val, vint) ((ref) = (val) + (vint))
362#define value_addmul(ref, val1, val2) ((ref) += (val1) * (val2))
363#define value_increment(ref, val) ((ref) = (val) + 1)
364#define value_multiply(ref, val1, val2) ((ref) = (val1) * (val2))
365#define value_subtract(ref, val1, val2) ((ref) = (val1) - (val2))
366#define value_sub_int(ref, val1, val2) ((ref) = (val1) - (val2))
367#define value_decrement(ref, val) ((ref) = (val) - 1)
368#define value_division(ref, val1, val2) ((ref) = cln::truncate1(val1, val2))
369#define value_divexact(ref, val1, val2) ((ref) = cln::exquo(val1, val2))
370#define value_modulus(ref, val1, val2) \
371 ((ref) = cln::truncate2(val1, val2).remainder)
372#define value_pdivision(ref, val1, val2) ((ref) = cln::floor1(val1, val2))
373#define value_pmodulus(ref, val1, val2) \
374 ((ref) = cln::floor2(val1, val2).remainder)
375#define value_oppose(ref, val) ((ref) = -(val))
376#define value_absolute(ref, val) ((ref) = cln::abs(val))
377#define value_minimum(ref, val1, val2) ((ref) = cln::min((val1), (val2)))
378#define value_maximum(ref, val1, val2) ((ref) = cln::max((val1), (val2)))
379#define value_gcd(ref, val1, val2) ((ref) = cln::gcd((val1), (val2)))
380#define value_lcm(ref, val1, val2) ((ref) = cln::lcm((val1), (val2)))
381#define value_orto(ref, val1, val2) ((ref) = (val1) | (val2))
382#define value_andto(ref, val1, val2) ((ref) = (val1) & (val2))
386#define value_pos_p(val) ((val) > 0)
387#define value_neg_p(val) ((val) < 0)
388#define value_posz_p(val) ((val) >= 0)
389#define value_negz_p(val) ((val) <= 0)
390#define value_zero_p(val) ((val) == 0)
391#define value_notzero_p(val) ((val) != 0)
392#define value_one_p(val) ((val) == 1)
393#define value_notone_p(val) ((val) != 1)
394#define value_mone_p(val) ((val) == -1)
395#define value_notmone_p(val) ((val) != -1)
396#define value_cmp_si(val, n) (cln::compare(val, n))
403#define value_init(val) (mpz_init((val)))
404#define value_assign(v1, v2) (mpz_set((v1), (v2)))
405#define value_set_si(val, i) (mpz_set_si((val), (i)))
406#define value_set_double(val, d) (mpz_set_d((val), (d)))
407#define value_clear(val) (mpz_clear((val)))
408#define value_read(val, str) (mpz_set_str((val), (str), 10))
409typedef void (*value_print_gmp_free_t)(
void *, size_t);
410#define value_print(Dst, fmt, val) \
413 value_print_gmp_free_t gmp_free; \
414 str = mpz_get_str(0, 10, (val)); \
415 fprintf((Dst), (fmt), str); \
416 mp_get_memory_functions(NULL, NULL, &gmp_free); \
417 (*gmp_free)(str, strlen(str) + 1); \
419#define value_swap(val1, val2) (mpz_swap(val1, val2))
422#define value_eq(v1, v2) (mpz_cmp((v1), (v2)) == 0)
423#define value_ne(v1, v2) (mpz_cmp((v1), (v2)) != 0)
424#define value_gt(v1, v2) (mpz_cmp((v1), (v2)) > 0)
425#define value_ge(v1, v2) (mpz_cmp((v1), (v2)) >= 0)
426#define value_lt(v1, v2) (mpz_cmp((v1), (v2)) < 0)
427#define value_le(v1, v2) (mpz_cmp((v1), (v2)) <= 0)
429#define value_abs_eq(v1, v2) (mpz_cmpabs((v1), (v2)) == 0)
430#define value_abs_ne(v1, v2) (mpz_cmpabs((v1), (v2)) != 0)
431#define value_abs_gt(v1, v2) (mpz_cmpabs((v1), (v2)) > 0)
432#define value_abs_ge(v1, v2) (mpz_cmpabs((v1), (v2)) >= 0)
433#define value_abs_lt(v1, v2) (mpz_cmpabs((v1), (v2)) < 0)
434#define value_abs_le(v1, v2) (mpz_cmpabs((v1), (v2)) <= 0)
437#define value_sign(val) (mpz_sgn(val))
438#define value_cmp(v1, v2) (mpz_cmp((v1), (v2)))
441#define value_addto(ref, val1, val2) (mpz_add((ref), (val1), (val2)))
442#define value_add_int(ref, val, vint) (mpz_add_ui((ref), (val), (long)(vint)))
443#define value_addmul(ref, val1, val2) (mpz_addmul((ref), (val1), (val2)))
444#define value_increment(ref, val) (mpz_add_ui((ref), (val), 1))
445#define value_multiply(ref, val1, val2) (mpz_mul((ref), (val1), (val2)))
446#define value_subtract(ref, val1, val2) (mpz_sub((ref), (val1), (val2)))
447#define value_sub_int(ref, val, vint) (mpz_sub_ui((ref), (val), (long)(vint)))
448#define value_decrement(ref, val) (mpz_sub_ui((ref), (val), 1))
449#define value_division(ref, val1, val2) (mpz_tdiv_q((ref), (val1), (val2)))
450#define value_divexact(ref, val1, val2) (mpz_divexact((ref), (val1), (val2)))
451#define value_modulus(ref, val1, val2) (mpz_tdiv_r((ref), (val1), (val2)))
452#define value_pdivision(ref, val1, val2) (mpz_fdiv_q((ref), (val1), (val2)))
453#define value_pmodulus(ref, val1, val2) (mpz_fdiv_r((ref), (val1), (val2)))
454#define value_oppose(ref, val) (mpz_neg((ref), (val)))
455#define value_absolute(ref, val) (mpz_abs((ref), (val)))
456#define value_minimum(ref, val1, val2) \
457 (value_le((val1), (val2)) ? mpz_set((ref), (val1)) : mpz_set((ref), (val2)))
458#define value_maximum(ref, val1, val2) \
459 (value_ge((val1), (val2)) ? mpz_set((ref), (val1)) : mpz_set((ref), (val2)))
460#define value_gcd(ref, val1, val2) (mpz_gcd(ref, val1, val2))
461#define value_lcm(ref, val1, val2) (mpz_lcm(ref, val1, val2))
462#define value_orto(ref, val1, val2) (mpz_ior((ref), (val1), (val2)))
463#define value_andto(ref, val1, val2) (mpz_and((ref), (val1), (val2)))
466#define value_pos_p(val) (mpz_sgn(val) > 0)
467#define value_neg_p(val) (mpz_sgn(val) < 0)
468#define value_posz_p(val) (mpz_sgn(val) >= 0)
469#define value_negz_p(val) (mpz_sgn(val) <= 0)
470#define value_zero_p(val) (mpz_sgn(val) == 0)
471#define value_notzero_p(val) (mpz_sgn(val) != 0)
472#define value_one_p(val) (mpz_cmp_si(val, 1) == 0)
473#define value_notone_p(val) (mpz_cmp_si(val, 1) != 0)
474#define value_mone_p(val) (mpz_cmp_si(val, -1) == 0)
475#define value_notmone_p(val) (mpz_cmp_si(val, -1) != 0)
476#define value_cmp_si(val, n) (mpz_cmp_si(val, n))
484#define value_init(val) ((val) = 0)
485#define value_assign(v1, v2) ((v1) = (v2))
486#define value_set_si(val, i) ((val) = (Value)(i))
487#define value_set_double(val, d) ((val) = (Value)(d))
488#define value_clear(val) ((val) = 0)
489#define value_read(val, str) (sscanf((str), VALUE_FMT, &(val)))
490#define value_print(Dst, fmt, val) (fprintf((Dst), (fmt), (val)))
491#define value_swap(v1, v2) \
499#define int_to_value(i) ((Value)(i))
500#define long_to_value(l) ((Value)(l))
501#define float_to_value(f) ((Value)(f))
502#define double_to_value(d) ((Value)(d))
505#define value_eq(v1, v2) ((v1) == (v2))
506#define value_ne(v1, v2) ((v1) != (v2))
507#define value_gt(v1, v2) ((v1) > (v2))
508#define value_ge(v1, v2) ((v1) >= (v2))
509#define value_lt(v1, v2) ((v1) < (v2))
510#define value_le(v1, v2) ((v1) <= (v2))
512#define value_abs_eq(v1, v2) (value_abs(v1) == value_abs(v2))
513#define value_abs_ne(v1, v2) (value_abs(v1) != value_abs(v2))
514#define value_abs_gt(v1, v2) (value_abs(v1) > value_abs(v2))
515#define value_abs_ge(v1, v2) (value_abs(v1) >= value_abs(v2))
516#define value_abs_lt(v1, v2) (value_abs(v1) < value_abs(v2))
517#define value_abs_le(v1, v2) (value_abs(v1) <= value_abs(v2))
520#define value_sign(v) \
521 (value_eq(v, VALUE_ZERO) ? 0 : value_lt(v, VALUE_ZERO) ? -1 : 1)
522#define value_cmp(v1, v2) (value_eq(v1, v2) ? 0 : value_lt(v1, v2) ? -1 : 1)
525#define value_plus(v1, v2) ((v1) + (v2))
526#define value_div(v1, v2) ((v1) / (v2))
527#define value_mod(v1, v2) ((v1) % (v2))
528#define value_direct_multiply(v1, v2) ((v1) * (v2))
529#define value_minus(v1, v2) ((v1) - (v2))
530#define value_pdiv(v1, v2) (DIVIDE((v1), (v2)))
531#define value_pmod(v1, v2) (MODULO((v1), (v2)))
532#define value_min(v1, v2) (value_le((v1), (v2)) ? (v1) : (v2))
533#define value_max(v1, v2) (value_ge((v1), (v2)) ? (v1) : (v2))
534#define value_or(v1, v2) ((v1) | (v2))
535#define value_and(v1, v2) ((v1) & (v2))
536#define value_lshift(v1, v2) ((v1) << (v2))
537#define value_rshift(v1, v2) ((v1) >> (v2))
540#define value_addto(ref, val1, val2) ((ref) = (val1) + (val2))
541#define value_add_int(ref, val, vint) ((ref) = (val) + (Value)(vint))
542#define value_addmul(ref, val1, val2) ((ref) += (val1) * (val2))
543#define value_increment(ref, val) ((ref) = (val) + VALUE_ONE)
544#define value_direct_product(ref, val1, val2) \
545 ((ref) = (val1) * (val2))
546#define value_multiply(ref, val1, val2) ((ref) = value_mult((val1), (val2)))
547#define value_subtract(ref, val1, val2) ((ref) = (val1) - (val2))
548#define value_sub_int(ref, val, vint) ((ref) = (val) - (Value)(vint))
549#define value_decrement(ref, val) ((ref) = (val) - VALUE_ONE)
550#define value_division(ref, val1, val2) ((ref) = (val1) / (val2))
551#define value_divexact(ref, val1, val2) ((ref) = (val1) / (val2))
552#define value_modulus(ref, val1, val2) ((ref) = (val1) % (val2))
553#define value_pdivision(ref, val1, val2) ((ref) = value_pdiv((val1), (val2)))
554#define value_pmodulus(ref, val1, val2) ((ref) = value_pmod((val1), (val2)))
555#define value_oppose(ref, val) ((ref) = value_uminus((val)))
556#define value_absolute(ref, val) ((ref) = value_abs((val)))
557#define value_minimum(ref, val1, val2) ((ref) = value_min((val1), (val2)))
558#define value_maximum(ref, val1, val2) ((ref) = value_max((val1), (val2)))
559#define value_gcd(ref, val1, val2) Gcd((val1), (val2), &(ref))
560#define value_lcm(ref, val1, val2) Lcm3((val1), (val2), &(ref))
561#define value_orto(ref, val1, val2) ((ref) = (val1) | (val2))
562#define value_andto(ref, val1, val2) ((ref) = (val1) & (val2))
565#define value_uminus(val) (-(val))
566#define value_not(val) (~(val))
567#define value_abs(val) \
570 : (value_ne((val), VALUE_NAN) ? value_uminus(val) \
571 : (THROW(overflow_error), VALUE_NAN)))
574#define value_pos_p(val) value_gt(val, VALUE_ZERO)
575#define value_neg_p(val) value_lt(val, VALUE_ZERO)
576#define value_posz_p(val) value_ge(val, VALUE_ZERO)
577#define value_negz_p(val) value_le(val, VALUE_ZERO)
578#define value_zero_p(val) value_eq(val, VALUE_ZERO)
579#define value_notzero_p(val) value_ne(val, VALUE_ZERO)
580#define value_one_p(val) value_eq(val, VALUE_ONE)
581#define value_notone_p(val) value_ne(val, VALUE_ONE)
582#define value_mone_p(val) value_eq(val, VALUE_MONE)
583#define value_notmone_p(val) value_ne(val, VALUE_MONE)
584#define value_cmp_si(val, n) (val - (n))
585#define value_min_p(val) value_eq(val, VALUE_MIN)
586#define value_max_p(val) value_eq(val, VALUE_MAX)
587#define value_notmin_p(val) value_ne(val, VALUE_MIN)
588#define value_notmax_p(val) value_ne(val, VALUE_MAX)
598#define value_protected_hard_idiv_multiply(v, w, throw) \
599 ((value_zero_p(w) || value_zero_p(v)) ? VALUE_ZERO \
600 : value_lt(value_abs(v), value_div(VALUE_MAX, value_abs(w))) \
601 ? value_direct_multiply(v, w) \
602 : (throw, VALUE_NAN))
606#if defined(LINEAR_VALUE_ASSUME_SOFTWARE_IDIV)
607#define value_protected_multiply(v, w, throw) \
608 ((value_le(v, VALUE_SQRT_MAX) && value_le(w, VALUE_SQRT_MAX) && \
609 value_ge(v, VALUE_SQRT_MIN) && value_ge(w, VALUE_SQRT_MIN)) \
610 ? value_direct_multiply(v, w) \
611 : value_protected_hard_idiv_multiply(v, w, throw))
613#define value_protected_multiply(v, w, throw) \
614 value_protected_hard_idiv_multiply(v, w, throw)
619#define value_protected_mult(v, w) \
620 value_protected_multiply(v, w, THROW(overflow_error))
621#define value_protected_product(v, w) v = value_protected_mult(v, w)
626#if defined(LINEAR_VALUE_PROTECT_MULTIPLY)
627#define value_mult(v, w) value_protected_mult(v, w)
628#define value_product(v, w) value_protected_product(v, w)
635#define value_mult(v, w) \
636 value_protected_multiply(v, w, \
637 (fprintf(stderr, "[value_mult] value overflow!\n"), \
638 THROW(overflow_error)))
639#define value_product(v, w) v = value_mult(v, w)
654#if defined(LINEAR_VALUE_IS_CHARS)
656#define value_init(val) ((val).s = NULL)
658#define value_clear(val) (value_init(val))
659#define value_fake_binary(v1, v2) ((Value)((v1).i + (v2).i))
660#define value_fake_ternary(v0, v1, v2) ((Value)((v0).i += (v1).i + (v2).i))
661#define value_bool_binary(v1, v2) ((int)((v1).i + (v2).i))
663#define float_to_value(f) ((Value)f)
664#undef double_to_value
665#define double_to_value(f) ((Value)f)
667#define value_uminus(v) (v)
669#define value_mult(v1, v2) value_fake_binary(v1, v2)
671#define value_mod(v1, v2) value_fake_binary(v1, v2)
673#define value_ge(v1, v2) value_bool_binary(v1, v2)
675#define value_gt(v1, v2) value_bool_binary(v1, v2)
677#define value_le(v1, v2) value_bool_binary(v1, v2)
679#define value_lt(v1, v2) value_bool_binary(v1, v2)
681#define value_ne(v1, v2) value_bool_binary(v1, v2)
683#define value_eq(v1, v2) value_bool_binary(v1, v2)
685#define value_plus(v1, v2) value_fake_binary(v1, v2)
687#define value_minus(v1, v2) value_fake_binary(v1, v2)
689#define value_pdiv(v1, v2) value_fake_binary(v1, v2)
691#define value_div(v1, v2) value_fake_binary(v1, v2)
693#define value_mod(v1, v2) value_fake_binary(v1, v2)
695#define value_addto(v1, v2) value_assign(v1, value_plus(v1, v2))
697#define value_subtract(v1, v2) value_addto(v1, v2)
699#define value_product(v1, v2) value_addto(v1, v2)
701#define value_modulus(v1, v2) value_addto(v1, v2)
703#define value_division(ref, val1, val2) (value_fake_ternary(ref, val1, val2))
705#define value_divexact(ref, v1, v2) (value_fake_ternary(ref, val1, val2))
706#undef value_increment
707#define value_increment(v) value_addto(v, VALUE_ONE)
708#undef value_decrement
709#define value_decrement(v) value_addto(v, VALUE_MONE)
711#define value_orto(ref, val) value_addto(v1, v2)
713#define value_andto(ref, val) value_addto(v1, v2)
715#define value_or(v1, v2) value_fake_binary(v1, v2)
717#define value_and(v1, v2) value_fake_binary(v1, v2)
719#define value_lshift(v1, v2) value_fake_binary(v1, v2)
721#define value_rshift(v1, v2) value_fake_binary(v1, v2)
725#define value_substract(ref, val1, val2) (value_subtract((ref), (val1), (val2)))
730#define ABS(x) (((x) >= 0) ? (x) : -(x))
738#define MIN(x, y) (((x) >= (y)) ? (y) : (x))
741#define MAX(x, y) (((x) >= (y)) ? (x) : (y))
745#define SIGN(x) (((x) > 0) ? 1 : ((x) == 0 ? 0 : -1))
753#define DIVIDE(x, y) \
754 ((y) > 0 ? POSITIVE_DIVIDE(x, y) : -POSITIVE_DIVIDE((x), (-(y))))
757#define POSITIVE_DIVIDE(x, y) ((x) > 0 ? (x) / (y) : -(-(x) + (y) - 1) / (y))
760#define MODULO(x, y) ((y) > 0 ? POSITIVE_MODULO(x, y) : POSITIVE_MODULO(-x, -y))
768#define POSITIVE_MODULO(x, y) \
769 ((x) > 0 ? (x) % (y) : ((x) % (y) == 0 ? 0 : ((y) - (-(x)) % (y))))
781 const char * ,
int );
783 const char * ,
int );
785 const char * ,
int );
unsigned int user_exception_error
unsigned int parser_exception_error
unsigned int simplex_arithmetic_error
unsigned int any_exception_error
void dump_exception_stack(void)
void pop_exception_from_stack(int, const char *, const char *, int)
jmp_buf * push_exception_on_stack(int, const char *, const char *, int)
void throw_exception(int, const char *, const char *, int)
void dump_exception_stack_to_file(FILE *)
unsigned int the_last_just_thrown_exception
void free_exception_stack(void)
unsigned int overflow_error