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
79#ifndef __LONG_LONG_MAX__
80#define __LONG_LONG_MAX__ 9223372036854775807LL
83#define LONG_LONG_MAX __LONG_LONG_MAX__
85#define LONG_LONG_MIN (-LONG_LONG_MAX - 1)
87#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
90#if defined(LINEAR_VALUE_IS_LONGLONG)
92#define LINEAR_VALUE_STRING "long long int"
93typedef long long int Value;
94#if defined(WIN32) && !defined(unix)
96#define VALUE_FMT "%I64d"
98#define VALUE_FMT "%lld"
100#define VALUE_CONST(val) (val##LL)
107#define VALUE_NAN LONG_LONG_MIN
108#define VALUE_MIN (LONG_LONG_MIN + 1LL)
109#define VALUE_MAX LONG_LONG_MAX
110#define VALUE_SQRT_MIN long_to_value(LONG_MIN)
111#define VALUE_SQRT_MAX long_to_value(LONG_MAX)
112#define VALUE_ZERO (0LL)
113#define VALUE_ONE (1LL)
114#define VALUE_MONE (-1LL)
116#define VALUE_TO_LONG(val) \
117 ((long)((val) > (Value)LONG_MIN && (val) <= (Value)LONG_MAX) \
119 : (THROW(overflow_error), LONG_MIN))
121#define VALUE_TO_INT(val) \
122 ((int)((val) > (Value)INT_MIN && (val) <= (Value)INT_MAX) \
124 : (THROW(overflow_error), INT_MIN))
126#define VALUE_TO_DOUBLE(val) ((double)(val))
129#define VALUE_TO_FLOAT(val) ((float)((int)(val)))
144#elif defined(LINEAR_VALUE_IS_LONG)
146#define LINEAR_VALUE_STRING "long int"
148#define VALUE_FMT "%ld"
149#define VALUE_CONST(val) (val##L)
150#define VALUE_NAN LONG_MIN
151#define VALUE_MIN (LONG_MIN + 1L)
152#define VALUE_MAX LONG_MAX
153#define VALUE_SQRT_MIN int_to_value(INT_MIN)
154#define VALUE_SQRT_MAX int_to_value(INT_MAX)
157#define VALUE_MONE -1L
158#define VALUE_TO_LONG(val) (val)
159#define VALUE_TO_INT(val) ((int)(val))
160#define VALUE_TO_FLOAT(val) ((float)(val))
161#define VALUE_TO_DOUBLE(val) ((double)(val))
208#elif defined(LINEAR_VALUE_IS_CHARS)
210#define LINEAR_VALUE_STRING "char"
218#define VALUE_FMT "%s"
219#define VALUE_CONST(val) ((Value)(val))
220#define VALUE_NAN ((Value)(long)0xdadeebee)
221#define VALUE_MIN ((Value)(long)0xdeadbeef)
222#define VALUE_MAX ((Value)(long)0xfeedabee)
223#define VALUE_ZERO ((Value)0)
224#define VALUE_ONE ((Value)1)
225#define VALUE_MONE ((Value) - 1)
226#define VALUE_TO_LONG(val) (val.l)
227#define VALUE_TO_INT(val) (val.i)
228#define VALUE_TO_FLOAT(val) (val.f)
229#define VALUE_TO_DOUBLE(val) (val.d)
243#elif defined(LINEAR_VALUE_IS_INT)
245#define LINEAR_VALUE_STRING "int"
247#define VALUE_FMT "%d"
248#define VALUE_CONST(val) (val)
249#define VALUE_NAN INT_MIN
250#define VALUE_MIN (INT_MIN + 1)
251#define VALUE_MAX INT_MAX
255#define VALUE_TO_LONG(val) ((long)(val))
256#define VALUE_TO_INT(val) ((int)(val))
257#define VALUE_TO_FLOAT(val) ((float)(val))
258#define VALUE_TO_DOUBLE(val) ((double)(val))
273#define LINEAR_VALUE_STRING "gmp"
275#define VALUE_FMT "%s"
281#define VALUE_TO_LONG(val) (mpz_get_si(val))
282#define VALUE_TO_INT(val) ((int)mpz_get_si(val))
283#define VALUE_TO_FLOAT(val) ((float)((int)mpz_get_si(val)))
284#define VALUE_TO_DOUBLE(val) (mpz_get_d(val))
299#define LINEAR_VALUE_STRING "cln"
300typedef cln::cl_I Value;
301#define VALUE_FMT "%s"
303#define VALUE_TO_INT(val) (cln::cl_I_to_int(val))
304#define VALUE_TO_DOUBLE(val) (cln::double_approx(val))
318#define value_init(val) ((val).word = ((cln::cl_uint)cl_FN_tag) << cl_tag_shift)
319#define value_assign(v1, v2) ((v1) = (v2))
320#define value_set_si(val, i) ((val) = (i))
321#define value_set_double(val, d) ((val) = cln::truncate1(cln::cl_R(d)))
322#define value_clear(val) ((val) = 0)
323#define value_read(val, str) ((val) = (str))
324#define value_print(Dst, fmt, val) \
326 std::ostringstream strm; \
328 fprintf((Dst), (fmt), strm.str().c_str()); \
330#define value_swap(v1, v2) \
340#define value_eq(v1, v2) ((v1) == (v2))
341#define value_ne(v1, v2) ((v1) != (v2))
342#define value_gt(v1, v2) ((v1) > (v2))
343#define value_ge(v1, v2) ((v1) >= (v2))
344#define value_lt(v1, v2) ((v1) < (v2))
345#define value_le(v1, v2) ((v1) <= (v2))
347#define value_abs_eq(v1, v2) (cln::abs(v1) == cln::abs(v2))
348#define value_abs_ne(v1, v2) (cln::abs(v1) != cln::abs(v2))
349#define value_abs_gt(v1, v2) (cln::abs(v1) > cln::abs(v2))
350#define value_abs_ge(v1, v2) (cln::abs(v1) >= cln::abs(v2))
351#define value_abs_lt(v1, v2) (cln::abs(v1) < cln::abs(v2))
352#define value_abs_le(v1, v2) (cln::abs(v1) <= cln::abs(v2))
354#define value_sign(val) (cln::signum(val))
355#define value_cmp(v1, v2) (cln::compare((v1), (v2)))
357#define value_addto(ref, val1, val2) ((ref) = (val1) + (val2))
358#define value_add_int(ref, val, vint) ((ref) = (val) + (vint))
359#define value_addmul(ref, val1, val2) ((ref) += (val1) * (val2))
360#define value_increment(ref, val) ((ref) = (val) + 1)
361#define value_multiply(ref, val1, val2) ((ref) = (val1) * (val2))
362#define value_subtract(ref, val1, val2) ((ref) = (val1) - (val2))
363#define value_sub_int(ref, val1, val2) ((ref) = (val1) - (val2))
364#define value_decrement(ref, val) ((ref) = (val) - 1)
365#define value_division(ref, val1, val2) ((ref) = cln::truncate1(val1, val2))
366#define value_divexact(ref, val1, val2) ((ref) = cln::exquo(val1, val2))
367#define value_modulus(ref, val1, val2) \
368 ((ref) = cln::truncate2(val1, val2).remainder)
369#define value_pdivision(ref, val1, val2) ((ref) = cln::floor1(val1, val2))
370#define value_pmodulus(ref, val1, val2) \
371 ((ref) = cln::floor2(val1, val2).remainder)
372#define value_oppose(ref, val) ((ref) = -(val))
373#define value_absolute(ref, val) ((ref) = cln::abs(val))
374#define value_minimum(ref, val1, val2) ((ref) = cln::min((val1), (val2)))
375#define value_maximum(ref, val1, val2) ((ref) = cln::max((val1), (val2)))
376#define value_gcd(ref, val1, val2) ((ref) = cln::gcd((val1), (val2)))
377#define value_lcm(ref, val1, val2) ((ref) = cln::lcm((val1), (val2)))
378#define value_orto(ref, val1, val2) ((ref) = (val1) | (val2))
379#define value_andto(ref, val1, val2) ((ref) = (val1) & (val2))
383#define value_pos_p(val) ((val) > 0)
384#define value_neg_p(val) ((val) < 0)
385#define value_posz_p(val) ((val) >= 0)
386#define value_negz_p(val) ((val) <= 0)
387#define value_zero_p(val) ((val) == 0)
388#define value_notzero_p(val) ((val) != 0)
389#define value_one_p(val) ((val) == 1)
390#define value_notone_p(val) ((val) != 1)
391#define value_mone_p(val) ((val) == -1)
392#define value_notmone_p(val) ((val) != -1)
393#define value_cmp_si(val, n) (cln::compare(val, n))
400#define value_init(val) (mpz_init((val)))
401#define value_assign(v1, v2) (mpz_set((v1), (v2)))
402#define value_set_si(val, i) (mpz_set_si((val), (i)))
403#define value_set_double(val, d) (mpz_set_d((val), (d)))
404#define value_clear(val) (mpz_clear((val)))
405#define value_read(val, str) (mpz_set_str((val), (str), 10))
406typedef void (*value_print_gmp_free_t)(
void *, size_t);
407#define value_print(Dst, fmt, val) \
410 value_print_gmp_free_t gmp_free; \
411 str = mpz_get_str(0, 10, (val)); \
412 fprintf((Dst), (fmt), str); \
413 mp_get_memory_functions(NULL, NULL, &gmp_free); \
414 (*gmp_free)(str, strlen(str) + 1); \
416#define value_swap(val1, val2) (mpz_swap(val1, val2))
419#define value_eq(v1, v2) (mpz_cmp((v1), (v2)) == 0)
420#define value_ne(v1, v2) (mpz_cmp((v1), (v2)) != 0)
421#define value_gt(v1, v2) (mpz_cmp((v1), (v2)) > 0)
422#define value_ge(v1, v2) (mpz_cmp((v1), (v2)) >= 0)
423#define value_lt(v1, v2) (mpz_cmp((v1), (v2)) < 0)
424#define value_le(v1, v2) (mpz_cmp((v1), (v2)) <= 0)
426#define value_abs_eq(v1, v2) (mpz_cmpabs((v1), (v2)) == 0)
427#define value_abs_ne(v1, v2) (mpz_cmpabs((v1), (v2)) != 0)
428#define value_abs_gt(v1, v2) (mpz_cmpabs((v1), (v2)) > 0)
429#define value_abs_ge(v1, v2) (mpz_cmpabs((v1), (v2)) >= 0)
430#define value_abs_lt(v1, v2) (mpz_cmpabs((v1), (v2)) < 0)
431#define value_abs_le(v1, v2) (mpz_cmpabs((v1), (v2)) <= 0)
434#define value_sign(val) (mpz_sgn(val))
435#define value_cmp(v1, v2) (mpz_cmp((v1), (v2)))
438#define value_addto(ref, val1, val2) (mpz_add((ref), (val1), (val2)))
439#define value_add_int(ref, val, vint) (mpz_add_ui((ref), (val), (long)(vint)))
440#define value_addmul(ref, val1, val2) (mpz_addmul((ref), (val1), (val2)))
441#define value_increment(ref, val) (mpz_add_ui((ref), (val), 1))
442#define value_multiply(ref, val1, val2) (mpz_mul((ref), (val1), (val2)))
443#define value_subtract(ref, val1, val2) (mpz_sub((ref), (val1), (val2)))
444#define value_sub_int(ref, val, vint) (mpz_sub_ui((ref), (val), (long)(vint)))
445#define value_decrement(ref, val) (mpz_sub_ui((ref), (val), 1))
446#define value_division(ref, val1, val2) (mpz_tdiv_q((ref), (val1), (val2)))
447#define value_divexact(ref, val1, val2) (mpz_divexact((ref), (val1), (val2)))
448#define value_modulus(ref, val1, val2) (mpz_tdiv_r((ref), (val1), (val2)))
449#define value_pdivision(ref, val1, val2) (mpz_fdiv_q((ref), (val1), (val2)))
450#define value_pmodulus(ref, val1, val2) (mpz_fdiv_r((ref), (val1), (val2)))
451#define value_oppose(ref, val) (mpz_neg((ref), (val)))
452#define value_absolute(ref, val) (mpz_abs((ref), (val)))
453#define value_minimum(ref, val1, val2) \
454 (value_le((val1), (val2)) ? mpz_set((ref), (val1)) : mpz_set((ref), (val2)))
455#define value_maximum(ref, val1, val2) \
456 (value_ge((val1), (val2)) ? mpz_set((ref), (val1)) : mpz_set((ref), (val2)))
457#define value_gcd(ref, val1, val2) (mpz_gcd(ref, val1, val2))
458#define value_lcm(ref, val1, val2) (mpz_lcm(ref, val1, val2))
459#define value_orto(ref, val1, val2) (mpz_ior((ref), (val1), (val2)))
460#define value_andto(ref, val1, val2) (mpz_and((ref), (val1), (val2)))
463#define value_pos_p(val) (mpz_sgn(val) > 0)
464#define value_neg_p(val) (mpz_sgn(val) < 0)
465#define value_posz_p(val) (mpz_sgn(val) >= 0)
466#define value_negz_p(val) (mpz_sgn(val) <= 0)
467#define value_zero_p(val) (mpz_sgn(val) == 0)
468#define value_notzero_p(val) (mpz_sgn(val) != 0)
469#define value_one_p(val) (mpz_cmp_si(val, 1) == 0)
470#define value_notone_p(val) (mpz_cmp_si(val, 1) != 0)
471#define value_mone_p(val) (mpz_cmp_si(val, -1) == 0)
472#define value_notmone_p(val) (mpz_cmp_si(val, -1) != 0)
473#define value_cmp_si(val, n) (mpz_cmp_si(val, n))
481#define value_init(val) ((val) = 0)
482#define value_assign(v1, v2) ((v1) = (v2))
483#define value_set_si(val, i) ((val) = (Value)(i))
484#define value_set_double(val, d) ((val) = (Value)(d))
485#define value_clear(val) ((val) = 0)
486#define value_read(val, str) (sscanf((str), VALUE_FMT, &(val)))
487#define value_print(Dst, fmt, val) (fprintf((Dst), (fmt), (val)))
488#define value_swap(v1, v2) \
496#define int_to_value(i) ((Value)(i))
497#define long_to_value(l) ((Value)(l))
498#define float_to_value(f) ((Value)(f))
499#define double_to_value(d) ((Value)(d))
502#define value_eq(v1, v2) ((v1) == (v2))
503#define value_ne(v1, v2) ((v1) != (v2))
504#define value_gt(v1, v2) ((v1) > (v2))
505#define value_ge(v1, v2) ((v1) >= (v2))
506#define value_lt(v1, v2) ((v1) < (v2))
507#define value_le(v1, v2) ((v1) <= (v2))
509#define value_abs_eq(v1, v2) (value_abs(v1) == value_abs(v2))
510#define value_abs_ne(v1, v2) (value_abs(v1) != value_abs(v2))
511#define value_abs_gt(v1, v2) (value_abs(v1) > value_abs(v2))
512#define value_abs_ge(v1, v2) (value_abs(v1) >= value_abs(v2))
513#define value_abs_lt(v1, v2) (value_abs(v1) < value_abs(v2))
514#define value_abs_le(v1, v2) (value_abs(v1) <= value_abs(v2))
517#define value_sign(v) \
518 (value_eq(v, VALUE_ZERO) ? 0 : value_lt(v, VALUE_ZERO) ? -1 : 1)
519#define value_cmp(v1, v2) (value_eq(v1, v2) ? 0 : value_lt(v1, v2) ? -1 : 1)
522#define value_plus(v1, v2) ((v1) + (v2))
523#define value_div(v1, v2) ((v1) / (v2))
524#define value_mod(v1, v2) ((v1) % (v2))
525#define value_direct_multiply(v1, v2) ((v1) * (v2))
526#define value_minus(v1, v2) ((v1) - (v2))
527#define value_pdiv(v1, v2) (DIVIDE((v1), (v2)))
528#define value_pmod(v1, v2) (MODULO((v1), (v2)))
529#define value_min(v1, v2) (value_le((v1), (v2)) ? (v1) : (v2))
530#define value_max(v1, v2) (value_ge((v1), (v2)) ? (v1) : (v2))
531#define value_or(v1, v2) ((v1) | (v2))
532#define value_and(v1, v2) ((v1) & (v2))
533#define value_lshift(v1, v2) ((v1) << (v2))
534#define value_rshift(v1, v2) ((v1) >> (v2))
537#define value_addto(ref, val1, val2) ((ref) = (val1) + (val2))
538#define value_add_int(ref, val, vint) ((ref) = (val) + (Value)(vint))
539#define value_addmul(ref, val1, val2) ((ref) += (val1) * (val2))
540#define value_increment(ref, val) ((ref) = (val) + VALUE_ONE)
541#define value_direct_product(ref, val1, val2) \
542 ((ref) = (val1) * (val2))
543#define value_multiply(ref, val1, val2) ((ref) = value_mult((val1), (val2)))
544#define value_subtract(ref, val1, val2) ((ref) = (val1) - (val2))
545#define value_sub_int(ref, val, vint) ((ref) = (val) - (Value)(vint))
546#define value_decrement(ref, val) ((ref) = (val) - VALUE_ONE)
547#define value_division(ref, val1, val2) ((ref) = (val1) / (val2))
548#define value_divexact(ref, val1, val2) ((ref) = (val1) / (val2))
549#define value_modulus(ref, val1, val2) ((ref) = (val1) % (val2))
550#define value_pdivision(ref, val1, val2) ((ref) = value_pdiv((val1), (val2)))
551#define value_pmodulus(ref, val1, val2) ((ref) = value_pmod((val1), (val2)))
552#define value_oppose(ref, val) ((ref) = value_uminus((val)))
553#define value_absolute(ref, val) ((ref) = value_abs((val)))
554#define value_minimum(ref, val1, val2) ((ref) = value_min((val1), (val2)))
555#define value_maximum(ref, val1, val2) ((ref) = value_max((val1), (val2)))
556#define value_gcd(ref, val1, val2) Gcd((val1), (val2), &(ref))
557#define value_lcm(ref, val1, val2) Lcm3((val1), (val2), &(ref))
558#define value_orto(ref, val1, val2) ((ref) = (val1) | (val2))
559#define value_andto(ref, val1, val2) ((ref) = (val1) & (val2))
562#define value_uminus(val) (-(val))
563#define value_not(val) (~(val))
564#define value_abs(val) \
567 : (value_ne((val), VALUE_NAN) ? value_uminus(val) \
568 : (THROW(overflow_error), VALUE_NAN)))
571#define value_pos_p(val) value_gt(val, VALUE_ZERO)
572#define value_neg_p(val) value_lt(val, VALUE_ZERO)
573#define value_posz_p(val) value_ge(val, VALUE_ZERO)
574#define value_negz_p(val) value_le(val, VALUE_ZERO)
575#define value_zero_p(val) value_eq(val, VALUE_ZERO)
576#define value_notzero_p(val) value_ne(val, VALUE_ZERO)
577#define value_one_p(val) value_eq(val, VALUE_ONE)
578#define value_notone_p(val) value_ne(val, VALUE_ONE)
579#define value_mone_p(val) value_eq(val, VALUE_MONE)
580#define value_notmone_p(val) value_ne(val, VALUE_MONE)
581#define value_cmp_si(val, n) (val - (n))
582#define value_min_p(val) value_eq(val, VALUE_MIN)
583#define value_max_p(val) value_eq(val, VALUE_MAX)
584#define value_notmin_p(val) value_ne(val, VALUE_MIN)
585#define value_notmax_p(val) value_ne(val, VALUE_MAX)
595#define value_protected_hard_idiv_multiply(v, w, throw) \
596 ((value_zero_p(w) || value_zero_p(v)) ? VALUE_ZERO \
597 : value_lt(value_abs(v), value_div(VALUE_MAX, value_abs(w))) \
598 ? value_direct_multiply(v, w) \
599 : (throw, VALUE_NAN))
603#if defined(LINEAR_VALUE_ASSUME_SOFTWARE_IDIV)
604#define value_protected_multiply(v, w, throw) \
605 ((value_le(v, VALUE_SQRT_MAX) && value_le(w, VALUE_SQRT_MAX) && \
606 value_ge(v, VALUE_SQRT_MIN) && value_ge(w, VALUE_SQRT_MIN)) \
607 ? value_direct_multiply(v, w) \
608 : value_protected_hard_idiv_multiply(v, w, throw))
610#define value_protected_multiply(v, w, throw) \
611 value_protected_hard_idiv_multiply(v, w, throw)
616#define value_protected_mult(v, w) \
617 value_protected_multiply(v, w, THROW(overflow_error))
618#define value_protected_product(v, w) v = value_protected_mult(v, w)
623#if defined(LINEAR_VALUE_PROTECT_MULTIPLY)
624#define value_mult(v, w) value_protected_mult(v, w)
625#define value_product(v, w) value_protected_product(v, w)
632#define value_mult(v, w) \
633 value_protected_multiply(v, w, \
634 (fprintf(stderr, "[value_mult] value overflow!\n"), \
635 THROW(overflow_error)))
636#define value_product(v, w) v = value_mult(v, w)
651#if defined(LINEAR_VALUE_IS_CHARS)
652#define value_fake_binary(v1, v2) ((Value)((v1).i + (v2).i))
653#define value_bool_binary(v1, v2) ((int)((v1).i + (v2).i))
655#define float_to_value(f) ((Value)f)
656#undef double_to_value
657#define double_to_value(f) ((Value)f)
659#define value_uminus(v) (v)
661#define value_mult(v1, v2) value_fake_binary(v1, v2)
663#define value_mod(v1, v2) value_fake_binary(v1, v2)
665#define value_ge(v1, v2) value_bool_binary(v1, v2)
667#define value_gt(v1, v2) value_bool_binary(v1, v2)
669#define value_le(v1, v2) value_bool_binary(v1, v2)
671#define value_lt(v1, v2) value_bool_binary(v1, v2)
673#define value_ne(v1, v2) value_bool_binary(v1, v2)
675#define value_eq(v1, v2) value_bool_binary(v1, v2)
677#define value_plus(v1, v2) value_fake_binary(v1, v2)
679#define value_minus(v1, v2) value_fake_binary(v1, v2)
681#define value_pdiv(v1, v2) value_fake_binary(v1, v2)
683#define value_div(v1, v2) value_fake_binary(v1, v2)
685#define value_mod(v1, v2) value_fake_binary(v1, v2)
687#define value_addto(v1, v2) value_assign(v1, value_plus(v1, v2))
689#define value_subtract(v1, v2) value_addto(v1, v2)
691#define value_product(v1, v2) value_addto(v1, v2)
693#define value_modulus(v1, v2) value_addto(v1, v2)
695#define value_division(v1, v2) value_addto(v1, v2)
697#define value_divexact(v1, v2) value_addto(v1, v2)
698#undef value_increment
699#define value_increment(v) value_addto(v, VALUE_ONE)
700#undef value_decrement
701#define value_decrement(v) value_addto(v, VALUE_MONE)
703#define value_orto(ref, val) value_addto(v1, v2)
705#define value_andto(ref, val) value_addto(v1, v2)
707#define value_or(v1, v2) value_fake_binary(v1, v2)
709#define value_and(v1, v2) value_fake_binary(v1, v2)
711#define value_lshift(v1, v2) value_fake_binary(v1, v2)
713#define value_rshift(v1, v2) value_fake_binary(v1, v2)
717#define value_substract(ref, val1, val2) (value_subtract((ref), (val1), (val2)))
722#define ABS(x) (((x) >= 0) ? (x) : -(x))
730#define MIN(x, y) (((x) >= (y)) ? (y) : (x))
733#define MAX(x, y) (((x) >= (y)) ? (x) : (y))
737#define SIGN(x) (((x) > 0) ? 1 : ((x) == 0 ? 0 : -1))
745#define DIVIDE(x, y) \
746 ((y) > 0 ? POSITIVE_DIVIDE(x, y) : -POSITIVE_DIVIDE((x), (-(y))))
749#define POSITIVE_DIVIDE(x, y) ((x) > 0 ? (x) / (y) : -(-(x) + (y) - 1) / (y))
752#define MODULO(x, y) ((y) > 0 ? POSITIVE_MODULO(x, y) : POSITIVE_MODULO(-x, -y))
760#define POSITIVE_MODULO(x, y) \
761 ((x) > 0 ? (x) % (y) : ((x) % (y) == 0 ? 0 : ((y) - (-(x)) % (y))))
773 const char * ,
int );
775 const char * ,
int );
777 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