2380baf832edaeacd76731ae5c6222cea5b8fefe
[scilab.git] / scilab / modules / history_manager / src / c / getCommentDateSession.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007-2008 - INRIA - Allan CORNET
4  * Copyright (C) 2010 - DIGITEO - Allan CORNET
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 /*------------------------------------------------------------------------*/
18 #include <time.h>
19 #include <stdio.h>
20 #include <string.h>             /* strlen */
21 #include "getCommentDateSession.h"
22 #include "sci_malloc.h"
23 #include "BOOL.h"
24 #include "localization.h"
25 #include "os_string.h"
26 #include "freeArrayOfString.h"
27 /*------------------------------------------------------------------------*/
28 #define STRING_BEGIN_SESSION _("Begin Session : ")
29 #define FORMAT_SESSION "%s%s%s"
30 #define MAX_wday 7              /* number days in a week */
31 #define MAX_mon 12              /* number of month in a year */
32 /*------------------------------------------------------------------------*/
33 static char *ASCIItime(const struct tm *timeptr);
34 static char *ASCIItimeShort(const struct tm *timeptr);
35 static char **getDays(void);
36 static char **getMonths(void);
37
38 /*------------------------------------------------------------------------*/
39 char *getCommentDateSession(BOOL longFormat)
40 {
41     char *line = NULL;
42     char *time_str = NULL;
43     time_t timer = time(NULL);
44
45     if (longFormat)
46     {
47         time_str = ASCIItime(localtime(&timer));
48     }
49     else
50     {
51         time_str = ASCIItimeShort(localtime(&timer));
52     }
53
54     if (time_str)
55     {
56         size_t historyLineSize = strlen(SESSION_PRAGMA_BEGIN) + strlen(time_str) + strlen(FORMAT_SESSION) + strlen(SESSION_PRAGMA_END) + 1;
57
58         if (longFormat)
59         {
60             historyLineSize += strlen(STRING_BEGIN_SESSION);
61         }
62
63         line = (char *)MALLOC(sizeof(char) * historyLineSize);
64
65         if (line)
66         {
67             if (longFormat)
68             {
69                 sprintf(line, FORMAT_SESSION, SESSION_PRAGMA_BEGIN, STRING_BEGIN_SESSION, time_str, SESSION_PRAGMA_END);
70             }
71             else
72             {
73                 sprintf(line, FORMAT_SESSION, SESSION_PRAGMA_BEGIN, time_str, SESSION_PRAGMA_END);
74             }
75         }
76         FREE(time_str);
77         time_str = NULL;
78     }
79
80     return line;
81 }
82
83 /*------------------------------------------------------------------------*/
84 static char *ASCIItime(const struct tm *timeptr)
85 {
86     char **wday_name = getDays();
87     char **mon_name = getMonths();
88     char *result = NULL;
89
90     if ((wday_name) && (mon_name))
91     {
92 #define FORMAT_TIME "%s %s%3d %.2d:%.2d:%.2d %d"
93         int len_result = (int)strlen(wday_name[timeptr->tm_wday]) + (int)strlen(mon_name[timeptr->tm_mon]) + (int)strlen(FORMAT_TIME);
94
95         result = (char *)MALLOC(sizeof(char) * (len_result + 1));
96         if (result)
97         {
98             sprintf(result, FORMAT_TIME,
99                     wday_name[timeptr->tm_wday],
100                     mon_name[timeptr->tm_mon], timeptr->tm_mday, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec, 1900 + timeptr->tm_year);
101         }
102     }
103     else
104     {
105         strcpy(result, "");
106     }
107
108     /* free pointers */
109     freeArrayOfString(wday_name, MAX_wday);
110     freeArrayOfString(mon_name, MAX_mon);
111
112     return result;
113 }
114
115 /*------------------------------------------------------------------------*/
116 static char **getDays(void)
117 {
118     char **days = NULL;
119
120     days = (char **)MALLOC(sizeof(char *) * MAX_wday);
121     if (days)
122     {
123         days[0] = os_strdup(_("Sun"));
124         days[1] = os_strdup(_("Mon"));
125         days[2] = os_strdup(_("Tue"));
126         days[3] = os_strdup(_("Wed"));
127         days[4] = os_strdup(_("Thu"));
128         days[5] = os_strdup(_("Fri"));
129         days[6] = os_strdup(_("Sat"));
130     }
131     return days;
132 }
133
134 /*------------------------------------------------------------------------*/
135 static char **getMonths(void)
136 {
137     char **months = NULL;
138
139     months = (char **)MALLOC(sizeof(char *) * MAX_mon);
140     if (months)
141     {
142         /* initialize month */
143         months[0] = os_strdup(_("Jan"));
144         months[1] = os_strdup(_("Feb"));
145         months[2] = os_strdup(_("Mar"));
146         months[3] = os_strdup(_("Apr"));
147         months[4] = os_strdup(_("May"));
148         months[5] = os_strdup(_("Jun"));
149         months[6] = os_strdup(_("Jul"));
150         months[7] = os_strdup(_("Aug"));
151         months[8] = os_strdup(_("Sep"));
152         months[9] = os_strdup(_("Oct"));
153         months[10] = os_strdup(_("Nov"));
154         months[11] = os_strdup(_("Dec"));
155     }
156     return months;
157 }
158
159 /*------------------------------------------------------------------------*/
160 static char *ASCIItimeShort(const struct tm *timeptr)
161 {
162 #define FORMAT_TIME_SHORT "%.2d/%.2d/%.4d %.2d:%.2d:%.2d"
163     int len_result = (int)20;   //strlen("21/05/2011 14:11:04")+1
164
165     char *result = (char *)MALLOC(sizeof(char) * (len_result + 1));
166
167     if (result)
168     {
169         sprintf(result, FORMAT_TIME_SHORT,
170                 timeptr->tm_mday, timeptr->tm_mon + 1 , 1900 + timeptr->tm_year, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec);
171     }
172
173     return result;
174 }
175 /*------------------------------------------------------------------------*/