From ecfae506c9793e240650cce1f17322142927c287 Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 19:19:39 +0100 Subject: [PATCH 1/7] unfolding doesnt work correctly --- .gitignore | 1 + src/main.c | 4 +++- src/parse_ics.c | 42 ++++++++++++++++++++++++------------------ src/parse_ics.h | 1 + 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 62184cc..0134a49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ icscli .gitconfig *.o +tags diff --git a/src/main.c b/src/main.c index a03bda4..b886522 100644 --- a/src/main.c +++ b/src/main.c @@ -19,6 +19,7 @@ int main(int argc, char **argv) { get_cli_args(argc, argv, &ics_path, &show_all_events); char my_event[8192] = ""; + char unfolded_event[8192] = ""; int myfd = open(ics_path, O_RDONLY); if (myfd == -1) { @@ -39,7 +40,8 @@ int main(int argc, char **argv) { if (strncmp(my_event, "BEGIN:VEVENT", 12) == 0) { memset(my_event, '\0', sizeof(my_event)); read_until_string(myfd, my_event, "END:VEVENT"); - parse_event(my_event, &head); + unfolding_string(my_event, unfolded_event); + parse_event(unfolded_event, &head); } memset(my_event, '\0', sizeof(my_event)); } diff --git a/src/parse_ics.c b/src/parse_ics.c index 21c2fb6..a84a170 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -4,14 +4,12 @@ #include #include #include +#include void parse_event(char event_string[], struct event **head) { - char *start_date = strstr(event_string, "\r\nDTSTART;"); - char *end_date = strstr(event_string, "\r\nDTEND;"); - char *sequence = strstr(event_string, "\r\nSEQUENCE:"); + char *start_date = strstr(event_string, "\r\nDTSTART"); + char *end_date = strstr(event_string, "\r\nDTEND"); char *summary = strstr(event_string, "\r\nSUMMARY"); - char *location = strstr(event_string, "\r\nLOCATION:"); - char *transp = strstr(event_string, "\r\nTRANSP:"); char *start_date_str = malloc(256); char *end_date_str = malloc(256); @@ -23,23 +21,13 @@ void parse_event(char event_string[], struct event **head) { assert(start_date != NULL); assert(end_date != NULL); - assert(sequence != NULL); assert(summary != NULL); - assert(transp != NULL); - strncpy(start_date_str, start_date, end_date - start_date); + strncpy(start_date_str, start_date, strchr(start_date, '\r') - start_date); - strncpy(end_date_str, end_date, sequence - end_date); + strncpy(end_date_str, end_date, strchr(end_date, '\r') - end_date); - if (location != NULL) { - strncpy(summary_str,\ - summary + strlen("\r\nSUMMARY:"),\ - location - summary - strlen("\r\nSUMMARY:")); - } else { - strncpy(summary_str,\ - summary + strlen("\r\nSUMMARY:"),\ - transp - summary - strlen("\r\nSUMMARY:")); - } + strncpy(summary_str, summary, strchr(summary, '\r') - summary); // parse dates remove_whitespace(start_date_str); @@ -55,3 +43,21 @@ void parse_event(char event_string[], struct event **head) { free(summary_str); } +// the unfolded string has a semicolon +// as a separator between what where previously separate lines +void unfolding_string(char* folded_string, char* unfolded_string) { + int j = 0; + for (int i = 0; i < strlen(folded_string); i++) { + if (folded_string[i] == '\r' && folded_string[i+1] == '\n') { + while (isblank(folded_string[i+2])) { + i++; + if (! isblank(folded_string[i+2])) + folded_string[i+1] = ';'; + } + } else { + unfolded_string[j] = folded_string[i]; + j++; + } + } +} + diff --git a/src/parse_ics.h b/src/parse_ics.h index d7cf4f9..8e02cec 100644 --- a/src/parse_ics.h +++ b/src/parse_ics.h @@ -1,3 +1,4 @@ #pragma once void parse_event(char event_string[], struct event **head); +void unfolding_string(char* folded_string, char* unfolded_string); From f874fb99a6ad376d3895405035aa7c7e34200db7 Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 20:28:28 +0100 Subject: [PATCH 2/7] still messy --- src/parse_ics.c | 15 +++++++-------- tests/folded_with_tabs.ics | 4 +++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/parse_ics.c b/src/parse_ics.c index a84a170..9955cec 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -5,11 +5,12 @@ #include #include #include +#include void parse_event(char event_string[], struct event **head) { - char *start_date = strstr(event_string, "\r\nDTSTART"); - char *end_date = strstr(event_string, "\r\nDTEND"); - char *summary = strstr(event_string, "\r\nSUMMARY"); + char *start_date = strstr(event_string, "\nDTSTART"); + char *end_date = strstr(event_string, "\nDTEND"); + char *summary = strstr(event_string, "\nSUMMARY"); char *start_date_str = malloc(256); char *end_date_str = malloc(256); @@ -23,11 +24,11 @@ void parse_event(char event_string[], struct event **head) { assert(end_date != NULL); assert(summary != NULL); - strncpy(start_date_str, start_date, strchr(start_date, '\r') - start_date); + strncpy(start_date_str, start_date, strchr(start_date + 1, '\n') - start_date); - strncpy(end_date_str, end_date, strchr(end_date, '\r') - end_date); + strncpy(end_date_str, end_date, strchr(end_date + 1, '\n') - end_date); - strncpy(summary_str, summary, strchr(summary, '\r') - summary); + strncpy(summary_str, summary, strchr(summary + 1, '\n') - summary); // parse dates remove_whitespace(start_date_str); @@ -51,8 +52,6 @@ void unfolding_string(char* folded_string, char* unfolded_string) { if (folded_string[i] == '\r' && folded_string[i+1] == '\n') { while (isblank(folded_string[i+2])) { i++; - if (! isblank(folded_string[i+2])) - folded_string[i+1] = ';'; } } else { unfolded_string[j] = folded_string[i]; diff --git a/tests/folded_with_tabs.ics b/tests/folded_with_tabs.ics index c819ad0..0c2e76c 100644 --- a/tests/folded_with_tabs.ics +++ b/tests/folded_with_tabs.ics @@ -9,7 +9,9 @@ UID:ical-19709628-example-com DTSTART;VALUE=DATE:20250622T000000 DTEND;VALUE=DATE:20250711T000000 TRANSP:TRANSPARENT -SUMMARY:vacation (approved) +SUMMARY:vacation + (approved) + (again) DESCRIPTION:vacation\n\n status: approved\n workdays: 13,0\n\n From b2a2d09a92ff8d90f8b3bef29527f5becea63613 Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 20:38:23 +0100 Subject: [PATCH 3/7] improved folding function --- src/parse_ics.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/parse_ics.c b/src/parse_ics.c index 9955cec..5e77cb8 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -7,7 +7,8 @@ #include #include -void parse_event(char event_string[], struct event **head) { +void parse_event(char event_string[], struct event **head) +{ char *start_date = strstr(event_string, "\nDTSTART"); char *end_date = strstr(event_string, "\nDTEND"); char *summary = strstr(event_string, "\nSUMMARY"); @@ -24,9 +25,10 @@ void parse_event(char event_string[], struct event **head) { assert(end_date != NULL); assert(summary != NULL); - strncpy(start_date_str, start_date, strchr(start_date + 1, '\n') - start_date); + strncpy(start_date_str, start_date, + strchr(start_date + 1, '\n') - start_date); - strncpy(end_date_str, end_date, strchr(end_date + 1, '\n') - end_date); + strncpy(end_date_str, end_date, strchr(end_date + 1, '\n') - end_date); strncpy(summary_str, summary, strchr(summary + 1, '\n') - summary); @@ -36,7 +38,7 @@ void parse_event(char event_string[], struct event **head) { remove_whitespace(end_date_str); cut_string(end_date_str, ':', 1); - + sorted_insert(head, start_date_str, end_date_str, summary_str); free(start_date_str); @@ -46,17 +48,21 @@ void parse_event(char event_string[], struct event **head) { // the unfolded string has a semicolon // as a separator between what where previously separate lines -void unfolding_string(char* folded_string, char* unfolded_string) { +void unfolding_string(char *folded_string, char *unfolded_string) +{ int j = 0; for (int i = 0; i < strlen(folded_string); i++) { - if (folded_string[i] == '\r' && folded_string[i+1] == '\n') { - while (isblank(folded_string[i+2])) { + if (folded_string[i] == '\r' && folded_string[i + 1] == '\n' + && isblank(folded_string[i + 2])) { + i+=3; + while (isblank(folded_string[i])) { i++; } + unfolded_string[j] = folded_string[i]; + j++; } else { unfolded_string[j] = folded_string[i]; j++; } } } - From 7a5b3bc97a80a0ee25f7db4dcda67301973aa74a Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 20:44:15 +0100 Subject: [PATCH 4/7] added space folded test case and improved unfolding function --- src/parse_ics.c | 2 ++ tests/folded_with_spaces.ics | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 tests/folded_with_spaces.ics diff --git a/src/parse_ics.c b/src/parse_ics.c index 5e77cb8..422c5f9 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -58,6 +58,8 @@ void unfolding_string(char *folded_string, char *unfolded_string) while (isblank(folded_string[i])) { i++; } + unfolded_string[j] = ' '; + j++; unfolded_string[j] = folded_string[i]; j++; } else { diff --git a/tests/folded_with_spaces.ics b/tests/folded_with_spaces.ics new file mode 100644 index 0000000..42a58f3 --- /dev/null +++ b/tests/folded_with_spaces.ics @@ -0,0 +1,27 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//www.example.com//iCal 4.0.3//EN +METHOD:PUBLISH +CALSCALE:GREGORIAN +BEGIN:VEVENT +CREATED:20240102T105004 +UID:ical-19709628-example-com +DTSTART;VALUE=DATE:20250622T000000 +DTEND;VALUE=DATE:20250711T000000 +TRANSP:TRANSPARENT +SUMMARY:vacation + (approved) + (again) +DESCRIPTION:vacation\n\n + status: approved\n + workdays: 13,0\n\n + entered by: John Doe\n + entry date: Tue, 2024-01-02, 10:09 AM\n + approved on: -\n\n\n\n + Powered by example.com\n +DTSTAMP:20240102T105004 +CATEGORIES:example.com +X-MICROSOFT-CDO-BUSYSTATUS:OOF +SEQUENCE:8 +END:VEVENT +END:VCALENDAR From ff20bb92f7d469eca30028a4e94f112472733e05 Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 21:00:18 +0100 Subject: [PATCH 5/7] dont put field name summary into summary field --- src/list_handling.c | 2 +- src/parse_ics.c | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/list_handling.c b/src/list_handling.c index 3e4a824..a94919c 100644 --- a/src/list_handling.c +++ b/src/list_handling.c @@ -52,7 +52,7 @@ void print_upcoming(struct event *head, char current_start_date[], int show_all_ if (strcmp(head->start_date, current_start_date) >= 0) { pretty_print_date_time(head->start_date); print_end_date(head->end_date, head->start_date); - printf("\n%s\n", head->summary); + printf("\nSUMMARY: %s\n", head->summary); if (!show_all_events) { i++; diff --git a/src/parse_ics.c b/src/parse_ics.c index 422c5f9..2b88fa9 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -9,13 +9,14 @@ void parse_event(char event_string[], struct event **head) { - char *start_date = strstr(event_string, "\nDTSTART"); - char *end_date = strstr(event_string, "\nDTEND"); - char *summary = strstr(event_string, "\nSUMMARY"); + char* start_date = strstr(event_string, "\nDTSTART"); + char* end_date = strstr(event_string, "\nDTEND"); + char* summary = strstr(event_string, "\nSUMMARY"); + summary = strchr(summary, ':') + 1; - char *start_date_str = malloc(256); - char *end_date_str = malloc(256); - char *summary_str = malloc(512); + char* start_date_str = malloc(256); + char* end_date_str = malloc(256); + char* summary_str = malloc(512); memset(start_date_str, '\0', 256); memset(end_date_str, '\0', 256); From 3252bf67ae6878389f9ed3302a7ad2d54bf9f9d6 Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 21:06:09 +0100 Subject: [PATCH 6/7] corrected comment --- src/parse_ics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parse_ics.c b/src/parse_ics.c index 2b88fa9..da2af78 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -47,7 +47,7 @@ void parse_event(char event_string[], struct event **head) free(summary_str); } -// the unfolded string has a semicolon +// the unfolded string has a space // as a separator between what where previously separate lines void unfolding_string(char *folded_string, char *unfolded_string) { From 76c7f414ef509950e02df66524a8322f25df256b Mon Sep 17 00:00:00 2001 From: bjt-user Date: Sat, 20 Jan 2024 21:51:07 +0100 Subject: [PATCH 7/7] changed formatting --- src/parse_ics.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/parse_ics.c b/src/parse_ics.c index da2af78..1822c70 100644 --- a/src/parse_ics.c +++ b/src/parse_ics.c @@ -7,16 +7,15 @@ #include #include -void parse_event(char event_string[], struct event **head) -{ - char* start_date = strstr(event_string, "\nDTSTART"); - char* end_date = strstr(event_string, "\nDTEND"); - char* summary = strstr(event_string, "\nSUMMARY"); +void parse_event(char event_string[], struct event **head) { + char *start_date = strstr(event_string, "\nDTSTART"); + char *end_date = strstr(event_string, "\nDTEND"); + char *summary = strstr(event_string, "\nSUMMARY"); summary = strchr(summary, ':') + 1; - char* start_date_str = malloc(256); - char* end_date_str = malloc(256); - char* summary_str = malloc(512); + char *start_date_str = malloc(256); + char *end_date_str = malloc(256); + char *summary_str = malloc(512); memset(start_date_str, '\0', 256); memset(end_date_str, '\0', 256); @@ -49,13 +48,12 @@ void parse_event(char event_string[], struct event **head) // the unfolded string has a space // as a separator between what where previously separate lines -void unfolding_string(char *folded_string, char *unfolded_string) -{ +void unfolding_string(char *folded_string, char *unfolded_string) { int j = 0; for (int i = 0; i < strlen(folded_string); i++) { if (folded_string[i] == '\r' && folded_string[i + 1] == '\n' && isblank(folded_string[i + 2])) { - i+=3; + i += 3; while (isblank(folded_string[i])) { i++; }