2 Copyright © 1995-2008, 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 #if (AROS_FLAVOUR & AROS_FLAVOUR_BINCOMPAT)
23 #define YEAR_FORMAT "%y"
25 #define YEAR_FORMAT "%Y"
32 static const TEXT long_dos_time_format
[] = "%H:%M:%S";
33 static const TEXT short_dos_time_format
[] = "%H:%M";
35 AROS_UFH3(ULONG
, LocStrToDateGetCharFunc
,
36 AROS_UFHA(struct Hook
*, hook
, A0
),
37 AROS_UFHA(struct Locale
*, locale
, A2
),
38 AROS_UFHA(ULONG
, null
, A1
))
42 STRPTR
*buf
= (STRPTR
*)hook
->h_Data
;
49 /*****************************************************************************
52 #include <proto/locale.h>
54 AROS_PLH1(LONG
, LocStrToDate
,
57 AROS_LHA(struct DateTime
*, datetime
, D1
),
60 struct DosLibrary
*, DOSBase
, 37, Locale
)
63 See dos.library/StrToDate
66 See dos.library/StrToDate
71 This function is not called by apps directly. Instead
72 dos.library/StrToDate() is patched to use this function. This means
73 that the LocaleBase parameter above actually points to DOSBase, so we
74 make use of the global LocaleBase variable. This function is marked as
75 private, thus the headers generator won't mind the different basename
83 dos.library/StrToDate, locale.library/ParseDate.
87 *****************************************************************************/
93 CONST_STRPTR buf
, fstring
, altfstring
;
97 hook
.h_Entry
= (HOOKFUNC
)AROS_ASMSYMNAME(LocStrToDateGetCharFunc
);
102 loc
= (struct Locale
*)IntLB(LocaleBase
)->lb_CurrentLocale
;
104 if (datetime
->dat_StrDate
)
106 struct DateStamp curr
;
108 buf
= datetime
->dat_StrDate
;
112 if (!strnicmp(buf
, GetLocaleStr(loc
, YESTERDAYSTR
), strlen(GetLocaleStr(loc
, YESTERDAYSTR
))))
114 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
- 1;
116 else if (!strnicmp(buf
, GetLocaleStr(loc
, TODAYSTR
), strlen(GetLocaleStr(loc
, TODAYSTR
))))
118 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
;
120 else if (!strnicmp(buf
, GetLocaleStr(loc
, TOMORROWSTR
), strlen(GetLocaleStr(loc
, TOMORROWSTR
))))
122 datetime
->dat_Stamp
.ds_Days
= curr
.ds_Days
+ 1;
128 for(i
= 0; i
< 7; i
++)
130 if (!strnicmp(buf
, GetLocaleStr(loc
, DAY_1
+ i
), 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
;
232 } /* if (datetime->dat_StrDate) */
235 if (retval
&& datetime
->dat_StrTime
)
239 buf
= datetime
->dat_StrTime
;
241 switch(datetime
->dat_Format
)
244 fstring
= loc
->loc_ShortTimeFormat
;
248 if (ParseDate(loc
, NULL
, long_dos_time_format
, &hook
))
249 fstring
= long_dos_time_format
;
251 fstring
= short_dos_time_format
;
252 buf
= datetime
->dat_StrTime
;
256 if (ParseDate(loc
, &ds
, fstring
, &hook
))
258 datetime
->dat_Stamp
.ds_Minute
= ds
.ds_Minute
;
259 datetime
->dat_Stamp
.ds_Tick
= ds
.ds_Tick
;