From 20699fd838e41340471b1407b771b68b2b9f3d2b Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Mon, 22 Nov 2010 12:50:50 +0000 Subject: [PATCH 1/2] fix syntax error. --- pl/setof.yap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pl/setof.yap b/pl/setof.yap index 198c9d55f..e3e9a3edc 100644 --- a/pl/setof.yap +++ b/pl/setof.yap @@ -237,6 +237,6 @@ all(T,G,S) :- '$partial_list_or_list'(V) :- var(V), !. '$partial_list_or_list'([]) :- !. -'$partial_list_or_list'([_|B]) :- ! +'$partial_list_or_list'([_|B]) :- !, '$partial_list_or_list'(B). From 2ee12ca1a781e94b34504099c31164c49a11eb47 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Mon, 22 Nov 2010 12:51:02 +0000 Subject: [PATCH 2/2] only force 1E30 an error if in ISO mode. always 1.0e30. --- C/scanner.c | 14 +++++++++++--- C/write.c | 34 ++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/C/scanner.c b/C/scanner.c index bc230f521..590ab78cf 100755 --- a/C/scanner.c +++ b/C/scanner.c @@ -602,8 +602,12 @@ get_num(int *chp, int *chbuffp, int inp_stream, int (*Nxtch) (int), int (*Quoted has_overflow = TRUE; ch = Nxtch(inp_stream); } - if (might_be_float && ch == '.') { - { + if (might_be_float && ( ch == '.' || ch == 'e' || ch == 'E')) { + if (yap_flags[STRICT_ISO_FLAG] && (ch == 'e' || ch == 'E')) { + Yap_ErrorMessage = "Float format not allowed in ISO mode"; + return TermNil; + } + if (ch == '.') { if (--max_size == 0) { Yap_ErrorMessage = "Number Too Long"; return TermNil; @@ -628,10 +632,14 @@ get_num(int *chp, int *chbuffp, int inp_stream, int (*Nxtch) (int), int (*Quoted } while (chtype(ch = Nxtch(inp_stream)) == NU); } - if (ch == 'e') { + if (ch == 'e' || ch == 'E') { char *sp0 = sp; char cbuff = ch; + if (yap_flags[STRICT_ISO_FLAG] && ch == 'E') { + Yap_ErrorMessage = "Float format not allowed in ISO mode"; + return TermNil; + } if (--max_size == 0) { Yap_ErrorMessage = "Number Too Long"; return TermNil; diff --git a/C/write.c b/C/write.c index 79cc46091..bc77cfac6 100755 --- a/C/write.c +++ b/C/write.c @@ -78,8 +78,8 @@ STATIC_PROTO(void wrputs, (char *, wrf)); STATIC_PROTO(void wrputf, (Float, wrf)); STATIC_PROTO(void wrputref, (CODEADDR, int, wrf)); STATIC_PROTO(int legalAtom, (unsigned char *)); -STATIC_PROTO(int LeftOpToProtect, (Atom, int)); -STATIC_PROTO(int RightOpToProtect, (Atom, int)); +/*STATIC_PROTO(int LeftOpToProtect, (Atom, int)); + STATIC_PROTO(int RightOpToProtect, (Atom, int));*/ STATIC_PROTO(wtype AtomIsSymbols, (unsigned char *)); STATIC_PROTO(void putAtom, (Atom, int, wrf)); STATIC_PROTO(void writeTerm, (Term, int, int, int, struct write_globs *, struct rewind_term *)); @@ -212,6 +212,7 @@ wrputf(Float f, wrf writewch) /* writes a float */ { char s[256], *pt = s, ch; + int found_dot = FALSE, found_exp = FALSE; #if HAVE_ISNAN || defined(__WIN32) if (isnan(f)) { @@ -246,14 +247,31 @@ wrputf(Float f, wrf writewch) /* writes a float */ sprintf(s, RepAtom(AtomFloatFormat)->StrOfAE, f); while (*pt == ' ') pt++; - wrputs(pt, writewch); - if (*pt == '-') pt++; - while ((ch = *pt) != '\0') { - if (ch < '0' || ch > '9') - return; + if (*pt == '-') { + wrputc('-', writewch); pt++; } - wrputs(".0", writewch); + while ((ch = *pt) != '\0') { + switch (ch) { + case '.': + found_dot = TRUE; + wrputc('.', writewch); + break; + case 'e': + case 'E': + if (!found_dot) { + found_dot = TRUE; + wrputs(".0", writewch); + } + found_exp = TRUE; + default: + wrputc(ch, writewch); + } + pt++; + } + if (!found_dot) { + wrputs(".0", writewch); + } } static void