2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
5 Desc: LocStrToDate - locale.library's private replacement
6 of dos.library/StrToDate function. IPrefs will install
12 #include <exec/types.h>
13 #include <dos/datetime.h>
14 #include <proto/exec.h>
15 #include <proto/dos.h>
16 #include <proto/locale.h>
17 #include "locale_intern.h"
18 #include <aros/asmcall.h>
22 #define YEAR_FORMAT "%y"
28 static const TEXT long_dos_time_format
[] = "%H:%M:%S";
29 static const TEXT short_dos_time_format
[] = "%H:%M";
31 AROS_UFH3(ULONG
, LocStrToDateGetCharFunc
,
32 AROS_UFHA(struct Hook
*, hook
, A0
),
33 AROS_UFHA(struct Locale
*, locale
, A2
),
34 AROS_UFHA(ULONG
, null
, A1
))
38 STRPTR
*buf
= (STRPTR
*)hook
->h_Data
;
45 /*****************************************************************************
48 #include <proto/locale.h>
50 AROS_PLH1(LONG
, LocStrToDate
,
53 AROS_LHA(struct DateTime
*, datetime
, D1
),
56 struct DosLibrary
*, DOSBase
, 37, Locale
)
59 See dos.library/StrToDate
62 See dos.library/StrToDate
67 This function is not called by apps directly. Instead
68 dos.library/StrToDate() is patched to use this function. This means
69 that the LocaleBase parameter above actually points to DOSBase, so we
70 make use of the global LocaleBase variable. This function is marked as
71 private, thus the headers generator won't mind the different basename
79 dos.library/StrToDate, locale.library/ParseDate.
83 *****************************************************************************/
89 CONST_STRPTR buf
, fstring
, altfstring
;
93 hook
.h_Entry
= (HOOKFUNC
) AROS_ASMSYMNAME(LocStrToDateGetCharFunc
);
98 loc
= (struct Locale
*)IntLB(LocaleBase
)->lb_CurrentLocale
;
100 if (datetime
->dat_StrDate
)
102 struct DateStamp curr
;
104 buf
= datetime
->dat_StrDate
;
108 if (!strnicmp(buf
, GetLocaleStr(loc
, YESTERDAYSTR
),
109 strlen(GetLocaleStr(loc
, YESTERDAYSTR
))))
111 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
- 1;
113 else if (!strnicmp(buf
, GetLocaleStr(loc
, TODAYSTR
),
114 strlen(GetLocaleStr(loc
, TODAYSTR
))))
116 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
;
118 else if (!strnicmp(buf
, GetLocaleStr(loc
, TOMORROWSTR
),
119 strlen(GetLocaleStr(loc
, TOMORROWSTR
))))
121 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
+ 1;
127 for (i
= 0; i
< 7; i
++)
129 if (!strnicmp(buf
, GetLocaleStr(loc
, DAY_1
+ i
),
130 strlen(GetLocaleStr(loc
, DAY_1
+ i
))))
141 diffdays
= i
- (days
% 7);
143 if (datetime
->dat_Flags
& DTF_FUTURE
)
151 days
+= 7 + diffdays
;
162 days
+= diffdays
- 7;
165 datetime
->dat_Stamp
.ds_Days
= days
;
176 if (datetime
->dat_Flags
& DTF_FUTURE
)
179 datetime
->dat_Stamp
.ds_Days
= days
;
185 switch (datetime
->dat_Format
)
188 fstring
= YEAR_FORMAT
"-%b-%d";
189 altfstring
= YEAR_FORMAT
"-%m-%d";
193 altfstring
= fstring
= "%m-%d-" YEAR_FORMAT
;
197 altfstring
= fstring
= "%d-%m-" YEAR_FORMAT
;
201 altfstring
= fstring
= loc
->loc_ShortDateFormat
;
204 default: /* FORMAT_DOS */
205 fstring
= "%d-%b-" YEAR_FORMAT
;
206 altfstring
= "%d-%m-" YEAR_FORMAT
;
211 if (ParseDate(loc
, &curr
, fstring
, &hook
))
213 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
;
217 buf
= datetime
->dat_StrDate
;
218 if (ParseDate(loc
, &curr
, altfstring
, &hook
))
220 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
;
234 if (retval
&& datetime
->dat_StrTime
)
238 buf
= datetime
->dat_StrTime
;
240 switch (datetime
->dat_Format
)
243 fstring
= loc
->loc_ShortTimeFormat
;
247 if (ParseDate(loc
, NULL
, long_dos_time_format
, &hook
))
248 fstring
= long_dos_time_format
;
250 fstring
= short_dos_time_format
;
251 buf
= datetime
->dat_StrTime
;
255 if (ParseDate(loc
, &ds
, fstring
, &hook
))
257 datetime
->dat_Stamp
.ds_Minute
= ds
.ds_Minute
;
258 datetime
->dat_Stamp
.ds_Tick
= ds
.ds_Tick
;