[BACK]Return to exprza.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / demos / expr

Annotation of OpenXM_contrib/gmp/demos/expr/exprza.c, Revision 1.1.1.1

1.1       ohara       1: /* mpz expression evaluation */
                      2:
                      3: /*
                      4: Copyright 2000, 2001 Free Software Foundation, Inc.
                      5:
                      6: This file is part of the GNU MP Library.
                      7:
                      8: The GNU MP Library is free software; you can redistribute it and/or modify
                      9: it under the terms of the GNU Lesser General Public License as published by
                     10: the Free Software Foundation; either version 2.1 of the License, or (at your
                     11: option) any later version.
                     12:
                     13: The GNU MP Library is distributed in the hope that it will be useful, but
                     14: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     15: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
                     16: License for more details.
                     17:
                     18: You should have received a copy of the GNU Lesser General Public License
                     19: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
                     20: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
                     21: MA 02111-1307, USA.
                     22: */
                     23:
                     24: #include <ctype.h>
                     25: #include <stdio.h>
                     26: #include "gmp.h"
                     27: #include "expr-impl.h"
                     28:
                     29:
                     30: /* No need to parse '-' since that's handled as an operator.
                     31:    This function also by mpq_expr_a, so it's not static.  */
                     32: size_t
                     33: mpexpr_mpz_number (mpz_ptr res, __gmp_const char *e, size_t elen, int base)
                     34: {
                     35:   char    *edup;
                     36:   size_t  i, ret;
                     37:   int     base_effective = (base == 0 ? 10 : base);
                     38:
                     39:   i = 0;
                     40:   if (e[i] == '0')
                     41:     {
                     42:       i++;
                     43:       if (e[i] == 'x' || e[i] == 'b')
                     44:         i++;
                     45:     }
                     46:
                     47:   for ( ; i < elen; i++)
                     48:     if (! isasciidigit_in_base (e[i], base_effective))
                     49:       break;
                     50:
                     51:   edup = (*__gmp_allocate_func) (i+1);
                     52:   memcpy (edup, e, i);
                     53:   edup[i] = '\0';
                     54:
                     55:   if (mpz_set_str (res, edup, base) == 0)
                     56:     ret = i;
                     57:   else
                     58:     ret = 0;
                     59:
                     60:   (*__gmp_free_func) (edup, i+1);
                     61:   return ret;
                     62: }
                     63:
                     64:
                     65: int
                     66: mpz_expr_a (__gmp_const struct mpexpr_operator_t *table,
                     67:             mpz_ptr res, int base,
                     68:             __gmp_const char *e, size_t elen,
                     69:             mpz_srcptr var[26])
                     70: {
                     71:   struct mpexpr_parse_t  p;
                     72:
                     73:   p.table = table;
                     74:   p.res = (mpX_ptr) res;
                     75:   p.base = base;
                     76:   p.e = e;
                     77:   p.elen = elen;
                     78:   p.var = (mpX_srcptr *) var;
                     79:
                     80:   p.mpX_clear       = (mpexpr_fun_one_t)      mpz_clear;
                     81:   p.mpX_ulong_p     = (mpexpr_fun_i_unary_t)  mpz_fits_ulong_p;
                     82:   p.mpX_get_ui      = (mpexpr_fun_get_ui_t)   mpz_get_ui;
                     83:   p.mpX_init        = (mpexpr_fun_unary_ui_t) mpz_init;
                     84:   p.mpX_number      = (mpexpr_fun_number_t)   mpexpr_mpz_number;
                     85:   p.mpX_set         = (mpexpr_fun_unary_t)    mpz_set;
                     86:   p.mpX_set_or_swap = (mpexpr_fun_unary_t)    mpz_swap;
                     87:   p.mpX_set_si      = (mpexpr_fun_set_si_t)   mpz_set_si;
                     88:   p.mpX_swap        = (mpexpr_fun_swap_t)     mpz_swap;
                     89:
                     90:   return mpexpr_evaluate (&p);
                     91: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>