[Remind-Fans] patch -- ISO8601 timestamps

Dianne Skoll dfs at roaringpenguin.com
Mon Jul 25 10:10:19 EDT 2016


OK, here's a patch.

It makes Remind accept yyyy-mm-dd at hh:mm or yyyy-mm-ddThh:mm on input.

On output, there's a system variable called $DateTimeSep that defaults to '@'.
You can set it to 'T' instead:

    SET $DateTimeSep "T"

and then DATETIMEs are output in ISO 8601 format.

Regards,

Dianne.

diff --git a/src/custom.h b/src/custom.h
index 92b6964..4bf8a94 100644
--- a/src/custom.h
+++ b/src/custom.h
@@ -53,6 +53,13 @@
 /* #define TIMESEP '.' */
 
 /*---------------------------------------------------------------------*/
+/* DATETIMESEP:  The default datetime separator.  Default is '@';      */
+/* others may prefer 'T'.                                              */
+/*---------------------------------------------------------------------*/
+#define DATETIMESEP '@'
+/* #define DATETIMESEP '/' */
+
+/*---------------------------------------------------------------------*/
 /* ISOLATIN1: define it to 1 if you use the                            */
 /* ISO 8859-1 character set instead of ASCII.                          */
 /*---------------------------------------------------------------------*/
diff --git a/src/custom.h.in b/src/custom.h.in
index 92b6964..419be88 100644
--- a/src/custom.h.in
+++ b/src/custom.h.in
@@ -37,7 +37,7 @@
 /*---------------------------------------------------------------------*/
 #define DEFAULT_PAGE {"Letter", 612, 792}
 /* #define DEFAULT_PAGE {"A4", 595, 842} */
-  
+
 /*---------------------------------------------------------------------*/
 /* DATESEP:  The default date separator.  Standard usage is '-';       */
 /* others may prefer '/'.                                              */
@@ -53,6 +53,13 @@
 /* #define TIMESEP '.' */
 
 /*---------------------------------------------------------------------*/
+/* DATETIMESEP:  The default datetime separator.  Default is '@';      */
+/* others may prefer 'T'.                                              */
+/*---------------------------------------------------------------------*/
+#define DATETIMESEP '@'
+/* #define DATETIMESEP '/' */
+
+/*---------------------------------------------------------------------*/
 /* ISOLATIN1: define it to 1 if you use the                            */
 /* ISO 8859-1 character set instead of ASCII.                          */
 /*---------------------------------------------------------------------*/
diff --git a/src/expr.c b/src/expr.c
index 273c14b..d576f89 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -620,8 +620,8 @@ int DoCoerce(char type, Value *v)
 	    k = v->v.val % MINUTES_PER_DAY;
 	    h = k / 60;
 	    i = k % 60;
-	    sprintf(CoerceBuf, "%04d%c%02d%c%02d@%02d%c%02d",
-		    y, DateSep, m+1, DateSep, d, h, TimeSep, i);
+	    sprintf(CoerceBuf, "%04d%c%02d%c%02d%c%02d%c%02d",
+		    y, DateSep, m+1, DateSep, d, DateTimeSep, h, TimeSep, i);
 	    break;
 	default: return E_CANT_COERCE;
 	}
@@ -1193,7 +1193,7 @@ void PrintValue (Value *v, FILE *fp)
     }
     else if (v->type == DATETIME_TYPE) {
 	FromJulian(v->v.val / MINUTES_PER_DAY, &y, &m, &d);
-	fprintf(fp, "%04d%c%02d%c%02d@%02d%c%02d", y, DateSep, m+1, DateSep, d,
+	fprintf(fp, "%04d%c%02d%c%02d%c%02d%c%02d", y, DateSep, m+1, DateSep, d, DateTimeSep,
 		(v->v.val % MINUTES_PER_DAY) / 60, TimeSep, (v->v.val % MINUTES_PER_DAY) % 60);
     }
     else fprintf(fp, "ERR");
@@ -1261,7 +1261,7 @@ int ParseLiteralDate(char const **s, int *jul, int *tim)
     *jul = Julian(y, m, d);
 
     /* Do we have a time part as well? */
-    if (**s == ' ' || **s == '@') {
+    if (**s == ' ' || **s == '@' || **s == 'T' || **s == 't') {
 	(*s)++;
 	while(isdigit(**s)) {
 	    hour *= 10;
diff --git a/src/globals.h b/src/globals.h
index c2af693..370e8b8 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -73,6 +73,7 @@ EXTERN  INIT(   int     DontIssueAts, 0);
 EXTERN  INIT(   int     Daemon, 0);
 EXTERN  INIT(   char    DateSep, DATESEP);
 EXTERN  INIT(   char    TimeSep, TIMESEP);
+EXTERN  INIT(   char    DateTimeSep, DATETIMESEP);
 EXTERN  INIT(   int     SynthesizeTags, 0);
 EXTERN  INIT(   int     ScFormat, SC_AMPM);
 EXTERN  INIT(   int     MaxSatIter, 150);
diff --git a/src/var.c b/src/var.c
index cf933c2..52d6e7a 100644
--- a/src/var.c
+++ b/src/var.c
@@ -140,6 +140,25 @@ static int today_wday_func(int do_set, Value *val)
     return OK;
 }
 
+static int datetime_sep_func(int do_set, Value *val)
+{
+    if (!do_set) {
+	val->v.str = malloc(2);
+	if (!val->v.str) return E_NO_MEM;
+	val->v.str[0] = DateTimeSep;
+	val->v.str[1] = 0;
+	val->type = STR_TYPE;
+	return OK;
+    }
+    if (val->type != STR_TYPE) return E_BAD_TYPE;
+    if (strcmp(val->v.str, "T") &&
+	strcmp(val->v.str, "@")) {
+	return E_BAD_TYPE;
+    }
+    DateTimeSep = val->v.str[0];
+    return OK;
+}
+
 static int date_sep_func(int do_set, Value *val)
 {
     if (!do_set) {
@@ -575,6 +594,7 @@ static SysVar SysVarArr[] = {
     {"CalMode",        0,  INT_TYPE,     &DoCalendar,         0,      0   },
     {"Daemon",         0,  INT_TYPE,     &Daemon,             0,      0   },
     {"DateSep",        1,  SPECIAL_TYPE, date_sep_func,       0,      0   },
+    {"DateTimeSep",    1,  SPECIAL_TYPE, datetime_sep_func,   0,      0   },
     {"DefaultPrio",    1,  INT_TYPE,     &DefaultPrio,        0,      9999},
     {"DeltaOffset",    0,  INT_TYPE,     &DeltaOffset,        0,      0   },
     {"DontFork",       0,  INT_TYPE,     &DontFork,           0,      0   },


More information about the Remind-fans mailing list