Blame src/strtoc.c

Packit Service 2e9770
/* mpc_strtoc -- Read a complex number from a string.
Packit Service 2e9770
Packit Service 2e9770
Copyright (C) 2009, 2010, 2011, 2012 INRIA
Packit Service 2e9770
Packit Service 2e9770
This file is part of GNU MPC.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is free software; you can redistribute it and/or modify it under
Packit Service 2e9770
the terms of the GNU Lesser General Public License as published by the
Packit Service 2e9770
Free Software Foundation; either version 3 of the License, or (at your
Packit Service 2e9770
option) any later version.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service 2e9770
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service 2e9770
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
Packit Service 2e9770
more details.
Packit Service 2e9770
Packit Service 2e9770
You should have received a copy of the GNU Lesser General Public License
Packit Service 2e9770
along with this program. If not, see http://www.gnu.org/licenses/ .
Packit Service 2e9770
*/
Packit Service 2e9770
Packit Service 2e9770
#include <string.h>
Packit Service 2e9770
#include <ctype.h>
Packit Service 2e9770
#include "mpc-impl.h"
Packit Service 2e9770
Packit Service 2e9770
static void
Packit Service 2e9770
skip_whitespace (const char **p)
Packit Service 2e9770
{
Packit Service 2e9770
   /* TODO: This function had better be inlined, but it is unclear whether
Packit Service 2e9770
      the hassle to get this implemented across all platforms is worth it. */
Packit Service 2e9770
   while (isspace ((unsigned char) **p))
Packit Service 2e9770
      (*p)++;
Packit Service 2e9770
}
Packit Service 2e9770
Packit Service 2e9770
int
Packit Service 2e9770
mpc_strtoc (mpc_ptr rop, const char *nptr, char **endptr, int base, mpc_rnd_t rnd)
Packit Service 2e9770
{
Packit Service 2e9770
   const char *p;
Packit Service 2e9770
   char *end;
Packit Service 2e9770
   int bracketed = 0;
Packit Service 2e9770
Packit Service 2e9770
   int inex_re = 0, inex_im = 0;
Packit Service 2e9770
Packit Service 2e9770
   if (nptr == NULL || base > 36 || base == 1)
Packit Service 2e9770
     goto error;
Packit Service 2e9770
Packit Service 2e9770
   p = nptr;
Packit Service 2e9770
   skip_whitespace (&p);
Packit Service 2e9770
Packit Service 2e9770
   if (*p == '('){
Packit Service 2e9770
      bracketed = 1;
Packit Service 2e9770
      ++p;
Packit Service 2e9770
   }
Packit Service 2e9770
Packit Service 2e9770
   inex_re = mpfr_strtofr (mpc_realref(rop), p, &end, base, MPC_RND_RE (rnd));
Packit Service 2e9770
   if (end == p)
Packit Service 2e9770
      goto error;
Packit Service 2e9770
   p = end;
Packit Service 2e9770
Packit Service 2e9770
   if (!bracketed)
Packit Service 2e9770
     inex_im = mpfr_set_ui (mpc_imagref (rop), 0ul, MPFR_RNDN);
Packit Service 2e9770
   else {
Packit Service 2e9770
     if (!isspace ((unsigned char)*p))
Packit Service 2e9770
         goto error;
Packit Service 2e9770
Packit Service 2e9770
      skip_whitespace (&p);
Packit Service 2e9770
Packit Service 2e9770
      inex_im = mpfr_strtofr (mpc_imagref(rop), p, &end, base, MPC_RND_IM (rnd));
Packit Service 2e9770
      if (end == p)
Packit Service 2e9770
         goto error;
Packit Service 2e9770
      p = end;
Packit Service 2e9770
Packit Service 2e9770
      skip_whitespace (&p);
Packit Service 2e9770
      if (*p != ')')
Packit Service 2e9770
         goto error;
Packit Service 2e9770
Packit Service 2e9770
      p++;
Packit Service 2e9770
   }
Packit Service 2e9770
Packit Service 2e9770
   if (endptr != NULL)
Packit Service 2e9770
     *endptr = (char*) p;
Packit Service 2e9770
   return MPC_INEX (inex_re, inex_im);
Packit Service 2e9770
Packit Service 2e9770
error:
Packit Service 2e9770
   if (endptr != NULL)
Packit Service 2e9770
     *endptr = (char*) nptr;
Packit Service 2e9770
   mpfr_set_nan (mpc_realref (rop));
Packit Service 2e9770
   mpfr_set_nan (mpc_imagref (rop));
Packit Service 2e9770
   return -1;
Packit Service 2e9770
}