This commit is contained in:
Vitor Santos Costa 2017-09-19 14:23:20 +01:00
parent 27fdeb81cc
commit 4d1c031051

141
C/text.c
View File

@ -271,8 +271,9 @@ st += put_utf8(st,ch);
return -TYPE_ERROR_LIST;
}
st[0] = '\0';
Malloc((st - st0) + 1);
*tailp = l;
*atoms = length;
length = (st-st0);
return length;
}
@ -294,9 +295,9 @@ static unsigned char *latin2utf8(seq_tv_t *inp, size_t *lengp) {
}
*pt++ = '\0';
return buf;
}
}
static unsigned char *wchar2utf8(seq_tv_t *inp, size_t *lengp) {
static unsigned char *wchar2utf8(seq_tv_t *inp, size_t *lengp) {
*lengp = wcslen(inp->val.w);
size_t sz = *lengp * 4;
wchar_t *b0 = inp->val.w;
@ -308,11 +309,11 @@ static unsigned char *wchar2utf8(seq_tv_t *inp, size_t *lengp) {
pt += put_utf8(pt, ch);
*pt++ = '\0';
return buf;
}
}
static void *slice(size_t min, size_t max, const unsigned char *buf USES_REGS);
static void *slice(size_t min, size_t max, const unsigned char *buf USES_REGS);
static unsigned char *to_buffer(unsigned char *buf, Term t, seq_tv_t *inp,
static unsigned char *to_buffer(unsigned char *buf, Term t, seq_tv_t *inp,
bool *widep, Int *atoms,
size_t *lenp USES_REGS) {
CELL *r = NULL;
@ -329,31 +330,31 @@ static unsigned char *to_buffer(unsigned char *buf, Term t, seq_tv_t *inp,
}
*lenp = n;
return bufc;
}
}
static unsigned char *Yap_ListOfCodesToBuffer(unsigned char *buf, Term t,
static unsigned char *Yap_ListOfCodesToBuffer(unsigned char *buf, Term t,
seq_tv_t *inp, bool *widep,
size_t *lenp USES_REGS) {
Int atoms = 1; // we only want lists of atoms
return to_buffer(buf, t, inp, widep, &atoms, lenp PASS_REGS);
}
}
static unsigned char *Yap_ListOfAtomsToBuffer(unsigned char *buf, Term t,
static unsigned char *Yap_ListOfAtomsToBuffer(unsigned char *buf, Term t,
seq_tv_t *inp, bool *widep,
size_t *lenp USES_REGS) {
Int atoms = 2; // we only want lists of integer codes
return to_buffer(buf, t, inp, widep, &atoms, lenp PASS_REGS);
}
}
static unsigned char *Yap_ListToBuffer(unsigned char *buf, Term t,
static unsigned char *Yap_ListToBuffer(unsigned char *buf, Term t,
seq_tv_t *inp, bool *widep,
size_t *lenp USES_REGS) {
Int atoms = 0; // we accept both types of lists.
return to_buffer(buf, t, inp, widep, &atoms, lenp PASS_REGS);
}
}
#if USE_GEN_TYPE_ERROR
static yap_error_number gen_type_error(int flags) {
static yap_error_number gen_type_error(int flags) {
if ((flags & (YAP_STRING_STRING | YAP_STRING_ATOM | YAP_STRING_INT |
YAP_STRING_FLOAT | YAP_STRING_ATOMS_CODES | YAP_STRING_BIG)) ==
(YAP_STRING_STRING | YAP_STRING_ATOM | YAP_STRING_INT | YAP_STRING_FLOAT |
@ -374,12 +375,12 @@ static yap_error_number gen_type_error(int flags) {
if (flags & (YAP_STRING_CODES | YAP_STRING_ATOMS))
return TYPE_ERROR_LIST;
return TYPE_ERROR_NUMBER;
}
}
#endif
// static int cnt;
// static int cnt;
unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) {
unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) {
unsigned char *s0 = NULL;
bool wide;
@ -513,9 +514,9 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) {
return wchar2utf8(inp, lengp);
}
return NULL;
}
}
static Term write_strings(unsigned char *s0, seq_tv_t *out,
static Term write_strings(unsigned char *s0, seq_tv_t *out,
size_t leng USES_REGS) {
size_t min = 0, max = leng;
@ -544,9 +545,9 @@ static Term write_strings(unsigned char *s0, seq_tv_t *out,
out->val.t = t;
return out->val.t;
}
}
static Term write_atoms(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
static Term write_atoms(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
Term t = AbsPair(HR);
size_t sz = 0;
size_t max = leng;
@ -595,9 +596,9 @@ static Term write_atoms(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
}
out->val.t = t;
return (t);
}
}
static Term write_codes(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
static Term write_codes(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
Term t = AbsPair(HR);
size_t sz = 0;
size_t max = leng;
@ -641,9 +642,9 @@ static Term write_codes(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
}
out->val.t = t;
return (t);
}
}
static Atom write_atom(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
static Atom write_atom(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
unsigned char *s = s0;
int32_t ch;
if (leng == 0) {
@ -657,9 +658,9 @@ static Atom write_atom(void *s0, seq_tv_t *out, size_t leng USES_REGS) {
memcpy(buf, s0, n + 1);
return Yap_ULookupAtom(buf);
}
}
}
size_t write_buffer(unsigned char *s0, seq_tv_t *out, size_t leng USES_REGS) {
size_t write_buffer(unsigned char *s0, seq_tv_t *out, size_t leng USES_REGS) {
size_t min = 0, max = leng, room_end;
if (out->enc == ENC_ISO_UTF8) {
room_end = strlen((char *)s0) + 1;
@ -725,29 +726,29 @@ size_t write_buffer(unsigned char *s0, seq_tv_t *out, size_t leng USES_REGS) {
room_end = -1;
}
return room_end;
}
}
static size_t write_length(const unsigned char *s0, seq_tv_t *out,
static size_t write_length(const unsigned char *s0, seq_tv_t *out,
size_t leng USES_REGS) {
return leng;
}
}
static Term write_number(unsigned char *s, seq_tv_t *out, int size,
static Term write_number(unsigned char *s, seq_tv_t *out, int size,
bool error_on USES_REGS) {
Term t;
int i = push_text_stack();
t = Yap_StringToNumberTerm((char *)s, &out->enc, error_on);
pop_text_stack(i);
return t;
}
}
static Term string_to_term(void *s, seq_tv_t *out, size_t leng USES_REGS) {
static Term string_to_term(void *s, seq_tv_t *out, size_t leng USES_REGS) {
Term o;
o = out->val.t = Yap_BufferToTerm(s, strlen(s) + 1, TermNil);
return o;
}
}
bool write_Text(unsigned char *inp, seq_tv_t *out, size_t leng USES_REGS) {
bool write_Text(unsigned char *inp, seq_tv_t *out, size_t leng USES_REGS) {
/* we know what the term is */
if (out->type == 0) {
return true;
@ -816,9 +817,9 @@ bool write_Text(unsigned char *inp, seq_tv_t *out, size_t leng USES_REGS) {
default: { return true; }
}
return false;
}
}
static size_t upcase(void *s0, seq_tv_t *out USES_REGS) {
static size_t upcase(void *s0, seq_tv_t *out USES_REGS) {
unsigned char *s = s0;
while (*s) {
@ -829,9 +830,9 @@ static size_t upcase(void *s0, seq_tv_t *out USES_REGS) {
s += put_utf8(s, chr);
}
return true;
}
}
static size_t downcase(void *s0, seq_tv_t *out USES_REGS) {
static size_t downcase(void *s0, seq_tv_t *out USES_REGS) {
unsigned char *s = s0;
while (*s) {
@ -842,9 +843,9 @@ static size_t downcase(void *s0, seq_tv_t *out USES_REGS) {
s += put_utf8(s, chr);
}
return true;
}
}
bool Yap_CVT_Text(seq_tv_t *inp, seq_tv_t *out USES_REGS) {
bool Yap_CVT_Text(seq_tv_t *inp, seq_tv_t *out USES_REGS) {
unsigned char *buf;
bool rc;
@ -857,7 +858,7 @@ bool Yap_CVT_Text(seq_tv_t *inp, seq_tv_t *out USES_REGS) {
else if (inp->type & YAP_STRING_WCHARS) fprintf(stderr,"S %S\n", inp->val
.w);
else fprintf(stderr,"s %s\n", inp->val.c);
*/
*/
// cnt++;
buf = Yap_readText(inp, &leng PASS_REGS);
if (out->type & (YAP_STRING_NCHARS | YAP_STRING_TRUNC)) {
@ -903,10 +904,10 @@ bool Yap_CVT_Text(seq_tv_t *inp, seq_tv_t *out USES_REGS) {
fprintf(stderr, "%s", out->val.c);
fprintf(stderr, "\n]\n"); */
return rc;
}
}
static unsigned char *concat(int n, void *sv[] USES_REGS) {
static unsigned char *concat(int n, void *sv[] USES_REGS) {
void *buf;
unsigned char *buf0;
size_t room = 0;
@ -926,9 +927,9 @@ static unsigned char *concat(int n, void *sv[] USES_REGS) {
#endif
}
return buf0;
}
}
static void *slice(size_t min, size_t max, const unsigned char *buf USES_REGS) {
static void *slice(size_t min, size_t max, const unsigned char *buf USES_REGS) {
unsigned char *nbuf = Malloc((max - min) * 4 + 1);
const unsigned char *ptr = skip_utf8(buf, min);
unsigned char *nptr = nbuf;
@ -940,11 +941,11 @@ static void *slice(size_t min, size_t max, const unsigned char *buf USES_REGS) {
}
nptr[0] = '\0';
return nbuf;
}
}
//
// Out must be an atom or a string
bool Yap_Concat_Text(int tot, seq_tv_t inp[], seq_tv_t *out USES_REGS) {
//
// Out must be an atom or a string
bool Yap_Concat_Text(int tot, seq_tv_t inp[], seq_tv_t *out USES_REGS) {
void **bufv;
unsigned char *buf;
int i;
@ -968,10 +969,10 @@ bool Yap_Concat_Text(int tot, seq_tv_t inp[], seq_tv_t *out USES_REGS) {
bool rc = write_Text(buf, out, strlen_utf8(buf) PASS_REGS);
return rc;
}
}
//
bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp,
//
bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp,
seq_tv_t outv[] USES_REGS) {
const unsigned char *buf;
size_t b_l, u_l;
@ -1038,24 +1039,24 @@ bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp,
}
return true;
}
}
/**
/**
* Function to convert a generic text term (string, atom, list of codes, list
of<
atoms) into a buff
er.
of<
atoms) into a buff
er.
*
* @param t the term
* @param buf the buffer, if NULL a buffer is malloced, and the user should
reclai it
reclai it
* @param len buffer size
* @param enc encoding (UTF-8 is strongly recommended)
*
* @return the buffer, or NULL in case of failure. If so, Yap_Error may be
called.
called.
*/
const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) {
const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) {
CACHE_REGS
seq_tv_t inp, out;
inp.val.t = t;
@ -1077,9 +1078,9 @@ const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) {
if (!Yap_CVT_Text(&inp, &out PASS_REGS))
return NULL;
return out.val.c;
}
}
/**
/**
* Convert from a predicate structure to an UTF-8 string of the form
*
* module:name/arity.
@ -1090,7 +1091,7 @@ const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) {
*
* @return the temporary string
*/
const char *Yap_PredIndicatorToUTF8String(PredEntry *ap) {
const char *Yap_PredIndicatorToUTF8String(PredEntry *ap) {
CACHE_REGS
Atom at;
arity_t arity = 0;
@ -1144,18 +1145,18 @@ const char *Yap_PredIndicatorToUTF8String(PredEntry *ap) {
s += strlen(s);
snprintf(s, smax - s, "/%" PRIdPTR, arity);
return s0;
}
}
/**
/**
* Convert from a text buffer (8-bit) to a term that has the same type as
* _Tguide_
*
* @param s the buffer
* @param tguide the guide
* @param tguide the guide
*
* @return the term
* @return the term
*/
Term Yap_MkTextTerm(const char *s, encoding_t enc, Term tguide) {
Term Yap_MkTextTerm(const char *s, encoding_t enc, Term tguide) {
CACHE_REGS
if (IsAtomTerm(tguide))
return MkAtomTerm(Yap_LookupAtom(s));
@ -1165,4 +1166,4 @@ Term Yap_MkTextTerm(const char *s, encoding_t enc, Term tguide) {
return Yap_CharsToListOfAtoms(s, enc PASS_REGS);
}
return Yap_CharsToListOfCodes(s, enc PASS_REGS);
}
}