initial load of upstream version 1.06.32
[xmlrpc-c] / lib / abyss / src / date.c
diff --git a/lib/abyss/src/date.c b/lib/abyss/src/date.c
new file mode 100644 (file)
index 0000000..91c9fa7
--- /dev/null
@@ -0,0 +1,192 @@
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+#include <stdlib.h>
+
+
+#include <inttypes.h>
+#include "date.h"
+
+/*********************************************************************
+** Date
+*********************************************************************/
+
+static char *_DateDay[7]=
+{
+    "Sun","Mon","Tue","Wed","Thu","Fri","Sat"
+};
+
+static char *_DateMonth[12]=
+{
+    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
+};
+
+static int32_t _DateTimeBias=0;
+static char _DateTimeBiasStr[6]="";
+
+abyss_bool DateToString(TDate *tm,char *s)
+{
+    if (mktime(tm)==(time_t)(-1))
+    {
+        *s='\0';
+        return FALSE;
+    };
+
+    sprintf(s,"%s, %02d %s %04d %02d:%02d:%02d GMT",_DateDay[tm->tm_wday],tm->tm_mday,
+                _DateMonth[tm->tm_mon],tm->tm_year+1900,tm->tm_hour,tm->tm_min,tm->tm_sec);
+
+    return TRUE;
+}
+
+
+
+abyss_bool
+DateToLogString(TDate * const tmP,
+                char *  const s) {
+    time_t t;
+
+    t = mktime(tmP);
+    if (t != (time_t)(-1)) {
+        TDate d;
+        abyss_bool success;
+        success = DateFromLocal(&d, t);
+        if (success) {
+            sprintf(s, "%02d/%s/%04d:%02d:%02d:%02d %s",
+                    d.tm_mday, _DateMonth[d.tm_mon],
+                    d.tm_year+1900, d.tm_hour, d.tm_min, d.tm_sec,
+                    _DateTimeBiasStr);
+            return TRUE;
+        }
+    }
+    *s = '\0';
+    return FALSE;
+}
+
+
+
+abyss_bool
+DateDecode(const char *  const dateString,
+           TDate *       const tmP) {
+
+    int rc;
+    const char * s;
+    uint32_t n;
+
+    s = &dateString[0];
+
+    /* Ignore spaces, day name and spaces */
+    while ((*s==' ') || (*s=='\t'))
+        ++s;
+
+    while ((*s!=' ') && (*s!='\t'))
+        ++s;
+
+    while ((*s==' ') || (*s=='\t'))
+        ++s;
+
+    /* try to recognize the date format */
+    rc = sscanf(s, "%*s %d %d:%d:%d %d%*s", &tmP->tm_mday, &tmP->tm_hour,
+                &tmP->tm_min, &tmP->tm_sec, &tmP->tm_year);
+    if (rc != 5) {
+        int rc;
+        rc = sscanf(s, "%d %n%*s %d %d:%d:%d GMT%*s",
+                    &tmP->tm_mday,&n,&tmP->tm_year,
+                    &tmP->tm_hour, &tmP->tm_min, &tmP->tm_sec);
+        if (rc != 5) {
+            int rc;
+            rc = sscanf(s, "%d-%n%*[A-Za-z]-%d %d:%d:%d GMT%*s",
+                        &tmP->tm_mday, &n, &tmP->tm_year,
+                        &tmP->tm_hour, &tmP->tm_min, &tmP->tm_sec);
+            if (rc != 5)
+                return FALSE;
+        }
+    }    
+    /* s points now to the month string */
+    s += n;
+    for (n = 0; n < 12; ++n) {
+        char * p;
+
+        p =_DateMonth[n];
+
+        if (tolower(*p++) == tolower(*s))
+            if (*p++ == tolower(s[1]))
+                if (*p == tolower(s[2]))
+                    break;
+    }
+
+    if (n == 12)
+        return FALSE;
+
+    tmP->tm_mon = n;
+
+    /* finish the work */
+    if (tmP->tm_year > 1900)
+        tmP->tm_year -= 1900;
+    else {
+        if (tmP->tm_year < 70)
+            tmP->tm_year += 100;
+    }
+    tmP->tm_isdst = 0;
+
+    return (mktime(tmP) != (time_t)(-1));
+}
+
+
+
+int32_t DateCompare(TDate *d1,TDate *d2)
+{
+    int32_t x;
+
+    if ((x=d1->tm_year-d2->tm_year)==0)
+        if ((x=d1->tm_mon-d2->tm_mon)==0)
+            if ((x=d1->tm_mday-d2->tm_mday)==0)
+                if ((x=d1->tm_hour-d2->tm_hour)==0)
+                    if ((x=d1->tm_min-d2->tm_min)==0)
+                        x=d1->tm_sec-d2->tm_sec;
+
+    return x;
+}
+
+
+
+abyss_bool
+DateFromGMT(TDate *d,time_t t) {
+    TDate *dx;
+
+    dx=gmtime(&t);
+    if (dx) {
+        *d=*dx;
+        return TRUE;
+    };
+
+    return FALSE;
+}
+
+abyss_bool DateFromLocal(TDate *d,time_t t)
+{
+    return DateFromGMT(d,t+_DateTimeBias*2);
+}
+
+
+
+abyss_bool
+DateInit() {
+    time_t t;
+    TDate gmt,local,*d;
+
+    time(&t);
+    if (DateFromGMT(&gmt,t)) {
+        d=localtime(&t);
+        if (d) {
+            local=*d;
+            _DateTimeBias =
+                (local.tm_sec-gmt.tm_sec)+(local.tm_min-gmt.tm_min)*60
+                +(local.tm_hour-gmt.tm_hour)*3600;
+            sprintf(_DateTimeBiasStr, "%+03d%02d",
+                    _DateTimeBias/3600,(abs(_DateTimeBias) % 3600)/60);
+            return TRUE;
+        };
+    }
+    return FALSE;
+}