depre

Afficher la date et l'heure hexadécimale
git clone git://git.asteride.xyz/~ldp/depre.git
Journaux | Fichiers | Références | LISEZ-MOI | LICENCE

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 }