From 7b22939c20afa4f4a08c13a25d71f2720f0b6a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sun, 3 Feb 2019 21:35:13 +0100 Subject: Loads of memmory fixes, among other. --- calendar.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'calendar.c') diff --git a/calendar.c b/calendar.c index abecef89..5ac47f58 100644 --- a/calendar.c +++ b/calendar.c @@ -14,6 +14,28 @@ #include "macro.h" #include "parse.h" +/* + * Returns 0 if file has no extersion + */ +int get_extension(const char* filename, char* ext, ssize_t max_len) { + int ext_idx = -1; + ext[0] = '\0'; + for (char* c = (char*) filename; *c != '\0'; c++) { + if (*c == '.') { + ext_idx = 0; + continue; + } + if (ext_idx >= 0) { + ext[ext_idx++] = *c; + if (ext_idx == max_len) break; + } + } + ext[ext_idx] = '\0'; + return (ext_idx == -1) + ? 0 + : ext_idx; +} + int read_vcalendar(vcalendar* cal, char* path) { DIR* dir = opendir(path); @@ -24,11 +46,11 @@ int read_vcalendar(vcalendar* cal, char* path) { if (d->d_type != DT_REG) continue; /* Check that we have an ICS file */ - char *s, *fname; - s = fname = d->d_name; - while (*(s++) != '.'); + char* fname = d->d_name; - if (strcmp(s, "ics") != 0) continue; + char ext[10]; + int has_ext = get_extension(fname, ext, 9); + if (! has_ext || strcmp(ext, "ics") != 0) continue; /* We now assume that it's a good file, and start parsing it */ @@ -45,10 +67,11 @@ int read_vcalendar(vcalendar* cal, char* path) { * iteration (not really, since I don't save any headers). * Preferably, a special case is made for vdir structures * which can assume that all headers are equal. */ - parse_file(f, cal); - cal->events[cal->n_events - 1]->filename = fname; + parse_file(fname, f, cal); + fclose(f); + ; } closedir(dir); -- cgit v1.2.3