Performance improvements by replacing sprintf with strcpy/strcat. Additional avoid creating temporary String objects. (#7541)
Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com>
This commit is contained in:
parent
a0ead19471
commit
f487d89c9d
1 changed files with 51 additions and 17 deletions
|
|
@ -36,7 +36,8 @@ FileImplPtr VFSImpl::open(const char* fpath, const char* mode, const bool create
|
||||||
return FileImplPtr();
|
return FileImplPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(temp,"%s%s", _mountpoint, fpath);
|
strcpy(temp, _mountpoint);
|
||||||
|
strcat(temp, fpath);
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
//file found
|
//file found
|
||||||
|
|
@ -136,19 +137,25 @@ bool VFSImpl::rename(const char* pathFrom, const char* pathTo)
|
||||||
log_e("%s does not exists", pathFrom);
|
log_e("%s does not exists", pathFrom);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
char * temp1 = (char *)malloc(strlen(pathFrom)+strlen(_mountpoint)+1);
|
size_t mountpointLen = strlen(_mountpoint);
|
||||||
|
char * temp1 = (char *)malloc(strlen(pathFrom)+mountpointLen+1);
|
||||||
if(!temp1) {
|
if(!temp1) {
|
||||||
log_e("malloc failed");
|
log_e("malloc failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
char * temp2 = (char *)malloc(strlen(pathTo)+strlen(_mountpoint)+1);
|
char * temp2 = (char *)malloc(strlen(pathTo)+mountpointLen+1);
|
||||||
if(!temp2) {
|
if(!temp2) {
|
||||||
free(temp1);
|
free(temp1);
|
||||||
log_e("malloc failed");
|
log_e("malloc failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sprintf(temp1,"%s%s", _mountpoint, pathFrom);
|
|
||||||
sprintf(temp2,"%s%s", _mountpoint, pathTo);
|
strcpy(temp1, _mountpoint);
|
||||||
|
strcat(temp1, pathFrom);
|
||||||
|
|
||||||
|
strcpy(temp2, _mountpoint);
|
||||||
|
strcat(temp2, pathTo);
|
||||||
|
|
||||||
auto rc = ::rename(temp1, temp2);
|
auto rc = ::rename(temp1, temp2);
|
||||||
free(temp1);
|
free(temp1);
|
||||||
free(temp2);
|
free(temp2);
|
||||||
|
|
@ -182,7 +189,10 @@ bool VFSImpl::remove(const char* fpath)
|
||||||
log_e("malloc failed");
|
log_e("malloc failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sprintf(temp,"%s%s", _mountpoint, fpath);
|
|
||||||
|
strcpy(temp, _mountpoint);
|
||||||
|
strcat(temp, fpath);
|
||||||
|
|
||||||
auto rc = unlink(temp);
|
auto rc = unlink(temp);
|
||||||
free(temp);
|
free(temp);
|
||||||
return rc == 0;
|
return rc == 0;
|
||||||
|
|
@ -211,7 +221,10 @@ bool VFSImpl::mkdir(const char *fpath)
|
||||||
log_e("malloc failed");
|
log_e("malloc failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sprintf(temp,"%s%s", _mountpoint, fpath);
|
|
||||||
|
strcpy(temp, _mountpoint);
|
||||||
|
strcat(temp, fpath);
|
||||||
|
|
||||||
auto rc = ::mkdir(temp, ACCESSPERMS);
|
auto rc = ::mkdir(temp, ACCESSPERMS);
|
||||||
free(temp);
|
free(temp);
|
||||||
return rc == 0;
|
return rc == 0;
|
||||||
|
|
@ -244,7 +257,10 @@ bool VFSImpl::rmdir(const char *fpath)
|
||||||
log_e("malloc failed");
|
log_e("malloc failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sprintf(temp,"%s%s", _mountpoint, fpath);
|
|
||||||
|
strcpy(temp, _mountpoint);
|
||||||
|
strcat(temp, fpath);
|
||||||
|
|
||||||
auto rc = ::rmdir(temp);
|
auto rc = ::rmdir(temp);
|
||||||
free(temp);
|
free(temp);
|
||||||
return rc == 0;
|
return rc == 0;
|
||||||
|
|
@ -265,7 +281,9 @@ VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* fpath, const char* mode)
|
||||||
if(!temp) {
|
if(!temp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sprintf(temp,"%s%s", _fs->_mountpoint, fpath);
|
|
||||||
|
strcpy(temp, _fs->_mountpoint);
|
||||||
|
strcat(temp, fpath);
|
||||||
|
|
||||||
_path = strdup(fpath);
|
_path = strdup(fpath);
|
||||||
if(!_path) {
|
if(!_path) {
|
||||||
|
|
@ -362,7 +380,10 @@ void VFSFileImpl::_getStat() const
|
||||||
if(!temp) {
|
if(!temp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sprintf(temp,"%s%s", _fs->_mountpoint, _path);
|
|
||||||
|
strcpy(temp, _fs->_mountpoint);
|
||||||
|
strcat(temp, _path);
|
||||||
|
|
||||||
if(!stat(temp, &_stat)) {
|
if(!stat(temp, &_stat)) {
|
||||||
_written = false;
|
_written = false;
|
||||||
}
|
}
|
||||||
|
|
@ -466,14 +487,27 @@ FileImplPtr VFSFileImpl::openNextFile(const char* mode)
|
||||||
if(file->d_type != DT_REG && file->d_type != DT_DIR) {
|
if(file->d_type != DT_REG && file->d_type != DT_DIR) {
|
||||||
return openNextFile(mode);
|
return openNextFile(mode);
|
||||||
}
|
}
|
||||||
String fname = String(file->d_name);
|
|
||||||
String name = String(_path);
|
|
||||||
if(!fname.startsWith("/") && !name.endsWith("/")) {
|
|
||||||
name += "/";
|
|
||||||
}
|
|
||||||
name += fname;
|
|
||||||
|
|
||||||
return std::make_shared<VFSFileImpl>(_fs, name.c_str(), mode);
|
size_t pathLen = strlen(_path);
|
||||||
|
size_t fileNameLen = strlen(file->d_name);
|
||||||
|
char * name = (char *)malloc(pathLen+fileNameLen+2);
|
||||||
|
|
||||||
|
if(name == NULL) {
|
||||||
|
return FileImplPtr();
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(name, _path);
|
||||||
|
|
||||||
|
if ((file->d_name[0] != '/') && (_path[pathLen - 1] != '/'))
|
||||||
|
{
|
||||||
|
strcat(name, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(name, file->d_name);
|
||||||
|
|
||||||
|
FileImplPtr fileImplPtr = std::make_shared<VFSFileImpl>(_fs, name, mode);
|
||||||
|
free(name);
|
||||||
|
return fileImplPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean VFSFileImpl::seekDir(long position){
|
boolean VFSFileImpl::seekDir(long position){
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue