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