Compare commits

...

6 Commits

Author SHA1 Message Date
ketrptr 42183a0747 Merge branch 'master' of https://gitea.fhgr.ch/schurtisimon/StudyPlanner
modified:   Makefile
	modified:   src/db.c
	modified:   src/db.h
2024-12-15 13:24:34 +01:00
ketrptr 809239492d modified: src/planner.c
modified:   src/ui.c
2024-12-15 13:16:02 +01:00
ketrptr 5e3d89fb57 modified: src/planner.c 2024-12-15 12:54:59 +01:00
ketrptr 5d76c54213 modified: src/db.h
modified:   src/planner.h
2024-12-15 12:53:33 +01:00
ketrptr b5dc110cd2 modified: src/ui.c 2024-12-15 12:40:05 +01:00
ketrptr 9b3238978b modified: src/db.c
modified:   src/db.h
	modified:   src/test.c
	modified:   src/ui.c
2024-12-15 12:18:32 +01:00
6 changed files with 257 additions and 145 deletions

View File

@ -10,84 +10,82 @@
* *
*/ */
#include "llist.h"
#include "planner.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "planner.h" #include <time.h>
#include "llist.h"
/* /*
write a complete linkedlist to a task csv file. write a complete linkedlist to a task csv file.
*/ */
void write_linkedlist_to_csv(llist *head, const char *filename) { void write_linkedlist_to_csv(llist *head, const char *filename) {
//Open file with write permission // Open file with write permision
FILE *file = fopen(filename, "w"); FILE *file = fopen(filename, "w");
//if there is no file or a wrong file path you become an error // if there is no file or a wrong file path you becom an error
if (file == NULL) { if (file == NULL) {
perror("Could not open file\n"); fprintf(stderr, "Could not open file %s\n", filename);
} exit(1);
} else {
// write the file header // write the file header
fprintf(file, "TaskName, Created, Deadline, Priority, Spare\n"); fprintf(file, "TaskName, Created, Deadline, Priority, Spare\n");
// Iterate through the linked list and write the data to the CSV // Iterate through the linked list and write the data to the CSV
llist *current = head; llist *current = head;
Task *task;
while (current != NULL) { while (current != NULL) {
task = current->data;
// Write the task data to the CSV file // Write the task data to the CSV file
Task *task = (Task *) (current->data); fprintf(file, "%s, %llu, %llu, %d, %llu\n", task->name, task->created,
fprintf(file, "%s, %llu, %llu, %d, %lu\n", task->deadline, task->priority, task->spare);
task->name,
task->created,
task->deadline,
task->priority,
task->spare);
current = current->next; current = current->next;
} }
fclose(file); // Close the file fclose(file); // Close the file
} }
}
/* /*
read a task csv file and write the data in a linked list read a task csv file and write the data in a linked list
*/ */
llist *write_csv_to_llist(const char *filename) { llist *write_csv_to_llist(const char *filename) {
//initialize list llist *list = NULL; // list to return
llist *list = NULL; // Open file with read permision
//Open file with read permission
FILE *file = fopen(filename, "r"); FILE *file = fopen(filename, "r");
if (file == NULL) { if (file == NULL) {
perror("Could not open file\n"); fprintf(stderr, "Could not open file %s\n", filename);
}
} else {
char line[1024]; // Line Buffer char line[1024]; // Line Buffer
int count = 0; // task counter int count = 0; // task counter
fgets(line, sizeof(line), file); // read and ignore file head fgets(line, sizeof(line), file); // read and ignore file head
while (fgets(line, sizeof(line), file)) { while (fgets(line, sizeof(line), file)) {
count++; count++;
// remove newline sign // remove newline sign
line[strcspn(line, "\n")] = '\0'; line[strcspn(line, "\n")] = '\0';
// column slice // column slice
char *task_name = strtok(line, ","); char *taskname = strtok(line, ",");
char *task_creation_dateSTR = strtok(NULL, ","); char *taskcreation_dateSTR = strtok(NULL, ",");
char *task_deadline_dateSTR = strtok(NULL, ","); char *taskdeadline_dateSTR = strtok(NULL, ",");
char *task_prioritySTR = strtok(NULL, ","); char *taskprioritySTR = strtok(NULL, ",");
char *task_spareSTR = strtok(NULL, ","); char *taskspareSTR = strtok(NULL, ",");
// convert char in integer and date // convert char in integer and date
unsigned long long int task_creation_date = (unsigned long long int)strtoul(task_creation_dateSTR, NULL, 10); unsigned long int taskcreation_date =
unsigned long long int task_deadline_date = (unsigned long long int)strtoul(task_deadline_dateSTR,NULL, 10); strtoul(taskcreation_dateSTR, NULL, 10);
unsigned long int task_spare = (unsigned long int)strtoul(task_spareSTR,NULL, 10); unsigned long int taskdeadline_date =
int task_priority = (int)strtol(task_prioritySTR, NULL, 10); strtoul(taskdeadline_dateSTR, NULL, 10);
unsigned long int taskspare = strtoul(taskspareSTR, NULL, 10);
int priority = atoi(taskprioritySTR);
// create Task // create Task
Task *task = newTask(task_name, task_creation_date, task_deadline_date, task_priority, task_spare); Task *task = newTask(taskname, taskcreation_date, taskdeadline_date,
priority, taskspare);
// Insert task into the linked list // Insert task into the linked list
if (list == NULL) { if (list == NULL) {
@ -99,5 +97,6 @@ llist *write_csv_to_llist(const char *filename) {
} }
} }
fclose(file); fclose(file);
return list; }
return list; // null on error
} }

View File

@ -5,5 +5,10 @@
#endif #endif
<<<<<<< HEAD
void write_linkedlist_to_csv(llist *head, const char *filename);
llist *write_csv_to_llist(const char *filename);
=======
extern void write_linkedlist_to_csv(llist* head, const char* filename); extern void write_linkedlist_to_csv(llist* head, const char* filename);
extern void write_csv_to_llist(const char* filename); extern void write_csv_to_llist(const char* filename);
>>>>>>> 9d903f62f26133fd6f309036b3da11400168e705

View File

@ -269,3 +269,71 @@ llist *genPlan(llist *head, time_t timeAvail) {
return events_ll; return events_ll;
} }
const char *iCalHeader = "BEGIN:VCALENDAR\r\n"
"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";
int exportiCal(llist *events_ll) {
llist *ev_ll = events_ll;
llistPrintE(ev_ll);
printf("%s", iCalHeader);
time_t now = time(NULL);
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(&current->plannedStartTime, &startlc);
localtime_r(&current->plannedEndTime, &endlc);
char timeStartBuf[17];
char timeEndBuf[17];
char timeStamp[17];
strftime(timeStamp, 17, "%Y%m%dT%k%M%SZ", &lc);
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;
}

