GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
/* mpq expression evaluation12Copyright 2000, 2001, 2002 Free Software Foundation, Inc.34This file is part of the GNU MP Library.56The GNU MP Library is free software; you can redistribute it and/or modify7it under the terms of the GNU Lesser General Public License as published by8the Free Software Foundation; either version 2.1 of the License, or (at your9option) any later version.1011The GNU MP Library is distributed in the hope that it will be useful, but12WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY13or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public14License for more details.1516You should have received a copy of the GNU Lesser General Public License17along with the GNU MP Library; see the file COPYING.LIB. If not, write to18the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,19MA 02110-1301, USA. */2021#include <stdio.h>22#include <string.h>23#include "gmp.h"24#include "expr-impl.h"252627/* Change this to "#define TRACE(x) x" to get some traces. */28#define TRACE(x)293031static void32e_mpq_pow_ui (mpq_ptr r, mpq_srcptr b, unsigned long e)33{34mpz_pow_ui (mpq_numref(r), mpq_numref(b), e);35mpz_pow_ui (mpq_denref(r), mpq_denref(b), e);36}3738/* Wrapped because mpq_sgn is a macro. */39static int40e_mpq_sgn (mpq_srcptr x)41{42return mpq_sgn (x);43}4445/* Wrapped because mpq_equal only guarantees a non-zero return, whereas we46want 1 or 0 for == and !=. */47static int48e_mpq_equal (mpq_srcptr x, mpq_srcptr y)49{50return mpq_equal (x, y) != 0;51}52static int53e_mpq_notequal (mpq_srcptr x, mpq_srcptr y)54{55return ! mpq_equal (x, y);56}5758static void59e_mpq_num (mpq_ptr w, mpq_srcptr x)60{61if (w != x)62mpz_set (mpq_numref(w), mpq_numref(x));63mpz_set_ui (mpq_denref(w), 1L);64}65static void66e_mpq_den (mpq_ptr w, mpq_srcptr x)67{68if (w == x)69mpz_swap (mpq_numref(w), mpq_denref(w));70else71mpz_set (mpq_numref(w), mpq_denref(x));72mpz_set_ui (mpq_denref(w), 1L);73}747576static __gmp_const struct mpexpr_operator_t _mpq_expr_standard_table[] = {7778{ "**", (mpexpr_fun_t) e_mpq_pow_ui,79MPEXPR_TYPE_BINARY_UI | MPEXPR_TYPE_RIGHTASSOC, 220 },8081{ "!", (mpexpr_fun_t) e_mpq_sgn,82MPEXPR_TYPE_LOGICAL_NOT | MPEXPR_TYPE_PREFIX, 210 },83{ "-", (mpexpr_fun_t) mpq_neg,84MPEXPR_TYPE_UNARY | MPEXPR_TYPE_PREFIX, 210 },8586{ "*", (mpexpr_fun_t) mpq_mul, MPEXPR_TYPE_BINARY, 200 },87{ "/", (mpexpr_fun_t) mpq_div, MPEXPR_TYPE_BINARY, 200 },8889{ "+", (mpexpr_fun_t) mpq_add, MPEXPR_TYPE_BINARY, 190 },90{ "-", (mpexpr_fun_t) mpq_sub, MPEXPR_TYPE_BINARY, 190 },9192{ "<<", (mpexpr_fun_t) mpq_mul_2exp, MPEXPR_TYPE_BINARY_UI, 180 },93{ ">>", (mpexpr_fun_t) mpq_div_2exp, MPEXPR_TYPE_BINARY_UI, 180 },9495{ "<=", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_CMP_LE, 170 },96{ "<", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_CMP_LT, 170 },97{ ">=", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_CMP_GE, 170 },98{ ">", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_CMP_GT, 170 },99100{ "==", (mpexpr_fun_t) e_mpq_equal, MPEXPR_TYPE_I_BINARY, 160 },101{ "!=", (mpexpr_fun_t) e_mpq_notequal, MPEXPR_TYPE_I_BINARY, 160 },102103{ "&&", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_LOGICAL_AND, 120 },104{ "||", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_LOGICAL_OR, 110 },105106{ ":", NULL, MPEXPR_TYPE_COLON, 101 },107{ "?", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_QUESTION, 100 },108109{ ")", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_CLOSEPAREN, 4 },110{ "(", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_OPENPAREN, 3 },111{ ",", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_ARGSEP, 2 },112{ "$", NULL, MPEXPR_TYPE_VARIABLE, 1 },113114{ "abs", (mpexpr_fun_t) mpq_abs, MPEXPR_TYPE_UNARY },115{ "cmp", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_I_BINARY },116{ "den", (mpexpr_fun_t) e_mpq_den, MPEXPR_TYPE_UNARY },117{ "max", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_MAX | MPEXPR_TYPE_PAIRWISE },118{ "min", (mpexpr_fun_t) mpq_cmp, MPEXPR_TYPE_MIN | MPEXPR_TYPE_PAIRWISE },119{ "num", (mpexpr_fun_t) e_mpq_num, MPEXPR_TYPE_UNARY },120{ "sgn", (mpexpr_fun_t) e_mpq_sgn, MPEXPR_TYPE_I_UNARY },121122{ NULL }123};124125__gmp_const struct mpexpr_operator_t * __gmp_const mpq_expr_standard_table126= _mpq_expr_standard_table;127128129int130#if HAVE_STDARG131mpq_expr (mpq_ptr res, int base, __gmp_const char *e, ...)132#else133mpq_expr (va_alist)134va_dcl135#endif136{137mpq_srcptr var[MPEXPR_VARIABLES];138va_list ap;139int ret;140#if HAVE_STDARG141va_start (ap, e);142#else143mpq_ptr res;144int base;145__gmp_const char *e;146va_start (ap);147res = va_arg (ap, mpq_ptr);148base = va_arg (ap, int);149e = va_arg (ap, __gmp_const char *);150#endif151152TRACE (printf ("mpq_expr(): base %d, %s\n", base, e));153ret = mpexpr_va_to_var ((void **) var, ap);154va_end (ap);155156if (ret != MPEXPR_RESULT_OK)157return ret;158159return mpq_expr_a (mpq_expr_standard_table, res, base, e, strlen(e), var);160}161162163