2017-08-01 12:30:58 +00:00
|
|
|
#ifndef B3_FILE_UTILS_H
|
|
|
|
#define B3_FILE_UTILS_H
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "b3Scalar.h"
|
|
|
|
#include <stddef.h>//ptrdiff_h
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
struct b3FileUtils
|
|
|
|
{
|
|
|
|
b3FileUtils()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
virtual ~b3FileUtils()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool findFile(const char* orgFileName, char* relativeFileName, int maxRelativeFileNameMaxLen)
|
|
|
|
{
|
|
|
|
FILE* f=0;
|
|
|
|
f = fopen(orgFileName,"rb");
|
|
|
|
if (f)
|
|
|
|
{
|
|
|
|
//printf("original file found: [%s]\n", orgFileName);
|
|
|
|
sprintf(relativeFileName,"%s", orgFileName);
|
|
|
|
fclose(f);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
//printf("Trying various directories, relative to current working directory\n");
|
|
|
|
const char* prefix[]={"./","./data/","../data/","../../data/","../../../data/","../../../../data/"};
|
|
|
|
int numPrefixes = sizeof(prefix)/sizeof(const char*);
|
|
|
|
|
|
|
|
f=0;
|
|
|
|
bool fileFound = false;
|
|
|
|
|
|
|
|
for (int i=0;!f && i<numPrefixes;i++)
|
|
|
|
{
|
2018-09-07 14:11:04 +00:00
|
|
|
#ifdef _MSC_VER
|
2017-08-01 12:30:58 +00:00
|
|
|
sprintf_s(relativeFileName,maxRelativeFileNameMaxLen,"%s%s",prefix[i],orgFileName);
|
|
|
|
#else
|
|
|
|
sprintf(relativeFileName,"%s%s",prefix[i],orgFileName);
|
|
|
|
#endif
|
|
|
|
f = fopen(relativeFileName,"rb");
|
|
|
|
if (f)
|
|
|
|
{
|
|
|
|
fileFound = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (f)
|
|
|
|
{
|
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
return fileFound;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char* strip2(const char* name, const char* pattern)
|
|
|
|
{
|
|
|
|
size_t const patlen = strlen(pattern);
|
|
|
|
size_t patcnt = 0;
|
|
|
|
const char * oriptr;
|
|
|
|
const char * patloc;
|
|
|
|
// find how many times the pattern occurs in the original string
|
|
|
|
for (oriptr = name; (patloc = strstr(oriptr, pattern)); oriptr = patloc + patlen)
|
|
|
|
{
|
|
|
|
patcnt++;
|
|
|
|
}
|
|
|
|
return oriptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int extractPath(const char* fileName, char* path, int maxPathLength)
|
|
|
|
{
|
|
|
|
const char* stripped = strip2(fileName, "/");
|
|
|
|
stripped = strip2(stripped, "\\");
|
|
|
|
|
|
|
|
ptrdiff_t len = stripped-fileName;
|
|
|
|
b3Assert((len+1)<maxPathLength);
|
|
|
|
|
|
|
|
if (len && ((len+1)<maxPathLength))
|
|
|
|
{
|
|
|
|
|
|
|
|
for (int i=0;i<len;i++)
|
|
|
|
{
|
|
|
|
path[i] = fileName[i];
|
|
|
|
}
|
|
|
|
path[len]=0;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
len = 0;
|
|
|
|
b3Assert(maxPathLength>0);
|
|
|
|
if (maxPathLength>0)
|
|
|
|
{
|
|
|
|
path[len] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char toLowerChar(const char t)
|
|
|
|
{
|
|
|
|
if (t>=(char)'A' && t<=(char)'Z')
|
|
|
|
return t + ((char)'a' - (char)'A');
|
|
|
|
else
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void toLower(char* str)
|
|
|
|
{
|
|
|
|
int len=strlen(str);
|
|
|
|
for (int i=0;i<len;i++)
|
|
|
|
{
|
|
|
|
str[i] = toLowerChar(str[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*static const char* strip2(const char* name, const char* pattern)
|
|
|
|
{
|
|
|
|
size_t const patlen = strlen(pattern);
|
|
|
|
size_t patcnt = 0;
|
|
|
|
const char * oriptr;
|
|
|
|
const char * patloc;
|
|
|
|
// find how many times the pattern occurs in the original string
|
|
|
|
for (oriptr = name; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen)
|
|
|
|
{
|
|
|
|
patcnt++;
|
|
|
|
}
|
|
|
|
return oriptr;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
};
|
|
|
|
#endif //B3_FILE_UTILS_H
|