/* * Copyright 2001-2004 Brandon Long * All Rights Reserved. * * ClearSilver Templating System * * This code is made available under the terms of the ClearSilver License. * http://www.clearsilver.net/license.hdf * */ #include "cs_config.h" #include #include #include #include #include #include "util/neo_misc.h" #include "util/neo_err.h" #include "util/neo_hdf.h" #include "util/neo_date.h" #include "cgi.h" #include "date.h" /* * prefix.sec * prefix.min * prefix.hour - 12 hour * prefix.am - 1 if AM * prefix.24hour - 24 hour * prefix.mday * prefix.mon - numeric month * prefix.year - full year (ie, 4 digits) * prefix.2yr - year (2 digits) * prefix.wday - day of the week * prefix.tzoffset - hhmm from UTC * */ NEOERR *export_date_tm (HDF *data, const char *prefix, struct tm *ttm) { NEOERR *err; HDF *obj; int hour, am = 1; char buf[256]; int tzoffset_seconds = 0; int tzoffset = 0; char tzsign = '+'; obj = hdf_get_obj (data, prefix); if (obj == NULL) { err = hdf_set_value (data, prefix, ""); if (err) return nerr_pass(err); obj = hdf_get_obj (data, prefix); } snprintf (buf, sizeof(buf), "%02d", ttm->tm_sec); err = hdf_set_value (obj, "sec", buf); if (err) return nerr_pass(err); snprintf (buf, sizeof(buf), "%02d", ttm->tm_min); err = hdf_set_value (obj, "min", buf); if (err) return nerr_pass(err); snprintf (buf, sizeof(buf), "%02d", ttm->tm_hour); err = hdf_set_value (obj, "24hour", buf); if (err) return nerr_pass(err); hour = ttm->tm_hour; if (hour == 0) { hour = 12; } else if (hour == 12) { am = 0; } else if (hour > 12) { am = 0; hour -= 12; } err = hdf_set_int_value (obj, "hour", hour); if (err) return nerr_pass(err); err = hdf_set_int_value (obj, "am", am); if (err) return nerr_pass(err); err = hdf_set_int_value (obj, "mday", ttm->tm_mday); if (err) return nerr_pass(err); err = hdf_set_int_value (obj, "mon", ttm->tm_mon + 1); if (err) return nerr_pass(err); err = hdf_set_int_value (obj, "year", ttm->tm_year + 1900); if (err) return nerr_pass(err); snprintf(buf, sizeof(buf), "%02d", ttm->tm_year % 100); err = hdf_set_value (obj, "2yr", buf); if (err) return nerr_pass(err); err = hdf_set_int_value (obj, "wday", ttm->tm_wday); if (err) return nerr_pass(err); // neo_tz_offset() returns offset from GMT in seconds tzoffset_seconds = neo_tz_offset(ttm); tzoffset = tzoffset_seconds / 60; if (tzoffset < 0) { tzoffset *= -1; tzsign = '-'; } snprintf(buf, sizeof(buf), "%c%02d%02d", tzsign, tzoffset / 60, tzoffset % 60); err = hdf_set_value (obj, "tzoffset", buf); if (err) return nerr_pass(err); return STATUS_OK; } NEOERR *export_date_time_t (HDF *data, const char *prefix, const char *timezone, time_t tt) { struct tm ttm; neo_time_expand (tt, timezone, &ttm); return nerr_pass (export_date_tm (data, prefix, &ttm)); } /* from httpd util.c : made infamous with Roy owes Rob beer. */ static char *months[] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; int find_month(char *mon) { register int x; for(x=0;x<12;x++) if(!strcmp(months[x],mon)) return x; return -1; } int later_than(struct tm *lms, char *ims) { char *ip; char mname[256]; int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0, x; /* Whatever format we're looking at, it will start * with weekday. */ /* Skip to first space. */ if(!(ip = strchr(ims,' '))) return 0; else while(isspace(*ip)) ++ip; if(isalpha(*ip)) { /* ctime */ sscanf(ip,"%25s %d %d:%d:%d %d",mname,&day,&hour,&min,&sec,&year); } else if(ip[2] == '-') { /* RFC 850 (normal HTTP) */ char t[256]; sscanf(ip,"%s %d:%d:%d",t,&hour,&min,&sec); t[2] = '\0'; day = atoi(t); t[6] = '\0'; strcpy(mname,&t[3]); x = atoi(&t[7]); /* Prevent * wraparound * from * ambiguity * */ if(x < 70) x += 100; year = 1900 + x; } else { /* RFC 822 */ sscanf(ip,"%d %s %d %d:%d:%d",&day,mname,&year,&hour,&min,&sec); } month = find_month(mname); if((x = (1900+lms->tm_year) - year)) return x < 0; if((x = lms->tm_mon - month)) return x < 0; if((x = lms->tm_mday - day)) return x < 0; if((x = lms->tm_hour - hour)) return x < 0; if((x = lms->tm_min - min)) return x < 0; if((x = lms->tm_sec - sec)) return x < 0; return 1; }