From 098be4aba027ff9fd2677274d7ade35201a03b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Thu, 22 Oct 2015 00:39:10 +0100 Subject: [PATCH] remove chtypes --- os/chartypes.c | 353 +++++++++++++++++++++++++++++------------------ os/chartypes.yap | 151 ++++++++++++++------ pl/chtypes.yap | 117 ---------------- pl/init.yap | 3 +- 4 files changed, 327 insertions(+), 297 deletions(-) delete mode 100644 pl/chtypes.yap diff --git a/os/chartypes.c b/os/chartypes.c index 7b8e7ebfe..f0aa0ce4d 100644 --- a/os/chartypes.c +++ b/os/chartypes.c @@ -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; - } +} diff --git a/os/chartypes.yap b/os/chartypes.yap index acdb8e566..d30a88b77 100644 --- a/os/chartypes.yap +++ b/os/chartypes.yap @@ -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 diff --git a/pl/chtypes.yap b/pl/chtypes.yap deleted file mode 100644 index 0f85b4f8b..000000000 --- a/pl/chtypes.yap +++ /dev/null @@ -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 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. - -*/ - diff --git a/pl/init.yap b/pl/init.yap index 9fd6e7a5a..edb480a58 100644 --- a/pl/init.yap +++ b/pl/init.yap @@ -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',