199 lines
5.1 KiB
Ada
199 lines
5.1 KiB
Ada
with System.UTF_32; -- TOOD: remove dependency on this package. create a seperate unicode package.
|
|
|
|
package body H3.Runes is
|
|
|
|
package UC renames System.UTF_32;
|
|
use type System.UTF_32.Category;
|
|
|
|
SP: constant Rune := Rune'Val(32);
|
|
HT: constant Rune := Rune'Val(9);
|
|
|
|
function Is_Alpha (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Is_UTF_32_Letter(Rune'Pos(V));
|
|
end Is_Alpha;
|
|
|
|
function Is_Alpha (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Alpha(Rune'Val(C));
|
|
end Is_Alpha;
|
|
|
|
function Is_Alnum (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Is_UTF_32_Letter(Rune'Pos(V)) or else
|
|
UC.Is_UTF_32_Digit(Rune'Pos(V));
|
|
end Is_Alnum;
|
|
|
|
function Is_Alnum (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Alnum(Rune'Val(C));
|
|
end Is_Alnum;
|
|
|
|
function Is_Blank (V: in Rune) return Boolean is
|
|
begin
|
|
return V = SP or else V = HT;
|
|
end Is_Blank;
|
|
|
|
function Is_Blank (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Blank(Rune'Val(C));
|
|
end Is_Blank;
|
|
|
|
function Is_Cntrl (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Get_Category(Rune'Pos(V)) = UC.Cc;
|
|
end Is_Cntrl;
|
|
|
|
function Is_Cntrl (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Cntrl(Rune'Val(C));
|
|
end Is_Cntrl;
|
|
|
|
function Is_Digit (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Is_UTF_32_Digit(Rune'Pos(V));
|
|
end Is_Digit;
|
|
|
|
function Is_Digit (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Digit(Rune'Val(C));
|
|
end Is_Digit;
|
|
|
|
function Is_Graph (V: in Rune) return Boolean is
|
|
begin
|
|
return Is_Print(V) and then V /= SP;
|
|
end Is_Graph;
|
|
|
|
function Is_Graph (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Graph(Rune'Val(C));
|
|
end Is_Graph;
|
|
|
|
function Is_Lower (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Get_Category(Rune'Pos(V)) = UC.Ll;
|
|
end Is_Lower;
|
|
|
|
function Is_Lower (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Lower(Rune'Val(C));
|
|
end Is_Lower;
|
|
|
|
function Is_Print (V: in Rune) return Boolean is
|
|
begin
|
|
return not UC.IS_UTF_32_Non_Graphic(Rune'Pos(V));
|
|
end Is_Print;
|
|
|
|
function Is_Print (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Print(Rune'Val(C));
|
|
end Is_Print;
|
|
|
|
function Is_Punct (V: in Rune) return Boolean is
|
|
begin
|
|
--return UC.Is_UTF_32_Punctuation(Rune'Pos(V));
|
|
return Is_Print(V) and then not Is_Space(V) and then not Is_Alnum(V);
|
|
end Is_Punct;
|
|
|
|
function Is_Punct (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Punct(Rune'Val(C));
|
|
end Is_Punct;
|
|
|
|
function Is_Space (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Is_UTF_32_Space(Rune'Pos(V)) or else
|
|
UC.Is_UTF_32_Line_Terminator(Rune'Pos(V)) or else
|
|
V = HT;
|
|
end Is_Space;
|
|
|
|
function Is_Space (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Space(Rune'Val(C));
|
|
end Is_Space;
|
|
|
|
function Is_Upper (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Get_Category(Rune'Pos(V)) = UC.Lu;
|
|
end Is_Upper;
|
|
|
|
function Is_Upper (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Upper(Rune'Val(C));
|
|
end Is_Upper;
|
|
|
|
function Is_Xdigit (V: in Rune) return Boolean is
|
|
begin
|
|
return UC.Is_UTF_32_Digit(Rune'Pos(V)) or else
|
|
Rune'Pos(V) in System_Rune'Pos('A') .. System_Rune'Pos('F') or else
|
|
Rune'Pos(V) in System_Rune'Pos('a') .. System_Rune'Pos('f');
|
|
end Is_Xdigit;
|
|
|
|
function Is_Xdigit (C: in Code) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Xdigit(Rune'Val(C));
|
|
end Is_Xdigit;
|
|
|
|
function To_Lower (V: in Rune) return Rune is
|
|
begin
|
|
return Rune'Val(UC.UTF_32_To_Lower_Case(Rune'Pos(V)));
|
|
end To_Lower;
|
|
|
|
function To_Upper (V: in Rune) return Rune is
|
|
begin
|
|
return Rune'Val(UC.UTF_32_To_Upper_Case(Rune'Pos(V)));
|
|
end To_Upper;
|
|
|
|
function Is_Class (V: in Rune; Class: in Item_Class) return Boolean is
|
|
begin
|
|
case Class 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 UPPER => return Is_Upper(V);
|
|
when XDIGIT => return Is_Xdigit(V);
|
|
end case;
|
|
end Is_Class;
|
|
|
|
function Is_Class (C: in Code; Class: in Item_Class) return Boolean is
|
|
begin
|
|
return not Is_Eof(C) and then Is_Class(To_Rune(C), Class);
|
|
end Is_Class;
|
|
|
|
function Is_Eof (C: in Code) return Boolean is
|
|
begin
|
|
return C = EOF;
|
|
end Is_Eof;
|
|
|
|
function Is_Code (V: in Rune; C: in Code) return Boolean is
|
|
begin
|
|
-- a clumsy way to work around strong type checking
|
|
-- with unknown Rune at the generic level?
|
|
return To_Code(V) = C;
|
|
end Is_Code;
|
|
|
|
function Is_Rune (C: in Code; V: in Rune) return Boolean is
|
|
begin
|
|
return To_Code(V) = C;
|
|
end Is_Rune;
|
|
|
|
function To_Rune (C: in Code) return Rune is
|
|
begin
|
|
pragma Assert (not Is_Eof(C));
|
|
return Rune'Val(C);
|
|
end To_Rune;
|
|
|
|
function To_Code (V: in Rune) return Code is
|
|
begin
|
|
return Rune'Pos(V);
|
|
end To_Code;
|
|
|
|
end H3.Runes;
|