/* main.c by ashgenesis ashgenesis[at]gmail[dot]com*/ /* Pour ne pas compiler avec un compilateur C++ */ #ifdef __cplusplus #error Be sure you are using a C compiler... #endif #include #include #include #include #include /* LONG_MIN et LONG_MAX */ #include /* gestion d'erreur strtol */ /* macros ============================================================== */ /* prototype =========================================================== */ /* L'usage des prototypes séparés n'est pas justifié ici, car c'est un mini projet a un seul fichier. */ static void use (char name[]); static void isbissextil (int y); static int showtime (void); static int showcalendar(void); static int myfirstdays(int d, int m, int y); static int affichage (int d, int m, int y, int fd); static int changeparam (char *str); static void lapinou(void); /* constants =========================================================== */ /* Pour les chaines longues et irrégulières, l'usage de tableaux de pointeurs sur chaines permet une optimisation de l'espace mémoire. */ static char const *monthnames [] = {"Janvier", "Fevrier", "Mars", "Avril", "Mais", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"}; static char const daynames[] [3]= {"Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"}; /* types =============================================================== */ /* structures ========================================================== */ /* private variables =================================================== */ /* Vu qu'il y a les 12 initialiseurs, il n'est pas indispensable de préciser la taille du tableau.*/ static int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* private functions =================================================== */ /* Regle d'usage du programme */ static void use (char name[]) { printf ("Utilisation : %s\n", name); printf ("Utilisation : %s [day] [month] [year]\n", name); printf ("Utilisation : %s -s (affiche la date d'aujourd'hui)\n", name); printf ("L'annee ne doit pas etre en dessous de 1970\n"); } /* Test si l'année est bissextile */ static void isbissextil (int y) { if ((( y % 4 == 0) && ( y % 100 != 0)) || (y % 400 == 0)) { days[1] = 29; } } /* Affiche la date d'aujourd'hui par Emmanuel Delahaye */ static int showtime (void) { time_t now = time (NULL); struct tm tm_now = *localtime (&now); char s[64]; strftime (s, sizeof s, "%d/%m/%Y", &tm_now); printf ("Aujourd'hui : %s\n", s); return 0; } /* Affiche le calendrier du mois courant */ static int showcalendar(void){ time_t now = time (NULL); struct tm tm_now = *localtime (&now); char day[10]; char month[10]; char year[10]; strftime (day, sizeof day, "%d", &tm_now); strftime (month, sizeof month, "%m", &tm_now); strftime (year, sizeof year, "%Y", &tm_now); int d = changeparam (day); int m = changeparam (month); int y = changeparam (year); isbissextil(y); int firstday = myfirstdays(1, m, y); affichage (d, m, y, firstday); return 0; } /* Quel jour correspond à la date */ static int myfirstdays(int d, int m, int y) { int jour; jour = 367*y-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4+275*m/9+d+1721029; jour++; return (jour%7)+1; } /* affichage du calendrier en console */ static int affichage (int d, int m, int y, int fd) { int j; printf (" \033[1m%s %d \n", monthnames[m-1], y); for (j=0; j<7; j++) { printf ("\033[0m%s ", daynames[j] ); } printf ("\n"); for (j=0; j 6 ) { printf("\n"); fd = 0; } fd++; } printf("\n"); return 0; } /* converti les parametres en int */ static int changeparam (char *str) { int val; int base = 10; char *end; errno = 0; val = strtol (str, &end, base); if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) { perror ("strtol"); exit (EXIT_FAILURE); } if (end == str) { fprintf(stderr, "Pas de chiffre trouvé\n"); exit(EXIT_FAILURE); } return val; } /* fonction décorative ne servant à rien */ static void lapinou(void) { printf("\t(\\ _ /)\n"); printf("\t(='.'=)\n"); printf("\t(\")-(\")\n"); printf("La conquete du lapinou !\n"); } /* internal public functions =========================================== */ /* entry points ======================================================== */ /* public variables ==================================================== */ /* --------------------------------------------------------------------- --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { int err = 0; if (argc == 1) { showcalendar(); } else if (argc == 2) { if(!strcmp(argv[1], "foo")) { lapinou (); } else if(!strcmp(argv[1], "-s")) { showtime (); } else { use (argv[0]); } } else if (argc == 4) { int year = changeparam (argv[3]); int month = changeparam (argv[2]); int day = changeparam (argv[1]); /* Test si mois est bien compris entre 1 et 12 et si l'année est strictement supérieur a 1971 */ if (month > 12 || month < 1 || year < 1971 || day > 31 || day < 1) { err = 1; } else { isbissextil (year); int firstday = myfirstdays(1, month, year); affichage (day, month, year, firstday); } } else { use (argv[0]); } #if defined (WIN32) system("PAUSE"); #endif return 0; }