improve PL_get_chars, still needs to handle wide chars.
This commit is contained in:
parent
00a157b8ac
commit
69b21df917
|
@ -445,17 +445,17 @@ static int CvtToStringTerm(Term t, char *buf, char *buf_max)
|
||||||
while (IsPairTerm(t)) {
|
while (IsPairTerm(t)) {
|
||||||
YAP_Term hd = HeadOfTerm(t);
|
YAP_Term hd = HeadOfTerm(t);
|
||||||
long int i;
|
long int i;
|
||||||
if (!IsVarTerm(hd) || !IsIntTerm(hd))
|
if (IsVarTerm(hd) || !IsIntTerm(hd))
|
||||||
return 0;
|
return 0;
|
||||||
i = IntOfTerm(hd);
|
i = IntOfTerm(hd);
|
||||||
if (i <= 0 || i >= 255)
|
if (i <= 0 || i >= 255)
|
||||||
return 0;
|
return 0;
|
||||||
if (!IsIntTerm(hd))
|
|
||||||
return 0;
|
|
||||||
*buf++ = i;
|
*buf++ = i;
|
||||||
if (buf == buf_max)
|
if (buf == buf_max)
|
||||||
return 0;
|
return 0;
|
||||||
t = TailOfTerm(t);
|
t = TailOfTerm(t);
|
||||||
|
if (IsVarTerm(t))
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
if (t != TermNil)
|
if (t != TermNil)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -465,17 +465,6 @@ static int CvtToStringTerm(Term t, char *buf, char *buf_max)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *bf, *bf_lim;
|
|
||||||
|
|
||||||
static void
|
|
||||||
buf_writer(int c)
|
|
||||||
{
|
|
||||||
if (bf == bf_lim) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*bf++ = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !HAVE_SNPRINTF
|
#if !HAVE_SNPRINTF
|
||||||
#define snprintf(X,Y,Z,A) sprintf(X,Z,A)
|
#define snprintf(X,Y,Z,A) sprintf(X,Z,A)
|
||||||
#endif
|
#endif
|
||||||
|
@ -501,6 +490,39 @@ static int do_yap_putc(int sno, wchar_t ch) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
CvtToGenericTerm(Term t, char *tmp, unsigned flags, char **sp)
|
||||||
|
{
|
||||||
|
int wflags = 0;
|
||||||
|
|
||||||
|
putc_cur_buf = putc_curp = tmp;
|
||||||
|
putc_cur_flags = flags;
|
||||||
|
if ((flags & BUF_RING)) {
|
||||||
|
putc_cur_lim = tmp+(TMP_BUF_SIZE-1);
|
||||||
|
} else {
|
||||||
|
putc_cur_lim = tmp+(BUF_SIZE-1);
|
||||||
|
}
|
||||||
|
if (flags & CVT_WRITE_CANONICAL) {
|
||||||
|
wflags |= (YAP_WRITE_IGNORE_OPS|YAP_WRITE_QUOTED);
|
||||||
|
}
|
||||||
|
Yap_plwrite(t, do_yap_putc, wflags, 1200);
|
||||||
|
if (putc_cur_buf == putc_cur_lim)
|
||||||
|
return 0;
|
||||||
|
*putc_curp = '\0';
|
||||||
|
/* may have changed due to overflows */
|
||||||
|
*sp = putc_cur_buf;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cv_error(unsigned flags)
|
||||||
|
{
|
||||||
|
if (flags & CVT_EXCEPTION) {
|
||||||
|
YAP_Error(0, 0L, "PL_get_chars");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
X_API int PL_get_chars(term_t l, char **sp, unsigned flags)
|
X_API int PL_get_chars(term_t l, char **sp, unsigned flags)
|
||||||
{
|
{
|
||||||
YAP_Term t = Yap_GetFromSlot(l);
|
YAP_Term t = Yap_GetFromSlot(l);
|
||||||
|
@ -514,62 +536,66 @@ X_API int PL_get_chars(term_t l, char **sp, unsigned flags)
|
||||||
tmp = buffers;
|
tmp = buffers;
|
||||||
}
|
}
|
||||||
*sp = tmp;
|
*sp = tmp;
|
||||||
if (flags & (CVT_WRITE|CVT_WRITE_CANONICAL)) {
|
if (IsVarTerm(t)) {
|
||||||
Int write_flags;
|
if (!(flags & (CVT_VARIABLE|CVT_WRITE|CVT_WRITE_CANONICAL)))
|
||||||
|
return cv_error(flags);
|
||||||
putc_cur_buf = putc_curp = tmp;
|
if (!CvtToGenericTerm(t, tmp, flags, sp))
|
||||||
putc_cur_flags = flags;
|
return 0;
|
||||||
if (flags & CVT_WRITE_CANONICAL) {
|
} else if (IsAtomTerm(t)) {
|
||||||
write_flags = (Quote_illegal_f|Ignore_ops_f);
|
|
||||||
} else {
|
|
||||||
write_flags = 0;
|
|
||||||
}
|
|
||||||
if ((flags & BUF_RING)) {
|
|
||||||
putc_cur_lim = tmp+(TMP_BUF_SIZE-1);
|
|
||||||
} else {
|
|
||||||
putc_cur_lim = tmp+(BUF_SIZE-1);
|
|
||||||
}
|
|
||||||
Yap_plwrite(t, do_yap_putc, write_flags, 1200);
|
|
||||||
*putc_curp = '\0';
|
|
||||||
/* may have changed due to overflows */
|
|
||||||
*sp = putc_cur_buf;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (IsAtomTerm(t)) {
|
|
||||||
Atom at = AtomOfTerm(t);
|
Atom at = AtomOfTerm(t);
|
||||||
if (!(flags & (CVT_ATOM|CVT_ATOMIC|CVT_ALL)))
|
if (!(flags & (CVT_ATOM|CVT_ATOMIC|CVT_WRITE|CVT_WRITE_CANONICAL|CVT_ALL)))
|
||||||
return 0;
|
return cv_error(flags);
|
||||||
if (IsWideAtom(at))
|
if (IsWideAtom(at)) {
|
||||||
/* will this always work? */
|
/* this is not enough!!! */
|
||||||
snprintf(*sp,BUF_SIZE,"%ls",RepAtom(at)->WStrOfAE);
|
snprintf(*sp,BUF_SIZE,"%ls",RepAtom(at)->WStrOfAE);
|
||||||
else
|
} else {
|
||||||
*sp = RepAtom(at)->StrOfAE;
|
*sp = RepAtom(at)->StrOfAE;
|
||||||
return 1;
|
}
|
||||||
} else if (YAP_IsIntTerm(t)) {
|
} else if (IsNumTerm(t)) {
|
||||||
if (!(flags & (CVT_INTEGER|CVT_NUMBER|CVT_ATOMIC|CVT_ALL)))
|
if (IsFloatTerm(t)) {
|
||||||
return 0;
|
if (!(flags & (CVT_FLOAT|CVT_NUMBER|CVT_ATOMIC|CVT_WRITE|CVT_WRITE_CANONICAL|CVT_ALL)))
|
||||||
|
return cv_error(flags);
|
||||||
|
snprintf(tmp,BUF_SIZE,"%f",FloatOfTerm(t));
|
||||||
|
} else {
|
||||||
|
if (!(flags & (CVT_INTEGER|CVT_NUMBER|CVT_ATOMIC|CVT_WRITE|CVT_WRITE_CANONICAL|CVT_ALL)))
|
||||||
|
return cv_error(flags);
|
||||||
#if _WIN64
|
#if _WIN64
|
||||||
snprintf(tmp,BUF_SIZE,"%I64d",YAP_IntOfTerm(t));
|
snprintf(tmp,BUF_SIZE,"%I64d",IntegerOfTerm(t));
|
||||||
#else
|
#else
|
||||||
snprintf(tmp,BUF_SIZE,"%ld",YAP_IntOfTerm(t));
|
snprintf(tmp,BUF_SIZE,"%ld",IntegerOfTerm(t));
|
||||||
#endif
|
#endif
|
||||||
} else if (YAP_IsFloatTerm(t)) {
|
}
|
||||||
if (!(flags & (CVT_FLOAT|CVT_ATOMIC|CVT_NUMBER|CVT_ALL)))
|
} else if (IsPairTerm(t)) {
|
||||||
return 0;
|
if (!(flags & (CVT_LIST|CVT_WRITE|CVT_WRITE_CANONICAL|CVT_ALL))) {
|
||||||
snprintf(tmp,BUF_SIZE,"%f",YAP_FloatOfTerm(t));
|
return cv_error(flags);
|
||||||
} else if (flags & (CVT_STRING)) {
|
}
|
||||||
char *s = Yap_BlobStringOfTerm(t);
|
if (CvtToStringTerm(t,tmp,tmp+BUF_SIZE) == 0) {
|
||||||
strncat(tmp, s, BUF_SIZE-1);
|
if (flags & (CVT_WRITE|CVT_WRITE_CANONICAL)) {
|
||||||
} else if (flags & CVT_LIST) {
|
if (!CvtToGenericTerm(t, tmp, flags, sp))
|
||||||
if (CvtToStringTerm(t,tmp,tmp+BUF_SIZE) == 0)
|
return 0;
|
||||||
return 0;
|
} else {
|
||||||
|
return cv_error(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
bf = tmp;
|
if (IsBigIntTerm(t)) {
|
||||||
bf_lim = tmp+(BUF_SIZE-1);
|
if (!(flags & (CVT_INTEGER|CVT_NUMBER|CVT_ATOMIC|CVT_WRITE|CVT_WRITE_CANONICAL|CVT_ALL)))
|
||||||
YAP_Write(t,buf_writer,0);
|
return cv_error(flags);
|
||||||
if (bf == bf_lim)
|
Yap_gmp_to_string(t, tmp, BUF_SIZE-1, 10);
|
||||||
return 0;
|
} else if (IsBlobStringTerm(t)) {
|
||||||
*bf = '\0';
|
if (!(flags & (CVT_STRING|CVT_WRITE|CVT_WRITE_CANONICAL|CVT_ALL))) {
|
||||||
|
return cv_error(flags);
|
||||||
|
} else {
|
||||||
|
char *s = Yap_BlobStringOfTerm(t);
|
||||||
|
strncat(tmp, s, BUF_SIZE-1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!(flags & (CVT_WRITE|CVT_WRITE_CANONICAL))) {
|
||||||
|
return cv_error(flags);
|
||||||
|
}
|
||||||
|
if (!CvtToGenericTerm(t, tmp, flags, sp))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (flags & BUF_MALLOC) {
|
if (flags & BUF_MALLOC) {
|
||||||
char *nbf = YAP_AllocSpaceFromYap(strlen(tmp)+1);
|
char *nbf = YAP_AllocSpaceFromYap(strlen(tmp)+1);
|
||||||
|
|
Reference in New Issue