Home | History | Annotate | Download | only in cgi
      1 /*
      2  * Copyright 2001-2004 Brandon Long
      3  * All Rights Reserved.
      4  *
      5  * ClearSilver Templating System
      6  *
      7  * This code is made available under the terms of the ClearSilver License.
      8  * http://www.clearsilver.net/license.hdf
      9  *
     10  */
     11 
     12 #include "cs_config.h"
     13 
     14 #include <time.h>
     15 #include <stdio.h>
     16 #include <string.h>
     17 #include <ctype.h>
     18 #include <stdlib.h>
     19 #include "util/neo_misc.h"
     20 #include "util/neo_err.h"
     21 #include "util/neo_hdf.h"
     22 #include "util/neo_date.h"
     23 #include "cgi.h"
     24 #include "date.h"
     25 
     26 /*
     27  * prefix.sec
     28  * prefix.min
     29  * prefix.hour  - 12 hour
     30  * prefix.am - 1 if AM
     31  * prefix.24hour - 24 hour
     32  * prefix.mday
     33  * prefix.mon   - numeric month
     34  * prefix.year  - full year (ie, 4 digits)
     35  * prefix.2yr  - year (2 digits)
     36  * prefix.wday  - day of the week
     37  * prefix.tzoffset - hhmm from UTC
     38  *
     39  */
     40 
     41 NEOERR *export_date_tm (HDF *data, const char *prefix, struct tm *ttm)
     42 {
     43   NEOERR *err;
     44   HDF *obj;
     45   int hour, am = 1;
     46   char buf[256];
     47   int tzoffset_seconds = 0;
     48   int tzoffset = 0;
     49   char tzsign = '+';
     50 
     51   obj = hdf_get_obj (data, prefix);
     52   if (obj == NULL)
     53   {
     54     err = hdf_set_value (data, prefix, "");
     55     if (err) return nerr_pass(err);
     56     obj = hdf_get_obj (data, prefix);
     57   }
     58 
     59   snprintf (buf, sizeof(buf), "%02d", ttm->tm_sec);
     60   err = hdf_set_value (obj, "sec", buf);
     61   if (err) return nerr_pass(err);
     62   snprintf (buf, sizeof(buf), "%02d", ttm->tm_min);
     63   err = hdf_set_value (obj, "min", buf);
     64   if (err) return nerr_pass(err);
     65   snprintf (buf, sizeof(buf), "%02d", ttm->tm_hour);
     66   err = hdf_set_value (obj, "24hour", buf);
     67   if (err) return nerr_pass(err);
     68   hour = ttm->tm_hour;
     69   if (hour == 0)
     70   {
     71     hour = 12;
     72   }
     73   else if (hour == 12)
     74   {
     75     am = 0;
     76   }
     77   else if (hour > 12)
     78   {
     79     am = 0;
     80     hour -= 12;
     81   }
     82   err = hdf_set_int_value (obj, "hour", hour);
     83   if (err) return nerr_pass(err);
     84   err = hdf_set_int_value (obj, "am", am);
     85   if (err) return nerr_pass(err);
     86   err = hdf_set_int_value (obj, "mday", ttm->tm_mday);
     87   if (err) return nerr_pass(err);
     88   err = hdf_set_int_value (obj, "mon", ttm->tm_mon + 1);
     89   if (err) return nerr_pass(err);
     90   err = hdf_set_int_value (obj, "year", ttm->tm_year + 1900);
     91   if (err) return nerr_pass(err);
     92   snprintf(buf, sizeof(buf), "%02d", ttm->tm_year % 100);
     93   err = hdf_set_value (obj, "2yr", buf);
     94   if (err) return nerr_pass(err);
     95   err = hdf_set_int_value (obj, "wday", ttm->tm_wday);
     96   if (err) return nerr_pass(err);
     97   // neo_tz_offset() returns offset from GMT in seconds
     98   tzoffset_seconds = neo_tz_offset(ttm);
     99   tzoffset = tzoffset_seconds / 60;
    100   if (tzoffset < 0)
    101   {
    102     tzoffset *= -1;
    103     tzsign = '-';
    104   }
    105   snprintf(buf, sizeof(buf), "%c%02d%02d", tzsign, tzoffset / 60, tzoffset % 60);
    106   err = hdf_set_value (obj, "tzoffset", buf);
    107   if (err) return nerr_pass(err);
    108 
    109   return STATUS_OK;
    110 }
    111 
    112 NEOERR *export_date_time_t (HDF *data, const char *prefix, const char *timezone,
    113                             time_t tt)
    114 {
    115   struct tm ttm;
    116 
    117   neo_time_expand (tt, timezone, &ttm);
    118   return nerr_pass (export_date_tm (data, prefix, &ttm));
    119 }
    120 
    121 /* from httpd util.c : made infamous with Roy owes Rob beer. */
    122 static char *months[] = {
    123   "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
    124 };
    125 
    126 int find_month(char *mon) {
    127   register int x;
    128 
    129   for(x=0;x<12;x++)
    130     if(!strcmp(months[x],mon))
    131       return x;
    132   return -1;
    133 }
    134 
    135 int later_than(struct tm *lms, char *ims) {
    136   char *ip;
    137   char mname[256];
    138   int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0, x;
    139 
    140   /* Whatever format we're looking at, it will start
    141    * with weekday. */
    142   /* Skip to first space. */
    143   if(!(ip = strchr(ims,' ')))
    144     return 0;
    145   else
    146     while(isspace(*ip))
    147       ++ip;
    148 
    149   if(isalpha(*ip)) {
    150     /* ctime */
    151     sscanf(ip,"%25s %d %d:%d:%d %d",mname,&day,&hour,&min,&sec,&year);
    152   }
    153   else if(ip[2] == '-') {
    154     /* RFC 850 (normal HTTP) */
    155     char t[256];
    156     sscanf(ip,"%s %d:%d:%d",t,&hour,&min,&sec);
    157     t[2] = '\0';
    158     day = atoi(t);
    159     t[6] = '\0';
    160     strcpy(mname,&t[3]);
    161     x = atoi(&t[7]);
    162     /* Prevent
    163      * wraparound
    164      * from
    165      * ambiguity
    166      * */
    167     if(x < 70)
    168       x += 100;
    169     year = 1900 + x;
    170   }
    171   else {
    172     /* RFC 822 */
    173     sscanf(ip,"%d %s %d %d:%d:%d",&day,mname,&year,&hour,&min,&sec);
    174   }
    175   month = find_month(mname);
    176 
    177   if((x = (1900+lms->tm_year) - year))
    178     return x < 0;
    179   if((x = lms->tm_mon - month))
    180     return x < 0;
    181   if((x = lms->tm_mday - day))
    182     return x < 0;
    183   if((x = lms->tm_hour - hour))
    184     return x < 0;
    185   if((x = lms->tm_min - min))
    186     return x < 0;
    187   if((x = lms->tm_sec - sec))
    188     return x < 0;
    189 
    190   return 1;
    191 }
    192 
    193