35#include "YapStreams.h"
45inline static size_t min_size(
size_t i,
size_t j) {
return (i < j ? i : j); }
46#define wcsnlen(S, N) min_size(N, wcslen(S))
49#if !defined(HAVE_STPCPY) && !defined(__APPLE__)
50inline static void *__stpcpy(
void *i,
const void *j) {
51 return strcpy(i, j) + strlen(j);
53#define stpcpy __stpcpy
57#define NAN (0.0 / 0.0)
62 return Yap_chtype[ch];
63 switch (utf8proc_category(ch)) {
64 case UTF8PROC_CATEGORY_CN:
66 case UTF8PROC_CATEGORY_LU:
68 case UTF8PROC_CATEGORY_LL:
70 case UTF8PROC_CATEGORY_LT:
72 case UTF8PROC_CATEGORY_LM:
74 case UTF8PROC_CATEGORY_LO:
76 case UTF8PROC_CATEGORY_MN:
78 case UTF8PROC_CATEGORY_MC:
80 case UTF8PROC_CATEGORY_ME:
82 case UTF8PROC_CATEGORY_ND:
84 case UTF8PROC_CATEGORY_NL:
86 case UTF8PROC_CATEGORY_NO:
88 case UTF8PROC_CATEGORY_PC:
90 case UTF8PROC_CATEGORY_PD:
92 case UTF8PROC_CATEGORY_PS:
94 case UTF8PROC_CATEGORY_PE:
96 case UTF8PROC_CATEGORY_PI:
98 case UTF8PROC_CATEGORY_PF:
100 case UTF8PROC_CATEGORY_PO:
102 case UTF8PROC_CATEGORY_SM:
104 case UTF8PROC_CATEGORY_SC:
106 case UTF8PROC_CATEGORY_SK:
111 case UTF8PROC_CATEGORY_SO:
113 case UTF8PROC_CATEGORY_ZS:
115 case UTF8PROC_CATEGORY_ZL:
117 case UTF8PROC_CATEGORY_ZP:
119 case UTF8PROC_CATEGORY_CC:
121 case UTF8PROC_CATEGORY_CF:
123 case UTF8PROC_CATEGORY_CS:
125 case UTF8PROC_CATEGORY_CO:
131static Term Globalize(Term v USES_REGS) {
132 if (!IsVarTerm(v = Deref(v))) {
135 if (VarOfTerm(v) > HR && VarOfTerm(v) < LCL0) {
136 Bind_Local(VarOfTerm(v), MkVarTerm());
142static void *codes2buf(Term t0,
void *b0,
bool get_codes,
143 bool fixed USES_REGS) {
144 unsigned char *st0, *st, ar[16];
153 if (!IsPairTerm(t)) {
154 Yap_ThrowError(TYPE_ERROR_LIST, t,
"scanning list of codes");
157 bool codes = IsIntegerTerm(HeadOfTerm(t));
158 if (get_codes != codes && fixed) {
160 Yap_ThrowError(TYPE_ERROR_INTEGER, HeadOfTerm(t),
161 "scanning list of codes");
163 Yap_ThrowError(TYPE_ERROR_ATOM, HeadOfTerm(t),
"scanning list of atoms");
167 while (IsPairTerm(t)) {
168 Term hd = HeadOfTerm(t);
170 Yap_ThrowError(INSTANTIATION_ERROR, hd,
"scanning list of codes");
173 if (!IsIntegerTerm(hd)) {
174 Yap_ThrowError(TYPE_ERROR_CHARACTER_CODE, hd,
"scanning list of codes");
177 Int code = IntegerOfTerm(hd);
179 Yap_ThrowError(REPRESENTATION_ERROR_CHARACTER_CODE, hd,
180 "scanning list of character codes, found %d", code);
182 }
else if (code == 0) {
185 length += put_utf8(ar, code);
189 Yap_ThrowError(INSTANTIATION_ERROR, t,
"scanning list of codes");
192 if (!IsPairTerm(t) && t != TermNil) {
193 Yap_ThrowError(TYPE_ERROR_LIST, t,
"scanning list of codes");
198 while (IsPairTerm(t)) {
199 Term hd = HeadOfTerm(t);
201 Yap_ThrowError(INSTANTIATION_ERROR, hd,
"scanning list of codes");
204 if (!IsAtomTerm(hd)) {
205 Yap_ThrowError(TYPE_ERROR_CHARACTER, hd,
"scanning list of texts");
208 const char *code = RepAtom(AtomOfTerm(hd))->StrOfAE;
210 Yap_ThrowError(TYPE_ERROR_CHARACTER, hd,
"scanning list of atoms");
212 }
else if (code == 0) {
215 length += strlen(code);
219 Yap_ThrowError(INSTANTIATION_ERROR, t,
"scanning list of codes");
222 if (!IsPairTerm(t) && t != TermNil) {
223 Yap_ThrowError(TYPE_ERROR_LIST, t,
"scanning list of codes");
231 Yap_ThrowError(TYPE_ERROR_LIST, t,
"scanning list of codes");
236 st0 = st =
Malloc(length + 1);
239 while (IsPairTerm(t)) {
240 Term hd = HeadOfTerm(t);
241 Int code = IntegerOfTerm(hd);
248 st = st + put_utf8(st, code);
252 while (IsPairTerm(t)) {
253 Term hd = HeadOfTerm(t);
254 const char *code = RepAtom(AtomOfTerm(hd))->StrOfAE;
255 st = (
unsigned char *)stpcpy((
char *)st, code);
264static unsigned char *latin2utf8(
seq_tv_t *inp) {
265 unsigned char *b0 = inp->val.uc;
266 size_t sz = strlen(inp->val.c);
269 unsigned char *buf =
Malloc(sz + 1), *pt = buf;
272 while ((ch = *b0++)) {
273 int off = put_utf8(pt, ch);
283static unsigned char *wchar2utf8(
seq_tv_t *inp) {
284 size_t sz = wcslen(inp->val.w) * 4;
285 wchar_t *b0 = inp->val.w;
286 unsigned char *buf =
Malloc(sz + 1), *pt = buf;
291 pt += put_utf8(pt, ch);
297static void *slice(
size_t min,
size_t max,
const unsigned char *buf USES_REGS) {
298size_t sz = strlen((
char*)buf)+1;
299if (max >sz) max = sz;
300 unsigned char *nbuf =
Malloc(sz + 1);
301 const unsigned char *ptr = skip_utf8(buf, min);
302 unsigned char *nptr = nbuf;
303 utf8proc_int32_t chr;
305 while (min++ < max && *ptr) {
306 ptr += get_utf8(ptr, -1, &chr);
307 nptr += put_utf8(nptr, chr);
308 if (nptr-nbuf > sz-64) {
309 size_t delta = nptr-nbuf;
310 nbuf = Realloc(nbuf,4096);
319static unsigned char *Yap_ListOfCodesToBuffer(
unsigned char *buf, Term t,
321 bool codes =
true, fixed =
true;
322 unsigned char *nbuf = codes2buf(t, buf, codes, fixed PASS_REGS);
326static unsigned char *Yap_ListOfAtomsToBuffer(
unsigned char *buf, Term t,
329 unsigned char *nbuf = codes2buf(t, buf, codes,
true PASS_REGS);
333static unsigned char *Yap_ListToBuffer(
unsigned char *buf, Term t,
335 return codes2buf(t, buf, NULL,
false PASS_REGS);
338static yap_error_number gen_type_error(
int flags) {
339 if ((flags & (YAP_STRING_STRING | YAP_STRING_ATOM | YAP_STRING_INT |
340 YAP_STRING_FLOAT | YAP_STRING_ATOMS_CODES | YAP_STRING_BIG)) ==
341 (YAP_STRING_STRING | YAP_STRING_ATOM | YAP_STRING_INT | YAP_STRING_FLOAT |
342 YAP_STRING_ATOMS_CODES | YAP_STRING_BIG))
343 return TYPE_ERROR_TEXT;
344 if ((flags & (YAP_STRING_STRING | YAP_STRING_ATOM | YAP_STRING_INT |
345 YAP_STRING_FLOAT | YAP_STRING_BIG)) ==
346 (YAP_STRING_STRING | YAP_STRING_ATOM | YAP_STRING_INT | YAP_STRING_FLOAT |
348 return TYPE_ERROR_ATOMIC;
349 if ((flags & (YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG)) ==
350 (YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG))
351 return TYPE_ERROR_NUMBER;
352 if (flags & YAP_STRING_ATOM)
353 return TYPE_ERROR_ATOM;
354 if (flags & YAP_STRING_STRING)
355 return TYPE_ERROR_STRING;
356 if (flags & (YAP_STRING_CODES | YAP_STRING_ATOMS))
357 return TYPE_ERROR_LIST;
358 return TYPE_ERROR_NUMBER;
363unsigned char *Yap_readText(
seq_tv_t *inp USES_REGS) {
364#define POPRET(x) return pop_output_text_stack(lvl, x)
365 int lvl = push_text_stack();
366 yap_error_number err = YAP_NO_ERROR;
368 if (!(inp->type & (YAP_STRING_CHARS | YAP_STRING_WCHARS))) {
369 seq_type_t inpt = inp->type & (YAP_STRING_TERM|YAP_STRING_ATOM|YAP_STRING_ATOMS_CODES);
370 if (!(inpt & YAP_STRING_TERM)) {
371 if (IsVarTerm(inp->val.t)) {
372 err = INSTANTIATION_ERROR;
373 }
else if (!IsAtomTerm(inp->val.t) && inpt == YAP_STRING_ATOM) {
374 err = TYPE_ERROR_ATOM;
375 }
else if (!IsStringTerm(inp->val.t) && inpt == YAP_STRING_STRING) {
376 err = TYPE_ERROR_STRING;
377 }
else if (!IsPairOrNilTerm(inp->val.t) && !IsStringTerm(inp->val.t) &&
378 inpt == (YAP_STRING_ATOMS_CODES | YAP_STRING_STRING)) {
379 err = TYPE_ERROR_LIST;
380 }
else if (!IsPairOrNilTerm(inp->val.t) && !IsStringTerm(inp->val.t) &&
381 !IsAtomTerm(inp->val.t) && !(inp->type & YAP_STRING_DATUM)) {
382 err = TYPE_ERROR_TEXT;
387 inp->val.t,
"while converting term %s", Yap_TermToBuffer(
388 inp->val.t, Handle_cyclics_f|Quote_illegal_f | Handle_vars_f));
391 if ((inp->val.t == TermNil) && inp->type & YAP_STRING_PREFER_LIST )
397 if (IsAtomTerm(inp->val.t) && inp->type & YAP_STRING_ATOM) {
400 Atom at = AtomOfTerm(inp->val.t);
401 if (RepAtom(at)->UStrOfAE[0] == 0) {
406 if (inp->type & YAP_STRING_WITH_BUFFER) {
411 size_t sz = strlen(at->StrOfAE);
412 char *out =
Malloc(sz + 1);
413 strcpy(out, at->StrOfAE);
417 if (IsStringTerm(inp->val.t) && inp->type & YAP_STRING_STRING) {
420 const char *s = StringOfTerm(inp->val.t);
427 if (inp->type & YAP_STRING_WITH_BUFFER) {
429 return (
unsigned char *)UStringOfTerm(inp->val.t);
432 inp->type |= YAP_STRING_IN_TMP;
433 size_t sz = strlen(s);
434 char *out =
Malloc(sz + 1);
438 }
else if (IsPairOrNilTerm(inp->val.t)) {
439 if (((inp->type & (YAP_STRING_CODES | YAP_STRING_ATOMS)) ==
440 (YAP_STRING_CODES | YAP_STRING_ATOMS))) {
442 char * out = (
char *)Yap_ListToBuffer(NULL, inp->val.t, inp PASS_REGS);
446 if (inp->type & YAP_STRING_CODES) {
448 char *out = (
char *)Yap_ListOfCodesToBuffer(NULL, inp->val.t, inp PASS_REGS);
452 if (inp->type & YAP_STRING_ATOMS) {
454 char *out = (
char *)Yap_ListOfAtomsToBuffer(NULL, inp->val.t, inp PASS_REGS);
459 if (inp->type & YAP_STRING_INT && IsIntegerTerm(inp->val.t)) {
462 char * out =
Malloc(2 * MaxTmp(PASS_REGS1));
463 if (snprintf(out, MaxTmp(PASS_REGS1) - 1, Int_FORMAT,
464 IntegerOfTerm(inp->val.t)) < 0) {
465 AUX_ERROR(inp->val.t, 2 * MaxTmp(PASS_REGS1), out,
char);
469 if (inp->type & YAP_STRING_FLOAT && IsFloatTerm(inp->val.t)) {
470 char *out =
Malloc(2 * MaxTmp(PASS_REGS1));
471 if (!Yap_FormatFloat(FloatOfTerm(inp->val.t), &out, 1024)) {
477 if (inp->type & YAP_STRING_BIG && IsBigIntTerm(inp->val.t)) {
479 char *out =
Malloc(MaxTmp());
480 if (!Yap_mpz_to_string(Yap_BigIntOfTerm(inp->val.t), out, MaxTmp() - 1,
482 AUX_ERROR(inp->val.t, MaxTmp(PASS_REGS1), out,
char);
486 if (inp->type & YAP_STRING_TERM) {
488 return (
unsigned char *)Yap_TermToBuffer(inp->val.t, 0);
491 Yap_ThrowError(TYPE_ERROR_TEXT,
492 inp->val.t,
"while converting term %s", Yap_TermToBuffer(
493 inp->val.t, Handle_cyclics_f|Quote_illegal_f | Handle_vars_f));
498 if (inp->type & YAP_STRING_CHARS) {
499 if (inp->enc == ENC_ISO_ASCII) {
504 if (inp->enc == ENC_ISO_LATIN1) {
505 POPRET( (
char*)latin2utf8(inp));
512 if (inp->type & YAP_STRING_WCHARS) {
514 POPRET( (
char *)wchar2utf8(inp) );
517 Yap_ThrowError(TYPE_ERROR_TEXT,
518 TermNil,
"Bad text input ");
525 if (s0 && s0[0]) max = strlen((
char *)s0);
528 if (out->type & (YAP_STRING_NCHARS | YAP_STRING_TRUNC)) {
529 if (out->type & YAP_STRING_NCHARS)
530 if (out->type & YAP_STRING_TRUNC && out->max < max) {
536 out->val.t = MkUStringTerm(s0);
541static Term write_atoms(
void *s0,
seq_tv_t *out USES_REGS) {
542 Term t = AbsPair(HR);
543 char *s1 = (
char *)s0;
545 size_t max = strlen(s1);
547 out->val.t = TermNil;
550 if (out->type & (YAP_STRING_NCHARS | YAP_STRING_TRUNC)) {
551 if (out->type & YAP_STRING_TRUNC && out->max < max)
555 unsigned char *s = s0, *lim = s + strnlen((
char *)s, max);
556 unsigned char *cp = s;
559 LOCAL_TERM_ERROR(t, 2 * (lim - s));
560 while (cp < lim && *cp) {
561 utf8proc_int32_t chr;
563 s += get_utf8(s, -1, &chr);
568 wp = put_utf8(w, chr);
572 cl[0] = MkAtomTerm(Yap_ULookupAtom(w));
578 if (out->type & YAP_STRING_DIFF) {
582 HR[-1] = Globalize(out->dif PASS_REGS);
593static Term write_codes(
void *s0,
seq_tv_t *out USES_REGS) {
595 size_t sz = strlen(s0);
597 if (out->type & YAP_STRING_DIFF) {
598 out->val.t = Globalize(out->dif PASS_REGS);
600 out->val.t = TermNil;
604 unsigned char *s = s0, *lim = s + sz;
605 unsigned char *cp = s;
608 LOCAL_TERM_ERROR(t, 2 * (lim - s));
611 utf8proc_int32_t chr;
613 cp += get_utf8(cp, -1, &chr);
618 cl[0] = MkIntegerTerm(chr);
622 HR[-1] = Globalize(out->dif PASS_REGS);
630static Atom write_atom(
void *s0,
seq_tv_t *out USES_REGS) {
631 unsigned char *s = s0;
634 return Yap_LookupAtom(
"");
636 size_t leng = strlen(s0);
637 if (strlen_utf8(s0) <= leng) {
638 return Yap_LookupAtom(s0);
640 size_t n = get_utf8(s, -1, &ch);
641 unsigned char *buf =
Malloc(n + 1);
642 memmove(buf, s0, n + 1);
643 return Yap_ULookupAtom(buf);
647void *write_buffer(
unsigned char *s0,
seq_tv_t *out USES_REGS) {
648 int l = push_text_stack();
649 size_t leng = strlen((
char *)s0);
650 size_t min = 0, max = leng;
651 if (out->enc == ENC_ISO_UTF8) {
652 if (out->val.uc == NULL) {
653 out->val.uc =
Malloc(leng + 1);
654 strcpy(out->val.c, (
char *)s0);
655 }
else if (out->val.uc != s0) {
656 out->val.c =
Malloc(leng + 1);
657 strcpy(out->val.c, (
char *)s0);
659 }
else if (out->enc == ENC_ISO_LATIN1) {
661 unsigned char *s = s0;
662 unsigned char *cp = s;
663 unsigned char *buf = out->val.uc;
669 utf8proc_int32_t chr;
670 int off = get_utf8(cp, -1, &chr);
671 if (off <= 0 || chr > 255) {
684 utf8proc_int32_t chr;
686 cp += get_utf8(cp, -1, &chr);
689 }
else if (out->enc == ENC_WCHAR) {
690 unsigned char *s = s0, *lim = s + (max = strnlen((
char *)s0, max));
691 unsigned char *cp = s;
694 buf = buf0 = out->val.w;
699 while (*cp && cp < lim) {
700 utf8proc_int32_t chr;
701 cp += get_utf8(cp, -1, &chr);
708 utf8proc_int32_t chr;
710 cp += get_utf8(cp, -1, &chr);
719 out->val.c = pop_output_text_stack(l, out->val.c);
723static size_t write_length(
const unsigned char *s0,
seq_tv_t *out USES_REGS) {
724 return strlen_utf8(s0);
727static Term write_number(
unsigned char *s,
seq_tv_t *out USES_REGS) {
730 t = Yap_StringToNumberTerm((
char *)s, &out->enc,
false);
735static Term string_to_term(
void *s,
seq_tv_t *out USES_REGS) {
737 int lvl = push_text_stack();
740 o = out->val.t = Yap_BufferToTerm(s, TermNil);
741 LOCAL_ActiveError = Yap_popErrorContext(
true,
false, old);
746bool write_Text(
unsigned char *inp,
seq_tv_t *out USES_REGS) {
749 if (out->type == 0) {
753 if (out->type & (YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG)) {
754 if ((out->val.t = write_number(
755 inp, out PASS_REGS)) != 0L) {
761 if (!(out->type & YAP_STRING_ATOM))
766 if (out->type & (YAP_STRING_ATOM)) {
769 if ((out->val.a = write_atom(inp, out PASS_REGS)) != NIL) {
770 Atom at = out->val.a;
771 if (at && (out->type & YAP_STRING_OUTPUT_TERM))
772 out->val.t = MkAtomTerm(at);
777 if (out->type & YAP_STRING_DATUM) {
778 if ((out->val.t = string_to_term(inp, out PASS_REGS)) != 0L)
779 return out->val.t != 0;
782 switch (out->type & YAP_TYPE_MASK) {
783 case YAP_STRING_CHARS: {
784 void *room = write_buffer(inp, out PASS_REGS);
788 case YAP_STRING_WCHARS: {
789 void *room = write_buffer(inp, out PASS_REGS);
793 case YAP_STRING_STRING:
796 return out->val.t != 0;
797 case YAP_STRING_ATOMS:
798 out->val.t = write_atoms(inp, out PASS_REGS);
800 return out->val.t != 0;
801 case YAP_STRING_CODES:
802 out->val.t = write_codes(inp, out PASS_REGS);
804 return out->val.t != 0;
805 case YAP_STRING_LENGTH:
806 out->val.l = write_length(inp, out PASS_REGS);
808 return out->val.l != (size_t)(-1);
809 case YAP_STRING_ATOM:
810 out->val.a = write_atom(inp, out PASS_REGS);
812 return out->val.a != NULL;
813 case YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG:
814 out->val.t = write_number(inp, out PASS_REGS);
816 if (out->val.t==0 &&(out->type & (YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG |YAP_STRING_ATOM | YAP_STRING_STRING| YAP_STRING_TERM)) ==
817 (YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG))
818 Yap_ThrowError(TYPE_ERROR_NUMBER, MkUStringTerm(inp), NULL);
819 return out->val.t != 0;
820 default: {
return true; }
825static size_t upcase(
void *s0,
seq_tv_t *out USES_REGS) {
827 unsigned char *s = s0;
830 utf8proc_int32_t chr;
831 get_utf8(s, -1, &chr);
832 chr = utf8proc_toupper(chr);
833 s += put_utf8(s, chr);
838static size_t downcase(
void *s0,
seq_tv_t *out USES_REGS) {
840 unsigned char *s = s0;
843 utf8proc_int32_t chr;
844 get_utf8(s, -1, &chr);
845 chr = utf8proc_tolower(chr);
846 s += put_utf8(s, chr);
865 int l = push_text_stack();
866 buf = Yap_readText(inp PASS_REGS);
869 yap_error_number err;
870 if (!(err=gen_type_error(inp->type)))
871 err = TYPE_ERROR_TEXT;
875 size_t leng = strlen_utf8(buf);
876 if (out->type & (YAP_STRING_NCHARS | YAP_STRING_TRUNC)) {
877 if (out->max < leng) {
878 const unsigned char *ptr = skip_utf8(buf, out->max);
879 size_t diff = (ptr - buf);
880 char *nbuf =
Malloc(diff + 1);
881 memmove(nbuf, buf, diff);
888 if (out->type & (YAP_STRING_UPCASE | YAP_STRING_DOWNCASE)) {
889 if (out->type & YAP_STRING_UPCASE) {
890 if (!upcase(buf, out)) {
895 if (out->type & YAP_STRING_DOWNCASE) {
896 if (!downcase(buf, out)) {
903 rc = write_Text(buf, out PASS_REGS);
916 out->val.uc = pop_output_text_stack(l,out->val.uc);
930 unsigned char *nbuf=NULL;
932 int lvl = push_text_stack();
939 for (i = 0; i < tot; i++) {
940 Term t = inp[i].val.t;
941 if (IsAtomTerm(t) && inp[i].type & YAP_STRING_ATOM) {
942 nbuf = RepAtom(AtomOfTerm(t))->UStrOfAE;
944 nbuf = Yap_readText(inp + i PASS_REGS);
953 if (nbuf && nbuf[0]) {
954 size_t sz = strlen((
char*)nbuf);
955 avai = (strlen((
char *)buf) - 1 - sz);
957 extra= (tot-i)*sz+256;
958 buf = Realloc(buf, extra);
960 strcat((
char*)buf,(
char*)nbuf);
964 bool rc = write_Text(buf, out PASS_REGS);
965 pop_text_stack( lvl );
971bool Yap_Splice_Text(
int n,
size_t cuts[],
seq_tv_t *inp,
973 int lvl = push_text_stack();
974 const unsigned char *buf;
977 inp->type |= YAP_STRING_IN_TMP;
978 buf = Yap_readText(inp PASS_REGS);
983 b_l = strlen((
char *)buf);
988 u_l = strlen_utf8(buf);
991 size_t b_l0, b_l1, u_l0, u_l1;
992 unsigned char *buf0, *buf1;
995 buf0 = Yap_readText(outv PASS_REGS);
999 b_l0 = strlen((
const char *)buf0);
1000 if (memcmp(buf, buf0, b_l0) != 0) {
1001 pop_text_stack(lvl);
1004 u_l0 = strlen_utf8(buf0);
1008 buf1 = slice(u_l0, u_l, buf PASS_REGS);
1009 b_l1 = strlen((
const char *)buf1);
1010 bool rc = write_Text(buf1, outv + 1 PASS_REGS);
1011 pop_text_stack(lvl);
1017 buf1 = Yap_readText(outv + 1 PASS_REGS);
1019 pop_text_stack(lvl);
1022 b_l1 = strlen((
char *)buf1);
1023 u_l1 = strlen_utf8(buf1);
1026 if (memcmp(skip_utf8((
const unsigned char *)buf, b_l0), buf1, b_l1) !=
1028 pop_text_stack(lvl);
1031 buf0 = slice(0, u_l0, buf PASS_REGS);
1032 buf0 = pop_output_text_stack(lvl, buf0);
1033 bool rc = write_Text(buf0, outv PASS_REGS);
1039 for (i = 0; i < n; i++) {
1044 if (i > 0 && cuts[i] == 0)
1046 void *bufi = slice(next, cuts[i], buf PASS_REGS);
1047 bufi = pop_output_text_stack(lvl, bufi);
1048 if (!write_Text(bufi, outv + i PASS_REGS)) {
1052 pop_text_stack(lvl);
1076 Term tmod = ap->ModuleOfPred;
1078 char *sn = Yap_AtomToUTF8Text(AtomOfTerm(tmod));
1087 if (smax - s > strlen(
"prolog:")) {
1088 s = strcpy(s,
"prolog:");
1094 if (ap->ModuleOfPred == IDB_MODULE) {
1095 if (ap->PredFlags & NumberDBPredFlag) {
1096 Int key = ap->src.IndxId;
1097 snprintf(s, smax - s,
"%" PRIdPTR, key);
1099 }
else if (ap->PredFlags & AtomDBPredFlag) {
1100 at = (
Atom)(ap->FunctorOfPred);
1101 if (!stpcpy(s, Yap_AtomToUTF8Text(at)))
1104 f = ap->FunctorOfPred;
1105 at = NameOfFunctor(f);
1106 arity = ArityOfFunctor(f);
1109 arity = ap->ArityOfPE;
1111 at = NameOfFunctor(ap->FunctorOfPred);
1113 at = (
Atom)(ap->FunctorOfPred);
1116 if (!stpcpy(s, Yap_AtomToUTF8Text(at))) {
1120 snprintf(s, smax - s,
"/%" PRIdPTR, arity);
1134 if (guide == YAP_STRING_ATOM) {
1135 return MkAtomTerm(Yap_LookupAtom(s));
1136 }
else if (guide == YAP_STRING_STRING) {
1137 return MkStringTerm(s);
1138 }
else if (guide == YAP_STRING_ATOMS) {
1139 return Yap_CharsToListOfAtoms(s, ENC_ISO_UTF8 PASS_REGS);
1141 return Yap_CharsToListOfCodes(s, ENC_ISO_UTF8 PASS_REGS);
void * Malloc(size_t sz USES_REGS)
allocate a temporary text block
yap_error_descriptor_t * Yap_pushErrorContext(bool link, yap_error_descriptor_t *new_error, yap_error_descriptor_t *old_error)
add a new error descriptor, either to the top of the stack, or as the top;
@ write_strings
Writable flag telling whether the system should write lists of integers that are writable character c...
all we need to know about an error/throw
char_kind_t Yap_wide_chtype(int ch)
Term Yap_MkTextTerm(const char *s, int guide USES_REGS)
Convert from a text buffer (8-bit) to a term that has the same type as Tguide
const char * Yap_PredIndicatorToUTF8String(PredEntry *ap, char *s0, size_t sz)
Convert from a predicate structure to an UTF-8 string of the form.