text problems
This commit is contained in:
parent
67b72f4958
commit
79791604d9
65
C/atomic.c
65
C/atomic.c
@ -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();
|
||||||
|
13
C/text.c
13
C/text.c
@ -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);
|
||||||
|
10
H/YapTags.h
10
H/YapTags.h
@ -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
|
||||||
|
Reference in New Issue
Block a user