*fnt = newFNT;
}
+FileNamesTable* UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames)
+{
+ size_t const sizeof_FNTable = nbFilenames * sizeof(*filenames);
+ const char** const newFNTable = (const char**)malloc(sizeof_FNTable);
+ if (newFNTable==NULL) return NULL;
+ memcpy(newFNTable, filenames, sizeof_FNTable);
+ return UTIL_createFileNamesTable(newFNTable, nbFilenames, NULL);
+}
+
/*-****************************************
* count the number of physical cores
*/
void UTIL_expandFNT(FileNamesTable** fnt, int followLinks);
+/*! UTIL_createFNT_fromROTable() :
+ * copy the @filenames pointer table inside the returned object.
+ * The names themselves are still stored in their original buffer, which must outlive the object.
+ * @return : a FileNamesTable* object,
+ * or NULL in case of error
+ */
+FileNamesTable* UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames);
+
/*! UTIL_createExpandedFNT() :
* read names from @filenames, and expand those corresponding to directories
* @return : an expanded FileNamesTable*, where each name is a file
int main(int argc, char const **argv) {
size_t const kMaxFileSize = (size_t)1 << 27;
int const kFollowLinks = 1;
- char *fileNamesBuf = NULL;
- char const **files = argv + 1;
- unsigned numFiles = argc - 1;
+ FileNamesTable* files;
+ const char** const fnTable = argv + 1;
+ unsigned numFiles = (unsigned)(argc - 1);
uint8_t *buffer = NULL;
size_t bufferSize = 0;
unsigned i;
int ret;
#ifdef UTIL_HAS_CREATEFILELIST
- files = UTIL_createFileList(files, numFiles, &fileNamesBuf, &numFiles,
- kFollowLinks);
- if (!files)
- numFiles = 0;
+ files = UTIL_createExpandedFNT(fnTable, numFiles, kFollowLinks);
+ if (!files) numFiles = 0;
+#else
+ files = UTIL_createFNT_fromROTable(fnTable, numFiles);
+ if (!files) numFiles = 0;
#endif
+ if (files) assert(numFiles == files->tableSize);
if (numFiles == 0)
fprintf(stderr, "WARNING: No files passed to %s\n", argv[0]);
for (i = 0; i < numFiles; ++i) {
- char const *fileName = files[i];
+ char const *fileName = files->fileNames[i];
DEBUGLOG(3, "Running %s", fileName);
size_t const fileSize = UTIL_getFileSize(fileName);
size_t readSize;
ret = 0;
free(buffer);
-#ifdef UTIL_HAS_CREATEFILELIST
- UTIL_freeFileList(files, fileNamesBuf);
-#endif
+ UTIL_freeFileNamesTable(files);
return ret;
}
* data filenames helpers.
*/
-data_filenames_t data_filenames_get(data_t const* data) {
- data_filenames_t filenames = {.buffer = NULL, .size = 0};
- char const* path = data->data.path;
-
- filenames.filenames = UTIL_createFileList(
- &path,
- 1,
- &filenames.buffer,
- &filenames.size,
- /* followLinks */ 0);
- return filenames;
-}
-
-void data_filenames_free(data_filenames_t filenames) {
- UTIL_freeFileList(filenames.filenames, filenames.buffer);
+FileNamesTable* data_filenames_get(data_t const* data)
+{
+ char const* const path = data->data.path;
+ return UTIL_createExpandedFNT(&path, 1, 0 /* followLinks */ );
}
/**
data_buffers_t data_buffers_get(data_t const* data) {
data_buffers_t buffers = {.size = 0};
- data_filenames_t filenames = data_filenames_get(data);
- if (filenames.size == 0)
+ FileNamesTable* const filenames = data_filenames_get(data);
+ if (filenames == NULL) return buffers;
+ if (filenames->tableSize == 0) {
+ UTIL_freeFileNamesTable(filenames);
return buffers;
+ }
data_buffer_t* buffersPtr =
- (data_buffer_t*)malloc(filenames.size * sizeof(data_buffer_t));
- if (buffersPtr == NULL)
+ (data_buffer_t*)malloc(filenames->tableSize * sizeof(*buffersPtr));
+ if (buffersPtr == NULL) {
+ UTIL_freeFileNamesTable(filenames);
return buffers;
+ }
buffers.buffers = (data_buffer_t const*)buffersPtr;
- buffers.size = filenames.size;
+ buffers.size = filenames->tableSize;
- for (size_t i = 0; i < filenames.size; ++i) {
- buffersPtr[i] = data_buffer_read(filenames.filenames[i]);
+ for (size_t i = 0; i < filenames->tableSize; ++i) {
+ buffersPtr[i] = data_buffer_read(filenames->fileNames[i]);
if (buffersPtr[i].data == NULL) {
data_buffers_t const kEmptyBuffer = {};
data_buffers_free(buffers);
+ UTIL_freeFileNamesTable(filenames);
return kEmptyBuffer;
}
}
+ UTIL_freeFileNamesTable(filenames);
return buffers;
}
*/
void data_buffer_free(data_buffer_t buffer);
-typedef struct {
- char* buffer;
- char const** filenames;
- unsigned size;
-} data_filenames_t;
-
-/**
- * Get a recursive list of filenames in the data object. If it is a file, it
- * will only contain one entry. If it is a directory, it will recursively walk
- * the directory.
- *
- * @returns The list of filenames, which has size 0 and NULL pointers on error.
- */
-data_filenames_t data_filenames_get(data_t const* data);
-
-/**
- * Frees the filenames table.
- */
-void data_filenames_free(data_filenames_t filenames);
typedef struct {
data_buffer_t const* buffers;