make sure "S" is generated.
[AROS-Contrib.git] / rexx / lstring / date.c
blob6626689669a7c282821c32db513138609e1b7ec8
1 /*
2 * $Header$
3 * $Log$
4 * Revision 1.1 2001/04/04 05:43:37 wang
5 * First commit: compiles on Linux, Amiga, Windows, Windows CE, generic gcc
7 * Revision 1.3 2000/10/09 07:17:19 bnv
8 * Corrected the year format
10 * Revision 1.2 1999/11/26 09:53:28 bnv
11 * Added Windows CE support
13 * Revision 1.1 1998/07/02 17:17:00 bnv
14 * Initial revision
18 #ifndef WCE
19 # include <time.h>
20 #endif
21 #ifdef MSDOS
22 # include <dos.h>
23 #endif
24 #include <lerror.h>
25 #include <lstring.h>
27 #ifdef WCE
28 static BYTE month_days[12] = {
29 31, 28, 31, 30, 31, 30,
30 31, 31, 30, 31, 30, 31
33 /* ---- day of year ---- */
34 static int
35 day_of_year(LPSYSTEMTIME time)
37 int m, d = 0;
38 /* fix the february */
39 if ((time->wYear%4==0) && (time->wYear%400 != 0))
40 month_days[1] = 29;
41 else
42 month_days[1] = 28;
43 for (m=1; m<time->wMonth; m++)
44 d += month_days[m-1];
45 return d+time->wDay;
46 } /* day_of_year */
47 #endif
49 static TCHAR *WeekDays[] = {
50 TEXT("Sunday"), TEXT("Monday"), TEXT("Tuesday"), TEXT("Wednesday"),
51 TEXT("Thursday"), TEXT("Friday"), TEXT("Saturday") };
53 static TCHAR *months[] = {
54 TEXT("January"), TEXT("February"), TEXT("March"),
55 TEXT("April"), TEXT("May"), TEXT("June"),
56 TEXT("July"), TEXT("August"), TEXT("September"),
57 TEXT("October"), TEXT("November"), TEXT("December") };
59 /* ----------------- Ldate ------------------ */
60 void
61 Ldate( const PLstr datestr, char option )
63 static TCHAR *fmt = TEXT("%02d/%02d/%02d");
64 static TCHAR *iso = TEXT("%4d%02d%02d");
65 long length;
66 TCHAR *chptr;
68 #ifndef WCE
69 time_t now ;
70 struct tm *tmdata ;
71 #else
72 TCHAR buf[30];
73 SYSTEMTIME time;
74 #endif
76 option = l2u[(byte)option];
77 Lfx(datestr,30); LZEROSTR(*datestr);
79 #ifndef WCE
80 now = time(NULL);
81 tmdata = localtime(&now) ;
82 #else
83 GetLocalTime(&time);
84 #endif
86 switch (option) {
87 case 'C':
88 #ifndef WCE
89 length = tmdata->tm_yday + 1 +
90 (long)(((float)tmdata->tm_year-1)*365.25) + 365 ;
91 sprintf(LSTR(*datestr),"%ld",length) ;
92 #else
93 length = day_of_year(&time) +
94 (long)(((float)time.wYear%100-1)*365.25) + 365;
95 swprintf(buf,TEXT("%ld"),length) ;
96 #endif
97 break;
99 case 'D':
100 #ifndef WCE
101 sprintf(LSTR(*datestr), "%d", tmdata->tm_yday+1) ;
102 #else
103 swprintf(buf, TEXT("%d"), day_of_year(&time)) ;
104 #endif
105 break;
107 case 'E':
108 #ifndef WCE
109 sprintf(LSTR(*datestr), fmt, tmdata->tm_mday,
110 tmdata->tm_mon+1, tmdata->tm_year%100) ;
111 #else
112 swprintf(buf, fmt, time.wDay,
113 time.wMonth, time.wYear%100) ;
114 #endif
115 break;
117 case 'J':
118 #ifndef WCE
119 sprintf(LSTR(*datestr),"%02d%03d",
120 tmdata->tm_year%100, tmdata->tm_yday+1);
121 #else
122 swprintf(buf,TEXT("%02d%03d"),
123 time.wYear%100, day_of_year(&time));
124 #endif
125 break;
127 case 'M':
128 #ifndef WCE
129 STRCPY(LSTR(*datestr),months[tmdata->tm_mon]);
130 #else
131 wcscpy(buf,months[time.wMonth-1]);
132 #endif
133 break;
135 case 'N':
136 #ifndef WCE
137 chptr = months[tmdata->tm_mon] ;
138 sprintf(LSTR(*datestr),"%d %c%c%c %4d",
139 tmdata->tm_mday, chptr[0], chptr[1],
140 chptr[2], tmdata->tm_year+1900) ;
141 #else
142 chptr = months[time.wMonth-1] ;
143 swprintf(buf,TEXT("%d %c%c%c %4d"),
144 time.wDay, chptr[0], chptr[1],
145 chptr[2], time.wYear) ;
146 #endif
147 break;
149 case 'O':
150 #ifndef WCE
151 sprintf(LSTR(*datestr), fmt, tmdata->tm_year%100,
152 tmdata->tm_mon+1, tmdata->tm_mday);
153 #else
154 swprintf(buf, fmt, time.wYear%100,
155 time.wMonth, time.wDay);
156 #endif
157 break;
159 case 'S':
160 #ifndef WCE
161 sprintf(LSTR(*datestr), iso, tmdata->tm_year+1900,
162 tmdata->tm_mon+1, tmdata->tm_mday) ;
163 #else
164 swprintf(buf, iso, time.wYear,
165 time.wMonth, time.wDay) ;
166 #endif
167 break;
169 case 'U':
170 #ifndef WCE
171 sprintf(LSTR(*datestr), fmt, tmdata->tm_mon+1,
172 tmdata->tm_mday, tmdata->tm_year%100 ) ;
173 #else
174 swprintf(buf, fmt, time.wMonth,
175 time.wDay, time.wYear%100 ) ;
176 #endif
177 break;
179 case 'W':
180 #ifndef WCE
181 STRCPY(LSTR(*datestr),WeekDays[tmdata->tm_wday]);
182 #else
183 wcscpy(buf, WeekDays[time.wDayOfWeek]);
184 #endif
185 break;
187 default:
188 Lerror(ERR_INCORRECT_CALL,0);
190 #ifndef WCE
191 LLEN(*datestr) = STRLEN(LSTR(*datestr));
192 #else
193 wcstombs(LSTR(*datestr),buf,LLEN(*datestr)=wcslen(buf));
194 #endif
195 } /* Ldate */