locale.pas 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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. unit locale;
  12. interface
  13. uses
  14. exec, amigados, utility;
  15. type
  16. PLocaleBase = ^TLocaleBase;
  17. TLocaleBase = record
  18. lb_LibNode: TLibrary;
  19. lb_SysPatches: WordBool;
  20. end;
  21. { This structure must only be allocated by locale.library and is READ-ONLY! }
  22. PLocale = ^TLocale;
  23. TLocale = record
  24. // Basics
  25. loc_LocaleName: STRPTR; // Name of locale
  26. loc_LanguageName: STRPTR; // Language of locale
  27. loc_PrefLanguages: array[0..9] of STRPTR; // Preferred languages as array
  28. loc_Flags: LongWord; // Locale Flags (LOCF_*)
  29. loc_CodeSet: LongWord;
  30. // Country
  31. loc_CountryCode: LongWord; // country code
  32. loc_TelephoneCode: LongWord; // telephone code of country
  33. loc_GMTOffset: LongInt; // distance to GMT in minutes
  34. loc_MeasuringSystem: Byte; // Used measuring system (MS_*)
  35. loc_CalendarType: Byte; // Define start of the Week (CT_*)
  36. loc_Reserved0: array[0..1] of Byte;
  37. // DateTime
  38. loc_DateTimeFormat, // Long date, time format
  39. loc_DateFormat, // Long date format
  40. loc_TimeFormat, // Long time format
  41. loc_ShortDateTimeFormat, // Short date, time format
  42. loc_ShortDateFormat, // Short date format
  43. loc_ShortTimeFormat, // Short time format
  44. // Numerics
  45. loc_DecimalPoint: STRPTR; // Decimalseparator
  46. loc_GroupSeparator: STRPTR; // Thousandseparator
  47. loc_FracGroupSeparator: STRPTR; // Additional separator
  48. loc_Grouping: PByte; // Size of loc_FracGroupSeparator group
  49. loc_FracGrouping: PByte; // Size of loc_FracGroupSeparator group
  50. // Currency Format
  51. loc_MonDecimalPoint: STRPTR;
  52. loc_MonGroupSeparator: STRPTR;
  53. loc_MonFracGroupSeparator: STRPTR;
  54. loc_MonGrouping: PByte;
  55. loc_MonFracGrouping: PByte;
  56. loc_MonFracDigits: Byte; // Numbers of places after loc_MonDecimalPoint
  57. loc_MonIntFracDigits: Byte;
  58. loc_Reserved1: array[0..1] of Byte;
  59. // Currency symbol
  60. loc_MonCS: STRPTR; // Currency symbol (e.g. $)
  61. loc_MonSmallCS: STRPTR; // Symbol for small amounts (eg. cent)
  62. loc_MonIntCS: STRPTR; // Internationl (ISO 4217) code (e.g. EUR/USD/GBP)
  63. loc_MonPositiveSign: STRPTR; // for positive money value
  64. loc_MonPositiveSpaceSep: Byte; // Separated by space (SS_*)
  65. loc_MonPositiveSignPos: Byte; // Position of positive sign (SP_*)
  66. loc_MonPositiveCSPos: Byte; // Position of currency symbol (CSP_*)
  67. loc_Reserved2: Byte;
  68. loc_MonNegativeSign: STRPTR; // for negative money values
  69. loc_MonNegativeSpaceSep: Byte; // Separated by space (SS_*)
  70. loc_MonNegativeSignPos: Byte; // Position of negative sign (SP_*)
  71. loc_MonNegativeCSPos: Byte; // Position of currency symbol (CSP_*)
  72. loc_Reserved3: Byte;
  73. end;
  74. const
  75. // Flags for loc_Flags
  76. LOCF_GMT_CLOCK = 1 shl 16; // Hardware clock stores GMT, AROS specific
  77. // Values for loc_MeasuringSystem
  78. MS_ISO = 0;
  79. MS_AMERICAN = 1;
  80. MS_IMPERIAL = 2;
  81. MS_BRITISH = 3;
  82. // Values for loc_CalendarType
  83. CT_7SUN = 0; // First day is Sunday
  84. CT_7MON = 1; // First day is Monday
  85. CT_7TUE = 2; // First day is Tuesday
  86. CT_7WED = 3; // First day is Wednesday
  87. CT_7THU = 4; // First day is Thursday
  88. CT_7FRI = 5; // First day is Friday
  89. CT_7SAT = 6; // First day is Saturday
  90. // Values for loc_MonPositiveSpaceSep and loc_MonNegativeSpaceSep
  91. SS_NOSPACE = 0; // No space between currency symbol and value
  92. SS_SPACE = 1; // Set a space between currency symbol and value
  93. // Values for loc_MonPositiveSignPos and loc_MonNegativeSignPos
  94. SP_PARENS = 0; // () surround the quantity and currency_symbol
  95. SP_PREC_ALL = 1; // sign before value and symbol
  96. SP_SUCC_ALL = 2; // sign after value and symbol
  97. SP_PREC_CURR = 3; // sign right before currency symbol
  98. SP_SUCC_CURR = 4; // sign right after currency symbol
  99. // Values for loc_MonPositiveCSPos and loc_MonNegativeCSPos
  100. CSP_PRECEDES = 0; // currency symbol before value
  101. CSP_SUCCEEDS = 1; // currency symbol after value
  102. // Tags for OpenCatalog()
  103. OC_TagBase = TAG_USER + $90000;
  104. OC_BuiltInLanguage = OC_TagBase + 1; // language of built-in strings
  105. OC_BuiltInCodeSet = OC_TagBase + 2; // code set of built-in strings
  106. OC_Version = OC_TagBase + 3; // catalog version number required
  107. OC_Language = OC_TagBase + 4; // preferred language of catalog
  108. // Comparison types for StrnCmp()
  109. SC_ASCII = 0;
  110. SC_COLLATE1 = 1;
  111. SC_COLLATE2 = 2;
  112. // Internal String-Numbers GetLocaleStr()
  113. // Days of Week
  114. DAY_1 = 1; // Sunday
  115. DAY_2 = 2; // Monday
  116. DAY_3 = 3; // Tuesday
  117. DAY_4 = 4; // Wednesday
  118. DAY_5 = 5; // Thursday
  119. DAY_6 = 6; // Friday
  120. DAY_7 = 7; // Saturday
  121. // Abbreviated Days of Week
  122. ABDAY_1 = 8; // Sun
  123. ABDAY_2 = 9; // Mon
  124. ABDAY_3 = 10; // Tue
  125. ABDAY_4 = 11; // Wed
  126. ABDAY_5 = 12; // Thu
  127. ABDAY_6 = 13; // Fri
  128. ABDAY_7 = 14; // Sat
  129. // Months
  130. MON_1 = 15; // January
  131. MON_2 = 16; // February
  132. MON_3 = 17; // March
  133. MON_4 = 18; // April
  134. MON_5 = 19; // May
  135. MON_6 = 20; // June
  136. MON_7 = 21; // July
  137. MON_8 = 22; // August
  138. MON_9 = 23; // September
  139. MON_10 = 24; // October
  140. MON_11 = 25; // November
  141. MON_12 = 26; // December
  142. // Abbreviated Months
  143. ABMON_1 = 27; // Jan
  144. ABMON_2 = 28; // Feb
  145. ABMON_3 = 29; // Mar
  146. ABMON_4 = 30; // Apr
  147. ABMON_5 = 31; // May
  148. ABMON_6 = 32; // Jun
  149. ABMON_7 = 33; // Jul
  150. ABMON_8 = 34; // Aug
  151. ABMON_9 = 35; // Sep
  152. ABMON_10 = 36; // Oct
  153. ABMON_11 = 37; // Nov
  154. ABMON_12 = 38; // Dec
  155. // Question
  156. YESSTR = 39; // affirmative response for yes/no queries
  157. NOSTR = 40; // negative response for yes/no queries
  158. // 12 hour clock
  159. AM_STR = 41;
  160. PM_STR = 42;
  161. // Hyphen
  162. SOFTHYPHEN = 43;
  163. HARDHYPHEN = 44;
  164. // Quotes
  165. OPENQUOTE = 45; // Open quote
  166. CLOSEQUOTE = 46; // Close quote
  167. // relative day names
  168. YESTERDAYSTR = 47; // Yesterday
  169. TODAYSTR = 48; // Today
  170. TOMORROWSTR = 49; // Tomorrow
  171. FUTURESTR = 50; // Future
  172. LANG_NAME = 51; // V50
  173. MAXSTRMSG = 52; // current number of defined strings
  174. type
  175. // This structure must only be allocated by locale.library and is READ-ONLY!
  176. PCatalog = ^TCatalog;
  177. TCatalog = record
  178. cat_Link: TNode; // for internal linkage
  179. cat_Pad: Word; // to longword align
  180. cat_Language: STRPTR; // language of the catalog
  181. cat_CodeSet: LongWord; // currently always 0
  182. cat_Version: Word; // version of the catalog
  183. cat_Revision: Word; // revision of the catalog
  184. end;
  185. var
  186. LocaleBase: PLocaleBase = nil;
  187. const
  188. LOCALENAME: PChar = 'locale.library';
  189. procedure CloseCatalog(Catalog: PCatalog); syscall LocaleBase 6;
  190. procedure CloseLocale(Locale: PLocale); syscall LocaleBase 7;
  191. function ConvToLower(Locale: PLocale; Character: LongWord): LongWord; syscall LocaleBase 8;
  192. function ConvToUpper(Locale: PLocale; Character: LongWord): LongWord; syscall LocaleBase 9;
  193. procedure FormatDate(Locale: PLocale; FormatString: STRPTR; Date: PDateStamp; Hook: PHook); syscall LocaleBase 10;
  194. function FormatString(Locale: PLocale; FmtTemplate: STRPTR; DataStream: APTR; PutCharFunc: PHook): APTR; syscall LocaleBase 11;
  195. function GetCatalogStr(Catalog: PCatalog; StringNum: LongWord; DefaultString: STRPTR): STRPTR; syscall LocaleBase 12;
  196. function GetLocaleStr(Locale: PLocale; StringNum: LongWord): STRPTR; syscall LocaleBase 13;
  197. function IsAlNum(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 14;
  198. function IsAlpha(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 15;
  199. function IsCntrl(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 16;
  200. function IsDigit(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 17;
  201. function IsGraph(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 18;
  202. function IsLower(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 19;
  203. function IsPrint(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 20;
  204. function IsPunct(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 21;
  205. function IsSpace(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 22;
  206. function IsUpper(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 23;
  207. function IsXDigit(Locale: PLocale; Character: LongWord): LongBool; syscall LocaleBase 24;
  208. function OpenCatalogA(Locale: PLocale; Name: STRPTR; Tags: PTagItem): PCatalog; syscall LocaleBase 25;
  209. function OpenLocale(Name: STRPTR): PLocale; syscall LocaleBase 26;
  210. function ParseDate(Locale: PLocale; Date: PDateStamp; FmtTemplate: STRPTR; GetCharFunc: PHook): LongBool; syscall LocaleBase 27;
  211. function LocalePrefsUpdate(Locale: PLocale): PLocale; syscall LocaleBase 28;
  212. function StrConvert(Locale: PLocale; String1: STRPTR; Buffer: APTR; BufferSize: LongWord; Typ: LongWord): LongWord; syscall LocaleBase 29;
  213. function StrnCmp(Locale: PLocale; String1: STRPTR; String2: STRPTR; Length: LongInt; Typ: LongWord): LongInt; syscall LocaleBase 30;
  214. function OpenCatalog(Locale: PLocale; Name: STRPTR; const Tags: array of PtrUInt): PCatalog;
  215. implementation
  216. function OpenCatalog(Locale: PLocale; Name: STRPTR; const Tags: array of PtrUInt): PCatalog;
  217. begin
  218. OpenCatalog := OpenCatalogA(Locale, Name, @Tags);
  219. end;
  220. const
  221. LIBVERSION = 0;
  222. initialization
  223. LocaleBase := PLocaleBase(OpenLibrary(LOCALENAME, LIBVERSION));
  224. finalization
  225. if Assigned(LocaleBase) then
  226. CloseLibrary(PLibrary(LocaleBase));
  227. end.