text problems

This commit is contained in:
Vitor Santos Costa 2016-08-24 02:04:49 -05:00
parent 67b72f4958
commit 79791604d9
3 changed files with 63 additions and 37 deletions

View File

@ -661,26 +661,31 @@ static Int atom_concat3(USES_REGS1) {
Term t1; Term t1;
Term t2, t3, ot; Term t2, t3, ot;
Atom at; Atom at;
bool g1, g2, g3;
restart_aux: restart_aux:
t1 = Deref(ARG1); t1 = Deref(ARG1);
t2 = Deref(ARG2); t2 = Deref(ARG2);
t3 = Deref(ARG3); t3 = Deref(ARG3);
if (Yap_IsGroundTerm(t1) && Yap_IsGroundTerm(t2)) { g1 = Yap_IsGroundTerm(t1);
g2 = Yap_IsGroundTerm(t2);
g3 = Yap_IsGroundTerm(t3);
if (g1 && g2) {
at = Yap_ConcatAtoms(t1, t2 PASS_REGS); at = Yap_ConcatAtoms(t1, t2 PASS_REGS);
ot = ARG3; ot = ARG3;
} else if (Yap_IsGroundTerm(t1) && Yap_IsGroundTerm(t3)) { } else if (g1 && g3) {
at = Yap_SubtractHeadAtom(Deref(ARG3), t1 PASS_REGS); at = Yap_SubtractHeadAtom(t3, t1 PASS_REGS);
ot = ARG2; ot = ARG2;
} else if (Yap_IsGroundTerm(t2) && Yap_IsGroundTerm(t3)) { } else if (g2 && g3) {
at = Yap_SubtractTailAtom(Deref(ARG3), t2 PASS_REGS); at = Yap_SubtractTailAtom(t3, t2 PASS_REGS);
ot = ARG1; ot = ARG1;
} else if (Yap_IsGroundTerm(t3)) { } else if (g3) {
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0); EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_AtomToLength(t3 PASS_REGS)); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_AtomToLength(t3 PASS_REGS));
return cont_atom_concat3(PASS_REGS1); return cont_atom_concat3(PASS_REGS1);
} else { } else {
LOCAL_Error_TYPE = INSTANTIATION_ERROR; LOCAL_Error_TYPE = INSTANTIATION_ERROR;
LOCAL_Error_Term = t1; LOCAL_Error_Term = t1;
at = NULL;
} }
if (at) { if (at) {
if (Yap_unify(ot, MkAtomTerm(at))) if (Yap_unify(ot, MkAtomTerm(at)))
@ -693,7 +698,7 @@ restart_aux:
if (Yap_HandleError("atom_concat/3")) { if (Yap_HandleError("atom_concat/3")) {
goto restart_aux; goto restart_aux;
} else { } else {
return FALSE; return false;
} }
} }
cut_fail(); cut_fail();
@ -751,29 +756,34 @@ static Int atomic_concat3(USES_REGS1) {
Term t1; Term t1;
Term t2, t3, ot; Term t2, t3, ot;
Atom at = NULL; Atom at = NULL;
bool g1, g2, g3;
restart_aux: restart_aux:
t1 = Deref(ARG1); t1 = Deref(ARG1);
t2 = Deref(ARG2); t2 = Deref(ARG2);
t3 = Deref(ARG3); t3 = Deref(ARG3);
if (Yap_IsGroundTerm(t1) && Yap_IsGroundTerm(t2)) { g1 = Yap_IsGroundTerm(t1);
at = Yap_ConcatAtoms(CastToAtom(t1), CastToAtom(t2) PASS_REGS); g2 = Yap_IsGroundTerm(t2);
g3 = Yap_IsGroundTerm(t3);
if (g1 && g2) {
at = Yap_ConcatAtomics(t1, t2 PASS_REGS);
ot = ARG3; ot = ARG3;
} else if (Yap_IsGroundTerm(t1) && Yap_IsGroundTerm(t3)) { } else if (g1 && g3) {
at = Yap_SubtractHeadAtom(t3, CastToAtom(t1) PASS_REGS); at = Yap_SubtractHeadAtom(t3, t1 PASS_REGS);
ot = ARG2; ot = ARG2;
} else if (Yap_IsGroundTerm(t2) && Yap_IsGroundTerm(t3)) { } else if (g2 && g3) {
at = Yap_SubtractTailAtom(t3, CastToAtom(t2) PASS_REGS); at = Yap_SubtractTailAtom(t3, t2 PASS_REGS);
ot = ARG1; ot = ARG1;
} else if (Yap_IsGroundTerm(t3)) { } else if (g3) {
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0); EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_AtomicToLength(t3 PASS_REGS)); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_AtomicToLength(t3 PASS_REGS));
return cont_atomic_concat3(PASS_REGS1); return cont_atomic_concat3(PASS_REGS1);
} else { } else {
LOCAL_Error_TYPE = INSTANTIATION_ERROR; LOCAL_Error_TYPE = INSTANTIATION_ERROR;
LOCAL_Error_Term = t1; LOCAL_Error_Term = t1;
at = NULL;
} }
if (at) { if (at) {
if (Yap_unify(ot, CastToNumeric(at))) if (Yap_unify(ot, MkAtomTerm(at)))
cut_succeed(); cut_succeed();
else else
cut_fail(); cut_fail();
@ -783,7 +793,7 @@ restart_aux:
if (Yap_HandleError("atomic_concat/3")) { if (Yap_HandleError("atomic_concat/3")) {
goto restart_aux; goto restart_aux;
} else { } else {
return FALSE; return false;
} }
} }
cut_fail(); cut_fail();
@ -822,40 +832,45 @@ static Int string_concat3(USES_REGS1) {
Term t1; Term t1;
Term t2, t3, ot; Term t2, t3, ot;
Term tf = 0; Term tf = 0;
bool g1, g2, g3;
Atom at;
restart_aux: restart_aux:
t1 = Deref(ARG1); t1 = Deref(ARG1);
t2 = Deref(ARG2); t2 = Deref(ARG2);
t3 = Deref(ARG3); t3 = Deref(ARG3);
if (Yap_IsGroundTerm(t1) && Yap_IsGroundTerm(t2)) { g1 = Yap_IsGroundTerm(t1);
g2 = Yap_IsGroundTerm(t2);
g3 = Yap_IsGroundTerm(t3);
if (g1 && g2) {
tf = Yap_ConcatStrings(t1, t2 PASS_REGS); tf = Yap_ConcatStrings(t1, t2 PASS_REGS);
ot = ARG3; ot = ARG3;
} else if (Yap_IsGroundTerm(t1) && Yap_IsGroundTerm(t3)) { } else if (g1 && g3) {
tf = Yap_SubtractHeadString(t3, t1 PASS_REGS); tf = Yap_SubtractHeadString(t3, t1 PASS_REGS);
ot = ARG2; ot = ARG2;
} else if (Yap_IsGroundTerm(t2) && Yap_IsGroundTerm(t3)) { } else if (g2 && g3) {
tf = Yap_SubtractTailString(t3, t2 PASS_REGS); tf = Yap_SubtractTailString(t3, t2 PASS_REGS);
ot = ARG1; ot = ARG1;
} else if (Yap_IsGroundTerm(t3)) { } else if (g3) {
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0); EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_StringToLength(t3 PASS_REGS)); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_StringToLength(t3 PASS_REGS));
return cont_string_concat3(PASS_REGS1); return cont_string_concat3(PASS_REGS1);
} else { } else {
LOCAL_Error_TYPE = INSTANTIATION_ERROR; LOCAL_Error_TYPE = INSTANTIATION_ERROR;
LOCAL_Error_Term = t1; LOCAL_Error_Term = t1;
at = NULL;
} }
if (tf) { if (tf) {
if (Yap_unify(ot, tf)) { if (Yap_unify(ot, tf))
cut_succeed(); cut_succeed();
} else { else
cut_fail(); cut_fail();
} }
}
/* Error handling */ /* Error handling */
if (LOCAL_Error_TYPE) { if (LOCAL_Error_TYPE) {
if (Yap_HandleError("string_concat/3")) { if (Yap_HandleError("atom_concat/3")) {
goto restart_aux; goto restart_aux;
} else { } else {
return FALSE; return false;
} }
} }
cut_fail(); cut_fail();

