source: Main/trunk/Common/dir.c@ 255

Last change on this file since 255 was 255, checked in by Nishi, on Oct 4, 2024 at 1:08:58 PM

get listdir working [release 2.03E]

  • Property svn:keywords set to Id
File size: 2.3 KB
Line 
1/* $Id: dir.c 255 2024-10-04 04:08:58Z 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(__WATCOMC__)
11#include <direct.h>
12#endif
13#include <stdlib.h>
14#include <string.h>
15
16int cm_sort(const void* _a, const void* _b) {
17 char* a = *(char**)_a;
18 char* b = *(char**)_b;
19 return strcmp(a, b);
20}
21
22char** cm_scandir(const char* path) {
23#if defined(_MSC_VER) || defined(__BORLANDC__)
24 WIN32_FIND_DATA ffd;
25 HANDLE hfind;
26 char** r = malloc(sizeof(*r));
27 int len;
28 char** old;
29 int i;
30 char* p;
31 r[0] = NULL;
32
33 p = cm_strcat(path, "/*");
34 hfind = FindFirstFile(p, &ffd);
35 if(INVALID_HANDLE_VALUE == hfind) {
36 return NULL;
37 }
38 do {
39 if(strcmp(ffd.cFileName, ".") != 0 && strcmp(ffd.cFileName, "..") != 0) {
40 old = r;
41 for(i = 0; old[i] != NULL; i++)
42 ;
43 r = malloc(sizeof(*r) * (i + 2));
44 for(i = 0; old[i] != NULL; i++) r[i] = old[i];
45 r[i] = cm_strcat(ffd.cFileName, (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "/" : "");
46 r[i + 1] = NULL;
47 free(old);
48 }
49 } while(FindNextFile(hfind, &ffd) != 0);
50 FindClose(hfind);
51 free(p);
52 for(len = 0; r[len] != NULL; len++)
53 ;
54 qsort(r, len, sizeof(char*), cm_sort);
55
56 old = r;
57 for(i = 0; old[i] != NULL; i++)
58 ;
59 r = malloc(sizeof(*r) * (i + 2));
60 for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
61 r[0] = cm_strdup("../");
62 r[i + 1] = NULL;
63 free(old);
64
65 return r;
66#else
67 DIR* dir = opendir(path);
68 if(dir != NULL) {
69 char** r = malloc(sizeof(*r));
70 struct dirent* d;
71 r[0] = NULL;
72 while((d = readdir(dir)) != NULL) {
73 if(strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) {
74 struct stat s;
75 char* p = cm_strcat3(path, "/", d->d_name);
76 stat(p, &s);
77 free(p);
78
79 char** old = r;
80 int i;
81 for(i = 0; old[i] != NULL; i++)
82 ;
83 r = malloc(sizeof(*r) * (i + 2));
84 for(i = 0; old[i] != NULL; i++) r[i] = old[i];
85 r[i] = cm_strcat(d->d_name, S_ISDIR(s.st_mode) ? "/" : "");
86 r[i + 1] = NULL;
87 free(old);
88 }
89 }
90 int len;
91 for(len = 0; r[len] != NULL; len++)
92 ;
93 qsort(r, len, sizeof(char*), cm_sort);
94
95 char** old = r;
96 int i;
97 for(i = 0; old[i] != NULL; i++)
98 ;
99 r = malloc(sizeof(*r) * (i + 2));
100 for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
101 r[0] = cm_strdup("../");
102 r[i + 1] = NULL;
103 free(old);
104
105 closedir(dir);
106
107 return r;
108 } else {
109 return NULL;
110 }
111#endif
112}
Note: See TracBrowser for help on using the repository browser.