src/lib/osunix.c 1.42
1.42 2009/07/08 16:24:25 larrym
add listDirRegEx
Index: src/lib/osunix.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/osunix.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -b -B -U 4 -r1.41 -r1.42
--- src/lib/osunix.c 7 Jun 2009 07:11:55 -0000 1.41
+++ src/lib/osunix.c 8 Jul 2009 16:24:25 -0000 1.42
@@ -11,8 +11,10 @@
#include <termios.h>
#include "portable.h"
#include "portimpl.h"
#include <sys/wait.h>
+#include <regex.h>
+
static char const rcsid[] = "$Id$";
@@ -116,8 +118,41 @@
slNameSort(&list);
return list;
}
+struct slName *listDirRegEx(char *dir, char *regEx, int flags)
+/* Return an alphabetized list of all files that match
+ * the regular expression pattern in directory.
+ * See REGCOMP(3) for flags (e.g. REG_ICASE) */
+{
+struct slName *list = NULL, *name;
+struct dirent *de;
+DIR *d;
+regex_t re;
+int err = regcomp(&re, regEx, flags | REG_NOSUB);
+if(err)
+ errAbort("regcomp failed; err: %d", err);
+
+if ((d = opendir(dir)) == NULL)
+ return NULL;
+while ((de = readdir(d)) != NULL)
+ {
+ char *fileName = de->d_name;
+ if (differentString(fileName, ".") && differentString(fileName, ".."))
+ {
+ if (!regexec(&re, fileName, 0, NULL, 0))
+ {
+ name = newSlName(fileName);
+ slAddHead(&list, name);
+ }
+ }
+ }
+closedir(d);
+regfree(&re);
+slNameSort(&list);
+return list;
+}
+
struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno,
time_t lastAccess)
/* Return a new fileInfo. */
{