depre.c (2958B)
1 /* depre, afficher la date et l'heure selon la représentation hexadécimale du 2 * temps dêpre 3 * par ldp <ldp@asteride.xyz> 4 * Ce programme est distribué sous la licence libre GPLv3 5 */ 6 7 #include <assert.h> 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <time.h> 11 #include <unistd.h> 12 13 /* nombre de secondes entre le zéro Unix et zéro depre, par défaut */ 14 #define ZERO_DEF (11138 * 60 * 60 * 24 + 3600 * 4) 15 16 static void utilisation(FILE *f); 17 static void version(void); 18 static int ccvt(char *cc, time_t *rep); 19 20 char *nom_prog; 21 22 int 23 main(int argc, char **argv) 24 { 25 int opt; 26 time_t zero; 27 time_t secondes; 28 unsigned int jours; 29 char *signe; 30 char *var; 31 32 var = NULL; 33 34 /* obtenir le nom du programme */ 35 if ((nom_prog = argv[0]) == NULL || nom_prog[0] == '\0') 36 nom_prog = "depre"; 37 38 /* nombre de secondes depuis le zéro Unix */ 39 secondes = time(NULL); 40 41 opterr = 0; /* ne pas afficher le message d'erreur par défaut */ 42 while ((opt = getopt(argc, argv, "s:z:Vh")) != -1) { 43 switch (opt) { 44 case 's': 45 if (ccvt(optarg, &secondes) < 0) 46 goto erreur; 47 break; 48 case 'z': 49 var = optarg; 50 break; 51 case 'V': 52 version(); 53 return 0; 54 case 'h': 55 utilisation(stdout); 56 return 0; 57 default: 58 goto erreur; 59 } 60 } 61 62 /* il ne doit plus rester d'arguments à traiter */ 63 if (argc - optind != 0) 64 goto erreur; 65 66 /* si l'option -z n'a pas été utilisée, voir si la variable 67 * d'environnement DEPRE_ZERO est réglée. */ 68 if (var == NULL) 69 var = getenv("DEPRE_ZERO"); 70 /* si l'option -z ou la variable d'environnement DEPRE_ZERO ont une 71 * valeur, tenter de convertir leur valeur en nombre. */ 72 if (var != NULL) { 73 if (ccvt(var, &zero) < 0) 74 goto erreur; 75 } else { /* sinon, utiliser la valeur par défaut */ 76 zero = ZERO_DEF; 77 } 78 79 /* nombre de secondes écoulées depuis le zéro depre */ 80 secondes = secondes - zero; 81 /* si la date et l'heure sont antérieures au zéro, quelques ajustements 82 * doivent être faits */ 83 if (secondes < 0) { 84 signe = "-"; 85 secondes *= -1; 86 } else { 87 signe = ""; 88 } 89 /* nombre de jours complets écoulés */ 90 jours = secondes / 86400; 91 /* nombre de secondes écoulées aujourd'hui */ 92 secondes -= jours * 86400; 93 94 /* afficher la date d'aujourd'hui */ 95 printf("%s%x.%llx\n", signe, jours, secondes * (16 * 16 * 16) / 86400); 96 97 return 0; 98 99 erreur: 100 utilisation(stderr); 101 return 1; 102 } 103 104 static void 105 utilisation(FILE *f) 106 { 107 fprintf(f, "Utilisation: %s [-r secondes] [-z zéro] [-V] [-h]\n", nom_prog); 108 } 109 110 static void 111 version(void) 112 { 113 fprintf(stdout, "%s " VERSION "\n", nom_prog); 114 } 115 116 /* convertir une chaîne de caractères en nombre */ 117 static int 118 ccvt(char *cc, time_t *rep) 119 { 120 int signe; 121 122 assert(cc != NULL); 123 124 *rep = 0; 125 signe = 1; 126 if (*cc == '-') { 127 signe = -1; 128 cc++; 129 } 130 131 for (;*cc != '\0'; cc++) { 132 if (*cc < '0' || *cc > '9') 133 return -1; 134 *rep = *rep * 10 + *cc - '0'; 135 } 136 137 *rep *= signe; 138 139 return 0; 140 }