136 lines
3.8 KiB
Prolog
136 lines
3.8 KiB
Prolog
/* $Id$
|
|
|
|
Part of SWI-Prolog
|
|
|
|
Author: Jan Wielemaker
|
|
E-mail: wielemak@science.uva.nl
|
|
WWW: http://www.swi-prolog.org
|
|
Copyright (C): 1985-2006, University of Amsterdam
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
As a special exception, if you link this library with other files,
|
|
compiled with a Free Software compiler, to produce an executable, this
|
|
library does not by itself cause the resulting executable to be covered
|
|
by the GNU General Public License. This exception does not however
|
|
invalidate any other reasons why the executable file might be covered by
|
|
the GNU General Public License.
|
|
*/
|
|
|
|
:- module(ctypes,
|
|
[ is_alnum/1,
|
|
is_alpha/1,
|
|
is_ascii/1,
|
|
is_cntrl/1,
|
|
is_csym/1,
|
|
is_csymf/1,
|
|
is_digit/1,
|
|
is_digit/3,
|
|
is_endfile/1,
|
|
is_endline/1,
|
|
is_graph/1,
|
|
is_lower/1,
|
|
is_newline/1,
|
|
is_newpage/1,
|
|
is_paren/2,
|
|
is_period/1,
|
|
is_print/1,
|
|
is_punct/1,
|
|
is_quote/1,
|
|
is_space/1,
|
|
is_upper/1,
|
|
is_white/1,
|
|
to_lower/2,
|
|
to_upper/2
|
|
]).
|
|
|
|
/** <module> Character code classification
|
|
@ingroup swi
|
|
|
|
This file implements the functionality of the corresponding Quintus
|
|
library based on SWI-Prolog's code_type/2 predicate. Please check the
|
|
documentation of this predicate to find the definitions of the classes.
|
|
|
|
@see code_type/2
|
|
@see char_type/2
|
|
*/
|
|
|
|
is_alnum(C) :- code_type(C, alnum).
|
|
is_alpha(C) :- code_type(C, alpha).
|
|
is_ascii(C) :- code_type(C, ascii).
|
|
is_cntrl(C) :- code_type(C, cntrl).
|
|
is_csym(C) :- code_type(C, csym).
|
|
is_csymf(C) :- code_type(C, csymf).
|
|
is_digit(C) :- code_type(C, digit).
|
|
is_graph(C) :- code_type(C, graph).
|
|
is_lower(C) :- code_type(C, lower).
|
|
is_upper(C) :- code_type(C, upper).
|
|
is_period(C) :- code_type(C, period).
|
|
is_endline(C) :- code_type(C, end_of_line).
|
|
is_print(C) :- is_graph(C).
|
|
is_punct(C) :- code_type(C, punct).
|
|
is_quote(C) :- code_type(C, quote).
|
|
is_space(C) :- code_type(C, space).
|
|
is_white(C) :- code_type(C, white).
|
|
|
|
is_endfile(-1).
|
|
is_newpage(12). % Control-L
|
|
is_newline(10).
|
|
|
|
%% is_paren(?Open, ?Close) is semidet.
|
|
%
|
|
% True if Open is the open-parenthesis of Close.
|
|
|
|
is_paren(0'(, 0')). % Prolog is too good at this
|
|
is_paren(0'[, 0']).
|
|
is_paren(0'{, 0'}).
|
|
|
|
%% to_lower(+U, -L) is det.
|
|
%% to_lower(-U, +L) is det.
|
|
%
|
|
% Succeeds if `U' is upper case character and `L' is the
|
|
% corresponding lower case character or `U' is an ascii character,
|
|
% but not an upper case letter and `L' is equal to `U'.
|
|
|
|
to_lower(U, L) :-
|
|
code_type(L, to_lower(U)).
|
|
|
|
to_upper(U, L) :-
|
|
code_type(L, to_upper(U)).
|
|
|
|
%% is_digit(+C, +Base, -Weight) is det.
|
|
%% is_digit(-C, +Base, +Weight) is det.
|
|
%
|
|
% Succeeds if `C' is a digit using `Base' as base and `Weight'
|
|
% represents its value. Only the base-10 case is handled by code_type.
|
|
|
|
is_digit(C, Base, Weight) :-
|
|
Base == 10, !,
|
|
code_type(C, digit(Weight)).
|
|
is_digit(C, Base, Weight) :-
|
|
between(2, 36, Base),
|
|
succ(X, Base),
|
|
between(0, X, Weight),
|
|
is_digit(C, Weight).
|
|
|
|
is_digit(C, Weight) :-
|
|
Weight < 10, !,
|
|
plus(Weight, 0'0, C).
|
|
is_digit(C, Weight) :-
|
|
plus(Weight, 87, C), !. /* `a`-10 */
|
|
is_digit(C, Weight) :-
|
|
plus(Weight, 55, C). /* `A`-10 */
|
|
|