13 #ifndef STRING_HELPER_H
14 #define STRING_HELPER_H
21 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
22 #ifndef _CRT_SECURE_NO_DEPRECATE
23 #define _CRT_SECURE_NO_DEPRECATE
26 #define STRCASECMP _stricmp
29 #define STRNCASECMP _strnicmp
32 #define STRCPY(sFilePath, nLength, sPath) strcpy_s(sFilePath, nLength, sPath)
36 #define FOPEN(fHandle,filename,mode) fopen_s(&fHandle, filename, mode)
39 #define FOPEN_FAIL(result) (result != 0)
42 #define SSCANF sscanf_s
45 #define SPRINTF sprintf_s
47 #else // Linux Includes
52 #define STRCASECMP strcasecmp
55 #define STRNCASECMP strncasecmp
58 #define STRCPY(sFilePath, nLength, sPath) strcpy(sFilePath, sPath)
62 #define FOPEN(fHandle,filename,mode) (fHandle = fopen(filename, mode))
65 #define FOPEN_FAIL(result) (result == NULL)
71 #define SPRINTF sprintf
84 while (
string[string_start] == delimiter)
89 if (string_start >= (
int)strlen(
string)-1)
99 int string_length = (int)strlen(filename);
101 while (filename[string_length--] !=
'.')
103 if (string_length == 0)
107 if (string_length > 0) string_length += 2;
109 if (string_length == 0)
112 *extension = &filename[string_length];
114 return string_length;
124 for (
int i=1; i < argc; i++)
127 const char *string_argv = &argv[i][string_start];
129 const char *equal_pos = strchr(string_argv,
'=');
130 int argv_length = (int)(equal_pos == 0 ? strlen(string_argv) : equal_pos - string_argv);
132 int length = (int)strlen(string_ref);
134 if (length == argv_length && !
STRNCASECMP(string_argv, string_ref, length))
153 for (
int i=1; i < argc; i++)
156 const char *string_argv = &argv[i][string_start];
157 int length = (int)strlen(string_ref);
161 if (length+1 <= (
int)strlen(string_argv))
163 int auto_inc = (string_argv[length] ==
'=') ? 1 : 0;
164 *value = (T)atoi(&string_argv[length + auto_inc]);
183 for (
int i=1; i < argc; i++)
186 const char *string_argv = &argv[i][string_start];
187 int length = (int)strlen(string_ref);
191 if (length+1 <= (
int)strlen(string_argv))
193 int auto_inc = (string_argv[length] ==
'=') ? 1 : 0;
194 value = atoi(&string_argv[length + auto_inc]);
224 for (
int i=1; i < argc; i++)
227 const char *string_argv = &argv[i][string_start];
228 int length = (int)strlen(string_ref);
232 if (length+1 <= (
int)strlen(string_argv))
234 int auto_inc = (string_argv[length] ==
'=') ? 1 : 0;
235 value = (float)atof(&string_argv[length + auto_inc]);
259 const char *string_ref,
char **string_retval)
265 for (
int i=1; i < argc; i++)
268 char *string_argv = (
char *)&argv[i][string_start];
269 int length = (int)strlen(string_ref);
273 *string_retval = &string_argv[length+1];
282 *string_retval = NULL;
302 const char *searchPath[] =
309 "./src/<executable_name>/data/",
318 "./7_CUDALibraries/",
329 "../0_Simple/<executable_name>/data/",
330 "../1_Utilities/<executable_name>/data/",
331 "../2_Graphics/<executable_name>/data/",
332 "../3_Imaging/<executable_name>/data/",
333 "../4_Finance/<executable_name>/data/",
334 "../5_Simulations/<executable_name>/data/",
335 "../6_Advanced/<executable_name>/data/",
336 "../7_CUDALibraries/<executable_name>/data/",
337 "../8_Android/<executable_name>/data/",
338 "../samples/<executable_name>/data/",
341 "../../common/data/",
345 "../../sandbox/<executable_name>/data/",
346 "../../0_Simple/<executable_name>/data/",
347 "../../1_Utilities/<executable_name>/data/",
348 "../../2_Graphics/<executable_name>/data/",
349 "../../3_Imaging/<executable_name>/data/",
350 "../../4_Finance/<executable_name>/data/",
351 "../../5_Simulations/<executable_name>/data/",
352 "../../6_Advanced/<executable_name>/data/",
353 "../../7_CUDALibraries/<executable_name>/data/",
354 "../../8_Android/<executable_name>/data/",
355 "../../samples/<executable_name>/data/",
357 "../../../src/<executable_name>/",
358 "../../../src/<executable_name>/data/",
359 "../../../src/<executable_name>/src/",
360 "../../../src/<executable_name>/inc/",
361 "../../../sandbox/<executable_name>/",
362 "../../../sandbox/<executable_name>/data/",
363 "../../../sandbox/<executable_name>/src/",
364 "../../../sandbox/<executable_name>/inc/",
365 "../../../0_Simple/<executable_name>/data/",
366 "../../../1_Utilities/<executable_name>/data/",
367 "../../../2_Graphics/<executable_name>/data/",
368 "../../../3_Imaging/<executable_name>/data/",
369 "../../../4_Finance/<executable_name>/data/",
370 "../../../5_Simulations/<executable_name>/data/",
371 "../../../6_Advanced/<executable_name>/data/",
372 "../../../7_CUDALibraries/<executable_name>/data/",
373 "../../../8_Android/<executable_name>/data/",
374 "../../../0_Simple/<executable_name>/",
375 "../../../1_Utilities/<executable_name>/",
376 "../../../2_Graphics/<executable_name>/",
377 "../../../3_Imaging/<executable_name>/",
378 "../../../4_Finance/<executable_name>/",
379 "../../../5_Simulations/<executable_name>/",
380 "../../../6_Advanced/<executable_name>/",
381 "../../../7_CUDALibraries/<executable_name>/",
382 "../../../8_Android/<executable_name>/",
383 "../../../samples/<executable_name>/data/",
385 "../../../common/data/",
388 "../../../../src/<executable_name>/",
389 "../../../../src/<executable_name>/data/",
390 "../../../../src/<executable_name>/src/",
391 "../../../../src/<executable_name>/inc/",
392 "../../../../sandbox/<executable_name>/",
393 "../../../../sandbox/<executable_name>/data/",
394 "../../../../sandbox/<executable_name>/src/",
395 "../../../../sandbox/<executable_name>/inc/",
396 "../../../../0_Simple/<executable_name>/data/",
397 "../../../../1_Utilities/<executable_name>/data/",
398 "../../../../2_Graphics/<executable_name>/data/",
399 "../../../../3_Imaging/<executable_name>/data/",
400 "../../../../4_Finance/<executable_name>/data/",
401 "../../../../5_Simulations/<executable_name>/data/",
402 "../../../../6_Advanced/<executable_name>/data/",
403 "../../../../7_CUDALibraries/<executable_name>/data/",
404 "../../../../8_Android/<executable_name>/data/",
405 "../../../../0_Simple/<executable_name>/",
406 "../../../../1_Utilities/<executable_name>/",
407 "../../../../2_Graphics/<executable_name>/",
408 "../../../../3_Imaging/<executable_name>/",
409 "../../../../4_Finance/<executable_name>/",
410 "../../../../5_Simulations/<executable_name>/",
411 "../../../../6_Advanced/<executable_name>/",
412 "../../../../7_CUDALibraries/<executable_name>/",
413 "../../../../8_Android/<executable_name>/",
414 "../../../../samples/<executable_name>/data/",
415 "../../../../common/",
416 "../../../../common/data/",
419 "../../../../../src/<executable_name>/",
420 "../../../../../src/<executable_name>/data/",
421 "../../../../../src/<executable_name>/src/",
422 "../../../../../src/<executable_name>/inc/",
423 "../../../../../sandbox/<executable_name>/",
424 "../../../../../sandbox/<executable_name>/data/",
425 "../../../../../sandbox/<executable_name>/src/",
426 "../../../../../sandbox/<executable_name>/inc/",
427 "../../../../../0_Simple/<executable_name>/data/",
428 "../../../../../1_Utilities/<executable_name>/data/",
429 "../../../../../2_Graphics/<executable_name>/data/",
430 "../../../../../3_Imaging/<executable_name>/data/",
431 "../../../../../4_Finance/<executable_name>/data/",
432 "../../../../../5_Simulations/<executable_name>/data/",
433 "../../../../../6_Advanced/<executable_name>/data/",
434 "../../../../../7_CUDALibraries/<executable_name>/data/",
435 "../../../../../8_Android/<executable_name>/data/",
436 "../../../../../samples/<executable_name>/data/",
437 "../../../../../common/",
438 "../../../../../common/data/",
442 std::string executable_name;
444 if (executable_path != 0)
446 executable_name = std::string(executable_path);
448 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
450 size_t delimiter_pos = executable_name.find_last_of(
'\\');
451 executable_name.erase(0, delimiter_pos + 1);
453 if (executable_name.rfind(
".exe") != std::string::npos)
456 executable_name.resize(executable_name.size() - 4);
461 size_t delimiter_pos = executable_name.find_last_of(
'/');
462 executable_name.erase(0,delimiter_pos+1);
467 for (
unsigned int i = 0; i <
sizeof(searchPath)/
sizeof(
char *); ++i)
469 std::string path(searchPath[i]);
470 size_t executable_name_pos = path.find(
"<executable_name>");
474 if (executable_name_pos != std::string::npos)
476 if (executable_path != 0)
478 path.replace(executable_name_pos, strlen(
"<executable_name>"), executable_name);
488 printf(
"sdkFindFilePath <%s> in %s\n", filename, path.c_str());
492 path.append(filename);
494 FOPEN(fp, path.c_str(),
"rb");
501 char *file_path = (
char *) malloc(path.length() + 1);
502 STRCPY(file_path, path.length() + 1, path.c_str());
int stringRemoveDelimiter(char delimiter, const char *string)
bool checkCmdLineFlag(const int argc, const char **argv, const char *string_ref)
#define FOPEN(fHandle, filename, mode)
bool getCmdLineArgumentString(const int argc, const char **argv, const char *string_ref, char **string_retval)
int getFileExtension(char *filename, char **extension)
char * sdkFindFilePath(const char *filename, const char *executable_path)
bool getCmdLineArgumentValue(const int argc, const char **argv, const char *string_ref, T *value)
#define STRCPY(sFilePath, nLength, sPath)
int getCmdLineArgumentInt(const int argc, const char **argv, const char *string_ref)
float getCmdLineArgumentFloat(const int argc, const char **argv, const char *string_ref)