135 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/*  $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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 */
							 | 
						||
| 
								 | 
							
								
							 |