Added dir.c
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 1 Sep 1995 10:34:51 +0000 (10:34 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 1 Sep 1995 10:34:51 +0000 (10:34 +0000)
index/dir.c [new file with mode: 0644]

diff --git a/index/dir.c b/index/dir.c
new file mode 100644 (file)
index 0000000..c643b40
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 1994, Index Data I/S 
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: dir.c,v $
+ * Revision 1.1  1995-09-01 10:34:51  adam
+ * Added dir.c
+ *
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+#include <util.h>
+#include "index.h"
+
+struct dir_entry *dir_open (const char *rep)
+{
+    DIR *dir;
+    struct dirent *dent;
+    size_t entry_max = 20;
+    size_t idx = 0;
+    struct dir_entry *entry;
+
+    log (LOG_DEBUG, "dir_open %s", rep);
+    if (!(dir = opendir(rep)))
+    {
+        log (LOG_WARN|LOG_ERRNO, "opendir %s", rep);
+        if (errno != ENOENT)
+            exit (1);
+        return NULL;
+    }
+    if (!(entry = malloc (sizeof(*entry) * entry_max)))
+    {
+        log (LOG_FATAL|LOG_ERRNO, "malloc");
+        exit (1);
+    }    
+    while ((dent = readdir (dir)))
+    {
+        if (idx == entry_max-1)
+        {
+            struct dir_entry *entry_n;
+
+            if (!(entry_n = malloc (sizeof(*entry) * (entry_max + 100))))
+            {
+                log (LOG_FATAL|LOG_ERRNO, "malloc");
+                exit (1);
+            }
+            memcpy (entry_n, entry, entry_max * sizeof(*entry));
+            free (entry);
+            entry = entry_n;
+            entry_max += 100;
+        }
+        if (!(entry[idx].name = malloc (strlen(dent->d_name)+1)))
+        {
+            log (LOG_FATAL|LOG_ERRNO, "malloc");
+            exit (1);
+        }
+        strcpy (entry[idx].name, dent->d_name);
+    }
+    entry[idx].name = NULL;
+    closedir (dir);
+    return entry;
+}
+
+int dir_cmp (const void *p1, const void *p2)
+{
+    return strcmp (((struct dir_entry *) p1)->name,
+                   ((struct dir_entry *) p2)->name);
+}
+
+void dir_sort (struct dir_entry *e)
+{
+    size_t nmemb = 0;
+    while (e[nmemb].name)
+        nmemb++;
+    qsort (e, nmemb, sizeof(*e), dir_cmp); 
+}
+
+void dir_free (struct dir_entry **e_p)
+{
+    size_t i = 0;
+    struct dir_entry *e = *e_p;
+
+    assert (e);
+    while (e[i].name)
+        free (e[i].name);
+    free (e);
+    *e_p = NULL;
+}