summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2015-02-23 10:43:54 +0100
committerLukas Fleischer <calcurse@cryptocrack.de>2015-02-23 10:46:16 +0100
commit1ea97795be8f9b8d63c5266ac7ea4889c3224a4d (patch)
tree7fdaaf4eaeb4b564b1479b375fef87a561c95bed /src
parent4efa3f3fbf5525e37d7bae4bd8ed5ce747a0b32f (diff)
downloadcalcurse-1ea97795be8f9b8d63c5266ac7ea4889c3224a4d.zip
Add support for UTC times in iCal imports
According to the iCal standard (4.3.12 Time): UTC time, or absolute time, is identified by a LATIN CAPITAL LETTER Z suffix character (US-ASCII decimal 90), the UTC designator, appended to the time value. Parse such time values properly when importing iCal files. Fixes GitHub issue #3. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
Diffstat (limited to 'src')
-rw-r--r--src/calcurse.h1
-rw-r--r--src/ical.c21
-rw-r--r--src/utils.c25
3 files changed, 39 insertions, 8 deletions
diff --git a/src/calcurse.h b/src/calcurse.h
index 6700d5b..6e686e4 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1054,6 +1054,7 @@ long get_item_time(long);
int get_item_hour(long);
int get_item_min(long);
long date2sec(struct date, unsigned, unsigned);
+long utcdate2sec(struct date, unsigned, unsigned);
char *date_sec2date_str(long, const char *);
void date_sec2date_fmt(long, const char *, char *);
long date_sec_change(long, int, int);
diff --git a/src/ical.c b/src/ical.c
index 4d1edab..e3ddc07 100644
--- a/src/ical.c
+++ b/src/ical.c
@@ -477,7 +477,7 @@ ical_chk_header(FILE * fd, char *buf, char *lstore, unsigned *lineno,
* where DATE is 'YYYYMMDD' and TIME is 'HHMMSS'.
* The time and 'T' separator are optional (in the case of an day-long event).
*
- * Optionnaly, if the type pointer is given, specify if it is an event
+ * Optionally, if the type pointer is given, specify if it is an event
* (no time is given, meaning it is an all-day event), or an appointment
* (time is given).
*
@@ -485,22 +485,27 @@ ical_chk_header(FILE * fd, char *buf, char *lstore, unsigned *lineno,
*/
static long ical_datetime2long(char *datestr, ical_vevent_e * type)
{
- const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 5;
+ const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 6,
+ FORMAT_DATETIMEZ = 7;
struct date date;
- unsigned hour, min;
- long datelong;
+ unsigned hour, min, sec;
+ char c;
+ long datelong ;
int format;
- format = sscanf(datestr, "%04u%02u%02uT%02u%02u",
- &date.yyyy, &date.mm, &date.dd, &hour, &min);
+ format = sscanf(datestr, "%04u%02u%02uT%02u%02u%02u%c",
+ &date.yyyy, &date.mm, &date.dd, &hour, &min, &sec, &c);
if (format == FORMAT_DATE) {
if (type)
*type = EVENT;
datelong = date2sec(date, 0, 0);
- } else if (format == FORMAT_DATETIME) {
+ } else if (format == FORMAT_DATETIME || format == FORMAT_DATETIMEZ) {
if (type)
*type = APPOINTMENT;
- datelong = date2sec(date, hour, min);
+ if (format == FORMAT_DATETIMEZ && c == 'Z')
+ datelong = utcdate2sec(date, hour, min);
+ else
+ datelong = date2sec(date, hour, min);
} else {
datelong = NOTFOUND;
}
diff --git a/src/utils.c b/src/utils.c
index b52de74..c7dc61c 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -386,6 +386,31 @@ long date2sec(struct date day, unsigned hour, unsigned min)
return t;
}
+time_t
+utcdate2sec(struct date day, unsigned hour, unsigned min)
+{
+ char *tz;
+ time_t t;
+
+ tz = getenv("TZ");
+ if (tz)
+ tz = mem_strdup(tz);
+ setenv("TZ", "", 1);
+ tzset();
+
+ t = date2sec(day, hour, min);
+
+ if (tz) {
+ setenv("TZ", tz, 1);
+ mem_free(tz);
+ } else {
+ unsetenv("TZ");
+ }
+ tzset();
+
+ return t;
+}
+
/* Return a string containing the date, given a date in seconds. */
char *date_sec2date_str(long sec, const char *datefmt)
{