remove chtypes

This commit is contained in:
Vítor Santos Costa 2015-10-22 00:39:10 +01:00
parent bcdfdeb65d
commit 098be4aba0
4 changed files with 327 additions and 297 deletions

View File

@ -8,9 +8,9 @@
* *
**************************************************************************
* *
* File: charcodes.c *
* File: charcodes.c *
* Last rev: 5/2/88 *
* mods: *
* mods: *
* comments: Character codes and character conversion *
* *
*************************************************************************/
@ -60,7 +60,7 @@ static Int p_change_type_of_char(USES_REGS1);
Term Yap_StringToNumberTerm(char *s, encoding_t *encp) {
CACHE_REGS
int sno;
int sno;
Term t;
sno = Yap_open_buf_read_stream(s, strlen(s), encp, MEM_BUF_USER);
@ -87,15 +87,15 @@ typedef struct enc_map {
} enc_map_t;
static enc_map_t ematches[] = {
{"UTF-8", ENC_ISO_UTF8},
{"UTF-16", ENC_UTF16_LE}, // ok, this is a very bad name
{"UCS-2", ENC_UTF16_LE}, // ok, this is probably gone by now
{"ISO-LATIN1", ENC_ISO_LATIN1},
{"ISO-8859-1", ENC_ISO_LATIN1},
{"Windows-1252", ENC_ISO_LATIN1}, // almost, but not quite
{"CP-1252", ENC_ISO_LATIN1},
{"C", ENC_ISO_ASCII},
{NULL, ENC_OCTET}};
{"UTF-8", ENC_ISO_UTF8},
{"UTF-16", ENC_UTF16_LE}, // ok, this is a very bad name
{"UCS-2", ENC_UTF16_LE}, // ok, this is probably gone by now
{"ISO-LATIN1", ENC_ISO_LATIN1},
{"ISO-8859-1", ENC_ISO_LATIN1},
{"Windows-1252", ENC_ISO_LATIN1}, // almost, but not quite
{"CP-1252", ENC_ISO_LATIN1},
{"C", ENC_ISO_ASCII},
{NULL, ENC_OCTET}};
static encoding_t DefaultEncoding(void) {
encoding_t rc;
@ -119,8 +119,8 @@ static encoding_t DefaultEncoding(void) {
}
i++;
}
// by default, return UTF-8
// except in _WIN32
// by default, return UTF-8
// except in _WIN32
#ifdef _WIN32
rc = ENC_UTF16_BE;
#else
@ -137,12 +137,12 @@ static encoding_t DefaultEncoding(void) {
encoding_t Yap_DefaultEncoding(void) {
CACHE_REGS
return LOCAL_encoding;
return LOCAL_encoding;
}
void Yap_SetDefaultEncoding(encoding_t new_encoding) {
CACHE_REGS
LOCAL_encoding = new_encoding;
LOCAL_encoding = new_encoding;
}
static Int get_default_encoding(USES_REGS1) {
@ -152,7 +152,7 @@ static Int get_default_encoding(USES_REGS1) {
static Int p_encoding(USES_REGS1) { /* '$encoding'(Stream,N) */
int sno =
Yap_CheckStream(ARG1, Input_Stream_f | Output_Stream_f, "encoding/2");
Yap_CheckStream(ARG1, Input_Stream_f | Output_Stream_f, "encoding/2");
Term t = Deref(ARG2);
if (sno < 0)
return FALSE;
@ -165,44 +165,6 @@ static Int p_encoding(USES_REGS1) { /* '$encoding'(Stream,N) */
return TRUE;
}
static Int toupper2(USES_REGS1) {
Int out = IntegerOfTerm(Deref(ARG1)), uout;
if (out < 0) {
Yap_Error(REPRESENTATION_ERROR_CHARACTER_CODE, ARG1, "toupper");
return FALSE;
}
if (out < 128)
uout = toupper(out);
else
uout = towupper(out);
return Yap_unify(ARG2, MkIntegerTerm(uout));
}
static Int tolower2(USES_REGS1) {
Int out = IntegerOfTerm(Deref(ARG1)), uout;
if (out < 0) {
Yap_Error(REPRESENTATION_ERROR_CHARACTER_CODE, ARG1, "tolower");
return FALSE;
}
if (out < 128)
uout = tolower(out);
else
uout = towlower(out);
return Yap_unify(ARG2, MkIntegerTerm(uout));
}
static Int
p_change_type_of_char(USES_REGS1) { /* change_type_of_char(+char,+type) */
Term t1 = Deref(ARG1);
Term t2 = Deref(ARG2);
if (!IsVarTerm(t1) && !IsIntegerTerm(t1))
return FALSE;
if (!IsVarTerm(t2) && !IsIntegerTerm(t2))
return FALSE;
Yap_chtype[IntegerOfTerm(t1)] = IntegerOfTerm(t2);
return TRUE;
}
static int get_char(Term t) {
if (IsVarTerm(t = Deref(t))) {
Yap_Error(INSTANTIATION_ERROR, t, NULL);
@ -248,6 +210,126 @@ static int get_code(Term t) {
return ch;
}
static int get_char_or_code(Term t, bool *is_char) {
if (!IsAtomTerm(t)) {
if (!IsIntegerTerm(t)) {
Yap_Error(TYPE_ERROR_CHARACTER, t, NULL);
return 0;
}
Int ch = IntegerOfTerm(t);
if (ch < -1) {
Yap_Error(REPRESENTATION_ERROR_CHARACTER_CODE, t, NULL);
return 0;
}
*is_char = false;
return ch;
}
Atom at = AtomOfTerm(t);
if (IsWideAtom(at)) {
wchar_t *s0 = RepAtom(AtomOfTerm(t))->WStrOfAE;
if (s0[1] != '\0') {
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t, NULL);
return 0;
}
*is_char = true;
return s0[0];
} else {
char *s0 = RepAtom(AtomOfTerm(t))->StrOfAE;
if (s0[1] != '\0') {
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t, NULL);
return 0;
}
*is_char = true;
return s0[0];
}
return 0;
}
static Int toupper2(USES_REGS1) {
bool is_char = false;
Term t;
if (!IsVarTerm(t = Deref(ARG1))) {
Int out = get_char_or_code(t, &is_char), uout;
if (out < 128)
uout = toupper(out);
else
uout = towupper(out);
if (is_char)
return Yap_unify(ARG2, MkCharTerm(uout));
else
return Yap_unify(ARG2, MkIntegerTerm(uout));
} else if (!IsVarTerm(t = Deref(ARG2))) {
Int uout = get_char_or_code(t, &is_char), out;
char_kind_t charp = Yap_wide_chtype(uout);
if (charp == UC) {
if (uout < 128)
out = tolower(uout);
else
out = towlower(uout);
} else if (charp == LC) {
return false;
} else {
out = uout;
}
if (is_char)
return Yap_unify(ARG2, MkCharTerm(out));
else
return Yap_unify(ARG2, MkIntegerTerm(out));
} else {
Yap_Error(INSTANTIATION_ERROR, ARG1, NULL);
}
return false;
}
static Int tolower2(USES_REGS1) {
bool is_char = false;
Term t;
if (!IsVarTerm(t = Deref(ARG1))) {
bool is_char = false;
Int out = get_char_or_code(ARG1, &is_char), uout;
if (out < 128)
uout = tolower(out);
else
uout = towlower(out);
if (is_char)
return Yap_unify(ARG2, MkCharTerm(uout));
else
return Yap_unify(ARG2, MkIntegerTerm(uout));
} else if (IsVarTerm(t = Deref(ARG2))) {
Int uout = get_char_or_code(t, &is_char), out;
char_kind_t charp = Yap_wide_chtype(uout);
if (charp == LC) {
if (uout < 128)
out = toupper(uout);
else
out = towupper(uout);
} else if (charp == UC) {
return false;
} else {
out = uout;
}
if (is_char)
return Yap_unify(ARG2, MkCharTerm(out));
else
return Yap_unify(ARG2, MkIntegerTerm(out));
} else {
Yap_Error(INSTANTIATION_ERROR, ARG1, NULL);
}
return false;
}
static Int
p_change_type_of_char(USES_REGS1) { /* change_type_of_char(+char,+type) */
Term t1 = Deref(ARG1);
Term t2 = Deref(ARG2);
if (!IsVarTerm(t1) && !IsIntegerTerm(t1))
return FALSE;
if (!IsVarTerm(t2) && !IsIntegerTerm(t2))
return FALSE;
Yap_chtype[IntegerOfTerm(t1)] = IntegerOfTerm(t2);
return TRUE;
}
static Int char_type_alnum(USES_REGS1) {
int ch = get_char(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
@ -281,12 +363,18 @@ static Int char_type_white(USES_REGS1) {
int ch = get_char(ARG1);
if (ch < 256) {
char_kind_t k = Yap_chtype[ch];
return k >= UC && k <= LC;
return k == BS;
}
utf8proc_category_t ct = utf8proc_category(ch);
return ct == UTF8PROC_CATEGORY_ZS;
}
static Int char_type_cntrl(USES_REGS1) {
Int ch = get_char(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
return k == BG;
}
static Int char_type_digit(USES_REGS1) {
Int ch = get_char(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
@ -296,12 +384,11 @@ static Int char_type_digit(USES_REGS1) {
static Int char_type_xdigit(USES_REGS1) {
Int ch = get_char(ARG1);
#if HAVE_ISWXDIGIT
return iswxdigit( ch );
return iswxdigit(ch);
#elif HAVE_ISWHEXNUMBER
return iswhexnumber(ch);
#else
return iswdigit(ch) || ( (ch >= 'a' && ch <= 'f') &&
(ch >= 'A' && ch <= 'F') );
return iswdigit(ch) || ((ch >= 'a' && ch <= 'f') && (ch >= 'A' && ch <= 'F'));
#endif
}
@ -363,7 +450,6 @@ static Int char_type_newline(USES_REGS1) {
return false;
}
static Int char_type_period(USES_REGS1) {
Int ch = get_char(ARG1);
return ch == '.' || ch == '!' || ch == '?';
@ -399,7 +485,7 @@ static Int char_type_prolog_identifier_continue(USES_REGS1) {
return k >= UC && k <= NU;
}
static Int char_type_prolog_symbol(USES_REGS1) {
static Int char_type_prolog_prolog_symbol(USES_REGS1) {
int ch = get_char(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
return k == SL && k == SY;
@ -438,12 +524,18 @@ static Int code_type_white(USES_REGS1) {
int ch = get_code(ARG1);
if (ch < 256) {
char_kind_t k = Yap_chtype[ch];
return k >= UC && k <= LC;
return k == BS;
}
utf8proc_category_t ct = utf8proc_category(ch);
return ct == UTF8PROC_CATEGORY_ZS;
}
static Int code_type_cntrl(USES_REGS1) {
Int ch = get_code(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
return k == BG;
}
static Int code_type_digit(USES_REGS1) {
Int ch = get_code(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
@ -453,12 +545,11 @@ static Int code_type_digit(USES_REGS1) {
static Int code_type_xdigit(USES_REGS1) {
Int ch = get_code(ARG1);
#if HAVE_ISWXDIGIT
return iswxdigit( ch );
return iswxdigit(ch);
#elif HAVE_ISWHEXNUMBER
return iswhexnumber(ch);
#else
return iswdigit(ch) || ( (ch >= 'a' && ch <= 'f') &&
(ch >= 'A' && ch <= 'F') );
return iswdigit(ch) || ((ch >= 'a' && ch <= 'f') && (ch >= 'A' && ch <= 'F'));
#endif
}
@ -520,7 +611,6 @@ static Int code_type_newline(USES_REGS1) {
return false;
}
static Int code_type_period(USES_REGS1) {
Int ch = get_code(ARG1);
return ch == '.' || ch == '!' || ch == '?';
@ -556,13 +646,12 @@ static Int code_type_prolog_identifier_continue(USES_REGS1) {
return k >= UC && k <= NU;
}
static Int code_type_prolog_symbol(USES_REGS1) {
static Int code_type_prolog_prolog_symbol(USES_REGS1) {
int ch = get_code(ARG1);
char_kind_t k = Yap_wide_chtype(ch);
return k == SL && k == SY;
}
int ISOWGetc(int sno) {
int ch = GLOBAL_Stream[sno].stream_wgetc(sno);
if (ch != EOF && GLOBAL_CharConversionTable != NULL) {
@ -594,8 +683,7 @@ static Int p_disable_char_conversion(USES_REGS1) {
for (i = 0; i < MaxStreams; i++) {
if (!(GLOBAL_Stream[i].status & Free_Stream_f))
GLOBAL_Stream[i].stream_wgetc_for_read =
GLOBAL_Stream[i].stream_wgetc;
GLOBAL_Stream[i].stream_wgetc_for_read = GLOBAL_Stream[i].stream_wgetc;
}
GLOBAL_CharConversionTable = NULL;
return (TRUE);
@ -639,17 +727,17 @@ static Int char_conversion(USES_REGS1) {
if (s0[0] == s1[0])
return (TRUE);
GLOBAL_CharConversionTable2 =
Yap_AllocCodeSpace(NUMBER_OF_CHARS * sizeof(char));
Yap_AllocCodeSpace(NUMBER_OF_CHARS * sizeof(char));
while (GLOBAL_CharConversionTable2 == NULL) {
if (!Yap_growheap(FALSE, NUMBER_OF_CHARS * sizeof(char), NULL)) {
Yap_Error(RESOURCE_ERROR_HEAP, TermNil, LOCAL_ErrorMessage);
return (FALSE);
Yap_Error(RESOURCE_ERROR_HEAP, TermNil, LOCAL_ErrorMessage);
return (FALSE);
}
}
if (trueGlobalPrologFlag(CHAR_CONVERSION_FLAG)) {
CACHE_REGS
if (p_force_char_conversion(PASS_REGS1) == FALSE)
return (FALSE);
if (p_force_char_conversion(PASS_REGS1) == FALSE)
return (FALSE);
}
for (i = 0; i < NUMBER_OF_CHARS; i++)
GLOBAL_CharConversionTable2[i] = i;
@ -673,14 +761,12 @@ static Int p_current_char_conversion(USES_REGS1) {
return (FALSE);
}
if (!IsAtomTerm(t)) {
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t,
"current_char_conversion/2");
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t, "current_char_conversion/2");
return (FALSE);
}
s0 = RepAtom(AtomOfTerm(t))->UStrOfAE;
if (s0[1] != '\0') {
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t,
"current_char_conversion/2");
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t, "current_char_conversion/2");
return (FALSE);
}
t1 = Deref(ARG2);
@ -693,18 +779,16 @@ static Int p_current_char_conversion(USES_REGS1) {
return (Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(out))));
}
if (!IsAtomTerm(t1)) {
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t1,
"current_char_conversion/2");
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t1, "current_char_conversion/2");
return (FALSE);
}
s1 = RepAtom(AtomOfTerm(t1))->UStrOfAE;
if (s1[1] != '\0') {
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t1,
"current_char_conversion/2");
Yap_Error(REPRESENTATION_ERROR_CHARACTER, t1, "current_char_conversion/2");
return (FALSE);
} else {
return (GLOBAL_CharConversionTable[(int)s0[0]] == '\0' &&
GLOBAL_CharConversionTable[(int)s0[0]] == s1[0]);
GLOBAL_CharConversionTable[(int)s0[0]] == s1[0]);
}
}
@ -733,27 +817,27 @@ static Int p_all_char_conversions(USES_REGS1) {
}
void Yap_InitChtypes(void) {
CACHE_REGS
DefaultEncoding();
Yap_InitCPred("$change_type_of_char", 2, p_change_type_of_char,
SafePredFlag | SyncPredFlag | HiddenPredFlag);
SafePredFlag | SyncPredFlag | HiddenPredFlag);
Yap_InitCPred("toupper", 2, toupper2, SafePredFlag);
Yap_InitCPred("tolower", 2, tolower2, SafePredFlag);
Yap_InitCPred("char_conversion", 2, char_conversion, SyncPredFlag);
Yap_InitCPred("$get_default_encoding", 1, get_default_encoding,
SafePredFlag | HiddenPredFlag);
SafePredFlag | HiddenPredFlag);
Yap_InitCPred("$encoding", 2, p_encoding, SafePredFlag | SyncPredFlag),
Yap_InitCPred("$current_char_conversion", 2,
p_current_char_conversion,
SyncPredFlag | HiddenPredFlag);
Yap_InitCPred("$current_char_conversion", 2, p_current_char_conversion,
SyncPredFlag | HiddenPredFlag);
Yap_InitCPred("$all_char_conversions", 1, p_all_char_conversions,
SyncPredFlag | HiddenPredFlag);
SyncPredFlag | HiddenPredFlag);
Yap_InitCPred("$force_char_conversion", 0, p_force_char_conversion,
SyncPredFlag | HiddenPredFlag);
SyncPredFlag | HiddenPredFlag);
Yap_InitCPred("$disable_char_conversion", 0, p_disable_char_conversion,
SyncPredFlag | HiddenPredFlag);
SyncPredFlag | HiddenPredFlag);
CurrentModule = CHTYPE_MODULE;
Yap_InitCPred("char_type_alnum", 1, char_type_alnum, SafePredFlag);
Yap_InitCPred("char_type_alpha", 1, char_type_alpha, SafePredFlag);
@ -761,6 +845,7 @@ void Yap_InitChtypes(void) {
Yap_InitCPred("char_type_csymf", 1, char_type_csymf, SafePredFlag);
Yap_InitCPred("char_type_ascii", 1, char_type_ascii, SafePredFlag);
Yap_InitCPred("char_type_white", 1, char_type_white, SafePredFlag);
Yap_InitCPred("char_type_cntrl", 1, char_type_cntrl, SafePredFlag);
Yap_InitCPred("char_type_digit", 1, char_type_digit, SafePredFlag);
Yap_InitCPred("char_type_xdigit", 1, char_type_xdigit, SafePredFlag);
Yap_InitCPred("char_type_graph", 1, char_type_graph, SafePredFlag);
@ -769,54 +854,50 @@ void Yap_InitChtypes(void) {
Yap_InitCPred("char_type_punct", 1, char_type_punct, SafePredFlag);
Yap_InitCPred("char_type_space", 1, char_type_space, SafePredFlag);
Yap_InitCPred("char_type_end_of_file", 1, char_type_end_of_file,
SafePredFlag);
SafePredFlag);
Yap_InitCPred("char_type_end_of_line", 1, char_type_end_of_line,
SafePredFlag);
SafePredFlag);
Yap_InitCPred("char_type_newline", 1, char_type_newline, SafePredFlag);
Yap_InitCPred("char_type_period", 1, char_type_period, SafePredFlag);
Yap_InitCPred("char_type_quote", 1, char_type_quote, SafePredFlag);
Yap_InitCPred("char_type_paren", 1, char_type_paren, SafePredFlag);
Yap_InitCPred("char_type_prolog_var_start", 1, char_type_prolog_var_start,
SafePredFlag);
Yap_InitCPred("char_type_prolog_symbol", 1, char_type_prolog_symbol,
SafePredFlag);
Yap_InitCPred("char_type_prolog_atom_start", 1,
char_type_prolog_atom_start, SafePredFlag);
Yap_InitCPred("char_type_prolog_identifier_continue", 1,
char_type_prolog_identifier_continue, SafePredFlag);
Yap_InitCPred("char_typetype_prolog_symbol", 1,
char_type_prolog_symbol,
SafePredFlag);
Yap_InitCPred("code_type_alnum", 1, code_type_alnum, SafePredFlag);
Yap_InitCPred("code_type_alpha", 1, code_type_alpha, SafePredFlag);
Yap_InitCPred("code_type_csym", 1, code_type_csym, SafePredFlag);
Yap_InitCPred("code_type_csymf", 1, code_type_csymf, SafePredFlag);
Yap_InitCPred("code_type_ascii", 1, code_type_ascii, SafePredFlag);
Yap_InitCPred("code_type_white", 1, code_type_white, SafePredFlag);
Yap_InitCPred("code_type_digit", 1, code_type_digit, SafePredFlag);
Yap_InitCPred("code_type_xdigit", 1, code_type_xdigit, SafePredFlag);
Yap_InitCPred("code_type_graph", 1, code_type_graph, SafePredFlag);
Yap_InitCPred("code_type_lower", 1, code_type_lower, SafePredFlag);
Yap_InitCPred("code_type_upper", 1, code_type_upper, SafePredFlag);
Yap_InitCPred("code_type_punct", 1, code_type_punct, SafePredFlag);
Yap_InitCPred("code_type_space", 1, code_type_space, SafePredFlag);
Yap_InitCPred("code_type_end_of_file", 1, code_type_end_of_file,
SafePredFlag);
Yap_InitCPred("code_type_end_of_line", 1, code_type_end_of_line,
SafePredFlag);
Yap_InitCPred("code_type_newline", 1, code_type_newline, SafePredFlag);
Yap_InitCPred("code_type_period", 1, code_type_period, SafePredFlag);
Yap_InitCPred("code_type_quote", 1, code_type_quote, SafePredFlag);
Yap_InitCPred("code_type_paren", 1, code_type_paren, SafePredFlag);
Yap_InitCPred("code_type_prolog_var_start", 1,
code_type_prolog_var_start, SafePredFlag);
Yap_InitCPred("code_type_prolog_symbol", 1, code_type_prolog_symbol,
SafePredFlag);
Yap_InitCPred("code_type_prolog_atom_start", 1,
code_type_prolog_atom_start, SafePredFlag);
Yap_InitCPred("code_type_prolog_identifier_continue", 1,
code_type_prolog_identifier_continue, SafePredFlag);
Yap_InitCPred("code_type_prolog_symbol", 1, code_type_prolog_symbol,
SafePredFlag);
SafePredFlag);
Yap_InitCPred("char_type_prolog_atom_start", 1, char_type_prolog_atom_start,
SafePredFlag);
Yap_InitCPred("char_type_prolog_identifier_continue", 1,
char_type_prolog_identifier_continue, SafePredFlag);
Yap_InitCPred("char_type_prolog_prolog_symbol", 1,
char_type_prolog_prolog_symbol, SafePredFlag);
Yap_InitCPred("code_type_alnum", 1, code_type_alnum, SafePredFlag);
Yap_InitCPred("code_type_alpha", 1, code_type_alpha, SafePredFlag);
Yap_InitCPred("code_type_csym", 1, code_type_csym, SafePredFlag);
Yap_InitCPred("code_type_csymf", 1, code_type_csymf, SafePredFlag);
Yap_InitCPred("code_type_ascii", 1, code_type_ascii, SafePredFlag);
Yap_InitCPred("code_type_white", 1, code_type_white, SafePredFlag);
Yap_InitCPred("code_type_cntrl", 1, code_type_cntrl, SafePredFlag);
Yap_InitCPred("code_type_digit", 1, code_type_digit, SafePredFlag);
Yap_InitCPred("code_type_xdigit", 1, code_type_xdigit, SafePredFlag);
Yap_InitCPred("code_type_graph", 1, code_type_graph, SafePredFlag);
Yap_InitCPred("code_type_lower", 1, code_type_lower, SafePredFlag);
Yap_InitCPred("code_type_upper", 1, code_type_upper, SafePredFlag);
Yap_InitCPred("code_type_punct", 1, code_type_punct, SafePredFlag);
Yap_InitCPred("code_type_space", 1, code_type_space, SafePredFlag);
Yap_InitCPred("code_type_end_of_file", 1, code_type_end_of_file,
SafePredFlag);
Yap_InitCPred("code_type_end_of_line", 1, code_type_end_of_line,
SafePredFlag);
Yap_InitCPred("code_type_newline", 1, code_type_newline, SafePredFlag);
Yap_InitCPred("code_type_period", 1, code_type_period, SafePredFlag);
Yap_InitCPred("code_type_quote", 1, code_type_quote, SafePredFlag);
Yap_InitCPred("code_type_paren", 1, code_type_paren, SafePredFlag);
Yap_InitCPred("code_type_prolog_var_start", 1, code_type_prolog_var_start,
SafePredFlag);
Yap_InitCPred("code_type_prolog_atom_start", 1, code_type_prolog_atom_start,
SafePredFlag);
Yap_InitCPred("code_type_prolog_identifier_continue", 1,
code_type_prolog_identifier_continue, SafePredFlag);
Yap_InitCPred("code_type_prolog_prolog_symbol", 1,
code_type_prolog_prolog_symbol, SafePredFlag);
CurrentModule = PROLOG_MODULE;
}
}

View File

@ -14,7 +14,7 @@
The Prolog library includes a set of built-in predicates designed to
support manipulation of sequences of text, represented either as
lists, atoms or strings.
lists, atoms or strings.
The char_type family of predicates support manipulation of individual characters, represented either as numbers (codes) or atoms (chars).
@ -51,7 +51,7 @@ different types.
+ alnum
Char is a letter (upper- or lowercase) or digit.
+alpha
Char is a letter (upper- or lowercase).
@ -139,71 +139,138 @@ Char is an uppercase version of Lower. Only true if Char is uppercase and Lower
:- discontiguous digit_weight/2, digit_weight/3.
char_type( CH, TYPE) :-
( var( CH ) -> between(-1,+inf,CH) ).
char_type( ALNUM, alnum) :-
prolog:char_type( CH, TYPE) :-
( var( CH ) -> between(-1,+inf,CH) ),
prolog:char_type( CH, TYPE) .
prolog:char_type( ALNUM, alnum) :-
char_type_alnum( ALNUM ).
char_type( ALPHA, alpha) :-
prolog:char_type( ALPHA, alpha) :-
char_type_alpha( ALPHA).
char_type( CSYM, csym) :-
prolog:char_type( CSYM, csym) :-
char_type_csym( CSYM ).
char_type( CSYMF, csymf) :-
prolog:char_type( CSYMF, csymf) :-
char_type_csymf( CSYMF).
char_type( ASCII, ascii ) :-
prolog:char_type( ASCII, ascii ) :-
char_type_ascii( ASCII ).
char_type( WHITE, white) :-
prolog:char_type( WHITE, white) :-
char_type_white( WHITE ).
char_type( CNTRL , cntrl) :-
prolog:char_type( CNTRL , cntrl) :-
char_type_cntrl( CNTRL ).
char_type( DIGIT , digit) :-
prolog:char_type( DIGIT , digit) :-
char_type_digit( DIGIT ).
char_type( DIGIT, digit(Weight) ) :-
prolog:char_type( DIGIT, digit(Weight) ) :-
char_type_digit( DIGIT ),
digit_weight( DIGIT, Weight ).
char_type( XDIGIT, sdigit(Weight) ) :-
char_type_digit( DIGIT ),
xdigit_weight( DIGIT, Weight ).
char_type( GRAPH , graph) :-
prolog:char_type( XDIGIT, xdigit(Weight) ) :-
char_type_digit( XDIGIT ),
xdigit_weight( XDIGIT, Weight ).
prolog:char_type( GRAPH , graph) :-
char_type_graph( GRAPH ).
char_type( LOWER , lower) :-
prolog:char_type( LOWER , lower) :-
char_type_lower( LOWER ).
char_type( LOWER, lower( Upper)) :-
prolog:char_type( LOWER, lower( Upper)) :-
toupper( LOWER, Upper),
char_type_lower( LOWER ),
tolower( Upper, LOWER).
char_type( LOWER, to_lower( Upper))
tolower( Upper, LOWER).
char_type( UPPER, upper ) :-
char_type_upper( upper ).
char_type( UPPER , upper( Lower)) :-
prolog:char_type( LOWER, to_lower( Upper))
toupper( LOWER, Upper).
prolog:char_type( UPPER, upper ) :-
char_type_upper( UPPER ).
prolog:char_type( UPPER , upper( Lower)) :-
char_type_upper( UPPER ),
toupper( Upper, Lower).
char_type( UPPER, to_upper( Lower) ) :-
toupper( Upper,Lower).
char_type( PUNCT , punct) :-
prolog:char_type( UPPER, to_upper( Lower) ) :-
tolower( UPPER, Lower),
char_type_upper( UPPER).
prolog:char_type( PUNCT , punct) :-
char_type_punct( PUNCT ).
char_type( SPACE , space) :-
prolog:char_type( SPACE , space) :-
char_type_space( SPACE ).
char_type( END_OF_FILE , end_of_file) :-
prolog:char_type( END_OF_FILE , end_of_file) :-
char_type_end_of_file( END_OF_FILE ).
char_type( END_OF_LINE , end_of_line) :-
prolog:char_type( END_OF_LINE , end_of_line) :-
char_type_end_of_line( END_OF_LINE ).
char_type( NEWLINE , newline) :-
char_type( _newline( NEWLINE ).
char_type( PERIOD , period) :-
char_type(_period( PERIOD ).
char_type( QUOTE , quote) :-
prolog:char_type( NEWLINE , newline) :-
char_type_newline( NEWLINE ).
prolog:char_type( PERIOD , period) :-
char_type_period( PERIOD ).
prolog:char_type( QUOTE , quote) :-
char_type_quote( QUOTE ).
char_type( Parent_Open paren( PAREN_CLOSE) ) :-
prolog:char_type( Parent_Open, paren( PAREN_CLOSE) ) :-
paren_paren(Parent_Open, PAREN_CLOSE).
char_type( PROLOG_VAR_START , prolog_var_start) :-
prolog:char_type( PROLOG_VAR_START , prolog_var_start) :-
char_type_prolog_var_start( PROLOG_VAR_START ).
char_type( PROLOG_ATOM_START , prolog_atom_start) :-
prolog:char_type( PROLOG_ATOM_START , prolog_atom_start) :-
char_type_prolog_atom_start( PROLOG_ATOM_START ).
char_type( PROLOG_IDENTIFIER_CONTINUE , prolog_identifier_continue) :-
prolog:char_type( PROLOG_IDENTIFIER_CONTINUE , prolog_identifier_continue) :-
char_type_prolog_identifier_continue( PROLOG_IDENTIFIER_CONTINUE ).
char_type( PROLOG_PROLOG_SYMBOL , prolog_prolog_symbol) :-
prolog:char_type( PROLOG_PROLOG_SYMBOL , prolog_prolog_symbol) :-
char_type_prolog_prolog_symbol( PROLOG_PROLOG_SYMBOL ).
prolog:code_type( CH, TYPE) :-
( var( CH ) -> between(-1,+inf,CH) ),
prolog:code_type( CH, TYPE) .
prolog:code_type( ALNUM, alnum) :-
code_type_alnum( ALNUM ).
prolog:code_type( ALPHA, alpha) :-
code_type_alpha( ALPHA).
prolog:code_type( CSYM, csym) :-
code_type_csym( CSYM ).
prolog:code_type( CSYMF, csymf) :-
code_type_csymf( CSYMF).
prolog:code_type( ASCII, ascii ) :-
code_type_ascii( ASCII ).
prolog:code_type( WHITE, white) :-
code_type_white( WHITE ).
prolog:code_type( CNTRL , cntrl) :-
code_type_cntrl( CNTRL ).
prolog:code_type( DIGIT , digit) :-
code_type_digit( DIGIT ).
prolog:code_type( DIGIT, digit(Weight) ) :-
code_type_digit( DIGIT ),
digit_weight( DIGIT, Weight ).
prolog:code_type( XDIGIT, xdigit(Weight) ) :-
code_type_digit( XDIGIT ),
xdigit_weight( XDIGIT, Weight ).
prolog:code_type( GRAPH , graph) :-
code_type_graph( GRAPH ).
prolog:code_type( LOWER , lower) :-
code_type_lower( LOWER ).
prolog:code_type( LOWER, lower( Upper)) :-
toupper( LOWER, Upper),
code_type_lower( LOWER ),
prolog:code_type( LOWER, to_lower( Upper))
toupper( LOWER, Upper).
prolog:code_type( UPPER, upper ) :-
code_type_upper( UPPER ).
prolog:code_type( UPPER , upper( Lower)) :-
code_type_upper( UPPER ),
prolog:code_type( UPPER, to_upper( Lower) ) :-
tolower( UPPER, Lower),
char_type_upper( UPPER).
prolog:code_type( PUNCT , punct) :-
code_type_punct( PUNCT ).
prolog:code_type( SPACE , space) :-
code_type_space( SPACE ).
prolog:code_type( END_OF_FILE , end_of_file) :-
code_type_end_of_file( END_OF_FILE ).
prolog:code_type( END_OF_LINE , end_of_line) :-
code_type_end_of_line( END_OF_LINE ).
prolog:code_type( NEWLINE , newline) :-
code_type_newline( NEWLINE ).
prolog:code_type( PERIOD , period) :-
code_type_period( PERIOD ).
prolog:code_type( QUOTE , quote) :-
code_type_quote( QUOTE ).
prolog:code_type( Parent_Open, paren( PAREN_CLOSE) ) :-
paren_paren(Parent_Open, PAREN_CLOSE).
prolog:code_type( PROLOG_VAR_START , prolog_var_start) :-
code_type_prolog_var_start( PROLOG_VAR_START ).
prolog:code_type( PROLOG_ATOM_START , prolog_atom_start) :-
code_type_prolog_atom_start( PROLOG_ATOM_START ).
prolog:code_type( PROLOG_IDENTIFIER_CONTINUE , prolog_identifier_continue) :-
code_type_prolog_identifier_continue( PROLOG_IDENTIFIER_CONTINUE ).
prolog:code_type( PROLOG_PROLOG_SYMBOL , prolog_prolog_symbol) :-
code_type_prolog_prolog_symbol( PROLOG_PROLOG_SYMBOL ).
/* numeric code sequences, obtained from
http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedNumericValues.txt

View File

@ -1,117 +0,0 @@
/*************************************************************************
* *
* YAP Prolog *
* *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* *
**************************************************************************
* *
* File: chtypes.yap *
* Last rev: 8/2/88 *
* mods: *
* comments: implementation of SWI's code_type/2 *
* *
*************************************************************************/
:- system_module( '$_chtypes', [], []).
/**
* @defgroup YAPChars Sequences of Characters: atoms, strings, lists of codes.
* @ingroup builtins
*
* The Prolog library includes a set of built-in predicates designed to
support manipulation of sequences of text, represented either as
lists, atoms or strings.
*/
/*
In addition, there is the library library(ctype) providing compatibility to some other Prolog systems. The predicates of this library are defined in terms of code_type/2.
char_type(?Char, ?Type)
Tests or generates alternative Types or Chars. The character-types are inspired by the standard C <ctype.h> primitives.
alnum
Char is a letter (upper- or lowercase) or digit.
alpha
Char is a letter (upper- or lowercase).
csym
Char is a letter (upper- or lowercase), digit or the underscore (_). These are valid C- and Prolog symbol characters.
csymf
Char is a letter (upper- or lowercase) or the underscore (_). These are valid first characters for C- and Prolog symbols
ascii
Char is a 7-bits ASCII character (0..127).
white
Char is a space or tab. E.i. white space inside a line.
cntrl
Char is an ASCII control-character (0..31).
digit
Char is a digit.
digit(Weigth)
Char is a digit with value Weigth. I.e. char_type(X, digit(6) yields X = '6'. Useful for parsing numbers.
xdigit(Weigth)
Char is a haxe-decimal digit with value Weigth. I.e. char_type(a, xdigit(X) yields X = '10'. Useful for parsing numbers.
graph
Char produces a visible mark on a page when printed. Note that the space is not included!
lower
Char is a lower-case letter.
lower(Upper)
Char is a lower-case version of Upper. Only true if Char is lowercase and Upper uppercase.
to_lower(Upper)
Char is a lower-case version of Upper. For non-letters, or letter without case, Char and Lower are the same. See also upcase_atom/2 and downcase_atom/2.
upper
Char is an upper-case letter.
upper(Lower)
Char is an upper-case version of Lower. Only true if Char is uppercase and Lower lowercase.
to_upper(Lower)
Char is an upper-case version of Lower. For non-letters, or letter without case, Char and Lower are the same. See also upcase_atom/2 and downcase_atom/2.
punct
Char is a punctuation character. This is a graph character that is not a letter or digit.
space
Char is some form of layout character (tab, vertical-tab, newline, etc.).
end_of_file
Char is -1.
end_of_line
Char ends a line (ASCII: 10..13).
newline
Char is a the newline character (10).
period
Char counts as the end of a sentence (.,!,?).
quote
Char is a quote-character (", ', `).
paren(Close)
Char is an open-parenthesis and Close is the corresponding close-parenthesis.
code_type(?Code, ?Type)
As char_type/2, but uses character-codes rather than one-character atoms. Please note that both predicates are as flexible as possible. They handle either representation if the argument is instantiated and only will instantiate with an integer code or one-character atom depending of the version used. See also the prolog-flag double_quotes, atom_chars/2 and atom_codes/2.
*/

View File

@ -174,9 +174,8 @@ print_message(_, Msg) :-
'statistics.yap',
'strict_iso.yap',
'tabling.yap',
'threads.yap',
'threads.yap',
'eam.yap',
'chtypes.yap',
'yapor.yap',
'qly.yap',
'spy.yap',