diff options
Diffstat (limited to 'tests/read_line.c')
-rw-r--r-- | tests/read_line.c | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/tests/read_line.c b/tests/read_line.c new file mode 100644 index 0000000..3fb29c5 --- /dev/null +++ b/tests/read_line.c @@ -0,0 +1,242 @@ +/* read_line.c -- Read line of test data in file. + +Copyright (C) 2012, 2013 INRIA + +This file is part of GNU MPC. + +GNU MPC is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program. If not, see http://www.gnu.org/licenses/ . +*/ + +#include "mpc-tests.h" + +static void +read_param (mpc_datafile_context_t* datafile_context, + mpc_operand_t* p, mpc_param_t t) +{ + switch (t) + { + case NATIVE_INT: + tpl_read_int (datafile_context, &(p->i),""); + return; + case NATIVE_UL: + tpl_read_ui (datafile_context, &(p->ui)); + return; + case NATIVE_L: + tpl_read_si (datafile_context, &(p->si)); + return; + + case NATIVE_D: + case NATIVE_LD: + /* TODO */ + fprintf (stderr, "read_param: type not implemented.\n"); + exit (1); + break; + + case NATIVE_DC: + case NATIVE_LDC: +#ifdef _Complex_I + /* TODO */ + fprintf (stderr, "read_param: type not implemented.\n"); + exit (1); +#endif + break; + + case NATIVE_IM: + case NATIVE_UIM: +#ifdef _MPC_H_HAVE_INTMAX_T + /* TODO */ + fprintf (stderr, "read_param: type not implemented.\n"); + exit (1); +#endif + break; + + case NATIVE_STRING: + /* TODO */ + fprintf (stderr, "read_param: type not implemented.\n"); + exit (1); + break; + + case GMP_Z: + tpl_read_mpz (datafile_context, p->mpz); + return; + + case GMP_Q: + case GMP_F: + /* TODO */ + fprintf (stderr, "read_param: type not implemented.\n"); + exit (1); + break; + + case MPFR_INEX: + tpl_read_mpfr_inex (datafile_context, &p->mpfr_inex); + return; + case MPFR: + tpl_read_mpfr (datafile_context, + p->mpfr_data.mpfr, &p->mpfr_data.known_sign); + return; + case MPFR_RND: + tpl_read_mpfr_rnd (datafile_context, &p->mpfr_rnd); + return; + + case MPC_INEX: + tpl_read_mpc_inex (datafile_context, &p->mpc_inex_data); + return; + case MPC: + tpl_read_mpc (datafile_context, &p->mpc_data); + return; + case MPC_RND: + tpl_read_mpc_rnd (datafile_context, &p->mpc_rnd); + return; + } + + fprintf (stderr, "read_param: unsupported type.\n"); + exit (1); +} + +static void +set_precision (mpc_fun_param_t* params, int index) +{ + /* set output precision to reference precision */ + int index_ref = index + params->nbout + params->nbin; + + switch (params->T[index]) + { + case MPFR: + mpfr_set_prec (params->P[index].mpfr, + mpfr_get_prec (params->P[index_ref].mpfr)); + return; + + case MPC: + mpfr_set_prec (mpc_realref (params->P[index].mpc), + MPC_PREC_RE (params->P[index_ref].mpc)); + mpfr_set_prec (mpc_imagref (params->P[index].mpc), + MPC_PREC_IM (params->P[index_ref].mpc)); + return; + + case NATIVE_INT: + case NATIVE_UL: case NATIVE_L: + case NATIVE_D: case NATIVE_LD: + case NATIVE_DC: case NATIVE_LDC: + case NATIVE_IM: case NATIVE_UIM: + case NATIVE_STRING: + case GMP_Z: case GMP_Q: + case GMP_F: + case MPFR_INEX: case MPFR_RND: + case MPC_INEX: case MPC_RND: + /* unsupported types */ + break; + } + + fprintf (stderr, "set_precision: unsupported type.\n"); + exit (1); +} + +void +read_line (mpc_datafile_context_t* datafile_context, + mpc_fun_param_t* params) +{ + int in, out; + int total = params->nbout + params->nbin; + + datafile_context->test_line_number = datafile_context->line_number; + + for (out = 0; out < params->nbout; out++) + + { + read_param (datafile_context, &(params->P[total + out]), + params->T[total + out]); + if (params->T[out] == MPFR || params->T[out] == MPC) + set_precision (params, out); + } + + for (in = params->nbout; in < total; in++) + { + read_param (datafile_context, &(params->P[in]), params->T[in]); + } +} + +/* read primitives */ +static void +tpl_skip_line (mpc_datafile_context_t* datafile_context) + /* skips characters until reaching '\n' or EOF; */ + /* '\n' is skipped as well */ +{ + while (datafile_context->nextchar != EOF && datafile_context->nextchar != '\n') + datafile_context->nextchar = getc (datafile_context->fd); + if (datafile_context->nextchar != EOF) + { + datafile_context->line_number ++; + datafile_context->nextchar = getc (datafile_context->fd); + } +} + +static void +tpl_skip_whitespace (mpc_datafile_context_t* datafile_context) + /* skips over whitespace if any until reaching EOF */ + /* or non-whitespace */ +{ + while (isspace (datafile_context->nextchar)) + { + if (datafile_context->nextchar == '\n') + datafile_context->line_number ++; + datafile_context->nextchar = getc (datafile_context->fd); + } +} + +void +tpl_skip_whitespace_comments (mpc_datafile_context_t* datafile_context) + /* skips over all whitespace and comments, if any */ +{ + tpl_skip_whitespace (datafile_context); + while (datafile_context->nextchar == '#') { + tpl_skip_line (datafile_context); + if (datafile_context->nextchar != EOF) + tpl_skip_whitespace (datafile_context); + } +} + +/* All following read routines skip over whitespace and comments; */ +/* so after calling them, nextchar is either EOF or the beginning */ +/* of a non-comment token. */ +void +tpl_read_ternary (mpc_datafile_context_t* datafile_context, int* ternary) +{ + switch (datafile_context->nextchar) + { + case '!': + *ternary = TERNARY_ERROR; + break; + case '?': + *ternary = TERNARY_NOT_CHECKED; + break; + case '+': + *ternary = +1; + break; + case '0': + *ternary = 0; + break; + case '-': + *ternary = -1; + break; + default: + printf ("Error: Unexpected ternary value '%c' in file '%s' line %lu\n", + datafile_context->nextchar, + datafile_context->pathname, + datafile_context->line_number); + exit (1); + } + + datafile_context->nextchar = getc (datafile_context->fd); + tpl_skip_whitespace_comments (datafile_context); +} |