Coverity: history_manager module memory errors fixed
[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 LONG_FORMAT_SESSION "%s%s%s%s"
31 #define MAX_wday 7              /* number days in a week */
32 #define MAX_mon 12              /* number of month in a year */
33 /*------------------------------------------------------------------------*/
34 static char *ASCIItime(const struct tm *timeptr);
35 static char *ASCIItimeShort(const struct tm *timeptr);
36 static char **getDays(void);
37 static char **getMonths(void);
38
39 /*------------------------------------------------------------------------*/
40 char *getCommentDateSession(BOOL longFormat)
41 {
42     char *line = NULL;
43     char *time_str = NULL;
44     time_t timer = time(NULL);
45
46     if (longFormat)
47     {
48         time_str = ASCIItime(localtime(&timer));
49     }
50     else
51     {
52         time_str = ASCIItimeShort(localtime(&timer));
53     }
54
55     if (time_str)
56     {
57         size_t historyLineSize = strlen(SESSION_PRAGMA_BEGIN) + strlen(time_str) + strlen(FORMAT_SESSION) + strlen(SESSION_PRAGMA_END) + 1;
58
59         if (longFormat)
60         {
61             historyLineSize += strlen(STRING_BEGIN_SESSION);
62         }
63
64         line = (char *)MALLOC(sizeof(char) * historyLineSize);
65
66         if (line)
67         {
68             if (longFormat)
69             {
70                 sprintf(line, LONG_FORMAT_SESSION, SESSION_PRAGMA_BEGIN, STRING_BEGIN_SESSION, time_str, SESSION_PRAGMA_END);
71             }
72             else
73             {
74                 sprintf(line, FORMAT_SESSION, SESSION_PRAGMA_BEGIN, time_str, SESSION_PRAGMA_END);
75             }
76         }
77         FREE(time_str);
78         time_str = NULL;
79     }
80
81     return line;
82 }
83
84 /*------------------------------------------------------------------------*/
85 static char *ASCIItime(const struct tm *timeptr)
86 {
87     char **wday_name = getDays();
88     char **mon_name = getMonths();
89     char *result = NULL;
90
91     if ((wday_name) && (mon_name))
92     {
93 #define FORMAT_TIME "%s %s%3d %.2d:%.2d:%.2d %d"
94         int len_result = (int)strlen(wday_name[timeptr->tm_wday]) + (int)strlen(mon_name[timeptr->tm_mon]) + (int)strlen(FORMAT_TIME);
95
96         result = (char *)MALLOC(sizeof(char) * (len_result + 1));
97         if (result)
98         {
99             sprintf(result, FORMAT_TIME,
100                     wday_name[timeptr->tm_wday],
101                     mon_name[timeptr->tm_mon], timeptr->tm_mday, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec, 1900 + timeptr->tm_year);
102         }
103     }
104     else
105     {
106         result = (char *)MALLOC(sizeof(char));
107         strcpy(result, "");
108     }
109
110     /* free pointers */
111     freeArrayOfString(wday_name, MAX_wday);
112     freeArrayOfString(mon_name, MAX_mon);
113
114     return result;
115 }
116
117 /*------------------------------------------------------------------------*/
118 static char **getDays(void)
119 {
120     char **days = NULL;
121
122     days = (char **)MALLOC(sizeof(char *) * MAX_wday);
123     if (days)
124     {
125         days[0] = os_strdup(_("Sun"));
126         days[1] = os_strdup(_("Mon"));
127         days[2] = os_strdup(_("Tue"));
128         days[3] = os_strdup(_("Wed"));
129         days[4] = os_strdup(_("Thu"));
130         days[5] = os_strdup(_("Fri"));
131         days[6] = os_strdup(_("Sat"));
132     }
133     return days;
134 }
135
136 /*------------------------------------------------------------------------*/
137 static char **getMonths(void)
138 {
139     char **months = NULL;
140
141     months = (char **)MALLOC(sizeof(char *) * MAX_mon);
142     if (months)
143     {
144         /* initialize month */
145         months[0] = os_strdup(_("Jan"));
146         months[1] = os_strdup(_("Feb"));
147         months[2] = os_strdup(_("Mar"));
148         months[3] = os_strdup(_("Apr"));
149         months[4] = os_strdup(_("May"));
150         months[5] = os_strdup(_("Jun"));
151         months[6] = os_strdup(_("Jul"));
152         months[7] = os_strdup(_("Aug"));
153         months[8] = os_strdup(_("Sep"));
154         months[9] = os_strdup(_("Oct"));
155         months[10] = os_strdup(_("Nov"));
156         months[11] = os_strdup(_("Dec"));
157     }
158     return months;
159 }
160
161 /*------------------------------------------------------------------------*/
162 static char *ASCIItimeShort(const struct tm *timeptr)
163 {
164 #define FORMAT_TIME_SHORT "%.2d/%.2d/%.4d %.2d:%.2d:%.2d"
165     int len_result = (int)20;   //strlen("21/05/2011 14:11:04")+1
166
167     char *result = (char *)MALLOC(sizeof(char) * (len_result + 1));
168
169     if (result)
170     {
171         sprintf(result, FORMAT_TIME_SHORT,
172                 timeptr->tm_mday, timeptr->tm_mon + 1 , 1900 + timeptr->tm_year, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec);
173     }
174
175     return result;
176 }
177 /*------------------------------------------------------------------------*/