date.c (1095B)
1 /* Copyright CC-BY-SA-4.0 2017-2018 Haelwenn (lanodan) Monnier <contact@hacktivis.me> */
2 #include <locale.h> /* setlocale() */
3 #include <stdio.h> /* BUFSIZ, perror(), puts() */
4 #include <stdlib.h> /* exit() */
5 #include <time.h> /* time, localtime, tm, strftime */
6 #include <unistd.h> /* getopt(), optarg, optind */
7
8 int main(int argc, char *argv[])
9 {
10 char outstr[BUFSIZ];
11 struct tm *tm;
12 time_t now;
13 char *format = "%c";
14 int uflag = 0, dflag = 0;
15 int c;
16
17 setlocale(LC_ALL, "");
18
19 while ((c = getopt(argc, argv, ":ud:")) != -1) {
20 switch(c) {
21 case 'd': /* user-provided datetime */
22 now = time(optarg);
23 dflag++;
24 break;
25 case 'u': /* Timezone is UTC */
26 uflag++;
27 break;
28 }
29 }
30
31 if(!dflag)
32 now = time(NULL);
33
34 if(uflag)
35 tm = gmtime(&now);
36 else
37 tm = localtime(&now);
38
39 argc -= optind;
40 argv += optind;
41
42 if (*argv && **argv == '+')
43 format = *argv + 1;
44
45 if(tm == NULL)
46 {
47 perror("localtime");
48 exit(EXIT_FAILURE);
49 }
50
51 if(strftime(outstr, sizeof(outstr), format, tm) == 0)
52 {
53 perror("strftime returned 0");
54 exit(EXIT_FAILURE);
55 }
56
57 return puts(outstr);
58 }