delint
[AROS.git] / workbench / libs / locale / locstrtodate.c
blob441ecd56d8fc5a2892736c7433e36401a02f5428
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: LocStrToDate - locale.library's private replacement
6 of dos.library/StrToDate function. IPrefs will install
7 the patch.
9 Lang: english
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>
20 #include <string.h>
22 #define YEAR_FORMAT "%y"
24 #ifndef FORMAT_DEF
25 #define FORMAT_DEF 4
26 #endif
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))
36 AROS_USERFUNC_INIT
38 STRPTR *buf = (STRPTR *)hook->h_Data;
40 return *(*buf)++;
42 AROS_USERFUNC_EXIT
45 /*****************************************************************************
47 NAME */
48 #include <proto/locale.h>
50 AROS_PLH1(LONG, LocStrToDate,
52 /* SYNOPSIS */
53 AROS_LHA(struct DateTime *, datetime, D1),
55 /* LOCATION */
56 struct DosLibrary *, DOSBase, 37, Locale)
58 /* FUNCTION
59 See dos.library/StrToDate
61 INPUTS
62 See dos.library/StrToDate
64 RESULT
66 NOTES
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
72 in the header.
74 EXAMPLE
76 BUGS
78 SEE ALSO
79 dos.library/StrToDate, locale.library/ParseDate.
81 INTERNALS
83 *****************************************************************************/
85 AROS_LIBFUNC_INIT
87 struct Locale *loc;
88 struct Hook hook;
89 CONST_STRPTR buf, fstring, altfstring;
90 LONG days;
91 LONG retval = TRUE;
93 hook.h_Entry = (HOOKFUNC) AROS_ASMSYMNAME(LocStrToDateGetCharFunc);
94 hook.h_Data = &buf;
96 REPLACEMENT_LOCK;
98 loc = (struct Locale *)IntLB(LocaleBase)->lb_CurrentLocale;
100 if (datetime->dat_StrDate)
102 struct DateStamp curr;
104 buf = datetime->dat_StrDate;
106 DateStamp(&curr);
108 if (!stricmp(buf, GetLocaleStr(loc, YESTERDAYSTR)))
110 datetime->dat_Stamp.ds_Days = curr.ds_Days - 1;
112 else if (!stricmp(buf, GetLocaleStr(loc, TODAYSTR)))
114 datetime->dat_Stamp.ds_Days = curr.ds_Days;
116 else if (!stricmp(buf, GetLocaleStr(loc, TOMORROWSTR)))
118 datetime->dat_Stamp.ds_Days = curr.ds_Days + 1;
120 else
122 WORD i;
124 for (i = 0; i < 7; i++)
126 if (!stricmp(buf, GetLocaleStr(loc, DAY_1 + i)))
127 break;
130 if (i != 7)
132 #if 1
133 LONG diffdays;
135 days = curr.ds_Days;
137 diffdays = i - (days % 7);
139 if (datetime->dat_Flags & DTF_FUTURE)
141 if (diffdays > 0)
143 days += diffdays;
145 else
147 days += 7 + diffdays;
150 else
152 if (diffdays < 0)
154 days += diffdays;
156 else
158 days += diffdays - 7;
161 datetime->dat_Stamp.ds_Days = days;
162 #else
163 days = curr.ds_Days;
165 if ((days % 7) == 0)
166 days -= 7;
167 else
168 days -= (days % 7);
170 days += i;
172 if (datetime->dat_Flags & DTF_FUTURE)
173 days += 7;
175 datetime->dat_Stamp.ds_Days = days;
176 #endif
178 else
181 switch (datetime->dat_Format)
183 case FORMAT_INT:
184 fstring = YEAR_FORMAT "-%b-%d";
185 altfstring = YEAR_FORMAT "-%m-%d";
186 break;
188 case FORMAT_USA:
189 altfstring = fstring = "%m-%d-" YEAR_FORMAT;
190 break;
192 case FORMAT_CDN:
193 altfstring = fstring = "%d-%m-" YEAR_FORMAT;
194 break;
196 case FORMAT_DEF:
197 altfstring = fstring = loc->loc_ShortDateFormat;
198 break;
200 default: /* FORMAT_DOS */
201 fstring = "%d-%b-" YEAR_FORMAT;
202 altfstring = "%d-%m-" YEAR_FORMAT;
203 break;
207 if (ParseDate(loc, &curr, fstring, &hook))
209 datetime->dat_Stamp.ds_Days = curr.ds_Days;
211 else
213 buf = datetime->dat_StrDate;
214 if (ParseDate(loc, &curr, altfstring, &hook))
216 datetime->dat_Stamp.ds_Days = curr.ds_Days;
218 else
220 retval = FALSE;
230 if (retval && datetime->dat_StrTime)
232 struct DateStamp ds;
234 buf = datetime->dat_StrTime;
236 switch (datetime->dat_Format)
238 case FORMAT_DEF:
239 fstring = loc->loc_ShortTimeFormat;
240 break;
242 default:
243 if (ParseDate(loc, NULL, long_dos_time_format, &hook))
244 fstring = long_dos_time_format;
245 else
246 fstring = short_dos_time_format;
247 buf = datetime->dat_StrTime;
248 break;
251 if (ParseDate(loc, &ds, fstring, &hook))
253 datetime->dat_Stamp.ds_Minute = ds.ds_Minute;
254 datetime->dat_Stamp.ds_Tick = ds.ds_Tick;
256 else
258 retval = FALSE;
262 REPLACEMENT_UNLOCK;
264 return retval;
266 AROS_LIBFUNC_EXIT