Blame demos/expr/expr.h

Packit 5c3484
/* Header for expression evaluation.
Packit 5c3484
Packit 5c3484
Copyright 2000-2002, 2004 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library.
Packit 5c3484
Packit 5c3484
The GNU MP Library is free software; you can redistribute it and/or modify
Packit 5c3484
it under the terms of either:
Packit 5c3484
Packit 5c3484
  * the GNU Lesser General Public License as published by the Free
Packit 5c3484
    Software Foundation; either version 3 of the License, or (at your
Packit 5c3484
    option) any later version.
Packit 5c3484
Packit 5c3484
or
Packit 5c3484
Packit 5c3484
  * the GNU General Public License as published by the Free Software
Packit 5c3484
    Foundation; either version 2 of the License, or (at your option) any
Packit 5c3484
    later version.
Packit 5c3484
Packit 5c3484
or both in parallel, as here.
Packit 5c3484
Packit 5c3484
The GNU MP Library is distributed in the hope that it will be useful, but
Packit 5c3484
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 5c3484
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 5c3484
for more details.
Packit 5c3484
Packit 5c3484
You should have received copies of the GNU General Public License and the
Packit 5c3484
GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 5c3484
see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
Packit 5c3484
#ifndef __EXPR_H__
Packit 5c3484
#define __EXPR_H__
Packit 5c3484
Packit 5c3484
#define MPEXPR_RESULT_OK            0
Packit 5c3484
#define MPEXPR_RESULT_BAD_VARIABLE  1
Packit 5c3484
#define MPEXPR_RESULT_BAD_TABLE     2
Packit 5c3484
#define MPEXPR_RESULT_PARSE_ERROR   3
Packit 5c3484
#define MPEXPR_RESULT_NOT_UI        4
Packit 5c3484
Packit 5c3484
Packit 5c3484
/* basic types */
Packit 5c3484
#define MPEXPR_TYPE_NARY(n)       ((n) * 0x0100)
Packit 5c3484
#define MPEXPR_TYPE_MASK_ARGCOUNT MPEXPR_TYPE_NARY(0xF)
Packit 5c3484
#define MPEXPR_TYPE_0ARY          MPEXPR_TYPE_NARY(0)
Packit 5c3484
#define MPEXPR_TYPE_UNARY         MPEXPR_TYPE_NARY(1)
Packit 5c3484
#define MPEXPR_TYPE_BINARY        MPEXPR_TYPE_NARY(2)
Packit 5c3484
#define MPEXPR_TYPE_TERNARY       MPEXPR_TYPE_NARY(3)
Packit 5c3484
Packit 5c3484
/* options for all */
Packit 5c3484
#define MPEXPR_TYPE_LAST_UI       0x0010
Packit 5c3484
#define MPEXPR_TYPE_RESULT_INT    0x0020
Packit 5c3484
#define MPEXPR_TYPE_MASK_ARGSTYLE 0x0030
Packit 5c3484
Packit 5c3484
#define MPEXPR_TYPE_UNARY_UI     (MPEXPR_TYPE_UNARY   | MPEXPR_TYPE_LAST_UI)
Packit 5c3484
#define MPEXPR_TYPE_I_UNARY      (MPEXPR_TYPE_UNARY   | MPEXPR_TYPE_RESULT_INT)
Packit 5c3484
#define MPEXPR_TYPE_I_UNARY_UI   (MPEXPR_TYPE_I_UNARY | MPEXPR_TYPE_LAST_UI)
Packit 5c3484
#define MPEXPR_TYPE_BINARY_UI    (MPEXPR_TYPE_BINARY  | MPEXPR_TYPE_LAST_UI)
Packit 5c3484
#define MPEXPR_TYPE_I_BINARY     (MPEXPR_TYPE_BINARY  | MPEXPR_TYPE_RESULT_INT)
Packit 5c3484
#define MPEXPR_TYPE_I_BINARY_UI  (MPEXPR_TYPE_I_BINARY| MPEXPR_TYPE_LAST_UI)
Packit 5c3484
#define MPEXPR_TYPE_TERNARY_UI   (MPEXPR_TYPE_TERNARY | MPEXPR_TYPE_LAST_UI)
Packit 5c3484
#define MPEXPR_TYPE_I_TERNARY    (MPEXPR_TYPE_TERNARY | MPEXPR_TYPE_RESULT_INT)
Packit 5c3484
#define MPEXPR_TYPE_I_TERNARY_UI (MPEXPR_TYPE_I_TERNARY|MPEXPR_TYPE_LAST_UI)
Packit 5c3484
Packit 5c3484
/* 0ary with options */
Packit 5c3484
#define MPEXPR_TYPE_CONSTANT      (MPEXPR_TYPE_0ARY | 0x0040)
Packit 5c3484
Packit 5c3484
/* unary options */
Packit 5c3484
#define MPEXPR_TYPE_PREFIX        0x0040
Packit 5c3484
Packit 5c3484
/* binary options */
Packit 5c3484
#define MPEXPR_TYPE_RIGHTASSOC    0x0040
Packit 5c3484
#define MPEXPR_TYPE_PAIRWISE      0x0080
Packit 5c3484
Packit 5c3484
#define MPEXPR_TYPE_MASK_SPECIAL  0x000F
Packit 5c3484
Packit 5c3484
/* unary specials */
Packit 5c3484
#define MPEXPR_TYPE_NEW_TABLE     (MPEXPR_TYPE_UNARY | 0x001)
Packit 5c3484
#define MPEXPR_TYPE_DONE          (MPEXPR_TYPE_UNARY | 0x002)
Packit 5c3484
#define MPEXPR_TYPE_VARIABLE      (MPEXPR_TYPE_UNARY | 0x003)
Packit 5c3484
#define MPEXPR_TYPE_LOGICAL_NOT   (MPEXPR_TYPE_UNARY | 0x004)
Packit 5c3484
#define MPEXPR_TYPE_CLOSEPAREN    (MPEXPR_TYPE_UNARY | 0x005)
Packit 5c3484
#define MPEXPR_TYPE_OPENPAREN     (MPEXPR_TYPE_CLOSEPAREN | MPEXPR_TYPE_PREFIX)
Packit 5c3484
Packit 5c3484
/* binary specials */
Packit 5c3484
#define MPEXPR_TYPE_LOGICAL_AND   (MPEXPR_TYPE_BINARY | 0x001)
Packit 5c3484
#define MPEXPR_TYPE_LOGICAL_OR    (MPEXPR_TYPE_BINARY | 0x002)
Packit 5c3484
#define MPEXPR_TYPE_ARGSEP        (MPEXPR_TYPE_BINARY | 0x003)
Packit 5c3484
#define MPEXPR_TYPE_QUESTION      (MPEXPR_TYPE_BINARY | 0x004)
Packit 5c3484
#define MPEXPR_TYPE_COLON         (MPEXPR_TYPE_BINARY | 0x005)
Packit 5c3484
#define MPEXPR_TYPE_MAX           (MPEXPR_TYPE_BINARY | 0x006)
Packit 5c3484
#define MPEXPR_TYPE_MIN           (MPEXPR_TYPE_BINARY | 0x007)
Packit 5c3484
#define MPEXPR_TYPE_MASK_CMP      0x008
Packit 5c3484
#define MPEXPR_TYPE_MASK_CMP_LT   0x001
Packit 5c3484
#define MPEXPR_TYPE_MASK_CMP_EQ   0x002
Packit 5c3484
#define MPEXPR_TYPE_MASK_CMP_GT   0x004
Packit 5c3484
#define MPEXPR_TYPE_CMP_LT       (MPEXPR_TYPE_BINARY | MPEXPR_TYPE_MASK_CMP \
Packit 5c3484
				  | MPEXPR_TYPE_MASK_CMP_LT)
