httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From stodd...@hyperreal.org
Subject cvs commit: apache-2.0/src/lib/apr/time/win32 time.c
Date Mon, 17 Jan 2000 04:42:33 GMT
stoddard    00/01/16 20:42:31

  Modified:    src/lib/apr aprlib.def
               src/lib/apr/time/win32 time.c
  Log:
  Reimplement Win32 time functions to the new spec.
  
  Revision  Changes    Path
  1.8       +42 -29    apache-2.0/src/lib/apr/aprlib.def
  
  Index: aprlib.def
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/aprlib.def,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- aprlib.def	1999/12/15 01:53:27	1.7
  +++ aprlib.def	2000/01/17 04:42:20	1.8
  @@ -15,11 +15,12 @@
   	ap_dir_entry_mtime   @8
   	ap_dir_entry_ftype   @9
   	ap_get_dir_filename   @10
  -	ap_get_filename   @11
  -	ap_get_filesize   @12
  -	ap_get_fileatime   @13
  -	ap_get_filectime   @14
  -	ap_get_filemtime   @15
  +;	ap_get_filename   @11
  +	ap_stat		  @11
  +;	ap_get_filesize   @12
  +;	ap_get_fileatime   @13
  +;	ap_get_filectime   @14
  +;	ap_get_filemtime   @15
   	ap_dupfile   @16
   	ap_getfileinfo   @17
   	ap_open   @18
  @@ -41,7 +42,7 @@
   	ap_flush @34
       	ap_fprintf   @35
       	ap_eof   @36
  -	ap_get_filetype @37
  +;	ap_get_filetype @37
   	ap_writev @38
   	; locks
   	ap_create_lock   @39
  @@ -132,29 +133,41 @@
   	ap_optopt   @124 DATA
   	ap_optreset   @125 DATA
   	ap_optarg   @126 DATA
  -	ap_make_time   @127
  -	ap_current_time   @128
  -	ap_explode_time   @129
  -	ap_implode_time   @130
  -	ap_get_curtime   @131
  -	ap_get_sec   @132
  -	ap_get_min   @133
  -	ap_get_hour   @134
  -	ap_get_mday   @135
  -	ap_get_mon   @136
  -	ap_get_year   @137
  -	ap_get_wday   @138
  -	ap_set_sec   @139
  -	ap_set_min   @140
  -	ap_set_hour   @141
  -	ap_set_mday   @142
  -	ap_set_mon   @143
  -	ap_set_year   @144
  -	ap_set_wday   @145
  -	ap_get_timedata   @146
  -	ap_set_timedata   @147
  -	ap_get_os_time   @148
  -	ap_timediff   @149
  +;	ap_make_time   @127
  +	ap_ansi_time_to_ap_time @127
  +;	ap_current_time   @128
  +	ap_now		  @128
  +;	ap_explode_time   @129
  +	ap_explode_gmt	  @129
  +;	ap_implode_time   @130
  +	ap_explode_localtime @130
  +;	ap_get_curtime   @131
  +	ap_implode_time	 @131
  +;	ap_get_sec   @132
  +	ap_get_os_imp_time	@132
  +;	ap_get_min   @133
  +	ap_get_os_exp_time	@133
  +;	ap_get_hour   @134
  +	ap_put_os_imp_time	@134
  +;	ap_get_mday   @135
  +	ap_put_os_exp_time	@135
  +;	ap_get_mon   @136
  +	ap_ctime     @136
  +;	ap_get_year   @137
  +	ap_rfc822_date	@137
  +;	ap_get_wday   @138
  +	ap_strftime   @138
  +;	ap_set_sec   @139
  +;	ap_set_min   @140
  +;	ap_set_hour   @141
  +;	ap_set_mday   @142
  +;	ap_set_mon   @143
  +;	ap_set_year   @144
  +;	ap_set_wday   @145
  +;	ap_get_timedata   @146
  +;	ap_set_timedata   @147
  +;	ap_get_os_time   @148
  +;	ap_timediff   @149
   	ap_MD5Final   @150
   	ap_MD5Init   @151
   	ap_MD5Update   @152
  
  
  
  1.5       +119 -62   apache-2.0/src/lib/apr/time/win32/time.c
  
  Index: time.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/time/win32/time.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- time.c	1999/12/09 21:01:05	1.4
  +++ time.c	2000/01/17 04:42:27	1.5
  @@ -60,98 +60,155 @@
   #include <time.h>
   #include <errno.h>
   #include <string.h>
  +#include <winbase.h>
   
  -ap_status_t ap_make_time(struct atime_t **new, ap_context_t *cont)
  +/* Number of micro-seconds between the beginning of the Windows epoch
  + * (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970) 
  + */
  +#define AP_DELTA_EPOCH_IN_USEC   11644473600000000;
  +
  +static void FileTimeToAprTime(ap_time_t *result, FILETIME *input)
  +{
  +    /* Convert FILETIME one 64 bit number so we can work with it. */
  +    *result = input->dwHighDateTime;
  +    *result = (*result) << 32;
  +    *result |= input->dwLowDateTime;
  +    *result /= 10;    /* Convert from 100 nano-sec periods to micro-seconds. */
  +    *result -= AP_DELTA_EPOCH_IN_USEC;  /* Convert from Windows epoch to Unix epoch */
  +    //printf("FileTimeToAprTime: aprtime - %I64d\n", *result);
  +    return;
  +}
  +static void AprTimeToFileTime(LPFILETIME pft, ap_time_t t)
   {
  -    (*new) = (struct atime_t *)ap_palloc(cont, sizeof(struct atime_t));
  +    LONGLONG ll;
  +    //printf("AprTimeToFileTime: aprtime - %I64d\n", t);
  +    t += AP_DELTA_EPOCH_IN_USEC;
  +    ll = t * 10;
  +    pft->dwLowDateTime = (DWORD)ll;
  +    pft->dwHighDateTime = (DWORD) (ll >> 32);
  +    return;
  +}
   
  -    if ((*new) == NULL) {
  -        return APR_ENOMEM;
  -    }
  +static void SystemTimeToAprExpTime(ap_exploded_time_t *xt, SYSTEMTIME *tm)
  +{
  +    xt->tm_usec = tm->wMilliseconds * 1000;
  +    xt->tm_sec  = tm->wSecond;
  +    xt->tm_min  = tm->wMinute;
  +    xt->tm_hour = tm->wHour;
  +    xt->tm_mday = tm->wDay;
  +    xt->tm_mon  = tm->wMonth - 1;
  +    xt->tm_year = tm->wYear - 1900;
  +    xt->tm_wday = tm->wDayOfWeek;
  +    xt->tm_yday = 0; /* ToDo: need to compute this */
  +    xt->tm_isdst = 0; /* ToDo: need to compute this */
  +    xt->tm_gmtoff = 0; /* ToDo: maybe the caller should set this explicitly */
  +    return;
  +}
   
  -    (*new)->cntxt = cont;
  -    (*new)->currtime = -1;
  -    (*new)->explodedtime = NULL;
  +ap_status_t ap_ansi_time_to_ap_time(ap_time_t *result, time_t input)
  +{
  +    *result = (ap_time_t) input * AP_USEC_PER_SEC;
       return APR_SUCCESS;
   }
   
  -ap_status_t ap_current_time(struct atime_t *new)
  +/* Return micro-seconds since the Unix epoch (jan. 1, 1970) */
  +ap_time_t ap_now(void)
   {
  -    if (!new) {
  -        return APR_ENOTIME;
  -    }
  -    if (new->explodedtime == NULL) {
  -        new->explodedtime = (SYSTEMTIME *)ap_palloc(new->cntxt, sizeof(SYSTEMTIME));
  -    }
  -    GetSystemTime(new->explodedtime);
  -    return APR_SUCCESS; 
  -}       
  +    ULONGLONG aprtime = 0;
  +    FILETIME time;
  +    GetSystemTimeAsFileTime(&time);
  +    FileTimeToAprTime(&aprtime, &time);
  +    return aprtime; 
  +}
   
  -ap_status_t ap_explode_time(struct atime_t *atime, ap_timetype_e type)
  +ap_status_t ap_explode_gmt(ap_exploded_time_t *result, ap_time_t input)
   {
  -    if (!atime || !atime->explodedtime) {
  -        return APR_ENOTIME;
  -    }   
  +    FILETIME ft;
  +    SYSTEMTIME st;
  +    AprTimeToFileTime(&ft, input);
  +    FileTimeToSystemTime(&ft, &st);
  +    SystemTimeToAprExpTime(result, &st);
  +    result->tm_gmtoff = 0;
       return APR_SUCCESS;
   }
   
  -ap_status_t ap_implode_time(struct atime_t *atime)
  +ap_status_t ap_explode_localtime(ap_exploded_time_t *result, ap_time_t input)
   {
  -    FILETIME temp;
  -    
  -    if (!atime || !atime->explodedtime) {
  -        return APR_ENOTIME;
  -    }
  +    SYSTEMTIME st;
  +    FILETIME ft, localft;
   
  -    if (SystemTimeToFileTime(atime->explodedtime, &temp) == 0) {
  -        return APR_EEXIST;
  -    }
  -    atime->currtime = WinTimeToUnixTime(&temp);
  +    AprTimeToFileTime(&ft, input);
  +    FileTimeToLocalFileTime(&ft, &localft);
  +    FileTimeToSystemTime(&localft, &st);
  +    SystemTimeToAprExpTime(result, &st);
       return APR_SUCCESS;
   }
   
  -ap_status_t ap_get_os_time(ap_os_time_t **atime, struct atime_t *thetime)
  +ap_status_t ap_implode_time(ap_time_t *t, ap_exploded_time_t *xt)
   {
  -    if (thetime == NULL) {
  -        return APR_ENOTIME;
  +    int year;
  +    time_t days;
  +    static const int dayoffset[12] =
  +    {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275};
  +
  +    year = xt->tm_year;
  +
  +    if (year < 70 || ((sizeof(time_t) <= 4) && (year >= 138))) {
  +        return APR_EBADDATE;
       }
  -    if (thetime->explodedtime == NULL) {
  -        ap_explode_time(thetime, APR_LOCALTIME); 
  +
  +    /* shift new year to 1st March in order to make leap year calc easy */
  +
  +    if (xt->tm_mon < 2)
  +        year--;
  +
  +    /* Find number of days since 1st March 1900 (in the Gregorian calendar). */
  +
  +    days = year * 365 + year / 4 - year / 100 + (year / 100 + 3) / 4;
  +    days += dayoffset[xt->tm_mon] + xt->tm_mday - 1;
  +    days -= 25508;              /* 1 jan 1970 is 25508 days since 1 mar 1900 */
  +
  +    days = ((days * 24 + xt->tm_hour) * 60 + xt->tm_min) * 60 + xt->tm_sec;
  +
  +    if (days < 0) {
  +        return APR_EBADDATE;
       }
  -    *atime = thetime->explodedtime;
  +    days -= xt->tm_gmtoff;
  +    *t = days * AP_USEC_PER_SEC + xt->tm_usec;
       return APR_SUCCESS;
   }
   
  -ap_status_t ap_put_os_time(struct atime_t **thetime, ap_os_time_t *atime, 
  -                           ap_context_t *cont)
  +ap_status_t ap_get_os_imp_time(ap_os_imp_time_t **ostime, ap_time_t *aprtime)
   {
  -    if (cont == NULL) {
  -        return APR_ENOCONT;
  -    }
  -    if (thetime == NULL) {
  -        (*thetime) = (struct atime_t *)ap_palloc(cont, sizeof(struct atime_t));
  -        (*thetime)->cntxt = cont;
  -    }
  -    (*thetime)->explodedtime = atime;
  +    /* TODO: Consider not passing in pointer to ap_time_t (e.g., call by value) */
  +    AprTimeToFileTime(*ostime, *aprtime);
       return APR_SUCCESS;
   }
   
  -ap_status_t ap_timediff(struct atime_t *a, struct atime_t *b, ap_int32_t *rv)
  +ap_status_t ap_get_os_exp_time(ap_os_exp_time_t **ostime, ap_exploded_time_t *aprexptime)
   {
  -    FILETIME fa, fb;
  -    LONGLONG ia = 0, ib = 0;
  -    
  -    SystemTimeToFileTime(a->explodedtime, &fa);
  -    SystemTimeToFileTime(b->explodedtime, &fb);
  -    
  -	ia = fa.dwHighDateTime;
  -	ia = ia << 32;
  -	ia |= fa.dwLowDateTime;
  +    (*ostime)->wYear = aprexptime->tm_year + 1900;
  +    (*ostime)->wMonth = aprexptime->tm_mon + 1;
  +    (*ostime)->wDayOfWeek = aprexptime->tm_wday;
  +    (*ostime)->wDay = aprexptime->tm_mday;
  +    (*ostime)->wHour = aprexptime->tm_hour;
  +    (*ostime)->wMinute = aprexptime->tm_min;
  +    (*ostime)->wSecond = aprexptime->tm_sec;
  +    (*ostime)->wMilliseconds = aprexptime->tm_usec / 1000;
  +    return APR_SUCCESS;
  +}
   
  -	ib = fb.dwHighDateTime;
  -	ib = ib << 32;
  -	ib |= fb.dwLowDateTime;
  +ap_status_t ap_put_os_imp_time(ap_time_t *aprtime, ap_os_imp_time_t **ostime,
  +                               ap_context_t *cont)
  +{
  +    FileTimeToAprTime(aprtime, *ostime);
  +    return APR_SUCCESS;
  +}
   
  -    *rv = (int)((ia - ib) / 10000);
  +ap_status_t ap_put_os_exp_time(ap_exploded_time_t *aprtime,
  +                               ap_os_exp_time_t **ostime, ap_context_t *cont)
  +{
  +    SystemTimeToAprExpTime(aprtime, *ostime);
       return APR_SUCCESS;
   }
  +
  
  
  

Mime
View raw message