| /* Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "apr_portable.h" |
| #include "apr_time.h" |
| #include "apr_lib.h" |
| #include "apr_private.h" |
| /* System Headers required for time library */ |
| #if APR_HAVE_SYS_TIME_H |
| #include <sys/time.h> |
| #endif |
| #ifdef HAVE_TIME_H |
| #include <time.h> |
| #endif |
| #if APR_HAVE_STRING_H |
| #include <string.h> |
| #endif |
| /* End System Headers */ |
| |
| APR_DECLARE_DATA const char apr_month_snames[12][4] = |
| { |
| "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" |
| }; |
| APR_DECLARE_DATA const char apr_day_snames[7][4] = |
| { |
| "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" |
| }; |
| |
| apr_status_t apr_rfc822_date(char *date_str, apr_time_t t) |
| { |
| apr_time_exp_t xt; |
| const char *s; |
| int real_year; |
| |
| apr_time_exp_gmt(&xt, t); |
| |
| /* example: "Sat, 08 Jan 2000 18:31:41 GMT" */ |
| /* 12345678901234567890123456789 */ |
| |
| s = &apr_day_snames[xt.tm_wday][0]; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = ','; |
| *date_str++ = ' '; |
| *date_str++ = xt.tm_mday / 10 + '0'; |
| *date_str++ = xt.tm_mday % 10 + '0'; |
| *date_str++ = ' '; |
| s = &apr_month_snames[xt.tm_mon][0]; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = ' '; |
| real_year = 1900 + xt.tm_year; |
| /* This routine isn't y10k ready. */ |
| *date_str++ = real_year / 1000 + '0'; |
| *date_str++ = real_year % 1000 / 100 + '0'; |
| *date_str++ = real_year % 100 / 10 + '0'; |
| *date_str++ = real_year % 10 + '0'; |
| *date_str++ = ' '; |
| *date_str++ = xt.tm_hour / 10 + '0'; |
| *date_str++ = xt.tm_hour % 10 + '0'; |
| *date_str++ = ':'; |
| *date_str++ = xt.tm_min / 10 + '0'; |
| *date_str++ = xt.tm_min % 10 + '0'; |
| *date_str++ = ':'; |
| *date_str++ = xt.tm_sec / 10 + '0'; |
| *date_str++ = xt.tm_sec % 10 + '0'; |
| *date_str++ = ' '; |
| *date_str++ = 'G'; |
| *date_str++ = 'M'; |
| *date_str++ = 'T'; |
| *date_str++ = 0; |
| return APR_SUCCESS; |
| } |
| |
| apr_status_t apr_ctime(char *date_str, apr_time_t t) |
| { |
| apr_time_exp_t xt; |
| const char *s; |
| int real_year; |
| |
| /* example: "Wed Jun 30 21:49:08 1993" */ |
| /* 123456789012345678901234 */ |
| |
| apr_time_exp_lt(&xt, t); |
| s = &apr_day_snames[xt.tm_wday][0]; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = ' '; |
| s = &apr_month_snames[xt.tm_mon][0]; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = *s++; |
| *date_str++ = ' '; |
| *date_str++ = xt.tm_mday / 10 + '0'; |
| *date_str++ = xt.tm_mday % 10 + '0'; |
| *date_str++ = ' '; |
| *date_str++ = xt.tm_hour / 10 + '0'; |
| *date_str++ = xt.tm_hour % 10 + '0'; |
| *date_str++ = ':'; |
| *date_str++ = xt.tm_min / 10 + '0'; |
| *date_str++ = xt.tm_min % 10 + '0'; |
| *date_str++ = ':'; |
| *date_str++ = xt.tm_sec / 10 + '0'; |
| *date_str++ = xt.tm_sec % 10 + '0'; |
| *date_str++ = ' '; |
| real_year = 1900 + xt.tm_year; |
| *date_str++ = real_year / 1000 + '0'; |
| *date_str++ = real_year % 1000 / 100 + '0'; |
| *date_str++ = real_year % 100 / 10 + '0'; |
| *date_str++ = real_year % 10 + '0'; |
| *date_str++ = 0; |
| |
| return APR_SUCCESS; |
| } |
| |
| apr_status_t apr_strftime(char *s, apr_size_t *retsize, apr_size_t max, |
| const char *format, apr_time_exp_t *xt) |
| { |
| struct tm tm; |
| memset(&tm, 0, sizeof tm); |
| tm.tm_sec = xt->tm_sec; |
| tm.tm_min = xt->tm_min; |
| tm.tm_hour = xt->tm_hour; |
| tm.tm_mday = xt->tm_mday; |
| tm.tm_mon = xt->tm_mon; |
| tm.tm_year = xt->tm_year; |
| tm.tm_wday = xt->tm_wday; |
| tm.tm_yday = xt->tm_yday; |
| tm.tm_isdst = xt->tm_isdst; |
| #if defined(HAVE_STRUCT_TM_TM_GMTOFF) |
| tm.tm_gmtoff = xt->tm_gmtoff; |
| #elif defined(HAVE_STRUCT_TM___TM_GMTOFF) |
| tm.__tm_gmtoff = xt->tm_gmtoff; |
| #endif |
| (*retsize) = strftime(s, max, format, &tm); |
| return APR_SUCCESS; |
| } |