xref: /netbsd-src/external/lgpl3/mpc/dist/tests/read_line.c (revision 39f28e1e142c5bfb6be935a49cb55e2287fec7ea)
1*39f28e1eSmrg /* read_line.c -- Read line of test data in file.
2*39f28e1eSmrg 
3*39f28e1eSmrg Copyright (C) 2012, 2013, 2014 INRIA
4*39f28e1eSmrg 
5*39f28e1eSmrg This file is part of GNU MPC.
6*39f28e1eSmrg 
7*39f28e1eSmrg GNU MPC is free software; you can redistribute it and/or modify it under
8*39f28e1eSmrg the terms of the GNU Lesser General Public License as published by the
9*39f28e1eSmrg Free Software Foundation; either version 3 of the License, or (at your
10*39f28e1eSmrg option) any later version.
11*39f28e1eSmrg 
12*39f28e1eSmrg GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
13*39f28e1eSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14*39f28e1eSmrg FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
15*39f28e1eSmrg more details.
16*39f28e1eSmrg 
17*39f28e1eSmrg You should have received a copy of the GNU Lesser General Public License
18*39f28e1eSmrg along with this program. If not, see http://www.gnu.org/licenses/ .
19*39f28e1eSmrg */
20*39f28e1eSmrg 
21*39f28e1eSmrg #include "mpc-tests.h"
22*39f28e1eSmrg 
23*39f28e1eSmrg static void
read_param(mpc_datafile_context_t * datafile_context,mpc_operand_t * p,mpc_param_t t)24*39f28e1eSmrg read_param  (mpc_datafile_context_t* datafile_context,
25*39f28e1eSmrg              mpc_operand_t* p, mpc_param_t t)
26*39f28e1eSmrg {
27*39f28e1eSmrg   switch (t)
28*39f28e1eSmrg     {
29*39f28e1eSmrg     case NATIVE_INT:
30*39f28e1eSmrg       tpl_read_int (datafile_context, &(p->i),"");
31*39f28e1eSmrg       return;
32*39f28e1eSmrg     case NATIVE_UL:
33*39f28e1eSmrg       tpl_read_ui (datafile_context, &(p->ui));
34*39f28e1eSmrg       return;
35*39f28e1eSmrg     case NATIVE_L:
36*39f28e1eSmrg       tpl_read_si (datafile_context, &(p->si));
37*39f28e1eSmrg       return;
38*39f28e1eSmrg 
39*39f28e1eSmrg     case NATIVE_D:
40*39f28e1eSmrg     case NATIVE_LD:
41*39f28e1eSmrg       /* TODO */
42*39f28e1eSmrg       fprintf (stderr, "read_param: type not implemented.\n");
43*39f28e1eSmrg       exit (1);
44*39f28e1eSmrg       break;
45*39f28e1eSmrg 
46*39f28e1eSmrg     case NATIVE_DC:
47*39f28e1eSmrg     case NATIVE_LDC:
48*39f28e1eSmrg #ifdef _Complex_I
49*39f28e1eSmrg       /* TODO */
50*39f28e1eSmrg       fprintf (stderr, "read_param: type not implemented.\n");
51*39f28e1eSmrg       exit (1);
52*39f28e1eSmrg #endif
53*39f28e1eSmrg       break;
54*39f28e1eSmrg 
55*39f28e1eSmrg     case NATIVE_IM:
56*39f28e1eSmrg     case NATIVE_UIM:
57*39f28e1eSmrg #ifdef _MPC_H_HAVE_INTMAX_T
58*39f28e1eSmrg       /* TODO */
59*39f28e1eSmrg       fprintf (stderr, "read_param: type not implemented.\n");
60*39f28e1eSmrg       exit (1);
61*39f28e1eSmrg #endif
62*39f28e1eSmrg       break;
63*39f28e1eSmrg 
64*39f28e1eSmrg     case NATIVE_STRING:
65*39f28e1eSmrg       /* TODO */
66*39f28e1eSmrg       fprintf (stderr, "read_param: type not implemented.\n");
67*39f28e1eSmrg       exit (1);
68*39f28e1eSmrg       break;
69*39f28e1eSmrg 
70*39f28e1eSmrg     case GMP_Z:
71*39f28e1eSmrg       tpl_read_mpz (datafile_context, p->mpz);
72*39f28e1eSmrg       return;
73*39f28e1eSmrg 
74*39f28e1eSmrg     case GMP_Q:
75*39f28e1eSmrg     case GMP_F:
76*39f28e1eSmrg       /* TODO */
77*39f28e1eSmrg       fprintf (stderr, "read_param: type not implemented.\n");
78*39f28e1eSmrg       exit (1);
79*39f28e1eSmrg       break;
80*39f28e1eSmrg 
81*39f28e1eSmrg     case MPFR_INEX:
82*39f28e1eSmrg       tpl_read_mpfr_inex (datafile_context, &p->mpfr_inex);
83*39f28e1eSmrg       return;
84*39f28e1eSmrg     case MPFR:
85*39f28e1eSmrg       tpl_read_mpfr (datafile_context,
86*39f28e1eSmrg                      p->mpfr_data.mpfr, &p->mpfr_data.known_sign);
87*39f28e1eSmrg       return;
88*39f28e1eSmrg     case MPFR_RND:
89*39f28e1eSmrg       tpl_read_mpfr_rnd (datafile_context, &p->mpfr_rnd);
90*39f28e1eSmrg       return;
91*39f28e1eSmrg 
92*39f28e1eSmrg     case MPC_INEX:
93*39f28e1eSmrg       tpl_read_mpc_inex (datafile_context, &p->mpc_inex_data);
94*39f28e1eSmrg       return;
95*39f28e1eSmrg     case MPC:
96*39f28e1eSmrg       tpl_read_mpc (datafile_context, &p->mpc_data);
97*39f28e1eSmrg       return;
98*39f28e1eSmrg     case MPC_RND:
99*39f28e1eSmrg       tpl_read_mpc_rnd (datafile_context, &p->mpc_rnd);
100*39f28e1eSmrg       return;
101*39f28e1eSmrg 
102*39f28e1eSmrg     case MPCC_INEX:
103*39f28e1eSmrg       /* TODO */
104*39f28e1eSmrg       fprintf (stderr, "read_param: type not implemented.\n");
105*39f28e1eSmrg       exit (1);
106*39f28e1eSmrg       break;
107*39f28e1eSmrg     }
108*39f28e1eSmrg 
109*39f28e1eSmrg   fprintf (stderr, "read_param: unsupported type.\n");
110*39f28e1eSmrg   exit (1);
111*39f28e1eSmrg }
112*39f28e1eSmrg 
113*39f28e1eSmrg static void
set_precision(mpc_fun_param_t * params,int index)114*39f28e1eSmrg set_precision (mpc_fun_param_t* params, int index)
115*39f28e1eSmrg {
116*39f28e1eSmrg   /* set output precision to reference precision */
117*39f28e1eSmrg   int index_ref = index + params->nbout + params->nbin;
118*39f28e1eSmrg 
119*39f28e1eSmrg   switch (params->T[index])
120*39f28e1eSmrg     {
121*39f28e1eSmrg     case MPFR:
122*39f28e1eSmrg       mpfr_set_prec (params->P[index].mpfr,
123*39f28e1eSmrg                      mpfr_get_prec (params->P[index_ref].mpfr));
124*39f28e1eSmrg       return;
125*39f28e1eSmrg 
126*39f28e1eSmrg     case MPC:
127*39f28e1eSmrg       mpfr_set_prec (mpc_realref (params->P[index].mpc),
128*39f28e1eSmrg                      MPC_PREC_RE (params->P[index_ref].mpc));
129*39f28e1eSmrg       mpfr_set_prec (mpc_imagref (params->P[index].mpc),
130*39f28e1eSmrg                      MPC_PREC_IM (params->P[index_ref].mpc));
131*39f28e1eSmrg       return;
132*39f28e1eSmrg 
133*39f28e1eSmrg     case NATIVE_INT:
134*39f28e1eSmrg     case NATIVE_UL:    case NATIVE_L:
135*39f28e1eSmrg     case NATIVE_D:     case NATIVE_LD:
136*39f28e1eSmrg     case NATIVE_DC:    case NATIVE_LDC:
137*39f28e1eSmrg     case NATIVE_IM:    case NATIVE_UIM:
138*39f28e1eSmrg     case NATIVE_STRING:
139*39f28e1eSmrg     case GMP_Z:        case GMP_Q:
140*39f28e1eSmrg     case GMP_F:
141*39f28e1eSmrg     case MPFR_INEX:    case MPFR_RND:
142*39f28e1eSmrg     case MPC_INEX:     case MPC_RND:
143*39f28e1eSmrg     case MPCC_INEX:
144*39f28e1eSmrg       /* unsupported types */
145*39f28e1eSmrg       break;
146*39f28e1eSmrg     }
147*39f28e1eSmrg 
148*39f28e1eSmrg   fprintf (stderr, "set_precision: unsupported type.\n");
149*39f28e1eSmrg   exit (1);
150*39f28e1eSmrg }
151*39f28e1eSmrg 
152*39f28e1eSmrg void
read_line(mpc_datafile_context_t * datafile_context,mpc_fun_param_t * params)153*39f28e1eSmrg read_line (mpc_datafile_context_t* datafile_context,
154*39f28e1eSmrg            mpc_fun_param_t* params)
155*39f28e1eSmrg {
156*39f28e1eSmrg   int in, out;
157*39f28e1eSmrg   int total = params->nbout + params->nbin;
158*39f28e1eSmrg 
159*39f28e1eSmrg   datafile_context->test_line_number = datafile_context->line_number;
160*39f28e1eSmrg 
161*39f28e1eSmrg   for (out = 0; out < params->nbout; out++)
162*39f28e1eSmrg 
163*39f28e1eSmrg     {
164*39f28e1eSmrg       read_param (datafile_context, &(params->P[total + out]),
165*39f28e1eSmrg                   params->T[total + out]);
166*39f28e1eSmrg       if (params->T[out] == MPFR || params->T[out] == MPC)
167*39f28e1eSmrg         set_precision (params, out);
168*39f28e1eSmrg     }
169*39f28e1eSmrg 
170*39f28e1eSmrg   for (in = params->nbout; in < total; in++)
171*39f28e1eSmrg     {
172*39f28e1eSmrg       read_param (datafile_context, &(params->P[in]), params->T[in]);
173*39f28e1eSmrg     }
174*39f28e1eSmrg }
175*39f28e1eSmrg 
176*39f28e1eSmrg /* read primitives */
177*39f28e1eSmrg static void
tpl_skip_line(mpc_datafile_context_t * datafile_context)178*39f28e1eSmrg tpl_skip_line (mpc_datafile_context_t* datafile_context)
179*39f28e1eSmrg    /* skips characters until reaching '\n' or EOF; */
180*39f28e1eSmrg    /* '\n' is skipped as well                      */
181*39f28e1eSmrg {
182*39f28e1eSmrg    while (datafile_context->nextchar != EOF && datafile_context->nextchar != '\n')
183*39f28e1eSmrg      datafile_context->nextchar = getc (datafile_context->fd);
184*39f28e1eSmrg    if (datafile_context->nextchar != EOF)
185*39f28e1eSmrg      {
186*39f28e1eSmrg        datafile_context->line_number ++;
187*39f28e1eSmrg        datafile_context->nextchar = getc (datafile_context->fd);
188*39f28e1eSmrg      }
189*39f28e1eSmrg }
190*39f28e1eSmrg 
191*39f28e1eSmrg static void
tpl_skip_whitespace(mpc_datafile_context_t * datafile_context)192*39f28e1eSmrg tpl_skip_whitespace (mpc_datafile_context_t* datafile_context)
193*39f28e1eSmrg    /* skips over whitespace if any until reaching EOF */
194*39f28e1eSmrg    /* or non-whitespace                               */
195*39f28e1eSmrg {
196*39f28e1eSmrg    while (isspace (datafile_context->nextchar))
197*39f28e1eSmrg      {
198*39f28e1eSmrg        if (datafile_context->nextchar == '\n')
199*39f28e1eSmrg          datafile_context->line_number ++;
200*39f28e1eSmrg        datafile_context->nextchar = getc (datafile_context->fd);
201*39f28e1eSmrg      }
202*39f28e1eSmrg }
203*39f28e1eSmrg 
204*39f28e1eSmrg void
tpl_skip_whitespace_comments(mpc_datafile_context_t * datafile_context)205*39f28e1eSmrg tpl_skip_whitespace_comments (mpc_datafile_context_t* datafile_context)
206*39f28e1eSmrg    /* skips over all whitespace and comments, if any */
207*39f28e1eSmrg {
208*39f28e1eSmrg    tpl_skip_whitespace (datafile_context);
209*39f28e1eSmrg    while (datafile_context->nextchar == '#') {
210*39f28e1eSmrg       tpl_skip_line (datafile_context);
211*39f28e1eSmrg       if (datafile_context->nextchar != EOF)
212*39f28e1eSmrg          tpl_skip_whitespace (datafile_context);
213*39f28e1eSmrg    }
214*39f28e1eSmrg }
215*39f28e1eSmrg 
216*39f28e1eSmrg /* All following read routines skip over whitespace and comments; */
217*39f28e1eSmrg /* so after calling them, nextchar is either EOF or the beginning */
218*39f28e1eSmrg /* of a non-comment token.                                        */
219*39f28e1eSmrg void
tpl_read_ternary(mpc_datafile_context_t * datafile_context,int * ternary)220*39f28e1eSmrg tpl_read_ternary (mpc_datafile_context_t* datafile_context, int* ternary)
221*39f28e1eSmrg {
222*39f28e1eSmrg   switch (datafile_context->nextchar)
223*39f28e1eSmrg     {
224*39f28e1eSmrg     case '!':
225*39f28e1eSmrg       *ternary = TERNARY_ERROR;
226*39f28e1eSmrg       break;
227*39f28e1eSmrg     case '?':
228*39f28e1eSmrg       *ternary = TERNARY_NOT_CHECKED;
229*39f28e1eSmrg       break;
230*39f28e1eSmrg     case '+':
231*39f28e1eSmrg       *ternary = +1;
232*39f28e1eSmrg       break;
233*39f28e1eSmrg     case '0':
234*39f28e1eSmrg       *ternary = 0;
235*39f28e1eSmrg       break;
236*39f28e1eSmrg     case '-':
237*39f28e1eSmrg       *ternary = -1;
238*39f28e1eSmrg       break;
239*39f28e1eSmrg     default:
240*39f28e1eSmrg       printf ("Error: Unexpected ternary value '%c' in file '%s' line %lu\n",
241*39f28e1eSmrg               datafile_context->nextchar,
242*39f28e1eSmrg               datafile_context->pathname,
243*39f28e1eSmrg               datafile_context->line_number);
244*39f28e1eSmrg       exit (1);
245*39f28e1eSmrg     }
246*39f28e1eSmrg 
247*39f28e1eSmrg   datafile_context->nextchar = getc (datafile_context->fd);
248*39f28e1eSmrg   tpl_skip_whitespace_comments (datafile_context);
249*39f28e1eSmrg }
250