summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2009-03-19 17:29:27 +0000
committerenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2009-03-19 17:29:27 +0000
commit32d1a5f3854f6705982545a17694ae4e33a902ca (patch)
tree6fbe257da0df8a362152a0bab5495b56c75a2ee6
parent4c14321905768e1a782384c38c49a9c66e3c1308 (diff)
downloadmpc-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.c62
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));