View File

@ -83,4 +83,6 @@ int cmpEvent(const void *a, const void *b);
*/ */
llist *genPlan(llist *head, time_t timeAvail); llist *genPlan(llist *head, time_t timeAvail);
int exportiCal(llist *head);
#endif // !PLANNER #endif // !PLANNER

View File

@ -9,7 +9,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
int main() { int test() {
time_t now = time(NULL); time_t now = time(NULL);

134
src/ui.c
View File

@ -5,12 +5,15 @@
/* Created by Juergen Buechel, 13.12.2024/ /* Created by Juergen Buechel, 13.12.2024/
*/ */
#include "ui.h" #include "ui.h"
// #include "db.h" #include "db.h"
#include "llist.h" #include "llist.h"
#include "planner.h" // for subject and event structs #include "planner.h" // for subject and event structs
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h>
const char *dbName = "db.csv";
int main(void) { int main(void) {
char taskname[256]; // taskName Buffer char taskname[256]; // taskName Buffer
@ -19,30 +22,34 @@ int main(void) {
int taskpriority = 0; int taskpriority = 0;
int taskspare = 0; int taskspare = 0;
llist *list = llistNew(NULL, cmpTaskN); llist *listT = NULL;
llist *listE = NULL;
int choice = 0, i = 0; int choice = 0, i = 0;
do { do {
printf(" -1- Neues Fach eingeben\n"); printf(" -1- Neues Fach eingeben\n");
printf(" -2- Verfuegbare Zeit eingeben\n"); printf(" -2- Verfuegbare Zeit eingeben\n");
printf(" -3- Alle vorhandenen Faecher aufliesten\n"); printf(" -3- Alle vorhandenen Faecher aufliesten\n");
printf(" -4- Kalenderlink ausgeben\n"); printf(" -4- Kalenderlink ausgeben\n");
printf(" -5- Planer beenden\n"); printf(" -5- Faecher Importieren\n");
printf(" -6- Planer beenden\n");
printf(" Wähle die gewünschte Option aus\n"); printf(" Wähle die gewünschte Option aus\n");
if (scanf("%d", &choice) != 1) { if (scanf("%d", &choice) != 1) {
printf("Falsche Eingabe\n"); printf("Falsche Eingabe\n");
}; };
choice = 0; // choice = 0;
while ((choice < 1 || choice > 5)) {
switch (choice) { switch (choice) {
case 1: { case 1:
printf(" Geben sie das gewünschte Fach ein: \n"); printf(" Geben sie das gewünschte Fach ein: \n");
if (scanf("%c", taskname) != 1) { time_t now = time(NULL);
struct tm lc;
localtime_r(&now, &lc);
if (fscanf(stdin, "%s", taskname) <= 0) {
printf("Ungültige Eingabe für den Namen.\n"); printf("Ungültige Eingabe für den Namen.\n");
return -1; return -1;
} }
printf(" Wie viel Zeit bleibt ihnen:\n"); printf(" Wie viel Zeit bleibt ihnen (tage bis deadline):\n");
if (scanf("%d", &taskdeadline_date) != 1) { if (scanf("%d", &taskdeadline_date) != 1) {
printf("Ungültige Eingabe.\n"); printf("Ungültige Eingabe.\n");
return -1; return -1;
@ -54,22 +61,42 @@ int main(void) {
return -1; return -1;
} }
printf(" Wie viel Zeit habe Sie für dieses Fach: \n"); // printf(" Wie viel Zeit habe Sie für dieses Fach: \n");
if (scanf("%d", &taskspare) != 1) { // if (scanf("%d", &taskspare) != 1) {
printf("Ungültige Eingabe.\n"); // printf("Ungültige Eingabe.\n");
return -1; // return -1;
// }
// create deadline timestamp
lc.tm_yday += taskdeadline_date;
time_t deadline = mktime(&lc);
Task *newT = newTask(taskname, now, deadline, taskpriority, 0);
if (listT == NULL) {
listT = llistNew(newT, cmpTaskN);
} else {
llistAppend(listT, newT);
} }
break; break;
case 2: case 2:
printf( printf(
"Geben Sie die zur verfuegung stehende Zeit für die Fächer an: \n"); "Geben Sie die zur verfuegung stehende Zeit für die Fächer an: \n");
scanf("%c", &taskspare); scanf("%d", &taskspare);
// if list exists use it to generate plan
if (listT != NULL) {
listE = genPlan(listT, taskspare);
write_linkedlist_to_csv(listT, dbName);
} else {
printf("list is empty!");
return -1;
}
break; break;
case 3: case 3:
// if (task == NULL) { if (listT == NULL) {
// printf("Die Liste ist leer"); printf("Die Liste ist leer");
// } else { } else {
llistPrintT(listT);
// llist *iterator = list; // llist *iterator = list;
// while (iterator != NULL) { // while (iterator != NULL) {
// Task *currentTask = (Task *)(iterator->data); // Cast zu Task // Task *currentTask = (Task *)(iterator->data); // Cast zu Task
@ -78,35 +105,51 @@ int main(void) {
// currentTask->priority); // currentTask->priority);
// iterator = iterator->next; // Gehe zum nächsten Listenelement // iterator = iterator->next; // Gehe zum nächsten Listenelement
// } // }
}
break;
// // case 4: iCAl();break;
//
// printf(" Wie viel Zeit bleibt ihnen:\n");
// if (scanf("%d", &taskdeadline_date) != 1) {
// printf("Ungültige Eingabe.\n");
// return -1;
// } // }
break; //
// case 4: iCAl();break; // printf(" Gib die Priorität des Faches an: \n");
// if (scanf("%d", &taskpriority) != 1) {
printf(" Wie viel Zeit bleibt ihnen:\n"); // printf("Ungültige Eingabe.\n");
if (scanf("%d", &taskdeadline_date) != 1) { // return -1;
printf("Ungültige Eingabe.\n"); // }
return -1; //
} // printf(" Wie viel Zeit habe Sie für dieses Fach: \n");
// if (scanf("%d", &taskspare) != 1) {
printf(" Gib die Priorität des Faches an: \n"); // printf("Ungültige Eingabe.\n");
if (scanf("%d", &taskpriority) != 1) { // return -1;
printf("Ungültige Eingabe.\n"); // }
return -1; // break;
}
printf(" Wie viel Zeit habe Sie für dieses Fach: \n");
if (scanf("%d", &taskspare) != 1) {
printf("Ungültige Eingabe.\n");
return -1;
}
break;
case 4: case 4:
printf( if (listE == NULL || taskspare <= 0) {
"Geben Sie die zur verfuegung stehende Zeit für die Fächer an: \n"); printf("vor Export erst task list erstellen, dann verfuegbare zeit "
scanf("%d", &taskspare); "eingeben!\n");
break;
}
exportiCal(listE);
// printf(
// "Geben Sie die zur verfuegung stehende Zeit für die Fächer an:
// \n");
// scanf("%d", &taskspare);
break;
case 5:
listT = write_csv_to_llist(dbName);
break; break;
case 5: case 6:
printf("Goodbye!\n");
if (listE != NULL)
llistFreeE(listE);
if (listT != NULL)
llistPrintT(listT);
// if (task == NULL) {//task? // if (task == NULL) {//task?
// printf("Die Liste ist leer"); // printf("Die Liste ist leer");
// } else { // } else {
@ -119,13 +162,8 @@ int main(void) {
// iterator = iterator->next; // Gehe zum nächsten Listenelement // iterator = iterator->next; // Gehe zum nächsten Listenelement
// } // }
// } // }
break; return EXIT_SUCCESS;
// case 4: iCAl();break; // case 4: iCAl();break;
} }
} } while (choice < 6);
}
} while (choice != 5);
{
return EXIT_SUCCESS;
}
} }