ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/tewi/Common/dir.c
Revision: 1.1
Committed: Thu Oct 17 09:53:38 2024 UTC (4 weeks, 1 day ago) by nishi
Content type: text/x-c
Branch: MAIN
CVS Tags: v2_05A, v2_05, HEAD
Log Message:
update

File Contents

# User Rev Content
1 nishi 1.1 /* $Id: dir.c 364 2024-10-17 00:47:01Z nishi $ */
2    
3     #include "cm_dir.h"
4    
5     #include "cm_string.h"
6    
7     #include <sys/stat.h>
8     #if !defined(_MSC_VER) && !defined(__WATCOMC__)
9     #include <dirent.h>
10     #elif defined(__NETWARE__)
11     #include <dirent.h>
12     #elif defined(__WATCOMC__) || defined(_MSC_VER)
13     #include <direct.h>
14     #endif
15     #ifdef _MSC_VER
16     #include <windows.h>
17     #endif
18     #include <stdlib.h>
19     #include <string.h>
20    
21     int cm_sort(const void* _a, const void* _b) {
22     char* a = *(char**)_a;
23     char* b = *(char**)_b;
24     return strcmp(a, b);
25     }
26    
27     char** cm_scandir(const char* path) {
28     #if defined(_MSC_VER) || defined(__BORLANDC__)
29     WIN32_FIND_DATA ffd;
30     HANDLE hfind;
31     char** r = malloc(sizeof(*r));
32     int len;
33     char** old;
34     int i;
35     char* p;
36     r[0] = NULL;
37    
38     p = cm_strcat(path, "/*");
39     hfind = FindFirstFile(p, &ffd);
40     if(INVALID_HANDLE_VALUE == hfind) {
41     return NULL;
42     }
43     do {
44     if(strcmp(ffd.cFileName, ".") != 0 && strcmp(ffd.cFileName, "..") != 0) {
45     old = r;
46     for(i = 0; old[i] != NULL; i++)
47     ;
48     r = malloc(sizeof(*r) * (i + 2));
49     for(i = 0; old[i] != NULL; i++) r[i] = old[i];
50     r[i] = cm_strcat(ffd.cFileName, (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "/" : "");
51     r[i + 1] = NULL;
52     free(old);
53     }
54     } while(FindNextFile(hfind, &ffd) != 0);
55     FindClose(hfind);
56     free(p);
57     for(len = 0; r[len] != NULL; len++)
58     ;
59     qsort(r, len, sizeof(char*), cm_sort);
60    
61     old = r;
62     for(i = 0; old[i] != NULL; i++)
63     ;
64     r = malloc(sizeof(*r) * (i + 2));
65     for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
66     r[0] = cm_strdup("../");
67     r[i + 1] = NULL;
68     free(old);
69    
70     return r;
71     #else
72     char* fxpath = cm_strcat(path, "/");
73     DIR* dir = opendir(fxpath);
74     if(dir != NULL) {
75     char** r = malloc(sizeof(*r));
76     struct dirent* d;
77     char** old;
78     int len;
79     int i;
80     r[0] = NULL;
81     while((d = readdir(dir)) != NULL) {
82     if(strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) {
83     struct stat s;
84     char* p = cm_strcat3(path, "/", d->d_name);
85     stat(p, &s);
86     free(p);
87    
88     old = r;
89     for(i = 0; old[i] != NULL; i++)
90     ;
91     r = malloc(sizeof(*r) * (i + 2));
92     for(i = 0; old[i] != NULL; i++) r[i] = old[i];
93     r[i] = cm_strcat(d->d_name, S_ISDIR(s.st_mode) ? "/" : "");
94     r[i + 1] = NULL;
95     free(old);
96     }
97     }
98     for(len = 0; r[len] != NULL; len++)
99     ;
100     qsort(r, len, sizeof(char*), cm_sort);
101    
102     old = r;
103     for(i = 0; old[i] != NULL; i++)
104     ;
105     r = malloc(sizeof(*r) * (i + 2));
106     for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
107     r[0] = cm_strdup("../");
108     r[i + 1] = NULL;
109     free(old);
110    
111     closedir(dir);
112     free(fxpath);
113    
114     return r;
115     } else {
116     free(fxpath);
117     return NULL;
118     }
119     #endif
120     }