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