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

Last change on this file since 367 was 364, checked in by Nishi, on Oct 17, 2024 at 9:47:01 AM

fix path stuff

  • Property svn:keywords set to Id
File size: 2.5 KB
Line 
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
21int 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
27char** 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}
Note: See TracBrowser for help on using the repository browser.