TEXT HANDLING BUGS

This commit is contained in:
Vitor Santos Costa 2017-01-09 14:58:01 +00:00
parent 80cb881f3c
commit 6778ea2975
4 changed files with 42 additions and 52 deletions

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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

View File

@ -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);