101 lines
2.4 KiB
C++

//
// Copyright (c) 2009-2010 Mikko Mononen memon@inside.org
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
//
#include "Filelist.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
# include <io.h>
#else
# include <dirent.h>
#endif
static void fileListAdd(FileList& list, const char* path)
{
if (list.size >= FileList::MAX_FILES)
return;
int n = strlen(path);
list.files[list.size] = new char[n+1];
strcpy(list.files[list.size], path);
list.size++;
}
static void fileListClear(FileList& list)
{
for (int i = 0; i < list.size; ++i)
delete [] list.files[i];
list.size = 0;
}
FileList::FileList() : size(0)
{
memset(files, 0, sizeof(char*)*MAX_FILES);
}
FileList::~FileList()
{
fileListClear(*this);
}
static int cmp(const void* a, const void* b)
{
return strcmp(*(const char**)a, *(const char**)b);
}
void scanDirectory(const char* path, const char* ext, FileList& list)
{
fileListClear(list);
#ifdef WIN32
_finddata_t dir;
char pathWithExt[260];
long fh;
strcpy(pathWithExt, path);
strcat(pathWithExt, "/*");
strcat(pathWithExt, ext);
fh = _findfirst(pathWithExt, &dir);
if (fh == -1L)
return;
do
{
fileListAdd(list, dir.name);
}
while (_findnext(fh, &dir) == 0);
_findclose(fh);
#else
dirent* current = 0;
DIR* dp = opendir(path);
if (!dp)
return;
while ((current = readdir(dp)) != 0)
{
int len = strlen(current->d_name);
if (len > 4 && strncmp(current->d_name+len-4, ext, 4) == 0)
{
fileListAdd(list, current->d_name);
}
}
closedir(dp);
#endif
if (list.size > 1)
qsort(list.files, list.size, sizeof(char*), cmp);
}