|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2002 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file was derived from the libwww source code of 1998/08/20. The
|
|
Packit |
a4aae4 |
// copyright for the source of this derivative work can be found in the file
|
|
Packit |
a4aae4 |
// COPYRIGHT_W3C.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cstdio>
|
|
Packit |
a4aae4 |
#include <cstring>
|
|
Packit |
a4aae4 |
#include <cstdlib>
|
|
Packit |
a4aae4 |
//#include <string>
|
|
Packit |
a4aae4 |
#include <ctype.h>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef TM_IN_SYS_TIME
|
|
Packit |
a4aae4 |
#include <time.h>
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
#include <sys/time.h>
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <sys/types.h>
|
|
Packit |
a4aae4 |
#include <sys/stat.h>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <iostream>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "util_mit.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using std::cerr;
|
|
Packit |
a4aae4 |
using std::endl;
|
|
Packit |
a4aae4 |
using std::string;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static const char * months[12] =
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef HAVE_STRFTIME
|
|
Packit |
a4aae4 |
static const char * wkdays[7] =
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/* Upper- and Lowercase macros
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The problem here is that toupper(x) is not defined officially unless
|
|
Packit |
a4aae4 |
isupper(x) is. These macros are CERTAINLY needed on #if defined(pyr) ||
|
|
Packit |
a4aae4 |
define(mips) or BDSI platforms. For safety, we make them mandatory.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef TOLOWER
|
|
Packit |
a4aae4 |
#define TOLOWER(c) tolower((int) (c))
|
|
Packit |
a4aae4 |
#define TOUPPER(c) toupper((int) (c))
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static int
|
|
Packit |
a4aae4 |
strncasecomp(const char *a, const char *b, int n)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
const char *p = a;
|
|
Packit |
a4aae4 |
const char *q = b;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
for (p = a, q = b;; p++, q++) {
|
|
Packit |
a4aae4 |
int diff;
|
|
Packit |
a4aae4 |
if (p == a + n) return 0; /* Match up to n characters */
|
|
Packit |
a4aae4 |
if (!(*p && *q)) return *p - *q;
|
|
Packit |
a4aae4 |
diff = TOLOWER(*p) - TOLOWER(*q);
|
|
Packit |
a4aae4 |
if (diff) return diff;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
/*NOTREACHED*/
|
|
Packit |
a4aae4 |
return -1; // silence gcc
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static int
|
|
Packit |
a4aae4 |
make_month(char * s, char ** ends)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
char * ptr = s;
|
|
Packit |
a4aae4 |
while (!isalpha((int) *ptr)) ptr++;
|
|
Packit |
a4aae4 |
if (*ptr) {
|
|
Packit |
a4aae4 |
int i;
|
|
Packit |
a4aae4 |
*ends = ptr + 3;
|
|
Packit |
a4aae4 |
for (i = 0; i < 12; i++)
|
|
Packit |
a4aae4 |
if (!strncasecomp(months[i], ptr, 3)) return i;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Parse a string in GMT format to a local time time_t representation
|
|
Packit |
a4aae4 |
Four formats are accepted:
|
|
Packit |
a4aae4 |
Wkd, 00 Mon 0000 00:00:00 GMT (rfc1123)
|
|
Packit |
a4aae4 |
Weekday, 00-Mon-00 00:00:00 GMT (rfc850)
|
|
Packit |
a4aae4 |
Wkd Mon 00 00:00:00 0000 GMT (ctime)
|
|
Packit |
a4aae4 |
1*DIGIT (delta-seconds)
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Copied from libwww. 09/19/02 jhrg
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@param str The time string.
|
|
Packit |
a4aae4 |
@param expand If the time is given in delta seconds, adjust it to seconds
|
|
Packit |
a4aae4 |
since midnight 1 Jan 1970 if this is true. If false, simply convert the
|
|
Packit |
a4aae4 |
string to a time_t and return. The default value is true.
|
|
Packit |
a4aae4 |
@return The time in seconds since midnight 1 Jan 1970. */
|
|
Packit |
a4aae4 |
time_t
|
|
Packit |
a4aae4 |
parse_time(const char * str, bool expand)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
char * s;
|
|
Packit |
a4aae4 |
struct tm tm;
|
|
Packit |
a4aae4 |
time_t t;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (!str) return 0;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if ((s = (char *)strchr(str, ','))) { /* Thursday, 10-Jun-93 01:29:59 GMT */
|
|
Packit |
a4aae4 |
s++; /* or: Thu, 10 Jan 1993 01:29:59 GMT */
|
|
Packit |
a4aae4 |
while (*s && *s == ' ') s++;
|
|
Packit |
a4aae4 |
if (strchr(s, '-')) { /* First format */
|
|
Packit |
a4aae4 |
DBG(cerr << "Format...... Weekday, 00-Mon-00 00:00:00 GMT"
|
|
Packit |
a4aae4 |
<< endl);
|
|
Packit |
a4aae4 |
if ((int)strlen(s) < 18) {
|
|
Packit |
a4aae4 |
DBG(cerr << "ERROR....... Not a valid time format \""
|
|
Packit |
a4aae4 |
<< s << "\"" << endl);
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
tm.tm_mday = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
tm.tm_mon = make_month(s, &s);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_year = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
tm.tm_hour = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_min = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_sec = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else { /* Second format */
|
|
Packit |
a4aae4 |
DBG(cerr << "Format...... Wkd, 00 Mon 0000 00:00:00 GMT" << endl);
|
|
Packit |
a4aae4 |
if ((int)strlen(s) < 20) {
|
|
Packit |
a4aae4 |
DBG(cerr << "ERROR....... Not a valid time format \""
|
|
Packit |
a4aae4 |
<< s << "\"" << endl);
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
tm.tm_mday = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
tm.tm_mon = make_month(s, &s);
|
|
Packit |
a4aae4 |
tm.tm_year = strtol(s, &s, 10) - 1900;
|
|
Packit |
a4aae4 |
tm.tm_hour = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_min = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_sec = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else if (isdigit((int) *str)) {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (strchr(str, 'T')) { /* ISO (limited format) date string */
|
|
Packit |
a4aae4 |
DBG(cerr << "Format...... YYYY.MM.DDThh:mmStzWkd" << endl);
|
|
Packit |
a4aae4 |
s = (char *) str;
|
|
Packit |
a4aae4 |
while (*s && *s == ' ') s++;
|
|
Packit |
a4aae4 |
if ((int)strlen(s) < 21) {
|
|
Packit |
a4aae4 |
DBG(cerr << "ERROR....... Not a valid time format \""
|
|
Packit |
a4aae4 |
<< s << "\"" << endl);
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
tm.tm_year = strtol(s, &s, 10) - 1900;
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_mon = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_mday = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_hour = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_min = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_sec = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else { /* delta seconds */
|
|
Packit |
a4aae4 |
t = expand ? time(NULL) + atol(str) : atol(str);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return t;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else { /* Try the other format: Wed Jun 9 01:29:59 1993 GMT */
|
|
Packit |
a4aae4 |
DBG(cerr << "Format...... Wkd Mon 00 00:00:00 0000 GMT" << endl);
|
|
Packit |
a4aae4 |
s = (char *) str;
|
|
Packit |
a4aae4 |
while (*s && *s == ' ') s++;
|
|
Packit |
a4aae4 |
DBG(cerr << "Trying...... The Wrong time format: " << s << endl);
|
|
Packit |
a4aae4 |
if ((int)strlen(s) < 24) {
|
|
Packit |
a4aae4 |
DBG(cerr << "ERROR....... Not a valid time format \""
|
|
Packit |
a4aae4 |
<< s << "\"" << endl);
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
tm.tm_mon = make_month(s, &s);
|
|
Packit |
a4aae4 |
tm.tm_mday = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
tm.tm_hour = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_min = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
++s;
|
|
Packit |
a4aae4 |
tm.tm_sec = strtol(s, &s, 10);
|
|
Packit |
a4aae4 |
tm.tm_year = strtol(s, &s, 10) - 1900;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
if (tm.tm_sec < 0 || tm.tm_sec > 59 ||
|
|
Packit |
a4aae4 |
tm.tm_min < 0 || tm.tm_min > 59 ||
|
|
Packit |
a4aae4 |
tm.tm_hour < 0 || tm.tm_hour > 23 ||
|
|
Packit |
a4aae4 |
tm.tm_mday < 1 || tm.tm_mday > 31 ||
|
|
Packit |
a4aae4 |
tm.tm_mon < 0 || tm.tm_mon > 11 ||
|
|
Packit |
a4aae4 |
tm.tm_year < 70 || tm.tm_year > 120) {
|
|
Packit |
a4aae4 |
DBG(cerr << "ERROR....... Parsed illegal time" << endl);
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/* Let mktime decide whether we have DST or not */
|
|
Packit |
a4aae4 |
tm.tm_isdst = -1;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef HAVE_TIMEGM
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
t = timegm(&tm;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef HAVE_MKTIME
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Compute offset between localtime and GMT.
|
|
Packit |
a4aae4 |
time_t offset;
|
|
Packit |
a4aae4 |
time_t now = time(0);
|
|
Packit |
a4aae4 |
#ifdef _REENTRANT
|
|
Packit |
a4aae4 |
struct tm gmt, local;
|
|
Packit |
a4aae4 |
offset = mktime(gmtime_r(&now, &gmt)) - mktime(localtime_r(&now, &local));
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
offset = mktime(gmtime(&now)) - mktime(localtime(&now));
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
t = mktime(&tm) + offset;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#error "Neither mktime nor timegm defined"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#endif /* HAVE_TIMEGM */
|
|
Packit |
a4aae4 |
#endif /* HAVE_MKTIME */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DBG(cerr << "Time string. " << str << " parsed to " << t
|
|
Packit |
a4aae4 |
<< " calendar time or \"" << ctime(&t) << "\" in local time" << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return t;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Given a time in seconds since midnight 1 Jan 1970, return the RFC 1123
|
|
Packit |
a4aae4 |
date string. Example result string: Sun, 06 Nov 1994 08:49:37 GMT
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@param calendar Time in seconds
|
|
Packit |
a4aae4 |
@param local If true, return the local time, if false return GMT. The
|
|
Packit |
a4aae4 |
default value is false.
|
|
Packit |
a4aae4 |
@return A RFC 1123 date string. */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string date_time_str(time_t *calendar, bool local)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
char buf[40];
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef HAVE_STRFTIME
|
|
Packit |
a4aae4 |
if (local) {
|
|
Packit |
a4aae4 |
/*
|
|
Packit |
a4aae4 |
** Solaris 2.3 has a bug so we _must_ use reentrant version
|
|
Packit |
a4aae4 |
** Thomas Maslen <tmaslen@verity.com>
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
#if defined(_REENTRANT) || defined(SOLARIS)
|
|
Packit |
a4aae4 |
struct tm loctime;
|
|
Packit |
a4aae4 |
localtime_r(calendar, &loctime);
|
|
Packit |
a4aae4 |
strftime(buf, 40, "%a, %d %b %Y %H:%M:%S", &loctime);
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
struct tm *loctime = localtime(calendar);
|
|
Packit |
a4aae4 |
strftime(buf, 40, "%a, %d %b %Y %H:%M:%S", loctime);
|
|
Packit |
a4aae4 |
#endif /* SOLARIS || _REENTRANT */
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
#if defined(_REENTRANT) || defined(SOLARIS)
|
|
Packit |
a4aae4 |
struct tm gmt;
|
|
Packit |
a4aae4 |
gmtime_r(calendar, &gmt);
|
|
Packit |
a4aae4 |
strftime(buf, 40, "%a, %d %b %Y %H:%M:%S GMT", &gmt);
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
struct tm *gmt = gmtime(calendar);
|
|
Packit |
a4aae4 |
strftime(buf, 40, "%a, %d %b %Y %H:%M:%S GMT", gmt);
|
|
Packit |
a4aae4 |
#endif /* SOLARIS || _REENTRANT */
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#else /* !HAVE_STRFTIME */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (local) {
|
|
Packit |
a4aae4 |
#if defined(_REENTRANT)
|
|
Packit |
a4aae4 |
struct tm loctime;
|
|
Packit |
a4aae4 |
localtime_r(calendar, &loctime);
|
|
Packit |
a4aae4 |
snprintf(buf, 40, "%s, %02d %s %04d %02d:%02d:%02d",
|
|
Packit |
a4aae4 |
wkdays[loctime.tm_wday],
|
|
Packit |
a4aae4 |
loctime.tm_mday,
|
|
Packit |
a4aae4 |
months[loctime.tm_mon],
|
|
Packit |
a4aae4 |
loctime.tm_year + 1900,
|
|
Packit |
a4aae4 |
loctime.tm_hour,
|
|
Packit |
a4aae4 |
loctime.tm_min,
|
|
Packit |
a4aae4 |
loctime.tm_sec);
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
struct tm *loctime = localtime(calendar);
|
|
Packit |
a4aae4 |
if (!loctime)
|
|
Packit |
a4aae4 |
return "";
|
|
Packit |
a4aae4 |
snprintf(buf, 40, "%s, %02d %s %04d %02d:%02d:%02d",
|
|
Packit |
a4aae4 |
wkdays[loctime->tm_wday],
|
|
Packit |
a4aae4 |
loctime->tm_mday,
|
|
Packit |
a4aae4 |
months[loctime->tm_mon],
|
|
Packit |
a4aae4 |
loctime->tm_year + 1900,
|
|
Packit |
a4aae4 |
loctime->tm_hour,
|
|
Packit |
a4aae4 |
loctime->tm_min,
|
|
Packit |
a4aae4 |
loctime->tm_sec);
|
|
Packit |
a4aae4 |
#endif /* _REENTRANT */
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
#if defined(_REENTRANT) || defined(SOLARIS)
|
|
Packit |
a4aae4 |
struct tm gmt;
|
|
Packit |
a4aae4 |
gmtime_r(calendar, &gmt);
|
|
Packit |
a4aae4 |
snprintf(buf, 40, "%s, %02d %s %04d %02d:%02d:%02d GMT",
|
|
Packit |
a4aae4 |
wkdays[gmt.tm_wday],
|
|
Packit |
a4aae4 |
gmt.tm_mday,
|
|
Packit |
a4aae4 |
months[gmt.tm_mon],
|
|
Packit |
a4aae4 |
gmt.tm_year + 1900,
|
|
Packit |
a4aae4 |
gmt.tm_hour,
|
|
Packit |
a4aae4 |
gmt.tm_min,
|
|
Packit |
a4aae4 |
gmt.tm_sec);
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
struct tm *gmt = gmtime(calendar);
|
|
Packit |
a4aae4 |
if (!gmt)
|
|
Packit |
a4aae4 |
return "";
|
|
Packit |
a4aae4 |
snprintf(buf, 40, "%s, %02d %s %04d %02d:%02d:%02d GMT",
|
|
Packit |
a4aae4 |
wkdays[gmt->tm_wday],
|
|
Packit |
a4aae4 |
gmt->tm_mday,
|
|
Packit |
a4aae4 |
months[gmt->tm_mon],
|
|
Packit |
a4aae4 |
gmt->tm_year + 1900,
|
|
Packit |
a4aae4 |
gmt->tm_hour,
|
|
Packit |
a4aae4 |
gmt->tm_min,
|
|
Packit |
a4aae4 |
gmt->tm_sec);
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
return string(buf);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|