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 ago) by nishi
Content type: text/x-c
Branch: MAIN
CVS Tags: v2_05A, v2_05, HEAD
Error occurred while calculating annotation data.
Log Message:
update

File Contents

# Content
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 }