diff options
author | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-03-19 17:29:27 +0000 |
---|---|---|
committer | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-03-19 17:29:27 +0000 |
commit | 32d1a5f3854f6705982545a17694ae4e33a902ca (patch) | |
tree | 6fbe257da0df8a362152a0bab5495b56c75a2ee6 | |
parent | 4c14321905768e1a782384c38c49a9c66e3c1308 (diff) | |
download | mpc-32d1a5f3854f6705982545a17694ae4e33a902ca.tar.gz |
inp_str: now without calling mpfr_inp_str
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@484 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r-- | src/inp_str.c | 62 |
1 files changed, 30 insertions, 32 deletions
diff --git a/src/inp_str.c b/src/inp_str.c index 1b25fa0..5986bce 100644 --- a/src/inp_str.c +++ b/src/inp_str.c @@ -66,51 +66,49 @@ mpc_free_str_len (char *str, size_t len) { size_t mpc_inp_str (mpc_ptr rop, FILE *stream, int base, mpc_rnd_t rnd_mode) { - size_t size, nread; + size_t white, nread; int c; + int par = 0; if (stream == NULL) stream = stdin; - size = skip_whitespace (stream); + white = skip_whitespace (stream); c = getc (stream); if (c != EOF) { - if (c != '(') { - /* real number without parentheses */ - ungetc (c, stream); - nread = mpfr_inp_str (MPC_RE(rop), stream, base, MPC_RND_RE(rnd_mode)); - if (nread != 0) { - size += nread; - mpfr_set_ui (MPC_IM(rop), 0ul, GMP_RNDN); - return size; + /* If c=='(', set par=true and read everything up to ')'; otherwise, + par=false already and read everything up to white space. + Then have mpc_setstr do the work. */ + size_t strsize = 100; + char *str = mpc_alloc_str (strsize); + nread = 0; + if (c == '(') + par = 1; + while (c != EOF && + ((par && c != ')') || (!par && !isspace ((unsigned char) c)))) { + str [nread] = (char) c; + nread++; + if (nread == strsize) { + str = mpc_realloc_str (str, strsize, 2 * strsize); + strsize *= 2; } + c = getc (stream); } - else { - /* Complex number in parentheses; read everything from '(' to ')' - into a string and have mpc_setstr do the work */ - size_t strsize = 100; - char *str = mpc_alloc_str (strsize); - nread = 0; - while (c != EOF && c != ')') { - str [nread] = (char) c; - nread++; - if (nread == strsize) { - str = mpc_realloc_str (str, strsize, 2 * strsize); - strsize *= 2; - } - c = getc (stream); - } - if (c != EOF) { + if (c != EOF) { + if (par) { str [nread] = ')'; nread++; - str = mpc_realloc_str (str, strsize, nread + 1); - str [nread] = '\0'; - size += nread; - if (mpc_set_str (rop, str, base, rnd_mode) != -1) - return size; } - mpc_free_str_len (str, strsize); + else /* put whitespace back into stream */ + ungetc (c, stream); + str = mpc_realloc_str (str, strsize, nread + 1); + str [nread] = '\0'; + if (mpc_set_str (rop, str, base, rnd_mode) != -1) { + mpc_free_str_len (str, strsize); + return white + nread; + } } + mpc_free_str_len (str, strsize); } mpfr_set_nan (MPC_RE(rop)); |