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

Last change on this file since 358 was 315, checked in by Nishi, on Oct 14, 2024 at 7:01:02 PM

wip

  • Property svn:keywords set to Id
File size: 2.4 KB
RevLine 
[21]1/* $Id: dir.c 315 2024-10-14 10:01:02Z nishi $ */
2
3#include "cm_dir.h"
4
5#include "cm_string.h"
6
7#include <sys/stat.h>
[219]8#if !defined(_MSC_VER) && !defined(__WATCOMC__)
[21]9#include <dirent.h>
[315]10#elif defined(__NETWARE__)
11#include <dirent.h>
[261]12#elif defined(__WATCOMC__) || defined(_MSC_VER)
[219]13#include <direct.h>
[212]14#endif
[261]15#ifdef _MSC_VER
16#include <windows.h>
17#endif
[21]18#include <stdlib.h>
19#include <string.h>
20
[22]21int cm_sort(const void* _a, const void* _b) {
[21]22 char* a = *(char**)_a;
23 char* b = *(char**)_b;
24 return strcmp(a, b);
25}
26
[22]27char** cm_scandir(const char* path) {
[215]28#if defined(_MSC_VER) || defined(__BORLANDC__)
[255]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) {
[257]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);
[255]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;
[212]71#else
[21]72 DIR* dir = opendir(path);
[22]73 if(dir != NULL) {
[21]74 char** r = malloc(sizeof(*r));
[212]75 struct dirent* d;
[292]76 char** old;
77 int len;
78 int i;
[21]79 r[0] = NULL;
[22]80 while((d = readdir(dir)) != NULL) {
81 if(strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) {
[21]82 struct stat s;
83 char* p = cm_strcat3(path, "/", d->d_name);
84 stat(p, &s);
85 free(p);
86
[292]87 old = r;
[22]88 for(i = 0; old[i] != NULL; i++)
89 ;
[21]90 r = malloc(sizeof(*r) * (i + 2));
91 for(i = 0; old[i] != NULL; i++) r[i] = old[i];
92 r[i] = cm_strcat(d->d_name, S_ISDIR(s.st_mode) ? "/" : "");
93 r[i + 1] = NULL;
94 free(old);
95 }
96 }
[22]97 for(len = 0; r[len] != NULL; len++)
98 ;
[21]99 qsort(r, len, sizeof(char*), cm_sort);
[22]100
[292]101 old = r;
[22]102 for(i = 0; old[i] != NULL; i++)
103 ;
104 r = malloc(sizeof(*r) * (i + 2));
105 for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
106 r[0] = cm_strdup("../");
107 r[i + 1] = NULL;
108 free(old);
109
[150]110 closedir(dir);
111
[21]112 return r;
[22]113 } else {
[21]114 return NULL;
115 }
[212]116#endif
[21]117}
Note: See TracBrowser for help on using the repository browser.