DateTimeUtils.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. {
  2. File: DateTimeUtils.p
  3. Contains: International Date and Time Interfaces (previously in TextUtils)
  4. Version: Technology: Mac OS 8.5
  5. Release: Universal Interfaces 3.4.2
  6. Copyright: © 1994-2002 by Apple Computer, Inc., all rights reserved.
  7. Bugs?: For bug reports, consult the following page on
  8. the World Wide Web:
  9. http://www.freepascal.org/bugs.html
  10. }
  11. {
  12. Modified for use with Free Pascal
  13. Version 200
  14. Please report any bugs to <[email protected]>
  15. }
  16. {$mode macpas}
  17. {$packenum 1}
  18. {$macro on}
  19. {$inline on}
  20. {$CALLING MWPASCAL}
  21. unit DateTimeUtils;
  22. interface
  23. {$setc UNIVERSAL_INTERFACES_VERSION := $0342}
  24. {$setc GAP_INTERFACES_VERSION := $0200}
  25. {$ifc not defined USE_CFSTR_CONSTANT_MACROS}
  26. {$setc USE_CFSTR_CONSTANT_MACROS := TRUE}
  27. {$endc}
  28. {$ifc defined CPUPOWERPC and defined CPUI386}
  29. {$error Conflicting initial definitions for CPUPOWERPC and CPUI386}
  30. {$endc}
  31. {$ifc defined FPC_BIG_ENDIAN and defined FPC_LITTLE_ENDIAN}
  32. {$error Conflicting initial definitions for FPC_BIG_ENDIAN and FPC_LITTLE_ENDIAN}
  33. {$endc}
  34. {$ifc not defined __ppc__ and defined CPUPOWERPC}
  35. {$setc __ppc__ := 1}
  36. {$elsec}
  37. {$setc __ppc__ := 0}
  38. {$endc}
  39. {$ifc not defined __i386__ and defined CPUI386}
  40. {$setc __i386__ := 1}
  41. {$elsec}
  42. {$setc __i386__ := 0}
  43. {$endc}
  44. {$ifc defined __ppc__ and __ppc__ and defined __i386__ and __i386__}
  45. {$error Conflicting definitions for __ppc__ and __i386__}
  46. {$endc}
  47. {$ifc defined __ppc__ and __ppc__}
  48. {$setc TARGET_CPU_PPC := TRUE}
  49. {$setc TARGET_CPU_X86 := FALSE}
  50. {$elifc defined __i386__ and __i386__}
  51. {$setc TARGET_CPU_PPC := FALSE}
  52. {$setc TARGET_CPU_X86 := TRUE}
  53. {$elsec}
  54. {$error Neither __ppc__ nor __i386__ is defined.}
  55. {$endc}
  56. {$setc TARGET_CPU_PPC_64 := FALSE}
  57. {$ifc defined FPC_BIG_ENDIAN}
  58. {$setc TARGET_RT_BIG_ENDIAN := TRUE}
  59. {$setc TARGET_RT_LITTLE_ENDIAN := FALSE}
  60. {$elifc defined FPC_LITTLE_ENDIAN}
  61. {$setc TARGET_RT_BIG_ENDIAN := FALSE}
  62. {$setc TARGET_RT_LITTLE_ENDIAN := TRUE}
  63. {$elsec}
  64. {$error Neither FPC_BIG_ENDIAN nor FPC_LITTLE_ENDIAN are defined.}
  65. {$endc}
  66. {$setc ACCESSOR_CALLS_ARE_FUNCTIONS := TRUE}
  67. {$setc CALL_NOT_IN_CARBON := FALSE}
  68. {$setc OLDROUTINENAMES := FALSE}
  69. {$setc OPAQUE_TOOLBOX_STRUCTS := TRUE}
  70. {$setc OPAQUE_UPP_TYPES := TRUE}
  71. {$setc OTCARBONAPPLICATION := TRUE}
  72. {$setc OTKERNEL := FALSE}
  73. {$setc PM_USE_SESSION_APIS := TRUE}
  74. {$setc TARGET_API_MAC_CARBON := TRUE}
  75. {$setc TARGET_API_MAC_OS8 := FALSE}
  76. {$setc TARGET_API_MAC_OSX := TRUE}
  77. {$setc TARGET_CARBON := TRUE}
  78. {$setc TARGET_CPU_68K := FALSE}
  79. {$setc TARGET_CPU_MIPS := FALSE}
  80. {$setc TARGET_CPU_SPARC := FALSE}
  81. {$setc TARGET_OS_MAC := TRUE}
  82. {$setc TARGET_OS_UNIX := FALSE}
  83. {$setc TARGET_OS_WIN32 := FALSE}
  84. {$setc TARGET_RT_MAC_68881 := FALSE}
  85. {$setc TARGET_RT_MAC_CFM := FALSE}
  86. {$setc TARGET_RT_MAC_MACHO := TRUE}
  87. {$setc TYPED_FUNCTION_POINTERS := TRUE}
  88. {$setc TYPE_BOOL := FALSE}
  89. {$setc TYPE_EXTENDED := FALSE}
  90. {$setc TYPE_LONGLONG := TRUE}
  91. uses MacTypes,ConditionalMacros;
  92. {$ALIGN MAC68K}
  93. {
  94. Here are the current routine names and the translations to the older forms.
  95. Please use the newer forms in all new code and migrate the older names out of existing
  96. code as maintainance permits.
  97. New Name Old Name(s)
  98. DateString IUDatePString IUDateString
  99. InitDateCache
  100. LongDateString IULDateString
  101. LongTimeString IULTimeString
  102. StringToDate String2Date
  103. StringToTime
  104. TimeString IUTimeString IUTimePString
  105. LongDateToSeconds LongDate2Secs
  106. LongSecondsToDate LongSecs2Date
  107. DateToSeconds Date2Secs
  108. SecondsToDate Secs2Date
  109. Carbon only supports the new names. The old names are undefined for Carbon targets.
  110. This is true for C, Assembly and Pascal.
  111. InterfaceLib always has exported the old names. For C macros have been defined to allow
  112. the use of the new names. For Pascal and Assembly using the new names will result
  113. in link errors.
  114. }
  115. type
  116. ToggleResults = SInt16;
  117. const
  118. { Toggle results }
  119. toggleUndefined = 0;
  120. toggleOK = 1;
  121. toggleBadField = 2;
  122. toggleBadDelta = 3;
  123. toggleBadChar = 4;
  124. toggleUnknown = 5;
  125. toggleBadNum = 6;
  126. toggleOutOfRange = 7; { synonym for toggleErr3 }
  127. toggleErr3 = 7;
  128. toggleErr4 = 8;
  129. toggleErr5 = 9;
  130. { Date equates }
  131. smallDateBit = 31; { Restrict valid date/time to range of Time global }
  132. togChar12HourBit = 30; { If toggling hour by char, accept hours 1..12 only }
  133. togCharZCycleBit = 29; { Modifier for togChar12HourBit: accept hours 0..11 only }
  134. togDelta12HourBit = 28; { If toggling hour up/down, restrict to 12-hour range (am/pm) }
  135. genCdevRangeBit = 27; { Restrict date/time to range used by genl CDEV }
  136. validDateFields = -1;
  137. maxDateField = 10;
  138. eraMask = $0001;
  139. yearMask = $0002;
  140. monthMask = $0004;
  141. dayMask = $0008;
  142. hourMask = $0010;
  143. minuteMask = $0020;
  144. secondMask = $0040;
  145. dayOfWeekMask = $0080;
  146. dayOfYearMask = $0100;
  147. weekOfYearMask = $0200;
  148. pmMask = $0400;
  149. dateStdMask = $007F; { default for ValidDate flags and ToggleDate TogglePB.togFlags }
  150. type
  151. LongDateField = SInt8;
  152. const
  153. eraField = 0;
  154. yearField = 1;
  155. monthField = 2;
  156. dayField = 3;
  157. hourField = 4;
  158. minuteField = 5;
  159. secondField = 6;
  160. dayOfWeekField = 7;
  161. dayOfYearField = 8;
  162. weekOfYearField = 9;
  163. pmField = 10;
  164. res1Field = 11;
  165. res2Field = 12;
  166. res3Field = 13;
  167. type
  168. DateForm = SInt8;
  169. const
  170. shortDate = 0;
  171. longDate = 1;
  172. abbrevDate = 2;
  173. { StringToDate status values }
  174. fatalDateTime = $8000; { StringToDate and String2Time mask to a fatal error }
  175. longDateFound = 1; { StringToDate mask to long date found }
  176. leftOverChars = 2; { StringToDate & Time mask to warn of left over characters }
  177. sepNotIntlSep = 4; { StringToDate & Time mask to warn of non-standard separators }
  178. fieldOrderNotIntl = 8; { StringToDate & Time mask to warn of non-standard field order }
  179. extraneousStrings = 16; { StringToDate & Time mask to warn of unparsable strings in text }
  180. tooManySeps = 32; { StringToDate & Time mask to warn of too many separators }
  181. sepNotConsistent = 64; { StringToDate & Time mask to warn of inconsistent separators }
  182. tokenErr = $8100; { StringToDate & Time mask for 'tokenizer err encountered' }
  183. cantReadUtilities = $8200;
  184. dateTimeNotFound = $8400;
  185. dateTimeInvalid = $8800;
  186. type
  187. StringToDateStatus = SInt16;
  188. String2DateStatus = StringToDateStatus;
  189. DateCacheRecordPtr = ^DateCacheRecord;
  190. DateCacheRecord = packed record
  191. hidden: array [0..255] of SInt16; { only for temporary use }
  192. end;
  193. DateCachePtr = ^DateCacheRecord;
  194. DateTimeRecPtr = ^DateTimeRec;
  195. DateTimeRec = record
  196. year: SInt16;
  197. month: SInt16;
  198. day: SInt16;
  199. hour: SInt16;
  200. minute: SInt16;
  201. second: SInt16;
  202. dayOfWeek: SInt16;
  203. end;
  204. LongDateTime = SInt64;
  205. LongDateTimePtr = ^LongDateTime;
  206. {$ifc TARGET_RT_BIG_ENDIAN}
  207. LongDateCvt = record
  208. case SInt16 of
  209. 0: (
  210. c: SInt64;
  211. );
  212. 1: (
  213. lHigh: UInt32;
  214. lLow: UInt32;
  215. );
  216. end;
  217. {$elsec}
  218. LongDateCvt = record
  219. case SInt16 of
  220. 0: (
  221. c: SInt64;
  222. );
  223. 1: (
  224. lLow: UInt32;
  225. lHigh: UInt32;
  226. );
  227. end;
  228. {$endc}
  229. LongDateCvtPtr = ^LongDateCvt;
  230. LongDateRecPtr = ^LongDateRec;
  231. LongDateRec = record
  232. case SInt16 of
  233. 0: (
  234. era: SInt16;
  235. year: SInt16;
  236. month: SInt16;
  237. day: SInt16;
  238. hour: SInt16;
  239. minute: SInt16;
  240. second: SInt16;
  241. dayOfWeek: SInt16;
  242. dayOfYear: SInt16;
  243. weekOfYear: SInt16;
  244. pm: SInt16;
  245. res1: SInt16;
  246. res2: SInt16;
  247. res3: SInt16;
  248. );
  249. 1: (
  250. list: array [0..13] of SInt16; { Index by LongDateField! }
  251. );
  252. 2: (
  253. eraAlt: SInt16;
  254. oldDate: DateTimeRec;
  255. );
  256. end;
  257. DateDelta = SInt8;
  258. TogglePBPtr = ^TogglePB;
  259. TogglePB = record
  260. togFlags: SInt32; { caller normally sets low word to dateStdMask=$7F }
  261. amChars: ResType; { from 'itl0', but uppercased }
  262. pmChars: ResType; { from 'itl0', but uppercased }
  263. reserved: array [0..3] of SInt32;
  264. end;
  265. {
  266. These routine are available in Carbon with their new name
  267. }
  268. {
  269. * DateString()
  270. *
  271. * Availability:
  272. * Non-Carbon CFM: not available
  273. * CarbonLib: in CarbonLib 1.0 and later
  274. * Mac OS X: in version 10.0 and later
  275. }
  276. procedure DateString(dateTime: UInt32; longFlag: ByteParameter; var result: Str255; intlHandle: Handle); external name '_DateString';
  277. {
  278. * TimeString()
  279. *
  280. * Availability:
  281. * Non-Carbon CFM: not available
  282. * CarbonLib: in CarbonLib 1.0 and later
  283. * Mac OS X: in version 10.0 and later
  284. }
  285. procedure TimeString(dateTime: UInt32; wantSeconds: boolean; var result: Str255; intlHandle: Handle); external name '_TimeString';
  286. {
  287. * LongDateString()
  288. *
  289. * Availability:
  290. * Non-Carbon CFM: not available
  291. * CarbonLib: in CarbonLib 1.0 and later
  292. * Mac OS X: in version 10.0 and later
  293. }
  294. procedure LongDateString((*const*) var dateTime: LongDateTime; longFlag: ByteParameter; var result: Str255; intlHandle: Handle); external name '_LongDateString';
  295. {
  296. * LongTimeString()
  297. *
  298. * Availability:
  299. * Non-Carbon CFM: not available
  300. * CarbonLib: in CarbonLib 1.0 and later
  301. * Mac OS X: in version 10.0 and later
  302. }
  303. procedure LongTimeString((*const*) var dateTime: LongDateTime; wantSeconds: boolean; var result: Str255; intlHandle: Handle); external name '_LongTimeString';
  304. {
  305. These routine are available in Carbon and InterfaceLib with their new name
  306. }
  307. {
  308. * InitDateCache()
  309. *
  310. * Availability:
  311. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  312. * CarbonLib: in CarbonLib 1.0 and later
  313. * Mac OS X: in version 10.0 and later
  314. }
  315. function InitDateCache(theCache: DateCachePtr): OSErr; external name '_InitDateCache';
  316. {
  317. * StringToDate()
  318. *
  319. * Availability:
  320. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  321. * CarbonLib: in CarbonLib 1.0 and later
  322. * Mac OS X: in version 10.0 and later
  323. }
  324. function StringToDate(textPtr: Ptr; textLen: SInt32; theCache: DateCachePtr; var lengthUsed: SInt32; var dateTime: LongDateRec): StringToDateStatus; external name '_StringToDate';
  325. {
  326. * StringToTime()
  327. *
  328. * Availability:
  329. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  330. * CarbonLib: in CarbonLib 1.0 and later
  331. * Mac OS X: in version 10.0 and later
  332. }
  333. function StringToTime(textPtr: Ptr; textLen: SInt32; theCache: DateCachePtr; var lengthUsed: SInt32; var dateTime: LongDateRec): StringToDateStatus; external name '_StringToTime';
  334. {
  335. * LongDateToSeconds()
  336. *
  337. * Availability:
  338. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  339. * CarbonLib: in CarbonLib 1.0 and later
  340. * Mac OS X: in version 10.0 and later
  341. }
  342. procedure LongDateToSeconds(const (*var*) lDate: LongDateRec; var lSecs: LongDateTime); external name '_LongDateToSeconds';
  343. {
  344. * LongSecondsToDate()
  345. *
  346. * Availability:
  347. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  348. * CarbonLib: in CarbonLib 1.0 and later
  349. * Mac OS X: in version 10.0 and later
  350. }
  351. procedure LongSecondsToDate((*const*) var lSecs: LongDateTime; var lDate: LongDateRec); external name '_LongSecondsToDate';
  352. {
  353. * ToggleDate()
  354. *
  355. * Availability:
  356. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  357. * CarbonLib: in CarbonLib 1.0 and later
  358. * Mac OS X: in version 10.0 and later
  359. }
  360. function ToggleDate(var lSecs: LongDateTime; field: ByteParameter; delta: DateDelta; ch: SInt16; const (*var*) params: TogglePB): ToggleResults; external name '_ToggleDate';
  361. {
  362. * ValidDate()
  363. *
  364. * Availability:
  365. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  366. * CarbonLib: in CarbonLib 1.0 and later
  367. * Mac OS X: in version 10.0 and later
  368. }
  369. function ValidDate(const (*var*) vDate: LongDateRec; flags: SInt32; var newSecs: LongDateTime): SInt16; external name '_ValidDate';
  370. {
  371. * ReadDateTime()
  372. *
  373. * Availability:
  374. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  375. * CarbonLib: in CarbonLib 1.0 and later
  376. * Mac OS X: in version 10.0 and later
  377. }
  378. function ReadDateTime(var time: UInt32): OSErr; external name '_ReadDateTime';
  379. {
  380. * GetDateTime()
  381. *
  382. * Availability:
  383. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  384. * CarbonLib: in CarbonLib 1.0 and later
  385. * Mac OS X: in version 10.0 and later
  386. }
  387. procedure GetDateTime(var secs: UInt32); external name '_GetDateTime';
  388. {
  389. * SetDateTime()
  390. *
  391. * Availability:
  392. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  393. * CarbonLib: in CarbonLib 1.0 and later
  394. * Mac OS X: in version 10.0 and later
  395. }
  396. function SetDateTime(time: UInt32): OSErr; external name '_SetDateTime';
  397. {
  398. * SetTime()
  399. *
  400. * Availability:
  401. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  402. * CarbonLib: in CarbonLib 1.0 and later
  403. * Mac OS X: in version 10.0 and later
  404. }
  405. procedure SetTime(const (*var*) d: DateTimeRec); external name '_SetTime';
  406. {
  407. * GetTime()
  408. *
  409. * Availability:
  410. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  411. * CarbonLib: in CarbonLib 1.0 and later
  412. * Mac OS X: in version 10.0 and later
  413. }
  414. procedure GetTime(var d: DateTimeRec); external name '_GetTime';
  415. {
  416. * DateToSeconds()
  417. *
  418. * Availability:
  419. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  420. * CarbonLib: in CarbonLib 1.0 and later
  421. * Mac OS X: in version 10.0 and later
  422. }
  423. procedure DateToSeconds(const (*var*) d: DateTimeRec; var secs: UInt32); external name '_DateToSeconds';
  424. {
  425. * SecondsToDate()
  426. *
  427. * Availability:
  428. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  429. * CarbonLib: in CarbonLib 1.0 and later
  430. * Mac OS X: in version 10.0 and later
  431. }
  432. procedure SecondsToDate(secs: UInt32; var d: DateTimeRec); external name '_SecondsToDate';
  433. {
  434. These routine are available in InterfaceLib using their old name.
  435. Macros allow using the new names in all source code.
  436. }
  437. {$ifc CALL_NOT_IN_CARBON}
  438. {
  439. * IUDateString()
  440. *
  441. * Availability:
  442. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  443. * CarbonLib: not available
  444. * Mac OS X: not available
  445. }
  446. procedure IUDateString(dateTime: SInt32; longFlag: ByteParameter; var result: Str255); external name '_IUDateString';
  447. {
  448. * IUTimeString()
  449. *
  450. * Availability:
  451. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  452. * CarbonLib: not available
  453. * Mac OS X: not available
  454. }
  455. procedure IUTimeString(dateTime: SInt32; wantSeconds: boolean; var result: Str255); external name '_IUTimeString';
  456. {
  457. * IUDatePString()
  458. *
  459. * Availability:
  460. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  461. * CarbonLib: not available
  462. * Mac OS X: not available
  463. }
  464. procedure IUDatePString(dateTime: SInt32; longFlag: ByteParameter; var result: Str255; intlHandle: Handle); external name '_IUDatePString';
  465. {
  466. * IUTimePString()
  467. *
  468. * Availability:
  469. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  470. * CarbonLib: not available
  471. * Mac OS X: not available
  472. }
  473. procedure IUTimePString(dateTime: SInt32; wantSeconds: boolean; var result: Str255; intlHandle: Handle); external name '_IUTimePString';
  474. {
  475. * IULDateString()
  476. *
  477. * Availability:
  478. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  479. * CarbonLib: not available
  480. * Mac OS X: not available
  481. }
  482. procedure IULDateString(var dateTime: LongDateTime; longFlag: ByteParameter; var result: Str255; intlHandle: Handle); external name '_IULDateString';
  483. {
  484. * IULTimeString()
  485. *
  486. * Availability:
  487. * Non-Carbon CFM: in InterfaceLib 7.1 and later
  488. * CarbonLib: not available
  489. * Mac OS X: not available
  490. }
  491. procedure IULTimeString(var dateTime: LongDateTime; wantSeconds: boolean; var result: Str255; intlHandle: Handle); external name '_IULTimeString';
  492. {$endc} {CALL_NOT_IN_CARBON}
  493. {$ifc OLDROUTINENAMES}
  494. {$ifc CALL_NOT_IN_CARBON}
  495. {
  496. * LongDate2Secs()
  497. *
  498. * Availability:
  499. * Non-Carbon CFM: not available
  500. * CarbonLib: not available
  501. * Mac OS X: not available
  502. }
  503. procedure LongDate2Secs(const (*var*) lDate: LongDateRec; var lSecs: LongDateTime); external name '_LongDate2Secs';
  504. {
  505. * LongSecs2Date()
  506. *
  507. * Availability:
  508. * Non-Carbon CFM: not available
  509. * CarbonLib: not available
  510. * Mac OS X: not available
  511. }
  512. procedure LongSecs2Date(var lSecs: LongDateTime; var lDate: LongDateRec); external name '_LongSecs2Date';
  513. {
  514. * Date2Secs()
  515. *
  516. * Availability:
  517. * Non-Carbon CFM: not available
  518. * CarbonLib: not available
  519. * Mac OS X: not available
  520. }
  521. procedure Date2Secs(const (*var*) d: DateTimeRec; var secs: UInt32); external name '_Date2Secs';
  522. {
  523. * Secs2Date()
  524. *
  525. * Availability:
  526. * Non-Carbon CFM: not available
  527. * CarbonLib: not available
  528. * Mac OS X: not available
  529. }
  530. procedure Secs2Date(secs: UInt32; var d: DateTimeRec); external name '_Secs2Date';
  531. {$endc} {CALL_NOT_IN_CARBON}
  532. {$endc} {OLDROUTINENAMES}
  533. {$ALIGN MAC68K}
  534. end.