Minor changes.
[idzebra-moved-to-github.git] / index / dir.c
1 /*
2  * Copyright (C) 1994, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: dir.c,v $
7  * Revision 1.2  1995-09-01 10:57:07  adam
8  * Minor changes.
9  *
10  * Revision 1.1  1995/09/01  10:34:51  adam
11  * Added dir.c
12  *
13  */
14 #include <stdio.h>
15 #include <assert.h>
16 #include <unistd.h>
17 #include <dirent.h>
18 #include <sys/stat.h>
19 #include <sys/types.h>
20 #include <fcntl.h>
21 #include <ctype.h>
22
23 #include <util.h>
24 #include "index.h"
25
26 struct dir_entry *dir_open (const char *rep)
27 {
28     DIR *dir;
29     struct dirent *dent;
30     size_t entry_max = 20;
31     size_t idx = 0;
32     struct dir_entry *entry;
33
34     log (LOG_DEBUG, "dir_open %s", rep);
35     if (!(dir = opendir(rep)))
36     {
37         log (LOG_WARN|LOG_ERRNO, "opendir %s", rep);
38         if (errno != ENOENT)
39             exit (1);
40         return NULL;
41     }
42     if (!(entry = malloc (sizeof(*entry) * entry_max)))
43     {
44         log (LOG_FATAL|LOG_ERRNO, "malloc");
45         exit (1);
46     }    
47     while ((dent = readdir (dir)))
48     {
49         if (idx == entry_max-1)
50         {
51             struct dir_entry *entry_n;
52
53             if (!(entry_n = malloc (sizeof(*entry) * (entry_max + 100))))
54             {
55                 log (LOG_FATAL|LOG_ERRNO, "malloc");
56                 exit (1);
57             }
58             memcpy (entry_n, entry, entry_max * sizeof(*entry));
59             free (entry);
60             entry = entry_n;
61             entry_max += 100;
62         }
63         if (!(entry[idx].name = malloc (strlen(dent->d_name)+1)))
64         {
65             log (LOG_FATAL|LOG_ERRNO, "malloc");
66             exit (1);
67         }
68         strcpy (entry[idx].name, dent->d_name);
69         idx++;
70     }
71     entry[idx].name = NULL;
72     closedir (dir);
73     return entry;
74 }
75
76 static int dir_cmp (const void *p1, const void *p2)
77 {
78     return strcmp (((struct dir_entry *) p1)->name,
79                    ((struct dir_entry *) p2)->name);
80 }
81
82 void dir_sort (struct dir_entry *e)
83 {
84     size_t nmemb = 0;
85     while (e[nmemb].name)
86         nmemb++;
87     qsort (e, nmemb, sizeof(*e), dir_cmp); 
88 }
89
90 void dir_free (struct dir_entry **e_p)
91 {
92     size_t i = 0;
93     struct dir_entry *e = *e_p;
94
95     assert (e);
96     while (e[i].name)
97         free (e[i++].name);
98     free (e);
99     *e_p = NULL;
100 }