Packit 5c3484
#define MPEXPR_TYPE_CMP_EQ       (MPEXPR_TYPE_BINARY | MPEXPR_TYPE_MASK_CMP \
Packit 5c3484
				  | MPEXPR_TYPE_MASK_CMP_EQ)
Packit 5c3484
#define MPEXPR_TYPE_CMP_GT       (MPEXPR_TYPE_BINARY | MPEXPR_TYPE_MASK_CMP \
Packit 5c3484
				  | MPEXPR_TYPE_MASK_CMP_GT)
Packit 5c3484
#define MPEXPR_TYPE_CMP_LE       (MPEXPR_TYPE_CMP_LT | MPEXPR_TYPE_MASK_CMP_EQ)
Packit 5c3484
#define MPEXPR_TYPE_CMP_NE       (MPEXPR_TYPE_CMP_LT | MPEXPR_TYPE_MASK_CMP_GT)
Packit 5c3484
#define MPEXPR_TYPE_CMP_GE       (MPEXPR_TYPE_CMP_GT | MPEXPR_TYPE_MASK_CMP_EQ)
Packit 5c3484
Packit 5c3484
/* parse options */
Packit 5c3484
#define MPEXPR_TYPE_WHOLEWORD      0x1000
Packit 5c3484
#define MPEXPR_TYPE_OPERATOR       0x2000
Packit 5c3484
Packit 5c3484
Packit 5c3484
#ifdef __cplusplus
Packit 5c3484
extern "C" {
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
typedef void (*mpexpr_fun_t) (void);
Packit 5c3484
Packit 5c3484
struct mpexpr_operator_t {
Packit 5c3484
  const char   *name;
Packit 5c3484
  mpexpr_fun_t fun;
Packit 5c3484
  int          type;
Packit 5c3484
  int          precedence;
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
Packit 5c3484
int mpf_expr_a (const struct mpexpr_operator_t *, mpf_ptr, int,
Packit 5c3484
		unsigned long, const char *, size_t, mpf_srcptr [26]);
Packit 5c3484
int mpf_expr (mpf_ptr, int, const char *, ...);
Packit 5c3484
Packit 5c3484
int mpq_expr_a (const struct mpexpr_operator_t *, mpq_ptr,
Packit 5c3484
		int, const char *, size_t, mpq_srcptr [26]);
Packit 5c3484
int mpq_expr (mpq_ptr, int, const char *, ...);
Packit 5c3484
Packit 5c3484
int mpz_expr_a (const struct mpexpr_operator_t *, mpz_ptr, int,
Packit 5c3484
		const char *, size_t, mpz_srcptr [26]);
Packit 5c3484
int mpz_expr (mpz_ptr, int, const char *, ...);
Packit 5c3484
Packit 5c3484
#ifdef __cplusplus
Packit 5c3484
} /* extern "C" */
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#endif