From 6ca2535f5e35147b469fb4a9bde9148eed4aa01e Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Mon, 28 Jul 2014 11:54:03 +0200
Subject: ical.c: Simplify and fix ical_durtime2long()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Correctly parse all types of durations. Before this change, durations
without an hour or minute component were not parsed properly.

Reported-by: HÃ¥kan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/ical.c | 35 +++++++++++++++--------------------
 1 file changed, 15 insertions(+), 20 deletions(-)

(limited to 'src')

diff --git a/src/ical.c b/src/ical.c
index d953b0e..dda642a 100644
--- a/src/ical.c
+++ b/src/ical.c
@@ -488,30 +488,25 @@ static long ical_datetime2long(char *datestr, ical_vevent_e * type)
 
 static long ical_durtime2long(char *timestr)
 {
-	long timelong;
 	char *p;
+	unsigned hour = 0, min = 0, sec = 0;
 
-	if ((p = strchr(timestr, 'T')) == NULL) {
-		timelong = 0;
-	} else {
-		int nbmatch;
-		struct {
-			unsigned hour, min, sec;
-		} time;
+	if ((p = strchr(timestr, 'T')) == NULL)
+		return 0;
 
-		p++;
-		memset(&time, 0, sizeof time);
-		nbmatch =
-		    sscanf(p, "%uH%uM%uS", &time.hour, &time.min,
-			   &time.sec);
-		if (nbmatch < 1 || nbmatch > 3)
-			timelong = 0;
-		else
-			timelong =
-			    time.hour * HOURINSEC + time.min * MININSEC +
-			    time.sec;
+	p++;
+	if (strchr(p, 'H')) {
+		if (sscanf(p, "%uH%uM%uS", &hour, &min, &sec) != 3)
+			return 0;
+	} else if (strchr(p, 'M')) {
+		if (sscanf(p, "%uM%uS", &min, &sec) != 2)
+			return 0;
+	} else if (strchr(p, 'S')) {
+		if (sscanf(p, "%uS", &sec) != 1)
+			return 0;
 	}
-	return timelong;
+
+	return hour * HOURINSEC + min * MININSEC + sec;
 }
 
 /*
-- 
cgit v1.2.3-70-g09d2