@ind-rcg/backend 246.1008.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +37 -0
- package/README.md +7 -0
- package/bin/libsqliteExtension.dll +0 -0
- package/bin/libsqliteExtension.dylib +0 -0
- package/binding.gyp +21 -0
- package/configuration.template.json +24 -0
- package/log4js.json +11 -0
- package/nativeSrc/PriceEngineWrap.cc +157 -0
- package/nativeSrc/PriceEngineWrap.h +24 -0
- package/nativeSrc/common/DBAccess/SimpleDBConnection.cpp +800 -0
- package/nativeSrc/common/DBAccess/SimpleDBConnection.h +54 -0
- package/nativeSrc/common/Libs/cJSON/CHANGELOG.md +428 -0
- package/nativeSrc/common/Libs/cJSON/LICENSE +20 -0
- package/nativeSrc/common/Libs/cJSON/README.md +571 -0
- package/nativeSrc/common/Libs/cJSON/cJSON.c +3110 -0
- package/nativeSrc/common/Libs/cJSON/cJSON.h +293 -0
- package/nativeSrc/common/Libs/sqlcipher/sqlite3.c +241624 -0
- package/nativeSrc/common/Libs/sqlcipher/sqlite3.h +12836 -0
- package/nativeSrc/common/Libs/sqlcipher/sqlite3ext.h +701 -0
- package/nativeSrc/common/LogAdapter/LogAdapter.cpp +25 -0
- package/nativeSrc/common/LogAdapter/LogAdapter.h +20 -0
- package/nativeSrc/common/PriceEngine/PriceEngine.cpp +251 -0
- package/nativeSrc/common/PriceEngine/PriceEngine.h +67 -0
- package/nativeSrc/common/Utils/StringFormat.cpp +905 -0
- package/nativeSrc/common/Utils/StringFormat.h +116 -0
- package/nativeSrc/common/Utils/miniz/timer.cpp +165 -0
- package/nativeSrc/common/Utils/miniz/timer.h +40 -0
- package/nativeSrc/common/stdngm.h +92 -0
- package/nativeSrc/nativeWrapper.cc +15 -0
- package/package.json +70 -0
- package/src/argsParser.js +73 -0
- package/src/bootstrap.js +156 -0
- package/src/fsHelper.js +36 -0
- package/src/globalConfig.js +23 -0
- package/src/local.js +546 -0
- package/src/server.js +64 -0
- package/src/sfAttachmentsHandler.js +283 -0
- package/src/utils.js +91 -0
- package/src/zipHandler.js +153 -0
|
@@ -0,0 +1,905 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StringFormat.cpp
|
|
3
|
+
// NGM
|
|
4
|
+
//
|
|
5
|
+
// Created by RGS on 07/03/13.
|
|
6
|
+
/*
|
|
7
|
+
* FILE_HEADER
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include "StringFormat.h"
|
|
11
|
+
|
|
12
|
+
#include <sstream>
|
|
13
|
+
#include <fstream>
|
|
14
|
+
|
|
15
|
+
#define TM_YEAR_BASE 1900
|
|
16
|
+
|
|
17
|
+
#define DAYSPERLYEAR 366
|
|
18
|
+
#define DAYSPERNYEAR 365
|
|
19
|
+
#define DAYSPERWEEK 7
|
|
20
|
+
|
|
21
|
+
#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
|
|
22
|
+
|
|
23
|
+
static char *_fmt(const char *format, const struct tm *t, char *pt, const char *ptlim);
|
|
24
|
+
static char *_conv(const int n, const char *format, char *pt, const char *ptlim);
|
|
25
|
+
static char *_add(const char *str, char *pt, const char *ptlim);
|
|
26
|
+
///
|
|
27
|
+
|
|
28
|
+
std::string to_string( double d )
|
|
29
|
+
{
|
|
30
|
+
char buf[64];
|
|
31
|
+
safe_snprintf(buf, 64, "%f", d);
|
|
32
|
+
return (std::string(buf));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
std::string to_string( size_t u )
|
|
36
|
+
{
|
|
37
|
+
char buf[32];
|
|
38
|
+
safe_snprintf(buf, 32, "%lu", u);
|
|
39
|
+
return (std::string(buf));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
std::string to_string( int i )
|
|
43
|
+
{
|
|
44
|
+
char buf[32];
|
|
45
|
+
safe_snprintf(buf, 32, "%d", i);
|
|
46
|
+
return std::string(buf);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
std::string to_string(INT64 ld )
|
|
50
|
+
{
|
|
51
|
+
char buf[64];
|
|
52
|
+
safe_snprintf(buf, 64, "%lld", ld);
|
|
53
|
+
return std::string(buf);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
std::string to_lower(const char *s) {
|
|
57
|
+
std::locale settings;
|
|
58
|
+
std::string cvt;
|
|
59
|
+
for(int i = 0; i < (int)safe_strlen(s); i++) { cvt += std::tolower(s[i], settings); }
|
|
60
|
+
return cvt;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
std::string to_upper(const char *s) {
|
|
64
|
+
std::locale settings;
|
|
65
|
+
std::string cvt;
|
|
66
|
+
for(int i = 0; i < (int)safe_strlen(s); i++) { cvt += std::toupper(s[i], settings); }
|
|
67
|
+
return cvt;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
bool to_boolean(const char *s) {
|
|
71
|
+
std::string cvt = to_lower(s);
|
|
72
|
+
return (("true" == cvt) || ("1" == cvt)) ? true : false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
std::string to_current_date() {
|
|
76
|
+
time_t t = time(0); // get time now
|
|
77
|
+
struct tm * now = localtime( & t );
|
|
78
|
+
char buf[32];
|
|
79
|
+
safe_snprintf(buf, 32, "%04d-%02d-%02d",(now->tm_year + 1900), (now->tm_mon + 1), now->tm_mday);
|
|
80
|
+
return std::string(buf);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
std::string to_current_date_time() {
|
|
84
|
+
time_t t = time(0); // get time now
|
|
85
|
+
struct tm * now = localtime( & t );
|
|
86
|
+
char buf[32];
|
|
87
|
+
safe_snprintf(buf, 32, "%04d-%02d-%02d %02d:%02d:%02d",(now->tm_year + 1900), (now->tm_mon + 1), now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec);
|
|
88
|
+
return std::string(buf);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
std::string to_current_date_time_msecs() {
|
|
92
|
+
#ifndef WIN32
|
|
93
|
+
timeval curTime;
|
|
94
|
+
gettimeofday(&curTime, NULL);
|
|
95
|
+
int msecs = curTime.tv_usec / 1000;
|
|
96
|
+
|
|
97
|
+
time_t t = time(0);
|
|
98
|
+
struct tm * now = localtime( & t );
|
|
99
|
+
|
|
100
|
+
char buf[32];
|
|
101
|
+
safe_snprintf(buf, 32, "%04d-%02d-%02d %02d:%02d:%02d.%03d",(now->tm_year + 1900), (now->tm_mon + 1), now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec, msecs);
|
|
102
|
+
#else
|
|
103
|
+
time_t t = time(0); // get time now
|
|
104
|
+
struct tm * now = localtime( & t );
|
|
105
|
+
char buf[32];
|
|
106
|
+
safe_snprintf(buf, 32, "%04d-%02d-%02d %02d:%02d:%02d.%03d",(now->tm_year + 1900), (now->tm_mon + 1), now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec,0);
|
|
107
|
+
#endif
|
|
108
|
+
return std::string(buf);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Specific date time format implementation
|
|
112
|
+
size_t formatted_date_time(char *s, size_t maxsize, const char *format, const struct tm *t) {
|
|
113
|
+
char *p;
|
|
114
|
+
|
|
115
|
+
p = _fmt(((format == NULL) ? "%" : format), t, s, s + maxsize);
|
|
116
|
+
if (p == s + maxsize) return 0;
|
|
117
|
+
*p = '\0';
|
|
118
|
+
return p - s;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static char *_fmt(const char *format, const struct tm *t, char *pt, const char *ptlim) {
|
|
122
|
+
for ( ; *format; ++format) {
|
|
123
|
+
switch (*format) {
|
|
124
|
+
case '\0':
|
|
125
|
+
--format;
|
|
126
|
+
break;
|
|
127
|
+
|
|
128
|
+
case 'a': // a Lowercase Ante meridiem and Post meridiem - Ex: am or pm
|
|
129
|
+
pt = _add((t->tm_hour >= 12) ? "pm" : "am", pt, ptlim);
|
|
130
|
+
continue;
|
|
131
|
+
|
|
132
|
+
case 'A': // A Uppercase Ante meridiem and Post meridiem - Ex: AM or PM
|
|
133
|
+
pt = _add((t->tm_hour >= 12) ? "PM" : "AM", pt, ptlim);
|
|
134
|
+
continue;
|
|
135
|
+
|
|
136
|
+
case 'd': // Day of the month, 2 digits with leading zeros - Ex: 01 to 31
|
|
137
|
+
pt = _conv(t->tm_mday, "%02d", pt, ptlim);
|
|
138
|
+
continue;
|
|
139
|
+
|
|
140
|
+
case 'H': // 24-hour format of an hour with leading zeros - Ex: 00 to 23
|
|
141
|
+
pt = _conv(t->tm_hour, "%02d", pt, ptlim);
|
|
142
|
+
continue;
|
|
143
|
+
|
|
144
|
+
case 'h': // 12-hour format of an hour with leading zeros - Ex: 01 to 12
|
|
145
|
+
pt = _conv((t->tm_hour % 12) ? (t->tm_hour % 12) : 12, "%02d", pt, ptlim);
|
|
146
|
+
continue;
|
|
147
|
+
|
|
148
|
+
case 'i': // Minutes, with leading zeros - Ex: 00 to 59
|
|
149
|
+
pt = _conv(t->tm_min, "%02d", pt, ptlim);
|
|
150
|
+
continue;
|
|
151
|
+
|
|
152
|
+
case 'j': // Day of the month without leading zeros - Ex: 1 to 31
|
|
153
|
+
pt = _conv(t->tm_mday, "%2d", pt, ptlim);
|
|
154
|
+
continue;
|
|
155
|
+
|
|
156
|
+
case 'G': // 24-hour format of an hour without leading zeros - Ex: 0 to 23
|
|
157
|
+
pt = _conv(t->tm_hour, "%2d", pt, ptlim);
|
|
158
|
+
continue;
|
|
159
|
+
|
|
160
|
+
case 'g': // 12-hour format of an hour without leading zeros - Ex: 1 to 12
|
|
161
|
+
pt = _conv((t->tm_hour % 12) ? (t->tm_hour % 12) : 12, "%2d", pt, ptlim);
|
|
162
|
+
continue;
|
|
163
|
+
|
|
164
|
+
case 'm': // Numeric representation of a month, with leading zeros
|
|
165
|
+
pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim);
|
|
166
|
+
continue;
|
|
167
|
+
|
|
168
|
+
case 'n': // Numeric representation of a month, without leading zeros - Ex: 1 to 12
|
|
169
|
+
pt = _conv(t->tm_mon + 1, "%2d", pt, ptlim);
|
|
170
|
+
continue;
|
|
171
|
+
|
|
172
|
+
case 'N': // ISO-8601 numeric representation of the day of the week 1 (for Monday) through 7 (for Sunday)
|
|
173
|
+
pt = _conv((t->tm_wday == 0) ? 7 : t->tm_wday, "%d", pt, ptlim);
|
|
174
|
+
continue;
|
|
175
|
+
|
|
176
|
+
case 's': // Seconds, with leading zeros - Ex: 00 to 59
|
|
177
|
+
pt = _conv(t->tm_sec, "%02d", pt, ptlim);
|
|
178
|
+
continue;
|
|
179
|
+
|
|
180
|
+
case 't': { // Number of days in the given month - Ex: 28 to 31
|
|
181
|
+
int numberOfDays;
|
|
182
|
+
int month = t->tm_mon + 1;
|
|
183
|
+
int year = t->tm_year + TM_YEAR_BASE;
|
|
184
|
+
if (month == 4 || month == 6 || month == 9 || month == 11)
|
|
185
|
+
numberOfDays = 30;
|
|
186
|
+
else if (month == 2) {
|
|
187
|
+
if (LEAPYEAR(year)) numberOfDays = 29;
|
|
188
|
+
else numberOfDays = 28;
|
|
189
|
+
}
|
|
190
|
+
else
|
|
191
|
+
numberOfDays = 31;
|
|
192
|
+
|
|
193
|
+
pt = _conv(numberOfDays, "%2d", pt, ptlim);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
case 'W': // ISO-8601 week number of year, weeks starting on Monday - Ex: 01 to 53
|
|
197
|
+
pt = _conv((t->tm_yday + 7 - (t->tm_wday ? (t->tm_wday - 1) : 6)) / 7, "%02d", pt, ptlim);
|
|
198
|
+
continue;
|
|
199
|
+
|
|
200
|
+
case 'y': // A two digit representation of a year - Ex: 99 or 03
|
|
201
|
+
pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, "%02d", pt, ptlim);
|
|
202
|
+
continue;
|
|
203
|
+
|
|
204
|
+
case 'Y': // A full numeric representation of a year, 4 digits - Ex: 1999 or 2003
|
|
205
|
+
pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d", pt, ptlim);
|
|
206
|
+
continue;
|
|
207
|
+
|
|
208
|
+
case 'z': // The day of the year (starting from 0) 0 to 364 (365 in leap years)
|
|
209
|
+
pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
|
|
210
|
+
continue;
|
|
211
|
+
|
|
212
|
+
case '%':
|
|
213
|
+
default:
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (pt == ptlim) break;
|
|
218
|
+
*pt++ = *format;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return pt;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
static char *_conv(const int n, const char *format, char *pt, const char *ptlim) {
|
|
225
|
+
char buf[32];
|
|
226
|
+
|
|
227
|
+
safe_snprintf(buf, 32, format, n);
|
|
228
|
+
return _add(buf, pt, ptlim);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
static char *_add(const char *str, char *pt, const char *ptlim) {
|
|
232
|
+
while (pt < ptlim && (*pt = *str++) != '\0') ++pt;
|
|
233
|
+
return pt;
|
|
234
|
+
}
|
|
235
|
+
/////
|
|
236
|
+
|
|
237
|
+
std::string StringFormat(const char *fmt, ...)
|
|
238
|
+
{
|
|
239
|
+
int sz = SAFE_DEFAULT_BUFSIZE;
|
|
240
|
+
std::string str;
|
|
241
|
+
va_list ap;
|
|
242
|
+
|
|
243
|
+
if (NULL != fmt)
|
|
244
|
+
{
|
|
245
|
+
for (;;)
|
|
246
|
+
{
|
|
247
|
+
str.resize((size_t)sz);
|
|
248
|
+
|
|
249
|
+
va_start(ap, fmt);
|
|
250
|
+
int n = safe_vsnprintf((char *)str.c_str(), (size_t)sz, fmt, ap);
|
|
251
|
+
va_end(ap);
|
|
252
|
+
|
|
253
|
+
if (n < 0) break;
|
|
254
|
+
|
|
255
|
+
if (n < sz) { str.resize((size_t)n); break; }
|
|
256
|
+
|
|
257
|
+
sz = (sz == n) ? (n + 1) : (sz * 2);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return str;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
std::string StringFormat(int sz, const char *fmt, ...)
|
|
266
|
+
{
|
|
267
|
+
std::string str;
|
|
268
|
+
va_list ap;
|
|
269
|
+
|
|
270
|
+
if (NULL != fmt)
|
|
271
|
+
{
|
|
272
|
+
for (;;)
|
|
273
|
+
{
|
|
274
|
+
str.resize((size_t)sz);
|
|
275
|
+
|
|
276
|
+
va_start(ap, fmt);
|
|
277
|
+
int n = safe_vsnprintf((char *)str.c_str(), (size_t)sz, fmt, ap);
|
|
278
|
+
va_end(ap);
|
|
279
|
+
|
|
280
|
+
if (n < 0) break;
|
|
281
|
+
|
|
282
|
+
if (n < sz) { str.resize((size_t)n); break; }
|
|
283
|
+
|
|
284
|
+
sz = (sz == n) ? (n + 1) : (sz * 2);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return str;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// in place string replacement
|
|
292
|
+
void StringReplace(std::string& subject, const std::string& search, const std::string& replace) {
|
|
293
|
+
if (search.empty()) return;
|
|
294
|
+
size_t pos = 0;
|
|
295
|
+
while( (pos = subject.find(search, pos)) != std::string::npos ) {
|
|
296
|
+
subject.replace(pos, search.length(), replace);
|
|
297
|
+
pos += replace.length();
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
void StringReplace(std::string& subject, const char *search, const char *replace) {
|
|
302
|
+
StringReplace(subject, std::string(search), std::string(replace) );
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
void StringEscapeResponseXML(std::string& subject)
|
|
306
|
+
{
|
|
307
|
+
StringReplace(subject, std::string("\r\n" ), std::string("" ));
|
|
308
|
+
StringReplace(subject, std::string(" " ), std::string("" ));
|
|
309
|
+
StringReplace(subject, std::string("&" ), std::string("&" ));
|
|
310
|
+
StringReplace(subject, std::string("'" ), std::string("'"));
|
|
311
|
+
StringReplace(subject, std::string("\""), std::string("""));
|
|
312
|
+
StringReplace(subject, std::string(">" ), std::string(">" ));
|
|
313
|
+
StringReplace(subject, std::string("<" ), std::string("<" ));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
void StringEscapeXML(std::string& subject)
|
|
317
|
+
{
|
|
318
|
+
StringReplace(subject, std::string("&" ), std::string("&" ));
|
|
319
|
+
StringReplace(subject, std::string("'" ), std::string("'"));
|
|
320
|
+
StringReplace(subject, std::string("\""), std::string("""));
|
|
321
|
+
StringReplace(subject, std::string(">" ), std::string(">" ));
|
|
322
|
+
StringReplace(subject, std::string("<" ), std::string("<" ));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
void StringDoubleEscapeXML(std::string& subject)
|
|
326
|
+
{
|
|
327
|
+
StringReplace(subject, std::string("&" ), std::string("&amp;" ));
|
|
328
|
+
StringReplace(subject, std::string("'" ), std::string("&apos;"));
|
|
329
|
+
StringReplace(subject, std::string("\""), std::string("&quot;"));
|
|
330
|
+
StringReplace(subject, std::string(">" ), std::string("&gt;" ));
|
|
331
|
+
StringReplace(subject, std::string("<" ), std::string("&lt;" ));
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
void StringEscapeJSON(std::string& subject)
|
|
335
|
+
{
|
|
336
|
+
StringReplace(subject, std::string("\\"), std::string("\\\\")); //always replace these first!!!
|
|
337
|
+
StringReplace(subject, std::string("\""), std::string("\\\""));
|
|
338
|
+
StringReplace(subject, std::string("\t"), std::string("\\t"));
|
|
339
|
+
StringReplace(subject, std::string("\n"), std::string("\\n"));
|
|
340
|
+
StringReplace(subject, std::string("\r"), std::string("\\r"));
|
|
341
|
+
StringReplace(subject, std::string("/"), std::string("\\/"));
|
|
342
|
+
StringReplace(subject, std::string("\b"), std::string("\\b"));
|
|
343
|
+
StringReplace(subject, std::string("\f"), std::string("\\f"));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
std::vector<std::string> StringSplit(const std::string &s, char delim)
|
|
347
|
+
{
|
|
348
|
+
std::vector<std::string> elems;
|
|
349
|
+
std::stringstream ss(s);
|
|
350
|
+
std::string item;
|
|
351
|
+
|
|
352
|
+
while (std::getline(ss, item, delim))
|
|
353
|
+
{
|
|
354
|
+
elems.push_back(item);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return elems;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
std::vector<std::string> StringSplit(const char * s, char delim)
|
|
361
|
+
{
|
|
362
|
+
std::string buf = s;
|
|
363
|
+
|
|
364
|
+
return StringSplit(buf, delim);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
bool starts_with(const std::string& s1, const std::string& s2) {
|
|
368
|
+
return (s2.size() <= s1.size()) && s1.compare(0, s2.size(), s2) == 0;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
bool ends_with(const std::string& s1, const std::string& s2) {
|
|
372
|
+
return (s2.size() <= s1.size()) && (s1.compare(s1.size() - s2.size(), s2.size(), s2) == 0);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
bool contains(const std::string& s1, const std::string& s2) {
|
|
376
|
+
return std::string::npos != s1.find(s2);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
void StringList::_buildJSONString(std::string & ret, const char *s, bool comma) {
|
|
380
|
+
ret += (comma) ? ", \"" : "\""; ret += s; ret += "\"";
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
void StringList::save(const char * file_name, const char * eol_mark) {
|
|
384
|
+
std::ofstream f(file_name); if (f.is_open()) { for (int i=0; i<(int)lst.size(); i++ ) { f << lst[i].c_str(); f << eol_mark; } f.close(); }
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
std::string StringList::toJSON() {
|
|
388
|
+
std::string ret = "["; for (int i=0; i<(int)lst.size(); i++) { _buildJSONString(ret, lst[i].c_str(), (0<i)); } ret += "]"; return ret;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const char *strreplace(char *s, char search, char replace )
|
|
392
|
+
{
|
|
393
|
+
int l = (int)safe_strlen(s);
|
|
394
|
+
|
|
395
|
+
for ( int i=0; i<l; i++ ) {
|
|
396
|
+
if ( s[i] == search ) s[i] = replace;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return s;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const char *strrspn( const char *s )
|
|
403
|
+
{
|
|
404
|
+
const char* p = strchr( s, '\0' );
|
|
405
|
+
while (p-- != s)
|
|
406
|
+
if (!strchr( " ", *p ))
|
|
407
|
+
break;
|
|
408
|
+
return p + 1;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
char *trim_right( char *s )
|
|
412
|
+
{
|
|
413
|
+
s[ strrspn( s ) - s ] = '\0';
|
|
414
|
+
return s;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
char *trim_left( char *s )
|
|
418
|
+
{
|
|
419
|
+
char* p = s + strspn( s, " " );
|
|
420
|
+
return (char *)safe_memcpy((void *)s, (const void *)p, safe_strlen( p ) + 1);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
char *trim( char *s )
|
|
424
|
+
{
|
|
425
|
+
return trim_left( trim_right( s ) );
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
void *safe_malloc(size_t size)
|
|
429
|
+
{
|
|
430
|
+
return calloc(size, sizeof(char));
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
void safe_srand()
|
|
434
|
+
{
|
|
435
|
+
return srand(time(NULL));
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
std::string safe_trim(const char *s)
|
|
439
|
+
{
|
|
440
|
+
std::string result = "";
|
|
441
|
+
|
|
442
|
+
int len = safe_strlen(s);
|
|
443
|
+
|
|
444
|
+
if (len > 0)
|
|
445
|
+
{
|
|
446
|
+
char *sp = new char [len + 1];
|
|
447
|
+
safe_strcpy(sp,s);
|
|
448
|
+
trim(sp);
|
|
449
|
+
result = sp;
|
|
450
|
+
delete[] sp;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
return result;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
std::string safe_string(const char *s)
|
|
457
|
+
{
|
|
458
|
+
std::string result = "";
|
|
459
|
+
|
|
460
|
+
int len = safe_strlen(s);
|
|
461
|
+
|
|
462
|
+
if (len > 0)
|
|
463
|
+
{
|
|
464
|
+
char *sp = new char [len + 1];
|
|
465
|
+
safe_strcpy(sp,s);
|
|
466
|
+
result = sp;
|
|
467
|
+
delete[] sp;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
FILE *safe_fopen(const char *filename, const char *mode)
|
|
474
|
+
{
|
|
475
|
+
std::string sFilename = safe_string(filename);
|
|
476
|
+
std::string sMode = safe_string(mode);
|
|
477
|
+
|
|
478
|
+
return fopen(sFilename.c_str(), sMode.c_str());
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
int safe_stat(const char *filename, struct stat *buf)
|
|
482
|
+
{
|
|
483
|
+
struct stat dummy_buf;
|
|
484
|
+
std::string sFilename = safe_string(filename);
|
|
485
|
+
|
|
486
|
+
if (NULL == buf)
|
|
487
|
+
{
|
|
488
|
+
buf = &dummy_buf;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return stat(sFilename.c_str(), buf);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
std::string ConvertWStringToString(const std::wstring& s)
|
|
495
|
+
{
|
|
496
|
+
std::string temp(s.length(), ' ');
|
|
497
|
+
std::string::iterator str = temp.begin();
|
|
498
|
+
|
|
499
|
+
for (std::wstring::const_iterator itr = s.begin(); itr != s.end(); ++itr)
|
|
500
|
+
{
|
|
501
|
+
*str++ = (const char)*itr;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
return temp;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
std::string escapeJsonString(const std::string& inputStr) {
|
|
508
|
+
std::ostringstream oss;
|
|
509
|
+
for (std::string::const_iterator iter = inputStr.begin(); iter != inputStr.end(); iter++) {
|
|
510
|
+
switch (*iter) {
|
|
511
|
+
case '\\': oss << "\\\\"; break;
|
|
512
|
+
case '"': oss << "\\\""; break;
|
|
513
|
+
case '/': oss << "\\/"; break;
|
|
514
|
+
case '\b': oss << "\\b"; break;
|
|
515
|
+
case '\f': oss << "\\f"; break;
|
|
516
|
+
case '\n': oss << "\\n"; break;
|
|
517
|
+
case '\r': oss << "\\r"; break;
|
|
518
|
+
case '\t': oss << "\\t"; break;
|
|
519
|
+
default: oss << *iter; break;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return oss.str();
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
void * safe_memcpy(void *dst, const void *src, size_t count)
|
|
526
|
+
{
|
|
527
|
+
if ((NULL == dst) || (NULL == src)) return NULL;
|
|
528
|
+
// CHECKMARX FALSE POSITIVE - Use_of_Obsolete_Functions
|
|
529
|
+
// Explanation ( looks like improper Null termination - which is not a finding any more)
|
|
530
|
+
// moving src to dst will keep NULL terminated in dst
|
|
531
|
+
return memmove(dst, src, count);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const void * safe_memchr(const void * ptr, int ch, size_t count)
|
|
535
|
+
{
|
|
536
|
+
if ((NULL == ptr) || (ch < 0) || (ch > 255)) return NULL;
|
|
537
|
+
|
|
538
|
+
return memchr(ptr, ch, count);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
size_t safe_strlen(const char *str)
|
|
542
|
+
{
|
|
543
|
+
if (NULL == str) return 0;
|
|
544
|
+
|
|
545
|
+
size_t len = safe_strnlen(str, SAFE_DEFAULT_STRLEN);
|
|
546
|
+
|
|
547
|
+
return (SAFE_DEFAULT_STRLEN == len) ? 0 : len;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
size_t safe_strnlen(const char *str, size_t count)
|
|
551
|
+
{
|
|
552
|
+
if (NULL == str) return 0;
|
|
553
|
+
|
|
554
|
+
const char * end = (const char *)safe_memchr(str, '\0', count);
|
|
555
|
+
|
|
556
|
+
return (end == NULL) ? count : (end - str);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
char * safe_strcat(char * dst, const char * src)
|
|
560
|
+
{
|
|
561
|
+
if ((NULL == dst) || (NULL == src)) return NULL;
|
|
562
|
+
|
|
563
|
+
size_t len_dst = safe_strlen(dst);
|
|
564
|
+
size_t len_src = safe_strlen(src);
|
|
565
|
+
|
|
566
|
+
if ((0 == len_dst) && (*dst != 0x0)) return NULL;
|
|
567
|
+
if ((0 == len_src) && (*src != 0x0)) return NULL;
|
|
568
|
+
|
|
569
|
+
char * end_dst = dst + len_dst;
|
|
570
|
+
|
|
571
|
+
return (NULL == safe_memcpy(end_dst, src, len_src + 1)) ? NULL : dst;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
char * safe_strcpy(char * dst, const char * src)
|
|
575
|
+
{
|
|
576
|
+
if ((NULL == dst) || (NULL == src)) return NULL;
|
|
577
|
+
|
|
578
|
+
size_t len_src = safe_strlen(src);
|
|
579
|
+
|
|
580
|
+
if ((0 == len_src) && (*src != 0x0)) return NULL;
|
|
581
|
+
|
|
582
|
+
return (NULL == safe_memcpy(dst, src, len_src + 1)) ? NULL : dst;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
char * safe_strncpy(char * dst, const char * src, size_t count)
|
|
586
|
+
{
|
|
587
|
+
if ((NULL == dst) || (NULL == src)) return NULL;
|
|
588
|
+
|
|
589
|
+
if (0 == count) return dst;
|
|
590
|
+
|
|
591
|
+
size_t len_src = safe_strnlen(src, count);
|
|
592
|
+
|
|
593
|
+
if ((0 == len_src) && (*src != 0x0)) return NULL;
|
|
594
|
+
|
|
595
|
+
if (len_src > count) len_src = count;
|
|
596
|
+
|
|
597
|
+
if (NULL == safe_memcpy(dst, src, len_src)) return NULL;
|
|
598
|
+
|
|
599
|
+
dst[len_src] = 0x0;
|
|
600
|
+
|
|
601
|
+
return dst;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
int safe_snprintf(char *str, size_t count, const char * fmt, ...)
|
|
605
|
+
{
|
|
606
|
+
if ((NULL == str) || (NULL == fmt)) return -1;
|
|
607
|
+
|
|
608
|
+
if (0 == count) return 0;
|
|
609
|
+
|
|
610
|
+
va_list ap;
|
|
611
|
+
int n;
|
|
612
|
+
|
|
613
|
+
va_start(ap, fmt);
|
|
614
|
+
n = safe_vsnprintf(str, count, fmt, ap);
|
|
615
|
+
va_end(ap);
|
|
616
|
+
|
|
617
|
+
return n;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
int safe_vsnprintf(char * str, size_t count, const char * fmt, va_list arg)
|
|
621
|
+
{
|
|
622
|
+
if ((NULL == str) || (NULL == fmt)) return -1;
|
|
623
|
+
|
|
624
|
+
if (0 == count) return 0;
|
|
625
|
+
|
|
626
|
+
return vsnprintf(str, count, fmt, arg);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
#ifdef SAFE_TEST
|
|
630
|
+
void safe_test(const char *operating_system, const char *output_path_only_no_delimiter_no_filename, ...)
|
|
631
|
+
{
|
|
632
|
+
if ((NULL == operating_system) || (NULL == output_path_only_no_delimiter_no_filename)) return;
|
|
633
|
+
|
|
634
|
+
std::string sOutputPath(output_path_only_no_delimiter_no_filename);
|
|
635
|
+
|
|
636
|
+
#ifdef WIN32
|
|
637
|
+
sOutputPath.append("\\safetest.log");
|
|
638
|
+
#else
|
|
639
|
+
sOutputPath.append("/safetest.log");
|
|
640
|
+
#endif
|
|
641
|
+
|
|
642
|
+
va_list ap;
|
|
643
|
+
|
|
644
|
+
time_t timer;
|
|
645
|
+
char buffer[32];
|
|
646
|
+
struct tm* tm_info;
|
|
647
|
+
|
|
648
|
+
FILE * fle = safe_fopen(sOutputPath.c_str(), "w");
|
|
649
|
+
|
|
650
|
+
if (NULL == fle) return;
|
|
651
|
+
|
|
652
|
+
#define SAFE_TEST_BUF_LEN 64
|
|
653
|
+
#define SAFE_TEST_ASCII_LEN 26
|
|
654
|
+
#define SAFE_TEST_DELIMITER_LEN 128
|
|
655
|
+
#define SAFE_TEST_BIGBUF_LEN 64000
|
|
656
|
+
|
|
657
|
+
char dst[SAFE_TEST_BUF_LEN];
|
|
658
|
+
char src[SAFE_TEST_BUF_LEN];
|
|
659
|
+
char str[SAFE_TEST_BUF_LEN];
|
|
660
|
+
|
|
661
|
+
char delimiter[SAFE_TEST_DELIMITER_LEN + 2];
|
|
662
|
+
|
|
663
|
+
char *pstr = (char *)safe_malloc(SAFE_TEST_BIGBUF_LEN);
|
|
664
|
+
|
|
665
|
+
const void *cvret = NULL;
|
|
666
|
+
void *vret = NULL;
|
|
667
|
+
char *cret = NULL;
|
|
668
|
+
int iret = -1;
|
|
669
|
+
|
|
670
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { dst[i] = 0x0; src[i] = 0x0; str[i] = 0x0; }
|
|
671
|
+
for (int i = 0; i<SAFE_TEST_BIGBUF_LEN; i++) { pstr[i] = 'A' + (i % 26); }
|
|
672
|
+
|
|
673
|
+
for (int i = 0; i<SAFE_TEST_DELIMITER_LEN; i++) { delimiter[i] = '='; }
|
|
674
|
+
|
|
675
|
+
delimiter[SAFE_TEST_DELIMITER_LEN] = '\n';
|
|
676
|
+
delimiter[SAFE_TEST_DELIMITER_LEN + 1] = 0x0;
|
|
677
|
+
|
|
678
|
+
fprintf(fle, "Operating system: %s\n\n", operating_system);
|
|
679
|
+
|
|
680
|
+
time(&timer);
|
|
681
|
+
tm_info = localtime(&timer);
|
|
682
|
+
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
|
|
683
|
+
|
|
684
|
+
fprintf(fle, "Begin tests at %s\n\n", buffer);
|
|
685
|
+
|
|
686
|
+
//===========================================================================================
|
|
687
|
+
fputs(delimiter, fle);
|
|
688
|
+
|
|
689
|
+
fputs("Function: void * safe_memcpy(void *dst, const void *src, size_t count)\n\n", fle);
|
|
690
|
+
|
|
691
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { dst[i] = 0x0; src[i] = 0x0; }
|
|
692
|
+
for (int i=0; i<SAFE_TEST_ASCII_LEN; i++) { dst[i] = '*'; src[i] = 'A' + i; }
|
|
693
|
+
|
|
694
|
+
fprintf(fle, "dst = %p [\"%s\"]\n", dst, dst);
|
|
695
|
+
fprintf(fle, "src = %p [\"%s\"]\n", src, src);
|
|
696
|
+
|
|
697
|
+
fputs("\n", fle);
|
|
698
|
+
|
|
699
|
+
vret = safe_memcpy(dst, NULL, 0); fprintf(fle, "%p = safe_memcpy(dst, NULL, 0)\n", vret);
|
|
700
|
+
vret = safe_memcpy(NULL, src, 0); fprintf(fle, "%p = safe_memcpy(NULL, src, 0)\n", vret);
|
|
701
|
+
vret = safe_memcpy(NULL, NULL, 0); fprintf(fle, "%p = safe_memcpy(NULL, NULL, 0)\n", vret);
|
|
702
|
+
vret = safe_memcpy(dst, NULL, 10); fprintf(fle, "%p = safe_memcpy(dst, NULL, 10)\n", vret);
|
|
703
|
+
vret = safe_memcpy(NULL, src, 10); fprintf(fle, "%p = safe_memcpy(NULL, src, 10)\n", vret);
|
|
704
|
+
vret = safe_memcpy(NULL, NULL, 10); fprintf(fle, "%p = safe_memcpy(NULL, NULL, 10)\n", vret);
|
|
705
|
+
vret = safe_memcpy(dst, src, 0); fprintf(fle, "%p = safe_memcpy(dst, src, 0) [\"%s\"]\n", vret, dst);
|
|
706
|
+
vret = safe_memcpy(dst, src, 10); fprintf(fle, "%p = safe_memcpy(dst, src, 10) [\"%s\"]\n", vret, dst);
|
|
707
|
+
vret = safe_memcpy(src+1, src, 8); fprintf(fle, "%p = safe_memcpy(src+1, src, 8) [\"%s\"]\n", vret, src);
|
|
708
|
+
vret = safe_memcpy(src, src+1, 5); fprintf(fle, "%p = safe_memcpy(src, src+1, 5) [\"%s\"]\n", vret, src);
|
|
709
|
+
|
|
710
|
+
fputs("\n", fle);
|
|
711
|
+
|
|
712
|
+
//===========================================================================================
|
|
713
|
+
fputs(delimiter, fle);
|
|
714
|
+
|
|
715
|
+
fputs("Function: const void * safe_memchr(const void * ptr, int ch, size_t count)\n\n", fle);
|
|
716
|
+
|
|
717
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { str[i] = 0x0; }
|
|
718
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { str[i] = 'A' + i; }
|
|
719
|
+
|
|
720
|
+
fprintf(fle, "str = %p [\"%s\"]\n", str, str);
|
|
721
|
+
|
|
722
|
+
fputs("\n", fle);
|
|
723
|
+
|
|
724
|
+
cvret = safe_memchr(NULL, 0, 0); fprintf(fle, "%p = safe_memchr(NULL, 0, 0)\n", cvret);
|
|
725
|
+
cvret = safe_memchr(NULL, -1, 0); fprintf(fle, "%p = safe_memchr(NULL, -1, 0)\n", cvret);
|
|
726
|
+
cvret = safe_memchr(str, 0, 0); fprintf(fle, "%p = safe_memchr(str, 0, 0) [\"%s\"]\n", cvret, cvret != NULL ? cvret : "");
|
|
727
|
+
cvret = safe_memchr(str, 0, 10); fprintf(fle, "%p = safe_memchr(str, 0, 10) [\"%s\"]\n", cvret, cvret != NULL ? cvret : "");
|
|
728
|
+
cvret = safe_memchr(str, 0, SAFE_TEST_BUF_LEN); fprintf(fle, "%p = safe_memchr(str, 0, %d) [\"%s\"]\n", cvret, SAFE_TEST_BUF_LEN, cvret != NULL ? cvret : "");
|
|
729
|
+
cvret = safe_memchr(str, 'D', 0); fprintf(fle, "%p = safe_memchr(str, 'D', 0) [\"%s\"]\n", cvret, cvret != NULL ? cvret : "");
|
|
730
|
+
cvret = safe_memchr(str, 'D', 10); fprintf(fle, "%p = safe_memchr(str, 'D', 10) [\"%s\"]\n", cvret, cvret != NULL ? cvret : "");
|
|
731
|
+
cvret = safe_memchr(str, 'D', SAFE_TEST_BUF_LEN); fprintf(fle, "%p = safe_memchr(str, 'D', %d) [\"%s\"]\n", cvret, SAFE_TEST_BUF_LEN, cvret != NULL ? cvret : "");
|
|
732
|
+
cvret = safe_memchr(str, '#', 10); fprintf(fle, "%p = safe_memchr(str, '#', 10) [\"%s\"]\n", cvret, cvret != NULL ? cvret : "");
|
|
733
|
+
cvret = safe_memchr(str, '#', SAFE_TEST_BUF_LEN); fprintf(fle, "%p = safe_memchr(str, '#', %d) [\"%s\"]\n", cvret, SAFE_TEST_BUF_LEN, cvret != NULL ? cvret : "");
|
|
734
|
+
|
|
735
|
+
fputs("\n", fle);
|
|
736
|
+
|
|
737
|
+
//===========================================================================================
|
|
738
|
+
fputs(delimiter, fle);
|
|
739
|
+
|
|
740
|
+
fputs("Function: size_t safe_strlen(const char *str)\n\n", fle);
|
|
741
|
+
|
|
742
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { str[i] = 0x0; }
|
|
743
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { str[i] = 'A' + i; }
|
|
744
|
+
|
|
745
|
+
fprintf(fle, "str = %p [\"%s\"]\n", str, str);
|
|
746
|
+
fprintf(fle, "pstr = %p [unterminated string[%d] of A..Z]\n", pstr, SAFE_TEST_BIGBUF_LEN);
|
|
747
|
+
|
|
748
|
+
fputs("\n", fle);
|
|
749
|
+
|
|
750
|
+
iret = safe_strlen(NULL); fprintf(fle, "%d = safe_strlen(NULL)\n", iret);
|
|
751
|
+
iret = safe_strlen(str); fprintf(fle, "%d = safe_strlen(str)\n", iret);
|
|
752
|
+
|
|
753
|
+
iret = safe_strlen(pstr); fprintf(fle, "%d = safe_strlen(pstr)\n", iret);
|
|
754
|
+
|
|
755
|
+
fputs("\n", fle);
|
|
756
|
+
|
|
757
|
+
//===========================================================================================
|
|
758
|
+
fputs(delimiter, fle);
|
|
759
|
+
|
|
760
|
+
fputs("Function: size_t safe_strnlen(const char *str, size_t count)\n\n", fle);
|
|
761
|
+
|
|
762
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { str[i] = 'A' + i; }
|
|
763
|
+
|
|
764
|
+
fprintf(fle, "str = %p [\"%s\"]\n", str, str);
|
|
765
|
+
fprintf(fle, "pstr = %p [unterminated string[%d] of A..Z]\n", pstr, SAFE_TEST_BIGBUF_LEN);
|
|
766
|
+
|
|
767
|
+
fputs("\n", fle);
|
|
768
|
+
|
|
769
|
+
iret = safe_strnlen(NULL,0); fprintf(fle, "%d = safe_strnlen(NULL,0)\n", iret);
|
|
770
|
+
iret = safe_strnlen(str, 0); fprintf(fle, "%d = safe_strnlen(str,0)\n", iret);
|
|
771
|
+
iret = safe_strnlen(str, 10); fprintf(fle, "%d = safe_strnlen(str,10)\n", iret);
|
|
772
|
+
iret = safe_strnlen(str, SAFE_TEST_BUF_LEN + 1); fprintf(fle, "%d = safe_strnlen(str,%d)\n", iret, SAFE_TEST_BUF_LEN + 1);
|
|
773
|
+
|
|
774
|
+
iret = safe_strnlen(pstr, SAFE_DEFAULT_STRLEN); fprintf(fle, "%d = safe_strnlen(pstr,%d)\n", iret, SAFE_DEFAULT_STRLEN);
|
|
775
|
+
iret = safe_strnlen(pstr, SAFE_TEST_BIGBUF_LEN); fprintf(fle, "%d = safe_strnlen(pstr,%d)\n", iret, SAFE_TEST_BIGBUF_LEN);
|
|
776
|
+
iret = safe_strnlen(pstr, SAFE_TEST_BIGBUF_LEN * 2); fprintf(fle, "%d = safe_strnlen(pstr,%d)\n", iret, SAFE_TEST_BIGBUF_LEN * 2);
|
|
777
|
+
|
|
778
|
+
fputs("\n", fle);
|
|
779
|
+
|
|
780
|
+
//===========================================================================================
|
|
781
|
+
fputs(delimiter, fle);
|
|
782
|
+
|
|
783
|
+
fputs("Function: char * safe_strcat(char * dst, const char * src)\n\n", fle);
|
|
784
|
+
|
|
785
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { dst[i] = 0x0; src[i] = 0x0; }
|
|
786
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { dst[i] = '*'; src[i] = 'A' + i; }
|
|
787
|
+
|
|
788
|
+
fprintf(fle, "dst = %p [\"%s\"]\n", dst, dst);
|
|
789
|
+
fprintf(fle, "src = %p [\"%s\"]\n", src, src);
|
|
790
|
+
|
|
791
|
+
fputs("\n", fle);
|
|
792
|
+
|
|
793
|
+
cret = safe_strcat(dst, NULL); fprintf(fle, "%p = safe_strcat(dst, NULL)\n", cret);
|
|
794
|
+
cret = safe_strcat(NULL, src); fprintf(fle, "%p = safe_strcat(NULL, src)\n", cret);
|
|
795
|
+
cret = safe_strcat(NULL, NULL); fprintf(fle, "%p = safe_strcat(NULL, NULL)\n", cret);
|
|
796
|
+
cret = safe_strcat(dst, src); fprintf(fle, "%p = safe_strcat(dst, src) [\"%s\"]\n", cret, dst);
|
|
797
|
+
|
|
798
|
+
fputs("\n", fle);
|
|
799
|
+
|
|
800
|
+
//===========================================================================================
|
|
801
|
+
fputs(delimiter, fle);
|
|
802
|
+
|
|
803
|
+
fputs("Function: char * safe_strcpy(char * dst, const char * src)\n\n", fle);
|
|
804
|
+
|
|
805
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { dst[i] = 0x0; src[i] = 0x0; }
|
|
806
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { dst[i] = '*'; src[i] = 'A' + i; }
|
|
807
|
+
|
|
808
|
+
fprintf(fle, "dst = %p [\"%s\"]\n", dst, dst);
|
|
809
|
+
fprintf(fle, "src = %p [\"%s\"]\n", src, src);
|
|
810
|
+
|
|
811
|
+
fputs("\n", fle);
|
|
812
|
+
|
|
813
|
+
cret = safe_strcpy(dst, NULL); fprintf(fle, "%p = safe_strcpy(dst, NULL)\n", cret);
|
|
814
|
+
cret = safe_strcpy(NULL, src); fprintf(fle, "%p = safe_strcpy(NULL, src)\n", cret);
|
|
815
|
+
cret = safe_strcpy(NULL, NULL); fprintf(fle, "%p = safe_strcpy(NULL, NULL)\n", cret);
|
|
816
|
+
cret = safe_strcpy(dst, src); fprintf(fle, "%p = safe_strcpy(dst, src) [\"%s\"]\n", cret, dst);
|
|
817
|
+
|
|
818
|
+
fputs("\n", fle);
|
|
819
|
+
|
|
820
|
+
//===========================================================================================
|
|
821
|
+
fputs(delimiter, fle);
|
|
822
|
+
|
|
823
|
+
fputs("Function: char * safe_strncpy(char * dst, const char * src, size_t count)\n\n", fle);
|
|
824
|
+
|
|
825
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { dst[i] = 0x0; src[i] = 0x0; }
|
|
826
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { dst[i] = '*'; src[i] = 'A' + i; }
|
|
827
|
+
|
|
828
|
+
fprintf(fle, "dst = %p [\"%s\"]\n", dst, dst);
|
|
829
|
+
fprintf(fle, "src = %p [\"%s\"]\n", src, src);
|
|
830
|
+
|
|
831
|
+
fputs("\n", fle);
|
|
832
|
+
|
|
833
|
+
cret = safe_strncpy(dst, NULL, 0); fprintf(fle, "%p = safe_strncpy(dst, NULL, 0)\n", cret);
|
|
834
|
+
cret = safe_strncpy(NULL, src, 0); fprintf(fle, "%p = safe_strncpy(NULL, src, 0)\n", cret);
|
|
835
|
+
cret = safe_strncpy(NULL, NULL, 0); fprintf(fle, "%p = safe_strncpy(NULL, NULL, 0)\n", cret);
|
|
836
|
+
cret = safe_strncpy(dst, NULL, 10); fprintf(fle, "%p = safe_strncpy(dst, NULL, 10)\n", cret);
|
|
837
|
+
cret = safe_strncpy(NULL, src, 10); fprintf(fle, "%p = safe_strncpy(NULL, src, 10)\n", cret);
|
|
838
|
+
cret = safe_strncpy(NULL, NULL, 10); fprintf(fle, "%p = safe_strncpy(NULL, NULL, 10)\n", cret);
|
|
839
|
+
cret = safe_strncpy(dst, src, 0); fprintf(fle, "%p = safe_strncpy(dst, src, 0) [\"%s\"]\n", cret, dst);
|
|
840
|
+
cret = safe_strncpy(dst, src, 10); fprintf(fle, "%p = safe_strncpy(dst, src, 10) [\"%s\"]\n", cret, dst);
|
|
841
|
+
cret = safe_strncpy(src+1, src, 8); fprintf(fle, "%p = safe_strncpy(src+1, src, 8) [\"%s\"]\n", cret, src);
|
|
842
|
+
cret = safe_strncpy(src, src+1, 5); fprintf(fle, "%p = safe_strncpy(src, src+1, 5) [\"%s\"]\n", cret, src);
|
|
843
|
+
|
|
844
|
+
fputs("\n", fle);
|
|
845
|
+
|
|
846
|
+
//===========================================================================================
|
|
847
|
+
fputs(delimiter, fle);
|
|
848
|
+
|
|
849
|
+
fputs("Function: int safe_snprintf(char *str, size_t count, const char * fmt, ...)\n\n", fle);
|
|
850
|
+
|
|
851
|
+
for (int i = 0; i<SAFE_TEST_BUF_LEN; i++) { dst[i] = 0x0; src[i] = 0x0; }
|
|
852
|
+
for (int i = 0; i<SAFE_TEST_ASCII_LEN; i++) { dst[i] = '*'; src[i] = 'A' + i; }
|
|
853
|
+
|
|
854
|
+
fprintf(fle, "dst = %p [\"%s\"]\n", dst, dst);
|
|
855
|
+
fprintf(fle, "src = %p [\"%s\"]\n", src, src);
|
|
856
|
+
|
|
857
|
+
fputs("\n", fle);
|
|
858
|
+
|
|
859
|
+
iret = safe_snprintf(NULL, 0, NULL); fprintf(fle, "%d = safe_snprintf(NULL, 0, NULL) [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
860
|
+
iret = safe_snprintf(dst, 0, NULL); fprintf(fle, "%d = safe_snprintf(dst, 0, NULL) [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
861
|
+
iret = safe_snprintf(NULL, 0, ""); fprintf(fle, "%d = safe_snprintf(NULL, 0, "") [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
862
|
+
iret = safe_snprintf(dst, 0, ""); fprintf(fle, "%d = safe_snprintf(dst, 0, "") [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
863
|
+
iret = safe_snprintf(dst, 10, ""); fprintf(fle, "%d = safe_snprintf(dst, 10, "") [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
864
|
+
iret = safe_snprintf(dst, 0, "%s", src); fprintf(fle, "%d = safe_snprintf(dst, 0, \"%%s\", src) [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
865
|
+
iret = safe_snprintf(dst, 10, "%s", src); fprintf(fle, "%d = safe_snprintf(dst, 10, \"%%s\", src) [\"%s\"]\n", iret, iret != -1 ? dst : "");
|
|
866
|
+
iret = safe_snprintf(dst, SAFE_TEST_BUF_LEN - 1, "%s", src); fprintf(fle, "%d = safe_snprintf(dst, %d, \"%%s\", src) [\"%s\"]\n", iret, SAFE_TEST_BUF_LEN - 1, iret != -1 ? dst : "");
|
|
867
|
+
|
|
868
|
+
fputs("\n", fle);
|
|
869
|
+
|
|
870
|
+
//===========================================================================================
|
|
871
|
+
fputs(delimiter, fle);
|
|
872
|
+
|
|
873
|
+
fputs("Function: int safe_vsnprintf(char * str, size_t count, const char * fmt, va_list arg)\n\n", fle);
|
|
874
|
+
|
|
875
|
+
va_start(ap, output_path_only_no_delimiter_no_filename);
|
|
876
|
+
|
|
877
|
+
iret = safe_vsnprintf(NULL, 0, NULL, ap); fprintf(fle, "%d = safe_vsnprintf(NULL, 0, NULL, empty va_list)\n", iret);
|
|
878
|
+
iret = safe_vsnprintf(dst, 0, NULL, ap); fprintf(fle, "%d = safe_vsnprintf(dst, 0, NULL, empty va_list)\n", iret);
|
|
879
|
+
iret = safe_vsnprintf(NULL, 0, "", ap); fprintf(fle, "%d = safe_vsnprintf(NULL, 0, \"\", empty va_list)\n", iret);
|
|
880
|
+
iret = safe_vsnprintf(dst, 0, "", ap); fprintf(fle, "%d = safe_vsnprintf(dst, 0, \"\", empty va_list)\n", iret);
|
|
881
|
+
iret = safe_vsnprintf(dst, 10, "", ap); fprintf(fle, "%d = safe_vsnprintf(dst, 10, \"\", empty va_list)\n", iret);
|
|
882
|
+
|
|
883
|
+
va_end(ap);
|
|
884
|
+
|
|
885
|
+
fputs("\n", fle);
|
|
886
|
+
|
|
887
|
+
fputs("Tests with a valid va_list are covered with safe_snprintf()\n", fle);
|
|
888
|
+
|
|
889
|
+
fputs("\n", fle);
|
|
890
|
+
|
|
891
|
+
//===========================================================================================
|
|
892
|
+
fputs(delimiter, fle);
|
|
893
|
+
|
|
894
|
+
time(&timer);
|
|
895
|
+
tm_info = localtime(&timer);
|
|
896
|
+
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
|
|
897
|
+
|
|
898
|
+
fprintf(fle, "End tests at %s", buffer);
|
|
899
|
+
|
|
900
|
+
free(pstr);
|
|
901
|
+
|
|
902
|
+
fflush(fle);
|
|
903
|
+
fclose(fle);
|
|
904
|
+
}
|
|
905
|
+
#endif
|