Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdbool.h>
- #include <time.h>
- const char *weekday[] = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"};
- //char * searchWeekDay(char *);
- char * searchWeekDay(char *, char *);
- bool controllaRicorrenti(char *,char *);
- void getDate(char*,bool);
- bool checkDay(char *);
- void ThreeLetterToFull(char *);
- int main()
- {
- char today[130];
- getDate(today,true); // nome del file
- char toDoList[] = {"../../../Produttività 🎯/To-Do List 📝.md"}; //PATH TO-DO LIST
- char *buffer = (char *) malloc(sizeof(char)*100); // Buffer per contenere le righe estratte dal file
- char ricorrenza[15] = {""}; // Variabile in cui salvare la ricorrenza delle task
- bool taskListPart = false; //Variabile per segnalare che una task ricorrente è stata trovata e quindi le prossime righe fanno parte di essa e quindi devono essere salvate sul file
- size_t lunghezza;
- FILE *fp; //file sorgente
- FILE *log; // log file
- FILE *fileWT; //file destinazione
- if((log = fopen("log.txt","w")) == NULL) //controllo file log
- {
- exit(-1);
- }
- if((fp = fopen(toDoList,"r")) == NULL) //controllo file sorgente
- {
- fprintf(log,"file problem! (error opening log file)");
- fclose(fp);
- fclose(log);
- exit(-1);
- }
- if((fileWT = fopen(today,"w")) == NULL) //controllo file destinazione
- {
- fprintf(log,"file problem! (error opening destination file) %s",today);
- fclose(fp);
- fclose(log);
- exit(-1);
- }
- getline(&buffer,&lunghezza,fp); //Prendo la prima stringa dal file
- do
- {
- if(taskListPart == true || controllaRicorrenti(buffer,ricorrenza)) // controlla che la task sia ricorrente o continua a scrivere sul file se questa riga fa parte di una task ricorrente
- {
- if (strlen(buffer) < 2) // se la riga è vuota allora è finita la task ricorrente e quindi devi controllare se ce ne sono altre
- {
- taskListPart = false;
- taskListPart2 = false;
- }else if (taskListPart == true) // se questa è una riga che fa parte di una task ricorrente allora scrivila sul file
- {
- fputs(buffer,fileWT);
- }else if (checkDay(ricorrenza)) // se la riga non fa parte di una task ricorrente allora cerca se oggi è un giorno in cui deve essere fatta la task
- {
- fputs(buffer,fileWT);
- taskListPart = true;
- }
- else
- {
- taskListPart2 = true;
- }
- }
- else if (taskListPart2 == false)
- {
- fputs(buffer,fileWT);
- }
- }while(getline(&buffer,&lunghezza,fp) > -1); //continua finchè non hai letto tutte le righe del file
- fclose(fp);
- fclose(log);
- fclose(fileWT);
- free(buffer);
- return 0;
- }
- bool controllaRicorrenti(char * buffer, char * ricorrenza) // controlla se una task è ricorrente
- {
- strcpy(ricorrenza," ");
- char *tmp = buffer; // utilizziamo la variabile tmp per le varie operazioni così da non contaminare la variabile buffer che ci servirà inalterata
- char exclude[15] = {""};
- char tmp2[10] = {""};
- if(strstr(tmp,"- [ ]") != NULL) // Se trovi una task allora controlla che sia ricorrente
- {
- //tmp = buffer; // tmp è stata modificata da strstr quindi la riportiamo di nuovo allo stati iniziale
- if(tmp=strstr(tmp,"(ricorrente:")) // Se è ricorrente allora verifica ogni quanto si verifica
- {
- //tmp = buffer; // tmp è stata modificata da strstr quindi la riportiamo di nuovo allo stati iniziale
- if(strstr(tmp,"_to_")) //controlla se è ricorrente per più giorni consecutivi
- {
- strcpy(exclude,searchWeekDay(buffer," ")); // trova il giorno di inizio del periodo in cui deve essere ripetuta la task e copialo in exclude
- strcpy(tmp2,exclude);
- strcpy(ricorrenza,strcat(tmp2,"_to_")); // salva in ricorrenza la concatenazione del contenuto di exclude (giorno inzio ripetizione task) con "_to_" (es. mon_to_)
- strcat(ricorrenza,searchWeekDay(buffer,exclude)); // ottieni la ricorrenza della task nella forma giornoInizio_to_giornoFine
- }
- else
- {
- strcpy(ricorrenza,searchWeekDay(buffer," "));
- }
- return true; // se è ricorrente restituisci true
- }
- else
- {
- return false; // se non è ricorrente restituisci false
- }
- }
- }
- char * searchWeekDay(char * buffer, char * exclude) // cerca se c'è un giorno della settimana nella stringa (scritto nella forma a 3 lettere) e esclude dalla ricerca un giorno passato come parametro
- {
- if(strcmp("mon", exclude) != 0 && strstr(buffer,"mon") != NULL)
- {
- return "mon";
- }
- else if(strcmp("tue", exclude) != 0 && strstr(buffer,"tue") != NULL)
- {
- return "tue";
- }
- else if(strcmp("wed", exclude) != 0 && strstr(buffer,"wed") != NULL)
- {
- return "wed";
- }
- else if(strcmp("thu", exclude) != 0 && strstr(buffer,"thu") != NULL)
- {
- return "thu";
- }
- else if(strcmp("fri", exclude) != 0 && strstr(buffer,"fri") != NULL)
- {
- return "fri";
- }
- else if(strcmp("sat", exclude) != 0 && strstr(buffer,"sat") != NULL)
- {
- return "sat";
- }
- else if(strcmp("sun", exclude) != 0 && strstr(buffer,"sun") != NULL)
- {
- return "sun";
- }
- }
- void getDate(char * today, bool nomeFile) { // restuisce il nome del file nella forma: "percorsoFileDestinazione + dataAttuale" se nomeFile è true altrimenti restituisce la data attuale
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (nomeFile == true)
- {
- sprintf(today,"/home/giovanni/Studio/Obsidian/Vault/Produttività 🎯/Pianificazione giornata/%s - %02d-%02d-%04d.md", weekday[tm.tm_wday], tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
- }
- else
- {
- sprintf(today,"%s - %02d-%02d-%04d", weekday[tm.tm_wday], tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
- }
- }
- bool checkDay(char *ricorrenza)
- {
- char * tmp = ricorrenza;
- char day1[10];
- char day2[10];
- char day3[10];
- char today[30];
- int day1Position;
- int day2Position;
- if(strstr(tmp,"_to_")); //controlla se è ricorrente per più giorni consecutivi, se lo è allora cerca in quali giorni
- {
- strcpy(day1,searchWeekDay(ricorrenza,""));
- strcpy(day2,searchWeekDay(ricorrenza,day1));
- getDate(today,false);
- ThreeLetterToFull(day1);
- ThreeLetterToFull(day2);
- for(int i = 0; i < 7 ; i++)
- {
- if(strcmp(weekday[i],day1) == 0)
- {
- day1Position = i;
- break;
- }
- }
- for(int i = 0; i < 7 ; i++)
- {
- if(strcmp(weekday[i],day2) == 0)
- {
- day2Position = i;
- break;
- }
- }
- if(strstr(today,day1) != NULL)
- {
- return true;
- }
- else if(strstr(today,day2) != NULL)
- {
- return true;
- }
- else
- {
- for (int i = day1Position; i != day2Position; i++)
- {
- if (strstr(today,weekday[i]) != NULL)
- {
- return true;
- }
- }
- return false;
- }
- }
- }
- void ThreeLetterToFull(char *day) // cerca un giorno della settimana all'interno della stringa
- {
- if (strstr(day,"mon"))
- {
- strcpy(day,"monday");
- }else if (strstr(day,"tue"))
- {
- strcpy(day,"tuesday");
- }else if (strstr(day,"wed"))
- {
- strcpy(day,"wednesday");
- }else if (strstr(day,"thu"))
- {
- strcpy(day,"thursday");
- }else if (strstr(day,"fri"))
- {
- strcpy(day,"friday");
- }else if (strstr(day,"sat"))
- {
- strcpy(day,"saturday");
- }else if (strstr(day,"sun"))
- {
- strcpy(day,"sunday");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement