locale.pas 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2016 by Free Pascal development team
  4. locale.library functions
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$PACKRECORDS 2}
  12. unit locale;
  13. interface
  14. uses
  15. exec, amigados, utility;
  16. const
  17. // Internal String-Numbers GetLocaleStr()
  18. // Days of Week
  19. DAY_1 = 1; // Sunday
  20. DAY_2 = 2; // Monday
  21. DAY_3 = 3; // Tuesday
  22. DAY_4 = 4; // Wednesday
  23. DAY_5 = 5; // Thursday
  24. DAY_6 = 6; // Friday
  25. DAY_7 = 7; // Saturday
  26. // Abbreviated Days of Week
  27. ABDAY_1 = 8; // Sun
  28. ABDAY_2 = 9; // Mon
  29. ABDAY_3 = 10; // Tue
  30. ABDAY_4 = 11; // Wed
  31. ABDAY_5 = 12; // Thu
  32. ABDAY_6 = 13; // Fri
  33. ABDAY_7 = 14; // Sat
  34. // Months
  35. MON_1 = 15; // January
  36. MON_2 = 16; // February
  37. MON_3 = 17; // March
  38. MON_4 = 18; // April
  39. MON_5 = 19; // May
  40. MON_6 = 20; // June
  41. MON_7 = 21; // July
  42. MON_8 = 22; // August
  43. MON_9 = 23; // September
  44. MON_10 = 24; // October
  45. MON_11 = 25; // November
  46. MON_12 = 26; // December
  47. // Abbreviated Months
  48. ABMON_1 = 27; // Jan
  49. ABMON_2 = 28; // Feb
  50. ABMON_3 = 29; // Mar
  51. ABMON_4 = 30; // Apr
  52. ABMON_5 = 31; // May
  53. ABMON_6 = 32; // Jun
  54. ABMON_7 = 33; // Jul
  55. ABMON_8 = 34; // Aug
  56. ABMON_9 = 35; // Sep
  57. ABMON_10 = 36; // Oct
  58. ABMON_11 = 37; // Nov
  59. ABMON_12 = 38; // Dec
  60. // Question
  61. YESSTR = 39; // affirmative response for yes/no queries
  62. NOSTR = 40; // negative response for yes/no queries
  63. // 12 hour clock
  64. AM_STR = 41;
  65. PM_STR = 42;
  66. // Hyphen
  67. SOFTHYPHEN = 43;
  68. HARDHYPHEN = 44;
  69. // Quotes
  70. OPENQUOTE = 45; // Open quote
  71. CLOSEQUOTE = 46; // Close quote
  72. // relative day names
  73. YESTERDAYSTR = 47; // Yesterday
  74. TODAYSTR = 48; // Today
  75. TOMORROWSTR = 49; // Tomorrow
  76. FUTURESTR = 50; // Future
  77. MAXSTRMSG = 51; // current number of defined strings
  78. type
  79. PLocaleBase = ^TLocaleBase;
  80. TLocaleBase = record
  81. lb_LibNode: TLibrary;
  82. lb_SysPatches: WordBool;
  83. end;
  84. { This structure must only be allocated by locale.library and is READ-ONLY! }
  85. PLocale = ^TLocale;
  86. TLocale = record
  87. // Basics
  88. loc_LocaleName: STRPTR; // Name of locale
  89. loc_LanguageName: STRPTR; // Language of locale
  90. loc_PrefLanguages: array[0..9] of STRPTR; // Preferred languages as array
  91. loc_Flags: LongWord; // Locale Flags
  92. // Country
  93. loc_CodeSet: LongWord;
  94. loc_CountryCode: LongWord; // country code
  95. loc_TelephoneCode: LongWord; // telephone code of country
  96. loc_GMTOffset: LongInt; // distance to GMT in minutes
  97. loc_MeasuringSystem: Byte; // Used measuring system (MS_*)
  98. loc_CalendarType: Byte; // Define start of the Week (CT_*)
  99. loc_Reserved0: array[0..1] of Byte;
  100. // DateTime
  101. loc_DateTimeFormat, // Long date, time format
  102. loc_DateFormat, // Long date format
  103. loc_TimeFormat, // Long time format
  104. loc_ShortDateTimeFormat, // Short date, time format
  105. loc_ShortDateFormat, // Short date format
  106. loc_ShortTimeFormat, // Short time format
  107. // Numerics
  108. loc_DecimalPoint: STRPTR; // Decimalseparator
  109. loc_GroupSeparator: STRPTR; // Thousandseparator
  110. loc_FracGroupSeparator: STRPTR; // Additional separator
  111. loc_Grouping: PByte; // Size of loc_FracGroupSeparator group
  112. loc_FracGrouping: PByte; // Size of loc_FracGroupSeparator group
  113. // Currency Format
  114. loc_MonDecimalPoint: STRPTR;
  115. loc_MonGroupSeparator: STRPTR;
  116. loc_MonFracGroupSeparator: STRPTR;
  117. loc_MonGrouping: PByte;
  118. loc_MonFracGrouping: PByte;
  119. loc_MonFracDigits: Byte; // Numbers of places after loc_MonDecimalPoint
  120. loc_MonIntFracDigits: Byte;
  121. loc_Reserved1: array[0..1] of Byte;
  122. // Currency symbol
  123. loc_MonCS: STRPTR; // Currency symbol (e.g. $)
  124. loc_MonSmallCS: STRPTR; // Symbol for small amounts (eg. cent)
  125. loc_MonIntCS: STRPTR; // Internationl (ISO 4217) code (e.g. EUR/USD/GBP)
  126. loc_MonPositiveSign: STRPTR; // for positive money value
  127. loc_MonPositiveSpaceSep: Byte; // Separated by space (SS_*)
  128. loc_MonPositiveSignPos: Byte; // Position of positive sign (SP_*)
  129. loc_MonPositiveCSPos: Byte; // Position of currency symbol (CSP_*)
  130. loc_Reserved2: Byte;
  131. loc_MonNegativeSign: STRPTR; // for negative money values
  132. loc_MonNegativeSpaceSep: Byte; // Separated by space (SS_*)
  133. loc_MonNegativeSignPos: Byte; // Position of negative sign (SP_*)
  134. loc_MonNegativeCSPos: Byte; // Position of currency symbol (CSP_*)
  135. loc_Reserved3: Byte;
  136. end;
  137. const
  138. // Values for loc_MeasuringSystem
  139. MS_ISO = 0;
  140. MS_AMERICAN = 1;
  141. MS_IMPERIAL = 2;
  142. MS_BRITISH = 3;
  143. // Values for loc_CalendarType
  144. CT_7SUN = 0; // First day is Sunday
  145. CT_7MON = 1; // First day is Monday
  146. CT_7TUE = 2; // First day is Tuesday
  147. CT_7WED = 3; // First day is Wednesday
  148. CT_7THU = 4; // First day is Thursday
  149. CT_7FRI = 5; // First day is Friday
  150. CT_7SAT = 6; // First day is Saturday
  151. // Values for loc_MonPositiveSpaceSep and loc_MonNegativeSpaceSep
  152. SS_NOSPACE = 0; // No space between currency symbol and value
  153. SS_SPACE = 1; // Set a space between currency symbol and value
  154. // Values for loc_MonPositiveSignPos and loc_MonNegativeSignPos
  155. SP_PARENS = 0; // () surround the quantity and currency_symbol
  156. SP_PREC_ALL = 1; // sign before value and symbol
  157. SP_SUCC_ALL = 2; // sign after value and symbol
  158. SP_PREC_CURR = 3; // sign right before currency symbol
  159. SP_SUCC_CURR = 4; // sign right after currency symbol
  160. // Values for loc_MonPositiveCSPos and loc_MonNegativeCSPos
  161. CSP_PRECEDES = 0; // currency symbol before value
  162. CSP_SUCCEEDS = 1; // currency symbol after value
  163. // Tags for OpenCatalog()
  164. OC_TagBase = TAG_USER + $90000;
  165. OC_BuiltInLanguage = OC_TagBase + 1; // language of built-in strings
  166. OC_BuiltInCodeSet = OC_TagBase + 2; // code set of built-in strings
  167. OC_Version = OC_TagBase + 3; // catalog version number required
  168. OC_Language = OC_TagBase + 4; // preferred language of catalog
  169. OC_CodeSet = OC_TagBase + 5; // V51
  170. OC_BuiltInStrings = OC_TagBase + 6; // V52.3
  171. // Comparison types for StrnCmp()
  172. SC_ASCII = 0;
  173. SC_COLLATE1 = 1;
  174. SC_COLLATE2 = 2;
  175. SC_UNICODE = SC_ASCII;
  176. UCF_IGNORE_CASE = 1 shl 0;
  177. UNICODE_NFD = 0;
  178. UNICODE_NFKD = 1;
  179. type
  180. // This structure must only be allocated by locale.library and is READ-ONLY!
  181. PCatalog = ^TCatalog;
  182. TCatalog = record
  183. cat_Link: TNode; // for internal linkage
  184. cat_Pad: Word; // to longword align
  185. cat_Language: STRPTR; // language of the catalog
  186. cat_CodeSet: LongWord; // currently always 0
  187. cat_Version: Word; // version of the catalog
  188. cat_Revision: Word; // revision of the catalog
  189. end;
  190. const
  191. // cat_CodeSet values
  192. CODESET_LEGACY = 0;
  193. CODESET_UTF8 = 1;
  194. CODESET_UTF32 = 2;
  195. CODESET_COUNT = 3;
  196. CODESET_LATIN1 = CODESET_LEGACY;
  197. CODESET_UCS4 = CODESET_UTF32;
  198. // Values returned by IsUnicode()
  199. UNICODE_INVALID = 0; // ASCII or ISO-8859-1
  200. UNICODE_UTF8 = 1; // UTF-8
  201. UNICODE_16_BE = 2; // UCS-2/UTF-16 big endian
  202. UNICODE_16_LE = 3; // UCS-2/UTF-16 little endian
  203. UNICODE_32_BE = 4; // UCS-4/UTF-32 big endian
  204. UNICODE_32_LE = 5; // UCS-4/UTF-32 little endian
  205. var
  206. LocaleBase: PLocaleBase = nil;
  207. const
  208. LOCALENAME: PChar = 'locale.library';
  209. procedure CloseCatalog(Catalog: PCatalog location 'a0'); syscall LocaleBase 36;
  210. procedure CloseLocale(Locale: PLocale location 'a0'); syscall LocaleBase 42;
  211. function ConvToLower(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongWord; syscall LocaleBase 48;
  212. function ConvToUpper(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongWord; syscall LocaleBase 54;
  213. procedure FormatDate(Locale: PLocale location 'a0'; FmtTemplate: STRPTR location 'a1'; Date: PDateStamp location 'a2'; PutCharFunc: PHook location 'a3'); syscall LocaleBase 60;
  214. function FormatString(Locale: PLocale location 'a0'; FmtTemplate: STRPTR location 'a1'; DataStream: APTR location 'a2'; PutCharFunc: PHook location 'a3'): APTR; syscall LocaleBase 66;
  215. function GetCatalogStr(Catalog: PCatalog location 'a0'; StringNum: LongInt location 'd0'; DefaultString: STRPTR location 'a1'): STRPTR; syscall LocaleBase 72;
  216. function GetLocaleStr(Locale: PLocale location 'a0'; StringNum: LongWord location 'd0'): STRPTR; syscall LocaleBase 78;
  217. function IsAlNum(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 84;
  218. function IsAlpha(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 90;
  219. function IsCntrl(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 96;
  220. function IsDigit(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 102;
  221. function IsGraph(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 108;
  222. function IsLower(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 114;
  223. function IsPrint(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 120;
  224. function IsPunct(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 126;
  225. function IsSpace(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 132;
  226. function IsUpper(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 138;
  227. function IsXDigit(Locale: PLocale location 'a0'; Character: LongWord location 'd0'): LongBool; syscall LocaleBase 144;
  228. function OpenCatalogA(Locale: PLocale location 'a0'; Name: STRPTR location 'a1'; Tags: PTagItem location 'a2'): PCatalog; syscall LocaleBase 150;
  229. function OpenLocale(Name: STRPTR location 'a0'): PLocale; syscall LocaleBase 156;
  230. function ParseDate(Locale: PLocale location 'a0'; Date: PDateStamp location 'a1'; FmtTemplate: STRPTR location 'a2'; GetCharFunc: PHook location 'a3'): LongBool; syscall LocaleBase 162;
  231. function StrConvert(Locale: PLocale location 'a0'; String1: STRPTR location 'a1'; Buffer: APTR location 'a2'; BufferSize: LongWord location 'd0'; Typ: LongWord location 'd1'): LongWord; syscall LocaleBase 29;
  232. function StrnCmp(Locale: PLocale location 'a0'; String1: STRPTR location 'a2'; String2: STRPTR location 'a2'; Length: LongInt location 'd0'; Typ: LongWord location 'd1'): LongInt; syscall LocaleBase 30;
  233. // MorphOS specific
  234. function UCS4_ConvToLower(UCharacter: WideChar): WideChar; syscall sysv LocaleBase 232;
  235. function UCS4_ConvToUpper(UCharacter: WideChar): WideChar; syscall sysv LocaleBase 238;
  236. function UTF8_Decode(UTF8: STRPTR; UCharacter: PWideChar): LongWord; syscall sysv LocaleBase 244;
  237. function UTF8_Encode(UCharacter: WideChar; UTF8: STRPTR): LongWord; syscall sysv LocaleBase 250;
  238. function UCS4_GetCatalogStr(Catalog: PCatalog; StringNum: LongWord; defaultString: WSTRPTR): WSTRPTR; syscall sysvbase LocaleBase 256;
  239. function UCS4_IsAlNum(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 262;
  240. function UCS4_IsAlpha(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 268;
  241. function UCS4_IsCntrl(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 274;
  242. function UCS4_IsDigit(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 280;
  243. function UCS4_IsGraph(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 286;
  244. function UCS4_IsLower(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 292;
  245. function UCS4_IsPrint(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 298;
  246. function UCS4_IsPunct(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 304;
  247. function UCS4_IsSpace(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 310;
  248. function UCS4_IsUpper(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 316;
  249. function UCS4_IsXDigit(Locale: PLocale; Character: WideChar): LongBool; syscall sysv LocaleBase 322;
  250. procedure UCS4_FormatDate(Locale: PLocale; FmtTemplate: WSTRPTR; Date: PDateStamp; PutCharFunc: PHook); syscall sysvbase LocaleBase 328;
  251. function UCS4_FormatString(Locale: PLocale; FmtTemplate: WSTRPTR; DataStream: APTR; PutCharFunc: PHook): APTR; syscall sysvbase LocaleBase 334;
  252. function UCS4_GetLocaleStr(Locale: PLocale; StringNum: LongWord): WSTRPTR; syscall sysvbase LocaleBase 340;
  253. function UCS4_StrnCmp(Locale: PLocale; String1: WSTRPTR; String2: WSTRPTR; Length: LongInt; Typ: LongWord): LongInt; syscall sysvbase LocaleBase 346;
  254. function UCS4_StrToLower(Locale: PLocale; String1: WSTRPTR; buffer: WSTRPTR; BufferSize: LongWord; Typ: LongWord): LongInt; syscall sysvbase LocaleBase 352;
  255. function UCS4_StrToUpper(Locale: PLocale; String1: WSTRPTR; buffer: WSTRPTR; BufferSize: LongWord; Typ: LongWord): LongInt; syscall sysvbase LocaleBase 358;
  256. function UCS4_Decompose(Ch: WideChar): WSTRPTR; syscall sysvbase LocaleBase 364;
  257. function UCS4_IsNSM(UCharacter: WideChar): LongBool; syscall sysv LocaleBase 370;
  258. function UCS4_CanonicalDecompose(Ch: WideChar): WSTRPTR; syscall sysvbase LocaleBase 376;
  259. procedure UCS4_Normalize(Src: WSTRPTR; Dst: WSTRPTR; Length: LongInt; Typ: LongWord); syscall sysvbase LocaleBase 382;
  260. function ConvertUTF8ToUCS4(Src: STRPTR; Dst: WSTRPTR; Length: LongInt): LongWord; syscall sysv LocaleBase 388;
  261. function ConvertUCS4ToUTF8(Src: WSTRPTR; Dst: STRPTR; Length: LongInt): LongWord; syscall sysv LocaleBase 394;
  262. function UCS4_IsCombining(UCharacter: WideChar): LongWord; syscall sysv LocaleBase 400;
  263. function UCS4_Compare(Locale: PLocale; String1: WSTRPTR; String2: WSTRPTR; Length: LongInt; Flags: LongWord): LongInt; syscall sysvbase LocaleBase 406;
  264. function UCS4_GetCombiningClass(UCharacter: WideChar): LongWord; syscall sysv LocaleBase 412;
  265. function UCS4_NormalizedLength(String1: WSTRPTR; Lenght: LongInt; Typ: LongWord): LongWord; syscall sysvbase LocaleBase 418;
  266. function UTF8_CheckEncoding(String1: STRPTR; Length: LongInt): LongInt; syscall sysvbase LocaleBase 424;
  267. function IsUnicode(Buffer: APTR; Length: LongWord): LongWord; syscall sysvbase LocaleBase 430;
  268. function UTF8_EncodingLength(Utf32: WideChar): LongWord; syscall sysv LocaleBase 436;
  269. function UTF8_DecodeSafe(Src: STRPTR; Dest: PWideChar; Length: LongWord): LongWord; syscall sysvbase LocaleBase 442;
  270. procedure FormatClockData(Locale: PLocale; FormatString: STRPTR; CData: PClockData; Hook: PHook); syscall sysvbase LocaleBase 448;
  271. procedure UCS4_FormatClockData(Locale: PLocale; FormatString: WSTRPTR; CData: PClockData; Hook: PHook); syscall sysvbase LocaleBase 460;
  272. function OpenCatalog(Locale: PLocale; Name: STRPTR; const Tags: array of PtrUInt): PCatalog;
  273. implementation
  274. function OpenCatalog(Locale: PLocale; Name: STRPTR; const Tags: array of PtrUInt): PCatalog;
  275. begin
  276. OpenCatalog := OpenCatalogA(Locale, Name, @Tags);
  277. end;
  278. const
  279. LIBVERSION = 0;
  280. initialization
  281. LocaleBase := PLocaleBase(OpenLibrary(LOCALENAME, LIBVERSION));
  282. finalization
  283. if Assigned(LocaleBase) then
  284. CloseLibrary(PLibrary(LocaleBase));
  285. end.