View File

@ -104,6 +104,7 @@ static Int SkipListCodes(unsigned char **bufp, Term *l, Term **tailp,
*bufp = st = st0; *bufp = st = st0;
if (*l == TermNil) { if (*l == TermNil) {
st[0] = '\0';
return 0; return 0;
} }
if (IsPairTerm(*l)) { if (IsPairTerm(*l)) {
@ -311,7 +312,7 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) {
} else if (!IsStringTerm(inp->val.t) && } else if (!IsStringTerm(inp->val.t) &&
inp->type == YAP_STRING_STRING) { inp->type == YAP_STRING_STRING) {
LOCAL_Error_TYPE = TYPE_ERROR_STRING; LOCAL_Error_TYPE = TYPE_ERROR_STRING;
} else if (!IsPairTerm(inp->val.t) && !IsStringTerm(inp->val.t) && } else if (!IsPairOrNilTerm(inp->val.t) && !IsStringTerm(inp->val.t) &&
inp->type == inp->type ==
(YAP_STRING_ATOMS_CODES | YAP_STRING_STRING)) { (YAP_STRING_ATOMS_CODES | YAP_STRING_STRING)) {
LOCAL_Error_TYPE = TYPE_ERROR_LIST; LOCAL_Error_TYPE = TYPE_ERROR_LIST;
@ -344,20 +345,20 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) {
return UStringOfTerm(inp->val.t); return UStringOfTerm(inp->val.t);
} }
if (((inp->type & (YAP_STRING_CODES | YAP_STRING_ATOMS)) == if (((inp->type & (YAP_STRING_CODES | YAP_STRING_ATOMS)) ==
(YAP_STRING_CODES | YAP_STRING_ATOMS)) && IsPairTerm(inp->val.t)) { (YAP_STRING_CODES | YAP_STRING_ATOMS)) && IsPairOrNilTerm(inp->val.t)) {
//Yap_DebugPlWriteln(inp->val.t); //Yap_DebugPlWriteln(inp->val.t);
return inp->val.uc = return inp->val.uc =
Yap_ListToBuffer(s0, inp->val.t, inp, &wide, lengp Yap_ListToBuffer(s0, inp->val.t, inp, &wide, lengp
PASS_REGS); PASS_REGS);
// this is a term, extract to a sfer, and representation is wide // this is a term, extract to a sfer, and representation is wide
} }
if (inp->type & YAP_STRING_CODES && IsPairTerm(inp->val.t)) { if (inp->type & YAP_STRING_CODES && IsPairOrNilTerm(inp->val.t)) {
//Yap_DebugPlWriteln(inp->val.t); //Yap_DebugPlWriteln(inp->val.t);
return inp->val.uc = Yap_ListOfCodesToBuffer(s0, inp->val.t, inp, &wide, return inp->val.uc = Yap_ListOfCodesToBuffer(s0, inp->val.t, inp, &wide,
lengp PASS_REGS); lengp PASS_REGS);
// this is a term, extract to a sfer, and representation is wide // this is a term, extract to a sfer, and representation is wide
} }
if (inp->type & YAP_STRING_ATOMS && IsPairTerm(inp->val.t)) { if (inp->type & YAP_STRING_ATOMS && IsPairOrNilTerm(inp->val.t)) {
//Yap_DebugPlWriteln(inp->val.t); //Yap_DebugPlWriteln(inp->val.t);
return inp->val.uc = Yap_ListOfAtomsToBuffer(s0, inp->val.t, inp, &wide, return inp->val.uc = Yap_ListOfAtomsToBuffer(s0, inp->val.t, inp, &wide,
lengp PASS_REGS); lengp PASS_REGS);
@ -1031,7 +1032,7 @@ const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) {
CACHE_REGS CACHE_REGS
seq_tv_t inp, out; seq_tv_t inp, out;
inp.val.t = t; inp.val.t = t;
if (IsAtomTerm(t)) { if (IsAtomTerm(t) && t != TermNil) {
inp.type = YAP_STRING_ATOM; inp.type = YAP_STRING_ATOM;
if (IsWideAtom(AtomOfTerm(t))) if (IsWideAtom(AtomOfTerm(t)))
inp.enc = ENC_WCHAR; inp.enc = ENC_WCHAR;
@ -1040,7 +1041,7 @@ const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) {
} else if (IsStringTerm(t)) { } else if (IsStringTerm(t)) {
inp.type = YAP_STRING_STRING; inp.type = YAP_STRING_STRING;
inp.enc = ENC_ISO_UTF8; inp.enc = ENC_ISO_UTF8;
} else if (IsPairTerm(t)) { } else if (IsPairOrNilTerm(t)) {
inp.type = (YAP_STRING_CODES | YAP_STRING_ATOMS); inp.type = (YAP_STRING_CODES | YAP_STRING_ATOMS);
} else { } else {
Yap_Error(TYPE_ERROR_TEXT, t, NULL); Yap_Error(TYPE_ERROR_TEXT, t, NULL);

View File

@ -350,4 +350,14 @@ INLINE_ONLY inline EXTERN void *AddressOfTerm(Term t) {
return (void *)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t)); return (void *)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
} }
INLINE_ONLY inline EXTERN Int IsPairTermOrNil (Term);
INLINE_ONLY inline EXTERN Int
IsPairOrNilTerm (Term t)
{
return IsPairTerm(t) || t == TermNil;
}
#endif #endif