Character.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /******************************************************************************/
  2. enum CHAR_FLAG // Character Flag
  3. {
  4. CHARF_DIG2 =1<<0, // if binary digit 01
  5. CHARF_DIG10=1<<1, // if decimal digit 0123456789
  6. CHARF_DIG16=1<<2, // if hex digit 0123456789ABCDEFabcdef
  7. CHARF_SIGN =1<<3, // if sign `~!@#$%^&-+*=()[]{}<>;:'",./|\?
  8. CHARF_ALPHA=1<<4, // if alphabetic
  9. CHARF_UNDER=1<<5, // if underline
  10. CHARF_UP =1<<6, // if upper case
  11. CHARF_SPACE=1<<7, // if space character
  12. #if EE_PRIVATE
  13. CHARF_COMBINING =1<< 8, // if combining character
  14. CHARF_STACK =1<< 9, // if stack on top of each other
  15. CHARF_FONT_SPACE=1<<10, // if adjust font spacing
  16. #endif
  17. CHARF_DIG=CHARF_DIG10,
  18. };
  19. UInt CharFlag(Char c); // get CHAR_FLAG
  20. UInt CharFlag(Char8 c); // get CHAR_FLAG
  21. /******************************************************************************/
  22. enum CHAR_TYPE : Byte // Character Type
  23. {
  24. CHART_NONE , // none/unknown
  25. CHART_CHAR , // alphabetic, digit or underline
  26. CHART_SPACE, // space
  27. CHART_SIGN , // symbol
  28. };
  29. CHAR_TYPE CharType(Char c); // get character type
  30. CHAR_TYPE CharType(Char8 c); // get character type
  31. /******************************************************************************/
  32. constexpr UInt CC4(Byte a, Byte b, Byte c, Byte d) {return a | (b<<8) | (c<<16) | (d<<24);}
  33. Bool WhiteChar(Char c); // if char is a white char - ' ', '\t', '\n', '\r'
  34. Char8 Char16To8(Char c); // convert 16-bit to 8-bit character
  35. Char Char8To16(Char8 c); // convert 8-bit to 16-bit character
  36. Char CaseDown(Char c); // return lower case 'c'
  37. Char8 CaseDown(Char8 c); // return lower case 'c'
  38. Char CaseUp (Char c); // return upper case 'c'
  39. Char8 CaseUp (Char8 c); // return upper case 'c'
  40. Int Compare(Char a, Char b, Bool case_sensitive=false); // compare characters, returns -1, 0, +1
  41. Int Compare(Char a, Char8 b, Bool case_sensitive=false); // compare characters, returns -1, 0, +1
  42. Int Compare(Char8 a, Char b, Bool case_sensitive=false); // compare characters, returns -1, 0, +1
  43. Int Compare(Char8 a, Char8 b, Bool case_sensitive=false); // compare characters, returns -1, 0, +1
  44. Bool Equal(Char a, Char b, Bool case_sensitive=false); // if characters are the same
  45. Bool Equal(Char a, Char8 b, Bool case_sensitive=false); // if characters are the same
  46. Bool Equal(Char8 a, Char b, Bool case_sensitive=false); // if characters are the same
  47. Bool Equal(Char8 a, Char8 b, Bool case_sensitive=false); // if characters are the same
  48. Bool EqualCS(Char a, Char b); // if characters are the same, case sensitive
  49. Bool EqualCS(Char a, Char8 b); // if characters are the same, case sensitive
  50. Bool EqualCS(Char8 a, Char b); // if characters are the same, case sensitive
  51. Bool EqualCS(Char8 a, Char8 b); // if characters are the same, case sensitive
  52. Char RemoveAccent(Char c); // convert accented character to one without an accent, for example RemoveAccent('ą') -> 'a', if character is not accented then it will be returned without any modifications, RemoveAccent('a') -> 'a'
  53. inline Bool HasUnicode(Char c) {return U16(c)>=128;} // if character is a unicode character
  54. inline Bool HasUnicode(Char8 c) {return U8 (c)>=128;} // if character is a unicode character
  55. /******************************************************************************/
  56. const Char8 CharNull ='\0',
  57. CharTab ='\t',
  58. CharLine ='\n';
  59. const Char CharBullet =L'•',
  60. CharDegree =L'°',
  61. CharSection =L'§',
  62. CharStar =L'★',
  63. CharLeft =L'←',
  64. CharRight =L'→',
  65. CharDown =L'↓',
  66. CharUp =L'↑',
  67. CharLeftRight =L'↔',
  68. CharDownUp =L'↕',
  69. CharCopyright =L'©',
  70. CharRegTM =L'®',
  71. CharTrademark =L'™',
  72. Nbsp =L' ', // non-breaking space
  73. FullWidthSpace=L' ',
  74. Ellipsis =L'…',
  75. CharAlpha =L'α',
  76. CharBeta =L'β',
  77. CharSuper2 =L'²',
  78. CharSuper3 =L'³',
  79. CharPermil =L'‰'; // 1/1000
  80. /******************************************************************************/
  81. #if EE_PRIVATE
  82. extern Char _Char8To16[];
  83. extern Char8 _Char16To8[];
  84. extern U16 _CharFlag[];
  85. extern const Char8 Digits16[]; // '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  86. INLINE Char Char8To16Fast(Char8 c) {return WINDOWS ? _Char8To16[U8 (c)] : Char(U8(c));} // only Windows uses code pages, other platforms always have direct mapping
  87. INLINE Char8 Char16To8Fast(Char c) {return _Char16To8[U16(c)] ;}
  88. INLINE UInt CharFlagFast(Char c) {return _CharFlag[U16(c)];}
  89. INLINE UInt CharFlagFast(Char8 c) {return CharFlagFast(Char8To16Fast(c));}
  90. Int CharInt(Char c); // get character as integer, '0'->0, '1'->1, .., 'a/A'->10, 'b/B'->11, .., ?->-1
  91. CChar8* CharName(Char c); // get character name, sample usage: CharName(' ') -> "Space"
  92. UInt CharFlagFast(Char8 a, Char8 b);
  93. UInt CharFlagFast(Char a, Char b);
  94. #endif
  95. /******************************************************************************/