locale.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. {
  2. This file is part of the Free Pascal run time library.
  3. A file in Amiga system run time library.
  4. Copyright (c) 1998-2003 by Nils Sjoholm
  5. member of the Amiga RTL development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {
  13. History:
  14. Added functions and procedures with array of const.
  15. For use with fpc 1.0.7. They are in systemvartags.
  16. 11 Nov 2002.
  17. Added the defines use_amiga_smartlink and
  18. use_auto_openlib. Implemented autoopening
  19. of the library.
  20. 14 Jan 2003.
  21. Changed the start code for unit.
  22. 01 Feb 2003.
  23. Changed integer > smallint.
  24. 09 Feb 2003.
  25. [email protected]
  26. }
  27. {$I useamigasmartlink.inc}
  28. {$ifdef use_amiga_smartlink}
  29. {$smartlink on}
  30. {$endif use_amiga_smartlink}
  31. UNIT locale;
  32. INTERFACE
  33. USES exec, amigados, utility;
  34. const
  35. { constants for GetLocaleStr() }
  36. DAY_1 = 1; { Sunday }
  37. DAY_2 = 2; { Monday }
  38. DAY_3 = 3; { Tuesday }
  39. DAY_4 = 4; { Wednesday }
  40. DAY_5 = 5; { Thursday }
  41. DAY_6 = 6; { Friday }
  42. DAY_7 = 7; { Saturday }
  43. ABDAY_1 = 8 ; { Sun }
  44. ABDAY_2 = 9 ; { Mon }
  45. ABDAY_3 = 10; { Tue }
  46. ABDAY_4 = 11; { Wed }
  47. ABDAY_5 = 12; { Thu }
  48. ABDAY_6 = 13; { Fri }
  49. ABDAY_7 = 14; { Sat }
  50. MON_1 = 15; { January }
  51. MON_2 = 16; { February }
  52. MON_3 = 17; { March }
  53. MON_4 = 18; { April }
  54. MON_5 = 19; { May }
  55. MON_6 = 20; { June }
  56. MON_7 = 21; { July }
  57. MON_8 = 22; { August }
  58. MON_9 = 23; { September }
  59. MON_10 = 24; { October }
  60. MON_11 = 25; { November }
  61. MON_12 = 26; { December }
  62. ABMON_1 = 27; { Jan }
  63. ABMON_2 = 28; { Feb }
  64. ABMON_3 = 29; { Mar }
  65. ABMON_4 = 30; { Apr }
  66. ABMON_5 = 31; { May }
  67. ABMON_6 = 32; { Jun }
  68. ABMON_7 = 33; { Jul }
  69. ABMON_8 = 34; { Aug }
  70. ABMON_9 = 35; { Sep }
  71. ABMON_10 = 36; { Oct }
  72. ABMON_11 = 37; { Nov }
  73. ABMON_12 = 38; { Dec }
  74. YESSTR = 39; { affirmative response for yes/no queries }
  75. NOSTR = 40; { negative response for yes/no queries }
  76. AM_STR = 41; { AM }
  77. PM_STR = 42; { PM }
  78. SOFTHYPHEN = 43; { soft hyphenation }
  79. HARDHYPHEN = 44; { hard hyphenation }
  80. OPENQUOTE = 45; { start of quoted block }
  81. CLOSEQUOTE = 46; { end of quoted block }
  82. YESTERDAYSTR = 47; { Yesterday }
  83. TODAYSTR = 48; { Today }
  84. TOMORROWSTR = 49; { Tomorrow }
  85. FUTURESTR = 50; { Future }
  86. MAXSTRMSG = 51; { current number of defined strings }
  87. {***************************************************************************}
  88. Type
  89. { OpenLibrary("locale.library",0) returns a pointer to this structure }
  90. pLocaleBase = ^tLocaleBase;
  91. tLocaleBase = record
  92. lb_LibNode : tLibrary;
  93. lb_SysPatches : Boolean; { TRUE if locale installed its patches }
  94. end;
  95. {***************************************************************************}
  96. Type
  97. { This structure must only be allocated by locale.library and is READ-ONLY! }
  98. pLocale = ^tLocale;
  99. tLocale = record
  100. loc_LocaleName, { locale's name }
  101. loc_LanguageName : STRPTR; { language of this locale }
  102. loc_PrefLanguages : Array[0..9] of STRPTR; { preferred languages }
  103. loc_Flags : ULONG; { always 0 for now }
  104. loc_CodeSet, { always 0 for now }
  105. loc_CountryCode, { user's country code }
  106. loc_TelephoneCode, { country's telephone code }
  107. loc_GMTOffset : ULONG; { minutes from GMT }
  108. loc_MeasuringSystem, { what measuring system? }
  109. loc_CalendarType : Byte; { what calendar type? }
  110. loc_Reserved0 : Array[0..1] of Byte;
  111. loc_DateTimeFormat, { regular date & time format }
  112. loc_DateFormat, { date format by itself }
  113. loc_TimeFormat, { time format by itself }
  114. loc_ShortDateTimeFormat, { short date & time format }
  115. loc_ShortDateFormat, { short date format by itself }
  116. loc_ShortTimeFormat, { short time format by itself }
  117. { for numeric values }
  118. loc_DecimalPoint, { character before the decimals }
  119. loc_GroupSeparator, { separates groups of digits }
  120. loc_FracGroupSeparator : STRPTR; { separates groups of digits }
  121. loc_Grouping, { size of each group }
  122. loc_FracGrouping : Pointer; { size of each group }
  123. { for monetary values }
  124. loc_MonDecimalPoint,
  125. loc_MonGroupSeparator,
  126. loc_MonFracGroupSeparator : STRPTR;
  127. loc_MonGrouping,
  128. loc_MonFracGrouping : Pointer;
  129. loc_MonFracDigits, { digits after the decimal point }
  130. loc_MonIntFracDigits : Byte; { for international representation }
  131. loc_Reserved1 : Array[0..1] of Byte;
  132. { for currency symbols }
  133. loc_MonCS, { currency symbol }
  134. loc_MonSmallCS, { symbol for small amounts }
  135. loc_MonIntCS : STRPTR; { internationl (ISO 4217) code }
  136. { for positive monetary values }
  137. loc_MonPositiveSign : STRPTR; { indicate positive money value }
  138. loc_MonPositiveSpaceSep, { determine if separated by space }
  139. loc_MonPositiveSignPos, { position of positive sign }
  140. loc_MonPositiveCSPos, { position of currency symbol }
  141. loc_Reserved2 : Byte;
  142. { for negative monetary values }
  143. loc_MonNegativeSign : STRPTR; { indicate negative money value }
  144. loc_MonNegativeSpaceSep, { determine if separated by space }
  145. loc_MonNegativeSignPos, { position of negative sign }
  146. loc_MonNegativeCSPos, { position of currency symbol }
  147. loc_Reserved3 : Byte;
  148. end;
  149. const
  150. { constants for Locale.loc_MeasuringSystem }
  151. MS_ISO = 0; { international metric system }
  152. MS_AMERICAN = 1; { american system }
  153. MS_IMPERIAL = 2; { imperial system }
  154. MS_BRITISH = 3; { british system }
  155. { constants for Locale.loc_CalendarType }
  156. CT_7SUN = 0; { 7 days a week, Sunday is the first day }
  157. CT_7MON = 1; { 7 days a week, Monday is the first day }
  158. CT_7TUE = 2; { 7 days a week, Tuesday is the first day }
  159. CT_7WED = 3; { 7 days a week, Wednesday is the first day }
  160. CT_7THU = 4; { 7 days a week, Thursday is the first day }
  161. CT_7FRI = 5; { 7 days a week, Friday is the first day }
  162. CT_7SAT = 6; { 7 days a week, Saturday is the first day }
  163. { constants for Locale.loc_MonPositiveSpaceSep and Locale.loc_MonNegativeSpaceSep }
  164. SS_NOSPACE = 0; { cur. symbol is NOT separated from value with a space }
  165. SS_SPACE = 1; { cur. symbol IS separated from value with a space }
  166. { constants for Locale.loc_MonPositiveSignPos and Locale.loc_MonNegativeSignPos }
  167. SP_PARENS = 0; { () surround the quantity and currency_symbol }
  168. SP_PREC_ALL = 1; { sign string comes before amount and symbol }
  169. SP_SUCC_ALL = 2; { sign string comes after amount and symbol }
  170. SP_PREC_CURR = 3; { sign string comes right before currency symbol }
  171. SP_SUCC_CURR = 4; { sign string comes right after currency symbol }
  172. { constants for Locale.loc_MonPositiveCSPos and Locale.loc_MonNegativeCSPos }
  173. CSP_PRECEDES = 0; { currency symbol comes before value }
  174. CSP_SUCCEEDS = 1; { currency symbol comes after value }
  175. { elements of the byte arrays pointed to by:
  176. * Locale.loc_Grouping
  177. * Locale.loc_FracGrouping
  178. * Locale.loc_MonGrouping
  179. * Locale.loc_MonFracGrouping
  180. * are interpreted as follows:
  181. *
  182. * 255 indicates that no further grouping is to be performed
  183. * 0 indicates that the previous element is to be repeatedly used
  184. * for the remainder of the digits
  185. * <other> the number of digits that comprises the current group
  186. }
  187. {***************************************************************************}
  188. { Tags for OpenCatalog() }
  189. OC_TagBase = (TAG_USER + $90000);
  190. OC_BuiltInLanguage = OC_TagBase+1; { language of built-in strings }
  191. OC_BuiltInCodeSet = OC_TagBase+2; { code set of built-in strings }
  192. OC_Version = OC_TagBase+3; { catalog version number required }
  193. OC_Language = OC_TagBase+4; { preferred language of catalog }
  194. {***************************************************************************}
  195. { Comparison types for StrnCmp() }
  196. SC_ASCII = 0;
  197. SC_COLLATE1 = 1;
  198. SC_COLLATE2 = 2;
  199. {***************************************************************************}
  200. Type
  201. { This structure must only be allocated by locale.library and is READ-ONLY! }
  202. pCatalog = ^tCatalog;
  203. tCatalog = record
  204. cat_Link : tNode; { for internal linkage }
  205. cat_Pad : WORD; { to longword align }
  206. cat_Language: STRPTR; { language of the catalog }
  207. cat_CodeSet : ULONG; { currently always 0 }
  208. cat_Version : WORD; { version of the catalog }
  209. cat_Revision: WORD; { revision of the catalog }
  210. end;
  211. {***************************************************************************}
  212. { --- functions in V38 or higher (Release 2.1) --- }
  213. VAR LocaleBase : pLocaleBase;
  214. const
  215. LOCALENAME : PChar = 'locale.library';
  216. PROCEDURE CloseCatalog(catalog : pCatalog);
  217. PROCEDURE CloseLocale(locale : pLocale);
  218. FUNCTION ConvToLower(locale : pLocale; character : ULONG) : ULONG;
  219. FUNCTION ConvToUpper(locale : pLocale; character : ULONG) : ULONG;
  220. PROCEDURE FormatDate(locale : pLocale; fmtTemplate : pCHAR; date : pDateStamp; putCharFunc : pHook);
  221. FUNCTION FormatString(locale : pLocale; fmtTemplate : pCHAR; dataStream : POINTER; putCharFunc : pHook) : POINTER;
  222. FUNCTION GetCatalogStr(catalog : pCatalog; stringNum : LONGINT; defaultString : pCHAR) : pCHAR;
  223. FUNCTION GetLocaleStr(locale : pLocale; stringNum : ULONG) : pCHAR;
  224. FUNCTION IsAlNum(locale : pLocale; character : ULONG) : BOOLEAN;
  225. FUNCTION IsAlpha(locale : pLocale; character : ULONG) : BOOLEAN;
  226. FUNCTION IsCntrl(locale : pLocale; character : ULONG) : BOOLEAN;
  227. FUNCTION IsDigit(locale : pLocale; character : ULONG) : BOOLEAN;
  228. FUNCTION IsGraph(locale : pLocale; character : ULONG) : BOOLEAN;
  229. FUNCTION IsLower(locale : pLocale; character : ULONG) : BOOLEAN;
  230. FUNCTION IsPrint(locale : pLocale; character : ULONG) : BOOLEAN;
  231. FUNCTION IsPunct(locale : pLocale; character : ULONG) : BOOLEAN;
  232. FUNCTION IsSpace(locale : pLocale; character : ULONG) : BOOLEAN;
  233. FUNCTION IsUpper(locale : pLocale; character : ULONG) : BOOLEAN;
  234. FUNCTION IsXDigit(locale : pLocale; character : ULONG) : BOOLEAN;
  235. FUNCTION OpenCatalogA(locale : pLocale; name : pCHAR; tags : pTagItem) : pCatalog;
  236. FUNCTION OpenLocale(name : pCHAR) : pLocale;
  237. FUNCTION ParseDate(locale : pLocale; date : pDateStamp; fmtTemplate : pCHAR; getCharFunc : pHook) : BOOLEAN;
  238. FUNCTION StrConvert(locale : pLocale; string1 : pCHAR; buffer : POINTER; bufferSize : ULONG; typ : ULONG) : ULONG;
  239. FUNCTION StrnCmp(locale : pLocale; string1 : pCHAR; string2 : pCHAR; length : LONGINT; typ : ULONG) : LONGINT;
  240. {Here we read how to compile this unit}
  241. {You can remove this include and use a define instead}
  242. {$I useautoopenlib.inc}
  243. {$ifdef use_init_openlib}
  244. procedure InitLOCALELibrary;
  245. {$endif use_init_openlib}
  246. {This is a variable that knows how the unit is compiled}
  247. var
  248. LOCALEIsCompiledHow : longint;
  249. IMPLEMENTATION
  250. uses
  251. {$ifndef dont_use_openlib}
  252. msgbox;
  253. {$endif dont_use_openlib}
  254. PROCEDURE CloseCatalog(catalog : pCatalog);
  255. BEGIN
  256. ASM
  257. MOVE.L A6,-(A7)
  258. MOVEA.L catalog,A0
  259. MOVEA.L LocaleBase,A6
  260. JSR -036(A6)
  261. MOVEA.L (A7)+,A6
  262. END;
  263. END;
  264. PROCEDURE CloseLocale(locale : pLocale);
  265. BEGIN
  266. ASM
  267. MOVE.L A6,-(A7)
  268. MOVEA.L locale,A0
  269. MOVEA.L LocaleBase,A6
  270. JSR -042(A6)
  271. MOVEA.L (A7)+,A6
  272. END;
  273. END;
  274. FUNCTION ConvToLower(locale : pLocale; character : ULONG) : ULONG;
  275. BEGIN
  276. ASM
  277. MOVE.L A6,-(A7)
  278. MOVEA.L locale,A0
  279. MOVE.L character,D0
  280. MOVEA.L LocaleBase,A6
  281. JSR -048(A6)
  282. MOVEA.L (A7)+,A6
  283. MOVE.L D0,@RESULT
  284. END;
  285. END;
  286. FUNCTION ConvToUpper(locale : pLocale; character : ULONG) : ULONG;
  287. BEGIN
  288. ASM
  289. MOVE.L A6,-(A7)
  290. MOVEA.L locale,A0
  291. MOVE.L character,D0
  292. MOVEA.L LocaleBase,A6
  293. JSR -054(A6)
  294. MOVEA.L (A7)+,A6
  295. MOVE.L D0,@RESULT
  296. END;
  297. END;
  298. PROCEDURE FormatDate(locale : pLocale; fmtTemplate : pCHAR; date : pDateStamp; putCharFunc : pHook);
  299. BEGIN
  300. ASM
  301. MOVE.L A6,-(A7)
  302. MOVEA.L locale,A0
  303. MOVEA.L fmtTemplate,A1
  304. MOVEA.L date,A2
  305. MOVEA.L putCharFunc,A3
  306. MOVEA.L LocaleBase,A6
  307. JSR -060(A6)
  308. MOVEA.L (A7)+,A6
  309. END;
  310. END;
  311. FUNCTION FormatString(locale : pLocale; fmtTemplate : pCHAR; dataStream : POINTER; putCharFunc : pHook) : POINTER;
  312. BEGIN
  313. ASM
  314. MOVE.L A6,-(A7)
  315. MOVEA.L locale,A0
  316. MOVEA.L fmtTemplate,A1
  317. MOVEA.L dataStream,A2
  318. MOVEA.L putCharFunc,A3
  319. MOVEA.L LocaleBase,A6
  320. JSR -066(A6)
  321. MOVEA.L (A7)+,A6
  322. MOVE.L D0,@RESULT
  323. END;
  324. END;
  325. FUNCTION GetCatalogStr(catalog : pCatalog; stringNum : LONGINT; defaultString : pCHAR) : pCHAR;
  326. BEGIN
  327. ASM
  328. MOVE.L A6,-(A7)
  329. MOVEA.L catalog,A0
  330. MOVE.L stringNum,D0
  331. MOVEA.L defaultString,A1
  332. MOVEA.L LocaleBase,A6
  333. JSR -072(A6)
  334. MOVEA.L (A7)+,A6
  335. MOVE.L D0,@RESULT
  336. END;
  337. END;
  338. FUNCTION GetLocaleStr(locale : pLocale; stringNum : ULONG) : pCHAR;
  339. BEGIN
  340. ASM
  341. MOVE.L A6,-(A7)
  342. MOVEA.L locale,A0
  343. MOVE.L stringNum,D0
  344. MOVEA.L LocaleBase,A6
  345. JSR -078(A6)
  346. MOVEA.L (A7)+,A6
  347. MOVE.L D0,@RESULT
  348. END;
  349. END;
  350. FUNCTION IsAlNum(locale : pLocale; character : ULONG) : BOOLEAN;
  351. BEGIN
  352. ASM
  353. MOVE.L A6,-(A7)
  354. MOVEA.L locale,A0
  355. MOVE.L character,D0
  356. MOVEA.L LocaleBase,A6
  357. JSR -084(A6)
  358. MOVEA.L (A7)+,A6
  359. TST.W D0
  360. BEQ.B @end
  361. MOVEQ #1,D0
  362. @end: MOVE.B D0,@RESULT
  363. END;
  364. END;
  365. FUNCTION IsAlpha(locale : pLocale; character : ULONG) : BOOLEAN;
  366. BEGIN
  367. ASM
  368. MOVE.L A6,-(A7)
  369. MOVEA.L locale,A0
  370. MOVE.L character,D0
  371. MOVEA.L LocaleBase,A6
  372. JSR -090(A6)
  373. MOVEA.L (A7)+,A6
  374. TST.W D0
  375. BEQ.B @end
  376. MOVEQ #1,D0
  377. @end: MOVE.B D0,@RESULT
  378. END;
  379. END;
  380. FUNCTION IsCntrl(locale : pLocale; character : ULONG) : BOOLEAN;
  381. BEGIN
  382. ASM
  383. MOVE.L A6,-(A7)
  384. MOVEA.L locale,A0
  385. MOVE.L character,D0
  386. MOVEA.L LocaleBase,A6
  387. JSR -096(A6)
  388. MOVEA.L (A7)+,A6
  389. TST.W D0
  390. BEQ.B @end
  391. MOVEQ #1,D0
  392. @end: MOVE.B D0,@RESULT
  393. END;
  394. END;
  395. FUNCTION IsDigit(locale : pLocale; character : ULONG) : BOOLEAN;
  396. BEGIN
  397. ASM
  398. MOVE.L A6,-(A7)
  399. MOVEA.L locale,A0
  400. MOVE.L character,D0
  401. MOVEA.L LocaleBase,A6
  402. JSR -102(A6)
  403. MOVEA.L (A7)+,A6
  404. TST.W D0
  405. BEQ.B @end
  406. MOVEQ #1,D0
  407. @end: MOVE.B D0,@RESULT
  408. END;
  409. END;
  410. FUNCTION IsGraph(locale : pLocale; character : ULONG) : BOOLEAN;
  411. BEGIN
  412. ASM
  413. MOVE.L A6,-(A7)
  414. MOVEA.L locale,A0
  415. MOVE.L character,D0
  416. MOVEA.L LocaleBase,A6
  417. JSR -108(A6)
  418. MOVEA.L (A7)+,A6
  419. TST.W D0
  420. BEQ.B @end
  421. MOVEQ #1,D0
  422. @end: MOVE.B D0,@RESULT
  423. END;
  424. END;
  425. FUNCTION IsLower(locale : pLocale; character : ULONG) : BOOLEAN;
  426. BEGIN
  427. ASM
  428. MOVE.L A6,-(A7)
  429. MOVEA.L locale,A0
  430. MOVE.L character,D0
  431. MOVEA.L LocaleBase,A6
  432. JSR -114(A6)
  433. MOVEA.L (A7)+,A6
  434. TST.W D0
  435. BEQ.B @end
  436. MOVEQ #1,D0
  437. @end: MOVE.B D0,@RESULT
  438. END;
  439. END;
  440. FUNCTION IsPrint(locale : pLocale; character : ULONG) : BOOLEAN;
  441. BEGIN
  442. ASM
  443. MOVE.L A6,-(A7)
  444. MOVEA.L locale,A0
  445. MOVE.L character,D0
  446. MOVEA.L LocaleBase,A6
  447. JSR -120(A6)
  448. MOVEA.L (A7)+,A6
  449. TST.W D0
  450. BEQ.B @end
  451. MOVEQ #1,D0
  452. @end: MOVE.B D0,@RESULT
  453. END;
  454. END;
  455. FUNCTION IsPunct(locale : pLocale; character : ULONG) : BOOLEAN;
  456. BEGIN
  457. ASM
  458. MOVE.L A6,-(A7)
  459. MOVEA.L locale,A0
  460. MOVE.L character,D0
  461. MOVEA.L LocaleBase,A6
  462. JSR -126(A6)
  463. MOVEA.L (A7)+,A6
  464. TST.W D0
  465. BEQ.B @end
  466. MOVEQ #1,D0
  467. @end: MOVE.B D0,@RESULT
  468. END;
  469. END;
  470. FUNCTION IsSpace(locale : pLocale; character : ULONG) : BOOLEAN;
  471. BEGIN
  472. ASM
  473. MOVE.L A6,-(A7)
  474. MOVEA.L locale,A0
  475. MOVE.L character,D0
  476. MOVEA.L LocaleBase,A6
  477. JSR -132(A6)
  478. MOVEA.L (A7)+,A6
  479. TST.W D0
  480. BEQ.B @end
  481. MOVEQ #1,D0
  482. @end: MOVE.B D0,@RESULT
  483. END;
  484. END;
  485. FUNCTION IsUpper(locale : pLocale; character : ULONG) : BOOLEAN;
  486. BEGIN
  487. ASM
  488. MOVE.L A6,-(A7)
  489. MOVEA.L locale,A0
  490. MOVE.L character,D0
  491. MOVEA.L LocaleBase,A6
  492. JSR -138(A6)
  493. MOVEA.L (A7)+,A6
  494. TST.W D0
  495. BEQ.B @end
  496. MOVEQ #1,D0
  497. @end: MOVE.B D0,@RESULT
  498. END;
  499. END;
  500. FUNCTION IsXDigit(locale : pLocale; character : ULONG) : BOOLEAN;
  501. BEGIN
  502. ASM
  503. MOVE.L A6,-(A7)
  504. MOVEA.L locale,A0
  505. MOVE.L character,D0
  506. MOVEA.L LocaleBase,A6
  507. JSR -144(A6)
  508. MOVEA.L (A7)+,A6
  509. TST.W D0
  510. BEQ.B @end
  511. MOVEQ #1,D0
  512. @end: MOVE.B D0,@RESULT
  513. END;
  514. END;
  515. FUNCTION OpenCatalogA(locale : pLocale; name : pCHAR; tags : pTagItem) : pCatalog;
  516. BEGIN
  517. ASM
  518. MOVE.L A6,-(A7)
  519. MOVEA.L locale,A0
  520. MOVEA.L name,A1
  521. MOVEA.L tags,A2
  522. MOVEA.L LocaleBase,A6
  523. JSR -150(A6)
  524. MOVEA.L (A7)+,A6
  525. MOVE.L D0,@RESULT
  526. END;
  527. END;
  528. FUNCTION OpenLocale(name : pCHAR) : pLocale;
  529. BEGIN
  530. ASM
  531. MOVE.L A6,-(A7)
  532. MOVEA.L name,A0
  533. MOVEA.L LocaleBase,A6
  534. JSR -156(A6)
  535. MOVEA.L (A7)+,A6
  536. MOVE.L D0,@RESULT
  537. END;
  538. END;
  539. FUNCTION ParseDate(locale : pLocale; date : pDateStamp; fmtTemplate : pCHAR; getCharFunc : pHook) : BOOLEAN;
  540. BEGIN
  541. ASM
  542. MOVE.L A6,-(A7)
  543. MOVEA.L locale,A0
  544. MOVEA.L date,A1
  545. MOVEA.L fmtTemplate,A2
  546. MOVEA.L getCharFunc,A3
  547. MOVEA.L LocaleBase,A6
  548. JSR -162(A6)
  549. MOVEA.L (A7)+,A6
  550. TST.W D0
  551. BEQ.B @end
  552. MOVEQ #1,D0
  553. @end: MOVE.B D0,@RESULT
  554. END;
  555. END;
  556. FUNCTION StrConvert(locale : pLocale; string1 : pCHAR; buffer : POINTER; bufferSize : ULONG; typ : ULONG) : ULONG;
  557. BEGIN
  558. ASM
  559. MOVE.L A6,-(A7)
  560. MOVEA.L locale,A0
  561. MOVEA.L string1,A1
  562. MOVEA.L buffer,A2
  563. MOVE.L bufferSize,D0
  564. MOVE.L typ,D1
  565. MOVEA.L LocaleBase,A6
  566. JSR -174(A6)
  567. MOVEA.L (A7)+,A6
  568. MOVE.L D0,@RESULT
  569. END;
  570. END;
  571. FUNCTION StrnCmp(locale : pLocale; string1 : pCHAR; string2 : pCHAR; length : LONGINT; typ : ULONG) : LONGINT;
  572. BEGIN
  573. ASM
  574. MOVE.L A6,-(A7)
  575. MOVEA.L locale,A0
  576. MOVEA.L string1,A1
  577. MOVEA.L string2,A2
  578. MOVE.L length,D0
  579. MOVE.L typ,D1
  580. MOVEA.L LocaleBase,A6
  581. JSR -180(A6)
  582. MOVEA.L (A7)+,A6
  583. MOVE.L D0,@RESULT
  584. END;
  585. END;
  586. const
  587. { Change VERSION and LIBVERSION to proper values }
  588. VERSION : string[2] = '0';
  589. LIBVERSION : longword = 0;
  590. {$ifdef use_init_openlib}
  591. {$Info Compiling initopening of locale.library}
  592. {$Info don't forget to use InitLOCALELibrary in the beginning of your program}
  593. var
  594. locale_exit : Pointer;
  595. procedure CloselocaleLibrary;
  596. begin
  597. ExitProc := locale_exit;
  598. if LocaleBase <> nil then begin
  599. CloseLibrary(pLibrary(LocaleBase));
  600. LocaleBase := nil;
  601. end;
  602. end;
  603. procedure InitLOCALELibrary;
  604. begin
  605. LocaleBase := nil;
  606. LocaleBase := pLocaleBase(OpenLibrary(LOCALENAME,LIBVERSION));
  607. if LocaleBase <> nil then begin
  608. locale_exit := ExitProc;
  609. ExitProc := @CloselocaleLibrary;
  610. end else begin
  611. MessageBox('FPC Pascal Error',
  612. 'Can''t open locale.library version ' + VERSION + #10 +
  613. 'Deallocating resources and closing down',
  614. 'Oops');
  615. halt(20);
  616. end;
  617. end;
  618. begin
  619. LOCALEIsCompiledHow := 2;
  620. {$endif use_init_openlib}
  621. {$ifdef use_auto_openlib}
  622. {$Info Compiling autoopening of locale.library}
  623. var
  624. locale_exit : Pointer;
  625. procedure CloselocaleLibrary;
  626. begin
  627. ExitProc := locale_exit;
  628. if LocaleBase <> nil then begin
  629. CloseLibrary(pLibrary(LocaleBase));
  630. LocaleBase := nil;
  631. end;
  632. end;
  633. begin
  634. LocaleBase := nil;
  635. LocaleBase := pLocaleBase(OpenLibrary(LOCALENAME,LIBVERSION));
  636. if LocaleBase <> nil then begin
  637. locale_exit := ExitProc;
  638. ExitProc := @CloselocaleLibrary;
  639. LOCALEIsCompiledHow := 1;
  640. end else begin
  641. MessageBox('FPC Pascal Error',
  642. 'Can''t open locale.library version ' + VERSION + #10 +
  643. 'Deallocating resources and closing down',
  644. 'Oops');
  645. halt(20);
  646. end;
  647. {$endif use_auto_openlib}
  648. {$ifdef dont_use_openlib}
  649. begin
  650. LOCALEIsCompiledHow := 3;
  651. {$Warning No autoopening of locale.library compiled}
  652. {$Warning Make sure you open locale.library yourself}
  653. {$endif dont_use_openlib}
  654. END. (* UNIT LOCALE *)