mpfr_prec_t read_mpfr_prec (FILE *fp) { unsigned long prec; int n; if (nextchar == EOF) { printf ("Error: Unexpected EOF when reading mpfr precision " "in file '%s' line %lu\n", pathname, line_number); exit (1); } ungetc (nextchar, fp); n = fscanf (fp, "%lu", &prec); if (ferror (fp)) /* then also n == EOF */ perror ("Error when reading mpfr precision"); if (n == 0 || n == EOF || prec < MPFR_PREC_MIN || prec > MPFR_PREC_MAX) { printf ("Error: Impossible mpfr precision in file '%s' line %lu\n", pathname, line_number); exit (1); } nextchar = getc (fp); skip_whitespace_comments (fp); return (mpfr_prec_t) prec; }
void read_mpfr_rounding_mode (FILE *fp, mpfr_rnd_t* rnd) { switch (nextchar) { case 'n': case 'N': *rnd = MPFR_RNDN; break; case 'z': case 'Z': *rnd = MPFR_RNDZ; break; case 'u': case 'U': *rnd = MPFR_RNDU; break; case 'd': case 'D': *rnd = MPFR_RNDD; break; default: printf ("Error: Unexpected rounding mode '%c' in file '%s' line %lu\n", nextchar, pathname, line_number); exit (1); } nextchar = getc (fp); if (nextchar != EOF && !isspace (nextchar)) { printf ("Error: Rounding mode not followed by white space in file " "'%s' line %lu\n", pathname, line_number); exit (1); } skip_whitespace_comments (fp); }
/* of a non-comment token. */ void read_ternary (FILE *fp, int* ternary) { switch (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", nextchar, pathname, line_number); exit (1); } nextchar = getc (fp); skip_whitespace_comments (fp); }
size_t read_string (FILE *fp, char **buffer_ptr, size_t buffer_length, const char *name) { size_t pos; char *buffer; pos = 0; buffer = *buffer_ptr; if (nextchar == '"') nextchar = getc (fp); else goto error; while (nextchar != EOF && nextchar != '"') { if (nextchar == '\n') line_number ++; if (pos + 1 > buffer_length) { buffer = (char *) realloc (buffer, 2 * buffer_length); if (buffer == NULL) { printf ("Cannot allocate memory\n"); exit (1); } buffer_length *= 2; } buffer[pos++] = (char) nextchar; nextchar = getc (fp); } if (nextchar != '"') goto error; if (pos + 1 > buffer_length) { buffer = (char *) realloc (buffer, buffer_length + 1); if (buffer == NULL) { printf ("Cannot allocate memory\n"); exit (1); } buffer_length *= 2; } buffer[pos] = '\0'; nextchar = getc (fp); skip_whitespace_comments (fp); *buffer_ptr = buffer; return buffer_length; error: printf ("Error: Unable to read %s in file '%s' line '%lu'\n", name, pathname, line_number); exit (1); }
static void read_mpfr_mantissa (FILE *fp, mpfr_ptr x) { if (nextchar == EOF) { printf ("Error: Unexpected EOF when reading mpfr mantissa " "in file '%s' line %lu\n", pathname, line_number); exit (1); } ungetc (nextchar, fp); if (mpfr_inp_str (x, fp, 0, MPFR_RNDN) == 0) { printf ("Error: Impossible to read mpfr mantissa " "in file '%s' line %lu\n", pathname, line_number); exit (1); } nextchar = getc (fp); skip_whitespace_comments (fp); }
void read_int (FILE *fp, int *nread, const char *name) { int n = 0; if (nextchar == EOF) { printf ("Error: Unexpected EOF when reading int " "in file '%s' line %lu\n", pathname, line_number); exit (1); } ungetc (nextchar, fp); n = fscanf (fp, "%i", nread); if (ferror (fp) || n == 0 || n == EOF) { printf ("Error: Cannot read %s in file '%s' line %lu\n", name, pathname, line_number); exit (1); } nextchar = getc (fp); skip_whitespace_comments (fp); }
static void check_file (const char* file_name) { FILE *fp; int tmp; int base; int inex_re; int inex_im; mpc_t expected, got; mpc_rnd_t rnd = MPC_RNDNN; int inex = 0, expected_inex; size_t expected_size, size; known_signs_t ks = {1, 1}; fp = open_data_file (file_name); mpc_init2 (expected, 53); mpc_init2 (got, 53); /* read data file */ line_number = 1; nextchar = getc (fp); skip_whitespace_comments (fp); while (nextchar != EOF) { /* 1. read a line of data: expected result, base, rounding mode */ read_ternary (fp, &inex_re); read_ternary (fp, &inex_im); read_mpc (fp, expected, &ks); if (inex_re == TERNARY_ERROR || inex_im == TERNARY_ERROR) expected_inex = -1; else expected_inex = MPC_INEX (inex_re, inex_im); read_int (fp, &tmp, "size"); expected_size = (size_t)tmp; read_int (fp, &base, "base"); read_mpc_rounding_mode (fp, &rnd); /* 2. read string at the same precision as the expected result */ while (nextchar != '"') nextchar = getc (fp); mpfr_set_prec (MPC_RE (got), MPC_PREC_RE (expected)); mpfr_set_prec (MPC_IM (got), MPC_PREC_IM (expected)); inex = mpc_inp_str (got, fp, &size, base, rnd); /* 3. compare this result with the expected one */ if (inex != expected_inex || !same_mpc_value (got, expected, ks) || size != expected_size) { printf ("mpc_inp_str failed (line %lu) with rounding mode %s\n", line_number, rnd_mode[rnd]); if (inex != expected_inex) printf(" got inexact value: %d\nexpected inexact value: %d\n", inex, expected_inex); if (size != expected_size) printf (" got size: %lu\nexpected size: %lu\n ", (unsigned long int) size, (unsigned long int) expected_size); printf (" "); OUT (got); OUT (expected); exit (1); } while ((nextchar = getc (fp)) != '"'); nextchar = getc (fp); skip_whitespace_comments (fp); } mpc_clear (expected); mpc_clear (got); close_data_file (fp); }