experimenting with character classes
This commit is contained in:
		
							
								
								
									
										104
									
								
								lib2/h3-cc.adb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								lib2/h3-cc.adb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
with System.UTF_32; -- TOOD: remove dependency on this package. create a seperate unicode package.
 | 
			
		||||
 | 
			
		||||
package body H3.CC is
 | 
			
		||||
 | 
			
		||||
	package UC renames System.UTF_32;
 | 
			
		||||
	use type System.UTF_32.Category;
 | 
			
		||||
 | 
			
		||||
	SP: constant Item_Type := Item_Type'Val(32);
 | 
			
		||||
	VT: constant Item_Type := Item_Type'Val(9);
 | 
			
		||||
	
 | 
			
		||||
	function Is_Alpha (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Is_UTF_32_Letter(Item_Type'Pos(V));
 | 
			
		||||
	end Is_Alpha;
 | 
			
		||||
 | 
			
		||||
	function Is_Alnum (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Is_UTF_32_Letter(Item_Type'Pos(V)) or else
 | 
			
		||||
		       UC.Is_UTF_32_Digit(Item_Type'Pos(V));
 | 
			
		||||
	end Is_Alnum;
 | 
			
		||||
 | 
			
		||||
	function Is_Blank (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return V = SP or else V = VT;
 | 
			
		||||
	end Is_Blank;
 | 
			
		||||
 | 
			
		||||
	function Is_Cntrl (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Get_Category(Item_Type'Pos(V)) = UC.Cc;
 | 
			
		||||
	end Is_Cntrl;
 | 
			
		||||
 | 
			
		||||
	function Is_Digit (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Is_UTF_32_Digit(Item_Type'Pos(V));
 | 
			
		||||
	end Is_Digit;
 | 
			
		||||
 | 
			
		||||
	function Is_Graph (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		--return UC.Is_UTF_32_Graphic(Item_Type'Pos(V));
 | 
			
		||||
		return True;
 | 
			
		||||
	end Is_Graph;
 | 
			
		||||
 | 
			
		||||
	function Is_Lower (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Get_Category(Item_Type'Pos(V)) = UC.Ll;
 | 
			
		||||
	end Is_Lower;
 | 
			
		||||
 | 
			
		||||
	function Is_Print (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		--TODO:
 | 
			
		||||
		return True;
 | 
			
		||||
	end Is_Print;
 | 
			
		||||
 | 
			
		||||
	function Is_Punct (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Is_UTF_32_Punctuation(Item_Type'Pos(V));
 | 
			
		||||
	end Is_Punct;
 | 
			
		||||
 | 
			
		||||
	function Is_Space (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Is_UTF_32_Space(Item_Type'Pos(V)) or else
 | 
			
		||||
		       UC.Is_UTF_32_Line_Terminator(Item_Type'Pos(V));
 | 
			
		||||
	end Is_Space;
 | 
			
		||||
 | 
			
		||||
	function Is_Upper (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Get_Category(Item_Type'Pos(V)) = UC.Lu;
 | 
			
		||||
	end Is_Upper;
 | 
			
		||||
 | 
			
		||||
	function Is_Xdigit (V: in Item_Type) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		return UC.Is_UTF_32_Digit(Item_Type'Pos(V)) or else
 | 
			
		||||
		       Item_Type'Pos(V) in Standard.Character'Pos('A') .. Standard.Character'Pos('F') or else
 | 
			
		||||
		       Item_Type'Pos(V) in Standard.Character'Pos('a') .. Standard.Character'Pos('f');
 | 
			
		||||
	end Is_Xdigit;
 | 
			
		||||
 | 
			
		||||
	function To_Lower (V: in Item_Type) return Item_Type is
 | 
			
		||||
	begin
 | 
			
		||||
		return Item_Type'Val(UC.UTF_32_To_Lower_Case(Item_Type'Pos(V)));
 | 
			
		||||
	end To_Lower;
 | 
			
		||||
 | 
			
		||||
	function To_Upper (V: in Item_Type) return Item_Type is
 | 
			
		||||
	begin
 | 
			
		||||
		return Item_Type'Val(UC.UTF_32_To_Upper_Case(Item_Type'Pos(V)));
 | 
			
		||||
	end To_Upper;
 | 
			
		||||
 | 
			
		||||
	function Is_Class (V: in Item_Type; C: in Class) return Standard.Boolean is
 | 
			
		||||
	begin
 | 
			
		||||
		case C is
 | 
			
		||||
			when ALPHA => return Is_Alpha(V);
 | 
			
		||||
			when ALNUM => return Is_Alnum(V);
 | 
			
		||||
			when BLANK => return Is_Blank(V);
 | 
			
		||||
			when CNTRL => return Is_Cntrl(V);
 | 
			
		||||
			when DIGIT => return Is_Digit(V);
 | 
			
		||||
			when GRAPH => return Is_Graph(V);
 | 
			
		||||
			when LOWER => return Is_Lower(V);
 | 
			
		||||
			when PRINT => return Is_Print(V);
 | 
			
		||||
			when PUNCT => return Is_Punct(V);
 | 
			
		||||
			when SPACE => return Is_Space(V);
 | 
			
		||||
			when XDIGIT => return Is_Xdigit(V);
 | 
			
		||||
			when UPPER => return Is_Upper(V);
 | 
			
		||||
		end case;
 | 
			
		||||
	end Is_Class;
 | 
			
		||||
end H3.CC;
 | 
			
		||||
							
								
								
									
										26
									
								
								lib2/h3-cc.ads
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								lib2/h3-cc.ads
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
generic 
 | 
			
		||||
	type Item_Type is (<>); -- any discrete type
 | 
			
		||||
package H3.CC is
 | 
			
		||||
	-- <ctype.h>-like character classification package
 | 
			
		||||
	-- unicode-based. no system locale honored.
 | 
			
		||||
 | 
			
		||||
	type Class is (ALPHA, ALNUM, BLANK, CNTRL, DIGIT, GRAPH, LOWER, PRINT, PUNCT, SPACE, XDIGIT, UPPER);
 | 
			
		||||
	function Is_Class (V: in Item_Type; C: in Class) return Standard.Boolean;	
 | 
			
		||||
 | 
			
		||||
	function Is_Alpha (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Alnum (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Blank (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Cntrl (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Digit (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Graph (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Print (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Punct (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Space (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Xdigit (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
 | 
			
		||||
	function Is_Lower (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
	function Is_Upper (V: in Item_Type) return Standard.Boolean;
 | 
			
		||||
 | 
			
		||||
	function To_Lower (V: in Item_Type) return Item_Type;
 | 
			
		||||
	function To_Upper (V: in Item_Type) return Item_Type;
 | 
			
		||||
end H3.CC;
 | 
			
		||||
		Reference in New Issue
	
	Block a user