Correctly parse all types of iCal durations
This was supposed to be fixed in 6ca2535 (ical.c: Simplify and fix ical_durtime2long(), 2014-07-28) but some cases were not covered. Reported-by: Håkan Jerning <jerning@home.se> Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
parent
0a2c4d20fe
commit
76f151ff37
23
src/ical.c
23
src/ical.c
@ -510,6 +510,7 @@ static long ical_datetime2long(char *datestr, ical_vevent_e * type)
|
|||||||
static long ical_durtime2long(char *timestr)
|
static long ical_durtime2long(char *timestr)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
|
int bytes_read;
|
||||||
unsigned hour = 0, min = 0, sec = 0;
|
unsigned hour = 0, min = 0, sec = 0;
|
||||||
|
|
||||||
if ((p = strchr(timestr, 'T')) == NULL)
|
if ((p = strchr(timestr, 'T')) == NULL)
|
||||||
@ -517,15 +518,23 @@ static long ical_durtime2long(char *timestr)
|
|||||||
|
|
||||||
p++;
|
p++;
|
||||||
if (strchr(p, 'H')) {
|
if (strchr(p, 'H')) {
|
||||||
if (sscanf(p, "%uH%uM%uS", &hour, &min, &sec) != 3)
|
if (sscanf(p, "%uH%n", &hour, &bytes_read) != 1)
|
||||||
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 0;
|
||||||
|
p += bytes_read;
|
||||||
}
|
}
|
||||||
|
if (strchr(p, 'M')) {
|
||||||
|
if (sscanf(p, "%uM%n", &min, &bytes_read) != 1)
|
||||||
|
return 0;
|
||||||
|
p += bytes_read;
|
||||||
|
}
|
||||||
|
if (strchr(p, 'S')) {
|
||||||
|
if (sscanf(p, "%uM%n", &sec, &bytes_read) != 1)
|
||||||
|
return 0;
|
||||||
|
p += bytes_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hour == 0 && min == 0 && sec == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return hour * HOURINSEC + min * MININSEC + sec;
|
return hour * HOURINSEC + min * MININSEC + sec;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@ TESTS = \
|
|||||||
ical-002.sh \
|
ical-002.sh \
|
||||||
ical-003.sh \
|
ical-003.sh \
|
||||||
ical-004.sh \
|
ical-004.sh \
|
||||||
|
ical-006.sh \
|
||||||
next-001.sh \
|
next-001.sh \
|
||||||
search-001.sh \
|
search-001.sh \
|
||||||
bug-002.sh \
|
bug-002.sh \
|
||||||
@ -107,4 +108,5 @@ EXTRA_DIST = \
|
|||||||
data/ical-002.ical \
|
data/ical-002.ical \
|
||||||
data/ical-003.ical \
|
data/ical-003.ical \
|
||||||
data/ical-004.ical \
|
data/ical-004.ical \
|
||||||
|
data/ical-006.ical \
|
||||||
data/todo
|
data/todo
|
||||||
|
63
test/data/ical-006.ical
Normal file
63
test/data/ical-006.ical
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
BEGIN:VCALENDAR
|
||||||
|
VERSION:2.0
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H0M
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H0S
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H0M0S
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:30 minutes
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT30M
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:30 minutes
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT0H30M
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:30 minutes
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT30M0S
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:30 minutes
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT0H30M0S
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours and 30 minutes
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H30M
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours and 30 minutes
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H30M0S
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours and 10 seconds
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H10S
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
SUMMARY:5 hours, 30 minutes and 10 seconds
|
||||||
|
DTSTART;TZID=Europe/Stockholm:20120601T150000
|
||||||
|
DURATION:PT5H30M10S
|
||||||
|
END:VEVENT
|
||||||
|
END:VCALENDAR
|
43
test/ical-006.sh
Executable file
43
test/ical-006.sh
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. "${TEST_INIT:-./test-init.sh}"
|
||||||
|
|
||||||
|
if [ "$1" = 'actual' ]; then
|
||||||
|
mkdir .calcurse || exit 1
|
||||||
|
cp "$DATA_DIR/conf" .calcurse || exit 1
|
||||||
|
"$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-006.ical"
|
||||||
|
"$CALCURSE" -D "$PWD/.calcurse" -s06/01/2012 -r2
|
||||||
|
rm -rf .calcurse || exit 1
|
||||||
|
elif [ "$1" = 'expected' ]; then
|
||||||
|
cat <<EOD
|
||||||
|
Import process report: 0078 lines read
|
||||||
|
12 apps / 0 events / 0 todos / 0 skipped
|
||||||
|
06/01/12:
|
||||||
|
- 15:00 -> 20:00
|
||||||
|
5 hours
|
||||||
|
- 15:00 -> 20:00
|
||||||
|
5 hours
|
||||||
|
- 15:00 -> 20:00
|
||||||
|
5 hours
|
||||||
|
- 15:00 -> 20:00
|
||||||
|
5 hours
|
||||||
|
- 15:00 -> 15:30
|
||||||
|
30 minutes
|
||||||
|
- 15:00 -> 15:30
|
||||||
|
30 minutes
|
||||||
|
- 15:00 -> 15:30
|
||||||
|
30 minutes
|
||||||
|
- 15:00 -> 15:30
|
||||||
|
30 minutes
|
||||||
|
- 15:00 -> 20:30
|
||||||
|
5 hours and 30 minutes
|
||||||
|
- 15:00 -> 20:30
|
||||||
|
5 hours and 30 minutes
|
||||||
|
- 15:00 -> 20:00
|
||||||
|
5 hours and 10 seconds
|
||||||
|
- 15:00 -> 20:30
|
||||||
|
5 hours, 30 minutes and 10 seconds
|
||||||
|
EOD
|
||||||
|
else
|
||||||
|
./run-test "$0"
|
||||||
|
fi
|
Loading…
x
Reference in New Issue
Block a user