0a88fe80886ddabeeca43af8dbc1bda02dadae35
[monky] / src / timeinfo.c
1 /* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*-
2  * vim: ts=4 sw=4 noet ai cindent syntax=c
3  *
4  * Conky, a system monitor, based on torsmo
5  *
6  * Any original torsmo code is licensed under the BSD license
7  *
8  * All code written since the fork of torsmo is licensed under the GPL
9  *
10  * Please see COPYING for details
11  *
12  * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
13  * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
14  *      (see AUTHORS)
15  * All rights reserved.
16  *
17  * This program is free software: you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation, either version 3 of the License, or
20  * (at your option) any later version.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  * You should have received a copy of the GNU General Public License
27  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
28  *
29  */
30
31 #include "text_object.h"
32 #include <locale.h>
33
34 void scan_time(struct text_object *obj, const char *arg)
35 {
36         obj->data.s = strndup(arg ? arg : "%F %T", text_buffer_size);
37 }
38
39 void scan_tztime(struct text_object *obj, const char *arg)
40 {
41         char buf1[256], buf2[256], *fmt, *tz;
42
43         fmt = tz = NULL;
44         if (arg) {
45                 int nArgs = sscanf(arg, "%255s %255[^\n]", buf1, buf2);
46
47                 switch (nArgs) {
48                         case 2:
49                                 tz = buf1;
50                         case 1:
51                                 fmt = buf2;
52                 }
53         }
54
55         obj->data.tztime.fmt = strndup(fmt ? fmt : "%F %T", text_buffer_size);
56         obj->data.tztime.tz = tz ? strndup(tz, text_buffer_size) : NULL;
57 }
58
59 void print_time(struct text_object *obj, char *p, int p_max_size)
60 {
61         time_t t = time(NULL);
62         struct tm *tm = localtime(&t);
63
64         setlocale(LC_TIME, "");
65         strftime(p, p_max_size, obj->data.s, tm);
66 }
67
68 void print_utime(struct text_object *obj, char *p, int p_max_size)
69 {
70         time_t t = time(NULL);
71         struct tm *tm = gmtime(&t);
72
73         setlocale(LC_TIME, "");
74         strftime(p, p_max_size, obj->data.s, tm);
75 }
76
77 void print_tztime(struct text_object *obj, char *p, int p_max_size)
78 {
79         char *oldTZ = NULL;
80         time_t t;
81         struct tm *tm;
82
83         if (obj->data.tztime.tz) {
84                 oldTZ = getenv("TZ");
85                 setenv("TZ", obj->data.tztime.tz, 1);
86                 tzset();
87         }
88         t = time(NULL);
89         tm = localtime(&t);
90
91         setlocale(LC_TIME, "");
92         strftime(p, p_max_size, obj->data.tztime.fmt, tm);
93         if (oldTZ) {
94                 setenv("TZ", oldTZ, 1);
95                 tzset();
96         } else {
97                 unsetenv("TZ");
98         }
99         // Needless to free oldTZ since getenv gives ptr to static data
100 }
101
102 void free_time(struct text_object *obj)
103 {
104         if (!obj->data.s)
105                 return;
106         free(obj->data.s);
107         obj->data.s = NULL;
108 }
109
110 void free_tztime(struct text_object *obj)
111 {
112         if (obj->data.tztime.tz) {
113                 free(obj->data.tztime.tz);
114                 obj->data.tztime.tz = NULL;
115         }
116         if (obj->data.tztime.fmt) {
117                 free(obj->data.tztime.fmt);
118                 obj->data.tztime.fmt = NULL;
119         }
120 }