From 6778ea2975ab1e6bdbb63d48cccb0d072dd5b02c Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Mon, 9 Jan 2017 14:58:01 +0000 Subject: [PATCH] TEXT HANDLING BUGS --- C/alloc.c | 14 +++++++------- C/atomic.c | 32 ++++++++++++++++++-------------- C/text.c | 36 ++++++++++-------------------------- C/write.c | 12 +++++++----- 4 files changed, 42 insertions(+), 52 deletions(-) diff --git a/C/alloc.c b/C/alloc.c index 395d9ab5f..123b0b400 100644 --- a/C/alloc.c +++ b/C/alloc.c @@ -1,4 +1,4 @@ - /************************************************************************* +/************************************************************************* * * * YAP Prolog * * * @@ -78,7 +78,7 @@ void *my_malloc(size_t sz) { p = malloc(sz); // Yap_DebugPuts(stderr,"gof\n"); if (Yap_do_low_level_trace) - fprintf(stderr, "+ %p : %lu\n", p, sz); + fprintf(stderr, "+ %p : %" UInt_F "\n", p, sz); if (sz > 500 && write_malloc++ > 0) __android_log_print(ANDROID_LOG_ERROR, "YAPDroid ", "+ %d %p", write_malloc, p); @@ -90,11 +90,11 @@ void *my_realloc(void *ptr, size_t sz) { p = realloc(ptr, sz); if (Yap_do_low_level_trace) - // fprintf(stderr, "+ %p -> %p : %lu\n", ptr, p, sz); - // Yap_DebugPuts(stderr,"gof\n"); - if (sz > 500 && write_malloc++ > 0) - __android_log_print(ANDROID_LOG_ERROR, "YAPDroid ", "* %d %p", write_malloc, - p); + // fprintf(stderr, "+ %p -> %p : %: ==%" UInt_P "\n", ptr, p, sz); + // Yap_DebugPuts(stderr,"gof\n"); + if (sz > 500 && write_malloc++ > 0) + __android_log_print(ANDROID_LOG_ERROR, "YAPDroid ", "* %d %p", + write_malloc, p); return p; } diff --git a/C/atomic.c b/C/atomic.c index 3dc5f90e3..4338355df 100644 --- a/C/atomic.c +++ b/C/atomic.c @@ -1717,7 +1717,7 @@ static Int atom_split(USES_REGS1) { at = AtomOfTerm(t1); unsigned char *s, *s1, *s10; s = RepAtom(at)->UStrOfAE; - if (len > (Int)strlen_utf8(s)) + if (len > Yap_strlen(s)) ReleaseAndReturn((FALSE)); s1 = s10 = Malloc(len); if (s1 + len > (unsigned char *)ASP - 1024) @@ -1790,8 +1790,8 @@ restart_aux: #define SUB_ATOM_HAS_ATOM 16 #define SUB_ATOM_HAS_UTF8 32 -static Term build_new_atomic(int mask, wchar_t *wp, const unsigned char *p, - size_t minv, size_t len USES_REGS) { +static Term build_new_atomic(int mask, const unsigned char *p, size_t minv, + size_t len USES_REGS) { int n; seq_tv_t outv[5], inp; size_t cuts[3]; @@ -1876,7 +1876,6 @@ static Int cont_sub_atomic(USES_REGS1) { Term tat5 = Deref(ARG5); int mask; size_t minv, len, after, sz; - wchar_t *wp = NULL; const unsigned char *p = NULL, *p5 = NULL; mask = IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)); @@ -1936,7 +1935,7 @@ static Int cont_sub_atomic(USES_REGS1) { cut_fail(); } } else if (mask & SUB_ATOM_HAS_SIZE) { - Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Term nat = build_new_atomic(mask, p, minv, len PASS_REGS); Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG4, MkIntegerTerm(after)); Yap_unify(ARG5, nat); @@ -1945,7 +1944,7 @@ static Int cont_sub_atomic(USES_REGS1) { cut_succeed(); } else if (mask & SUB_ATOM_HAS_MIN) { after = sz - (minv + len); - Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Term nat = build_new_atomic(mask, p, minv, len PASS_REGS); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG4, MkIntegerTerm(after)); Yap_unify(ARG5, nat); @@ -1954,7 +1953,7 @@ static Int cont_sub_atomic(USES_REGS1) { cut_succeed(); } else if (mask & SUB_ATOM_HAS_AFTER) { len = sz - (minv + after); - Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Term nat = build_new_atomic(mask, p, minv, len PASS_REGS); Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG5, nat); @@ -1962,7 +1961,7 @@ static Int cont_sub_atomic(USES_REGS1) { if (len-- == 0) cut_succeed(); } else { - Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Term nat = build_new_atomic(mask, p, minv, len PASS_REGS); Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG4, MkIntegerTerm(after)); @@ -1988,7 +1987,6 @@ static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { Term tat1, tbef, tsize, tafter, tout; int mask = SUB_ATOM_HAS_UTF8; size_t minv, len, after, sz; - wchar_t *wp = NULL; const unsigned char *p = NULL; int bnds = 0; Term nat = 0L; @@ -2014,7 +2012,13 @@ static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { p = UStringOfTerm(tat1); sz = strlen_utf8(p); } else { - Yap_Error(TYPE_ERROR_STRING, tat1, "sub_atom/5"); + Yap_Error(TYPE_ERROR_STRING, tat1, "sub_string/5"); + ReleaseAndReturn(false); + } + } else { + if ((p = Yap_TextToUTF8Buffer(tat1 PASS_REGS))) { + sz = strlen_utf8(p); + } else { ReleaseAndReturn(false); } } @@ -2100,7 +2104,7 @@ static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { release_cut_fail(); if ((Int)(after = (sz - (minv + len))) < 0) release_cut_fail(); - nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + nat = build_new_atomic(mask, p, minv, len PASS_REGS); if (!nat) release_cut_fail(); out = Yap_unify(ARG4, MkIntegerTerm(after)) && Yap_unify(ARG5, nat); @@ -2109,7 +2113,7 @@ static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { if (sz < minv + after) release_cut_fail(); len = sz - (minv + after); - nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + nat = build_new_atomic(mask, p, minv, len PASS_REGS); if (!nat) release_cut_fail(); out = Yap_unify(ARG3, MkIntegerTerm(len)) && Yap_unify(ARG5, nat); @@ -2118,7 +2122,7 @@ static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { if (len + after > sz) release_cut_fail(); minv = sz - (len + after); - nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + nat = build_new_atomic(mask, p, minv, len PASS_REGS); if (!nat) release_cut_fail(); out = Yap_unify(ARG2, MkIntegerTerm(minv)) && Yap_unify(ARG5, nat); @@ -2141,7 +2145,7 @@ static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { if (!out) release_cut_fail(); } else { - out = (strlen_utf8(RepAtom(AtomOfTerm(tout))->UStrOfAE) == len); + out = (strlen(RepAtom(AtomOfTerm(tout))->StrOfAE) == len); if (!out) release_cut_fail(); } diff --git a/C/text.c b/C/text.c index 648ca6c2a..c3a361207 100644 --- a/C/text.c +++ b/C/text.c @@ -443,51 +443,35 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) { // ASCII, so both LATIN1 and UTF-8 // Yap_DebugPlWriteln(inp->val.t); char *s; - if (s0) - s = (char *)s0; - else - s = Malloc(0); + s = Malloc(0); if (snprintf(s, MaxTmp(PASS_REGS1) - 1, Int_FORMAT, IntegerOfTerm(inp->val.t)) < 0) { AUX_ERROR(inp->val.t, 2 * MaxTmp(PASS_REGS1), s, char); } - *lengp = strlen(s); + if (lengp) + *lengp = strlen(s); return (unsigned char *)s; } if (inp->type & YAP_STRING_FLOAT && IsFloatTerm(inp->val.t)) { char *s; - size_t sz = 1024; // Yap_DebugPlWriteln(inp->val.t); - if (s0) { - s = (char *)s0; - sz = strlen(s); - } else - s = Malloc(sz); - if (!s) - AUX_ERROR(inp->val.t, MaxTmp(PASS_REGS1), s, char); - while (!Yap_FormatFloat(FloatOfTerm(inp->val.t), &s, sz - 1)) { - if (s0) { - s = Malloc(sz = 1024); - s0 = NULL; - } else - s = Realloc(s, sz + 1024); + if (!Yap_FormatFloat(FloatOfTerm(inp->val.t), &s, 1024)) { + return NULL; } - *lengp = strlen(s); - return inp->val.uc = (unsigned char *)s; + if (lengp) + *lengp = strlen(s); + return (unsigned char *)s; } #if USE_GMP if (inp->type & YAP_STRING_BIG && IsBigIntTerm(inp->val.t)) { // Yap_DebugPlWriteln(inp->val.t); char *s; - if (s0) - s = 0; - else s = Malloc(0); if (!Yap_mpz_to_string(Yap_BigIntOfTerm(inp->val.t), s, MaxTmp() - 1, 10)) { AUX_ERROR(inp->val.t, MaxTmp(PASS_REGS1), s, char); } - *lengp = strlen(s); - Malloc(*lengp); + if (lengp) + *lengp = strlen(s); return inp->val.uc = (unsigned char *)s; } #endif diff --git a/C/write.c b/C/write.c index 91064bdd7..6687da19e 100644 --- a/C/write.c +++ b/C/write.c @@ -385,15 +385,16 @@ int Yap_FormatFloat(Float f, char **s, size_t sz) { sno = Yap_open_buf_write_stream(GLOBAL_Stream[LOCAL_c_output_stream].encoding, 0); if (sno < 0) - return FALSE; + return false; wglb.lw = separator; wglb.stream = GLOBAL_Stream + sno; wrputf(f, &wglb); wrputc('\0', wglb.stream); so = Yap_MemExportStreamPtr(sno); + *s = Malloc( strlen(so) )+1; + strcpy(*s, so ); Yap_CloseStream(sno); - *s = so; - return TRUE; + return true; } /* writes a data base reference */ @@ -568,9 +569,10 @@ static void write_string(const unsigned char *s, int delta; ptr += (delta = get_utf8(ptr, -1, &chr) ); - if (chr == '\0') + if (chr == '\0') { break; - if (delta == 0) {chr = *ptr++; } + } + if (delta == 0) {chr = *ptr++; } write_quoted(chr, qt, stream); } while (TRUE); wrputc(qt, stream);