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 */
 | 
						|
 |