Handle CRLF line endings in iCal files

RFC 2445 mentions that CRLF line endings may be used in iCal files.
Handle them properly when importing.

Reported-by: Håkan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2014-08-18 11:29:46 +02:00
parent e57b9654ff
commit bcc820ea74
4 changed files with 54 additions and 4 deletions

View File

@ -399,8 +399,12 @@ ical_readline_init(FILE * fdi, char *buf, char *lstore, unsigned *ln)
*buf = *lstore = '\0';
if (fgets(lstore, BUFSIZ, fdi)) {
if ((eol = strchr(lstore, '\n')) != NULL)
*eol = '\0';
if ((eol = strchr(lstore, '\n')) != NULL) {
if (*(eol - 1) == '\r')
*(eol - 1) = '\0';
else
*eol = '\0';
}
(*ln)++;
}
}
@ -413,8 +417,12 @@ static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln)
(*ln)++;
while (fgets(lstore, BUFSIZ, fdi) != NULL) {
if ((eol = strchr(lstore, '\n')) != NULL)
*eol = '\0';
if ((eol = strchr(lstore, '\n')) != NULL) {
if (*(eol - 1) == '\r')
*(eol - 1) = '\0';
else
*eol = '\0';
}
if (*lstore != SPACE && *lstore != TAB)
break;
strncat(buf, lstore + 1, BUFSIZ - strlen(buf) - 1);

View File

@ -45,6 +45,7 @@ TESTS = \
ical-001.sh \
ical-002.sh \
ical-003.sh \
ical-004.sh \
next-001.sh \
search-001.sh \
bug-002.sh \
@ -105,4 +106,5 @@ EXTRA_DIST = \
data/ical-001.ical \
data/ical-002.ical \
data/ical-003.ical \
data/ical-004.ical \
data/todo

12
test/data/ical-004.ical Normal file
View File

@ -0,0 +1,12 @@
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTART:19800101T000100
DURATION:P1DT9H17M0S
SUMMARY:Calibrator's
END:VEVENT
BEGIN:VTODO
PRIORITY:1
SUMMARY:Nary parabled Louvre's fleetest mered
END:VTODO
END:VCALENDAR

28
test/ical-004.sh Executable file
View File

@ -0,0 +1,28 @@
#!/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-004.ical"
"$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
"$CALCURSE" -D "$PWD/.calcurse" -t
rm -rf .calcurse || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0017 lines read
1 app / 0 events / 1 todo / 0 skipped
01/01/80:
- 00:01 -> ..:..
Calibrator's
01/02/80:
- ..:.. -> 09:18
Calibrator's
to do:
9. Nary parabled Louvre's fleetest mered
EOD
else
./run-test "$0"
fi