1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more
2251875Speter * contributor license agreements.  See the NOTICE file distributed with
3251875Speter * this work for additional information regarding copyright ownership.
4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0
5251875Speter * (the "License"); you may not use this file except in compliance with
6251875Speter * the License.  You may obtain a copy of the License at
7251875Speter *
8251875Speter *     http://www.apache.org/licenses/LICENSE-2.0
9251875Speter *
10251875Speter * Unless required by applicable law or agreed to in writing, software
11251875Speter * distributed under the License is distributed on an "AS IS" BASIS,
12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251875Speter * See the License for the specific language governing permissions and
14251875Speter * limitations under the License.
15251875Speter */
16251875Speter
17251875Speter#include "apr_portable.h"
18251875Speter#include "apr_time.h"
19251875Speter#include "apr_lib.h"
20251875Speter#include "apr_private.h"
21251875Speter/* System Headers required for time library */
22251875Speter#if APR_HAVE_SYS_TIME_H
23251875Speter#include <sys/time.h>
24251875Speter#endif
25251875Speter#ifdef HAVE_TIME_H
26251875Speter#include <time.h>
27251875Speter#endif
28251875Speter#if APR_HAVE_STRING_H
29251875Speter#include <string.h>
30251875Speter#endif
31251875Speter/* End System Headers */
32251875Speter
33251875SpeterAPR_DECLARE_DATA const char apr_month_snames[12][4] =
34251875Speter{
35251875Speter    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
36251875Speter};
37251875SpeterAPR_DECLARE_DATA const char apr_day_snames[7][4] =
38251875Speter{
39251875Speter    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
40251875Speter};
41251875Speter
42251875Speterapr_status_t apr_rfc822_date(char *date_str, apr_time_t t)
43251875Speter{
44251875Speter    apr_time_exp_t xt;
45251875Speter    const char *s;
46251875Speter    int real_year;
47251875Speter
48251875Speter    apr_time_exp_gmt(&xt, t);
49251875Speter
50251875Speter    /* example: "Sat, 08 Jan 2000 18:31:41 GMT" */
51251875Speter    /*           12345678901234567890123456789  */
52251875Speter
53251875Speter    s = &apr_day_snames[xt.tm_wday][0];
54251875Speter    *date_str++ = *s++;
55251875Speter    *date_str++ = *s++;
56251875Speter    *date_str++ = *s++;
57251875Speter    *date_str++ = ',';
58251875Speter    *date_str++ = ' ';
59251875Speter    *date_str++ = xt.tm_mday / 10 + '0';
60251875Speter    *date_str++ = xt.tm_mday % 10 + '0';
61251875Speter    *date_str++ = ' ';
62251875Speter    s = &apr_month_snames[xt.tm_mon][0];
63251875Speter    *date_str++ = *s++;
64251875Speter    *date_str++ = *s++;
65251875Speter    *date_str++ = *s++;
66251875Speter    *date_str++ = ' ';
67251875Speter    real_year = 1900 + xt.tm_year;
68251875Speter    /* This routine isn't y10k ready. */
69251875Speter    *date_str++ = real_year / 1000 + '0';
70251875Speter    *date_str++ = real_year % 1000 / 100 + '0';
71251875Speter    *date_str++ = real_year % 100 / 10 + '0';
72251875Speter    *date_str++ = real_year % 10 + '0';
73251875Speter    *date_str++ = ' ';
74251875Speter    *date_str++ = xt.tm_hour / 10 + '0';
75251875Speter    *date_str++ = xt.tm_hour % 10 + '0';
76251875Speter    *date_str++ = ':';
77251875Speter    *date_str++ = xt.tm_min / 10 + '0';
78251875Speter    *date_str++ = xt.tm_min % 10 + '0';
79251875Speter    *date_str++ = ':';
80251875Speter    *date_str++ = xt.tm_sec / 10 + '0';
81251875Speter    *date_str++ = xt.tm_sec % 10 + '0';
82251875Speter    *date_str++ = ' ';
83251875Speter    *date_str++ = 'G';
84251875Speter    *date_str++ = 'M';
85251875Speter    *date_str++ = 'T';
86251875Speter    *date_str++ = 0;
87251875Speter    return APR_SUCCESS;
88251875Speter}
89251875Speter
90251875Speterapr_status_t apr_ctime(char *date_str, apr_time_t t)
91251875Speter{
92251875Speter    apr_time_exp_t xt;
93251875Speter    const char *s;
94251875Speter    int real_year;
95251875Speter
96251875Speter    /* example: "Wed Jun 30 21:49:08 1993" */
97251875Speter    /*           123456789012345678901234  */
98251875Speter
99251875Speter    apr_time_exp_lt(&xt, t);
100251875Speter    s = &apr_day_snames[xt.tm_wday][0];
101251875Speter    *date_str++ = *s++;
102251875Speter    *date_str++ = *s++;
103251875Speter    *date_str++ = *s++;
104251875Speter    *date_str++ = ' ';
105251875Speter    s = &apr_month_snames[xt.tm_mon][0];
106251875Speter    *date_str++ = *s++;
107251875Speter    *date_str++ = *s++;
108251875Speter    *date_str++ = *s++;
109251875Speter    *date_str++ = ' ';
110251875Speter    *date_str++ = xt.tm_mday / 10 + '0';
111251875Speter    *date_str++ = xt.tm_mday % 10 + '0';
112251875Speter    *date_str++ = ' ';
113251875Speter    *date_str++ = xt.tm_hour / 10 + '0';
114251875Speter    *date_str++ = xt.tm_hour % 10 + '0';
115251875Speter    *date_str++ = ':';
116251875Speter    *date_str++ = xt.tm_min / 10 + '0';
117251875Speter    *date_str++ = xt.tm_min % 10 + '0';
118251875Speter    *date_str++ = ':';
119251875Speter    *date_str++ = xt.tm_sec / 10 + '0';
120251875Speter    *date_str++ = xt.tm_sec % 10 + '0';
121251875Speter    *date_str++ = ' ';
122251875Speter    real_year = 1900 + xt.tm_year;
123251875Speter    *date_str++ = real_year / 1000 + '0';
124251875Speter    *date_str++ = real_year % 1000 / 100 + '0';
125251875Speter    *date_str++ = real_year % 100 / 10 + '0';
126251875Speter    *date_str++ = real_year % 10 + '0';
127251875Speter    *date_str++ = 0;
128251875Speter
129251875Speter    return APR_SUCCESS;
130251875Speter}
131251875Speter
132251875Speterapr_status_t apr_strftime(char *s, apr_size_t *retsize, apr_size_t max,
133251875Speter                        const char *format, apr_time_exp_t *xt)
134251875Speter{
135251875Speter    struct tm tm;
136251875Speter    memset(&tm, 0, sizeof tm);
137251875Speter    tm.tm_sec  = xt->tm_sec;
138251875Speter    tm.tm_min  = xt->tm_min;
139251875Speter    tm.tm_hour = xt->tm_hour;
140251875Speter    tm.tm_mday = xt->tm_mday;
141251875Speter    tm.tm_mon  = xt->tm_mon;
142251875Speter    tm.tm_year = xt->tm_year;
143251875Speter    tm.tm_wday = xt->tm_wday;
144251875Speter    tm.tm_yday = xt->tm_yday;
145251875Speter    tm.tm_isdst = xt->tm_isdst;
146251875Speter#if defined(HAVE_STRUCT_TM_TM_GMTOFF)
147251875Speter    tm.tm_gmtoff = xt->tm_gmtoff;
148251875Speter#elif defined(HAVE_STRUCT_TM___TM_GMTOFF)
149251875Speter    tm.__tm_gmtoff = xt->tm_gmtoff;
150251875Speter#endif
151251875Speter    (*retsize) = strftime(s, max, format, &tm);
152251875Speter    return APR_SUCCESS;
153251875Speter}
154