facf0c92e0
Red Bear OS is a full fork. All sources must be available from git clone with zero network access. Removed gitignore rules that excluded fetched source trees under recipes/*/source/, local/recipes/kde/*/source/, local/recipes/qt/*/source/, and vendor source trees. Build artifacts (target/, build/, source.tar, *.o, *.so) remain excluded. 127291 files added — kernel, relibc, base, bootloader, pkgar, all KDE/Qt frameworks, mesa, wayland, DRM drivers, and every other recipe source.
250 lines
6.6 KiB
C
250 lines
6.6 KiB
C
/* read_line.c -- Read line of test data in file.
|
|
|
|
Copyright (C) 2012, 2013, 2014 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;
|
|
|
|
case MPCC_INEX:
|
|
/* TODO */
|
|
fprintf (stderr, "read_param: type not implemented.\n");
|
|
exit (1);
|
|
break;
|
|
}
|
|
|
|
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:
|
|
case MPCC_INEX:
|
|
/* 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);
|
|
}
|