Merge tag 'upstream/1.2.0'
[psensor-pkg-debian.git] / src / lib / ptime.c
1 /*
2  * Copyright (C) 2010-2016 jeanfi@gmail.com
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301 USA
18  */
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include <ptime.h>
23
24 const int P_TIME_VER = 3;
25
26 static const int ISO8601_TIME_LENGTH = 19; /* YYYY-MM-DDThh:mm:ss */
27 static const int ISO8601_DATE_LENGTH = 10; /* YYYY-MM-DD */
28
29 char *time_to_ISO8601_time(time_t *t)
30 {
31         struct tm lt;
32
33         memset(&lt, 0, sizeof(struct tm));
34         if (!gmtime_r(t, &lt))
35                 return NULL;
36
37         return tm_to_ISO8601_time(&lt);
38 }
39
40 char *time_to_ISO8601_date(time_t *t)
41 {
42         struct tm lt;
43
44         memset(&lt, 0, sizeof(struct tm));
45         if (!gmtime_r(t, &lt))
46                 return NULL;
47
48         return tm_to_ISO8601_date(&lt);
49 }
50
51 char *tm_to_ISO8601_date(struct tm *tm)
52 {
53         char *str;
54
55         str = malloc(ISO8601_DATE_LENGTH + 1);
56
57         if (strftime(str, ISO8601_DATE_LENGTH + 1, "%F", tm))
58                 return str;
59
60         free(str);
61         return NULL;
62 }
63
64 char *tm_to_ISO8601_time(struct tm *tm)
65 {
66         char *str;
67
68         str = malloc(ISO8601_TIME_LENGTH + 1);
69
70         if (strftime(str, ISO8601_TIME_LENGTH + 1, "%FT%T", tm))
71                 return str;
72
73         free(str);
74         return NULL;
75 }
76
77 char *get_current_ISO8601_time(void)
78 {
79         time_t t;
80
81         t = time(NULL);
82         return time_to_ISO8601_time(&t);
83 }