tree-sitter/test/helpers/file_helpers.cc

100 lines
2.2 KiB
C++

#include "helpers/file_helpers.h"
#include <sys/stat.h>
#include <errno.h>
#include <fstream>
using std::string;
using std::ifstream;
using std::istreambuf_iterator;
using std::ofstream;
using std::vector;
bool file_exists(const string &path) {
struct stat file_stat;
return stat(path.c_str(), &file_stat) == 0;
}
int get_modified_time(const string &path) {
struct stat file_stat;
if (stat(path.c_str(), &file_stat) != 0) {
if (errno != ENOENT)
fprintf(stderr, "Error in stat() for path: %s\n", + path.c_str());
return 0;
}
return file_stat.st_mtime;
}
string read_file(const string &path) {
struct stat file_stat;
if (stat(path.c_str(), &file_stat) != 0 || (file_stat.st_mode & S_IFMT) != S_IFREG) return "";
ifstream file(path, std::ios::binary);
if (!file.good()) return "";
istreambuf_iterator<char> file_iterator(file), end_iterator;
string content(file_iterator, end_iterator);
file.close();
return content;
}
void write_file(const string &path, const string &content) {
ofstream file(path);
file << content;
file.close();
}
#ifdef _WIN32
#include <windows.h>
const char *path_separator = "\\";
vector<string> list_directory(const string &path) {
vector<string> result;
WIN32_FIND_DATA search_data;
HANDLE handle = FindFirstFile((path + "\\*").c_str(), &search_data);
while (handle != INVALID_HANDLE_VALUE) {
string name(search_data.cFileName);
result.push_back(name);
if (FindNextFile(handle, &search_data) == FALSE) break;
}
return result;
}
#else
#include <dirent.h>
const char *path_separator = "/";
vector<string> list_directory(const string &path) {
vector<string> result;
DIR *dir = opendir(path.c_str());
if (!dir) {
printf("\nTest error - no such directory '%s'", path.c_str());
return result;
}
struct dirent *dir_entry;
while ((dir_entry = readdir(dir))) {
string name(dir_entry->d_name);
if (name != "." && name != "..") {
result.push_back(name);
}
}
closedir(dir);
return result;
}
#endif
string join_path(const vector<string> &parts) {
string result;
for (const string &part : parts) {
if (!result.empty()) result += path_separator;
result += part;
}
return result;
}