summaryrefslogtreecommitdiff
path: root/tests/read_line.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/read_line.c')
-rw-r--r--tests/read_line.c242
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);
+}