From 0943d4f32191a324abdd4002a4815c80b90e5a15 Mon Sep 17 00:00:00 2001 From: carlaTechnulgy Date: Tue, 17 Dec 2024 09:57:50 +0100 Subject: [PATCH] carlas commit --- .vscode/tasks.json | 28 +++++++++ src/iCal.c | 140 +++++++++++++++++++++++++++++++++++++++++++-- src/planner.c | 6 +- src/ui.c | 2 +- 4 files changed, 166 insertions(+), 10 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..a6d8aad --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc.exe build active file", + "command": "C:\\MinGW\\bin\\gcc.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/src/iCal.c b/src/iCal.c index 6ffc75e..4cf5d7e 100644 --- a/src/iCal.c +++ b/src/iCal.c @@ -1,7 +1,135 @@ -/* INPUT: linked list of events - * - * OUTPUT: Ical File, OK to caller - * - */ -#include "planner.h" // for task and event structs +const char *iCalHeader = "BEGIN:VCALENDAR\r\n" //definition of commands for final iCal file + "VERSION:2.0\r\n" + "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\r\n"; +const char *iCalEvent = "BEGIN:VEVENT\r\n" + "UID:%s%d\r\n" + "DTSTAMP:%s\r\n" + "DTSTART:%s\r\n" + "DTEND:%s\r\n" + "SUMMARY:%s\r\n" + "END:VEVENT\r\n"; + +const char *iCalFileExtension = "ics"; // doctype + +/* + * Wikipedia + * + *The body of the iCalendar object (the icalbody) contains single-line Calendar + * Properties that apply to the entire calendar, as well as one or more blocks + * of multiple lines that each define a Calendar Component such as an event, + * journal entry, alarm, or one of several other types. Here is a simple example + * of an iCalendar object with a single calendar containing a single Calendar + * Component, a "Bastille Day Party" event starting at 5pm on July 14, 1997, and + * ending at 4am the following morning:[10] + + + +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//hacksw/handcal//NONSGML v1.0//EN +BEGIN:VEVENT +UID:uid1@example.com +ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com +DTSTART:19970714T170000Z +DTEND:19970715T040000Z +SUMMARY:Bastille Day Party +GEO:48.85299;2.36885 +END:VEVENT +END:VCALENDAR + + +The UID field distributes updates when a scheduled event changes. When the event +is first generated a globally unique identifier is created. If a later event is +distributed with the same UID, it replaces the original one. An example UID +might be Y2007S2C131M5@example.edu, for the 5th meeting of class 131 in semester +2 at a hypothetical college. Email-style UIDs are now considered bad practice, +with a UUID recommended instead.[11] + +The most common representation of date and time is a tz timestamp such as +20010911T124640Z with the format TZ for a total fixed length of 16 characters. Z +indicates the use of UTC (referring to its Zulu time zone).[12] When used in +DTSTART and DTEND properties, start times are inclusive while end times are not. +This allows an event's end time to be the same as a consecutive event's start +without those events overlapping and potentially creating (false) scheduling +conflicts.[13] + + + */ +//exportical function: generates ical file from llist +int exportiCal(llist *events_ll) { + + llist *ev_ll = events_ll; //input from llist + + llistPrintE(ev_ll); + + printf("%s", iCalHeader); + + time_t now = time(NULL); //current time is captured an formatted + struct tm lc; + localtime_r(&now, &lc); + + // gen filename & open for write + char nameBuf[32]; + strftime(nameBuf, 32 - 12, "%F", &lc); + strcat(nameBuf, "dayplan.ics"); + FILE *fp = fopen(nameBuf, "w"); + if (fp == NULL) { + planLog("fopen failed!!", 1); + return 1; + } + // write iCal header to file + fprintf(fp, "%s", iCalHeader); + + // for every event in events_ll create VEVENT str and write to fp + int count = 0; + while (ev_ll != NULL) { + // gen iCal compatible time str + Event *current = ev_ll->data; + struct tm startlc; + struct tm endlc; + localtime_r(¤t->plannedStartTime, &startlc); + localtime_r(¤t->plannedEndTime, &endlc); + char timeStartBuf[17]; + char timeEndBuf[17]; + char timeStamp[17]; + strftime(timeStamp, 17, "%Y%m%dT%k%M%SZ", &lc); //strftime to match ical format + printf("%s\n", timeStamp); + strftime(timeStartBuf, 17, "%Y%m%dT%k%M%SZ", &startlc); + printf("%s\n", timeStartBuf); + strftime(timeEndBuf, 17, "%Y%m%dT%k%M%SZ", &endlc); + printf("%s\n", timeEndBuf); + + fprintf(fp, iCalEvent, current->task->name, count, timeStamp, timeStartBuf, + timeEndBuf, current->task->name); + ev_ll = ev_ll->next; + count += 1; + } + + // after all events are written end cal with + // END:VCALENDAR + fprintf(fp, "END:VCALENDAR\r\n"); + fclose(fp); + + return 0; +} + +//export data from llist to csv file +const char *taskFileFormat = "%s,%lu,%lu,%d,%lu\n"; +int taskLlToFile(llist *tll) { + // open file + FILE *fp = fopen("db.csv", "w"); + if (fp == NULL) + return -1; //if file cannot be opend, return -1 + llist *c = tll; + while (c != NULL) { + Task *ct = (Task *)c->data; //loop to go through tasks(name, created time, deadline, priority, etc.) + fprintf(fp, taskFileFormat, ct->name, ct->created, ct->deadline, + ct->priority, ct->spare); + c = c->next; + } + fclose(fp); + + return 0; +} diff --git a/src/planner.c b/src/planner.c index 325a912..7a3b30b 100644 --- a/src/planner.c +++ b/src/planner.c @@ -16,8 +16,8 @@ #include #ifdef _WIN32 -#define ctime_r(T, Tm) (localtime_s(Tm, T) ? NULL : Tm) -#define localtime_r(T, Tm) (localtime_s(Tm, T) ? NULL : Tm) +#define ctime_r(T, Tm) (_localtime64_s(Tm, T) ? NULL : Tm) +#define localtime_r(T, Tm) (_localtime64_s(Tm, T) ? NULL : Tm) #endif /* ifdef _WIN32 */ const unsigned int intervalLen = 45; // min @@ -204,7 +204,7 @@ llist *genPlan(llist *head, time_t timeAvail) { planLog("creating eventList", false); - // genertate plan basen on priorities and available time + // genertate plan based on priorities and available time time_t now = time(NULL); struct tm *lc = localtime(&now); llist *events_ll = llistNew(NULL, cmpEvent); diff --git a/src/ui.c b/src/ui.c index 3ad081c..fef67eb 100644 --- a/src/ui.c +++ b/src/ui.c @@ -16,7 +16,7 @@ #include #ifdef _WIN32 -#define localtime_r(T, Tm) (localtime_s(Tm, T) ? NULL : Tm) +#define localtime_r(T, Tm) (_localtime64_s(Tm, T) ? NULL : Tm) #endif