Mercurial > dwindows
annotate win/dirent.c @ 555:0d47bec8a5fb
Use LoadImage() and BS_ICON for properly loading the odd sized icon images
for bitmap buttons.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sun, 11 Apr 2004 08:35:43 +0000 |
parents | e0ea29c3d1eb |
children | 1e3ab8adba90 |
rev | line source |
---|---|
3 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include <ctype.h> | |
5 | |
6 #include <windows.h> | |
7 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
8 #include "compat.h" |
3 | 9 #include <errno.h> |
10 | |
11 #define error(rc) errno = 255 | |
12 | |
13 struct _dirdescr { | |
14 HANDLE handle; /* DosFindFirst handle */ | |
15 char fstype; /* filesystem type */ | |
16 long count; /* valid entries in <ffbuf> */ | |
17 long number; /* absolute number of next entry */ | |
18 int index; /* relative number of next entry */ | |
19 char name[MAXPATHLEN+3]; /* directory name */ | |
20 unsigned attrmask; /* attribute mask for seekdir */ | |
21 struct dirent entry; /* buffer for directory entry */ | |
22 WIN32_FIND_DATA data; | |
23 }; | |
24 | |
25 /* | |
26 * Return first char of filesystem type, or 0 if unknown. | |
27 */ | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
28 static char API getFSType(const char *path) |
3 | 29 { |
30 static char cache[1+26]; | |
31 char drive[3]; | |
32 ULONG unit; | |
33 char r; | |
34 | |
35 if (isalpha(path[0]) && path[1] == ':') { | |
36 unit = toupper(path[0]) - '@'; | |
37 path += 2; | |
38 } else { | |
39 return 0; | |
40 } | |
41 | |
42 if ((path[0] == '\\' || path[0] == '/') | |
43 && (path[1] == '\\' || path[1] == '/')) | |
44 return 0; | |
45 | |
46 if (cache [unit]) | |
47 return cache [unit]; | |
48 | |
49 drive[0] = '@' + unit; | |
50 drive[1] = ':'; | |
51 drive[2] = '\0'; | |
52 | |
53 r = GetDriveType(drive); | |
54 | |
55 return cache [unit] = r; | |
56 } | |
57 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
58 char * API abs_path(const char *name, char *buffer, int len) |
3 | 59 { |
260
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
60 char *buf; |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
61 LPTSTR file; |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
62 |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
63 if(isalpha(name[0]) && name[1] == ':' && name[2] == '\0') |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
64 { |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
65 int drive = _getdrive(); |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
66 char newdrive = toupper(name[0]); |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
67 |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
68 _chdrive((newdrive - 'A')+1); |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
69 |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
70 if(getcwd(buffer, len)) |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
71 { |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
72 _chdrive(drive); |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
73 return buffer; |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
74 } |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
75 _chdrive(drive); |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
76 return NULL; |
3 | 77 } |
260
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
78 if(GetFullPathName(name, len, buffer, &file)) |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
79 return buffer; |
e320dc29bfcd
Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
184
diff
changeset
|
80 return NULL; |
3 | 81 } |
82 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
83 DIR * API openxdir(const char *path, unsigned att_mask) |
3 | 84 { |
85 DIR *dir; | |
86 char name[MAXPATHLEN+3]; | |
87 | |
88 dir = malloc(sizeof(DIR)); | |
89 if (dir == NULL) { | |
90 errno = ENOMEM; | |
91 return NULL; | |
92 } | |
93 | |
94 strncpy(name, path, MAXPATHLEN); | |
95 name[MAXPATHLEN] = '\0'; | |
96 switch (name[strlen(name)-1]) { | |
97 default: | |
98 strcat(name, "\\"); | |
99 case '\\': | |
100 case '/': | |
101 case ':': | |
102 ; | |
103 } | |
104 strcat(name, "."); | |
105 if (!abs_path(name, dir->name, MAXPATHLEN+1)) | |
106 strcpy(dir->name, name); | |
107 if (dir->name[strlen(dir->name)-1] == '\\') | |
108 strcat(dir->name, "*"); | |
109 else | |
110 strcat(dir->name, "\\*"); | |
111 | |
112 dir->fstype = getFSType(dir->name); | |
113 dir->attrmask = att_mask | A_DIR; | |
114 | |
115 dir->count = 100; | |
184
4ec906d40ce2
FindFirstFile returns INVALID_HANDLE_VALUE on error, not NULL.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
3
diff
changeset
|
116 if((dir->handle = FindFirstFile(dir->name, &dir->data))==INVALID_HANDLE_VALUE) |
3 | 117 { |
118 free(dir); | |
119 error(rc); | |
120 return NULL; | |
121 } | |
122 | |
123 dir->number = 0; | |
124 dir->index = 0; | |
125 | |
126 return (DIR *)dir; | |
127 } | |
128 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
129 DIR * API opendir(const char *pathname) |
3 | 130 { |
131 return openxdir(pathname, 0); | |
132 } | |
133 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
134 struct dirent * API readdir(DIR *dir) |
3 | 135 { |
136 static int dummy_ino = 2; | |
137 | |
138 if (dir->number) | |
139 { | |
140 ULONG rc; | |
141 dir->count = 100; | |
142 if(!FindNextFile(dir->handle, &(dir->data))) | |
143 { | |
144 error(rc); | |
145 return NULL; | |
146 } | |
147 | |
148 dir->index = 0; | |
149 } | |
150 | |
151 strcpy(dir->entry.d_name, dir->data.cFileName); | |
152 dir->entry.d_ino = dummy_ino++; | |
153 dir->entry.d_reclen = strlen(dir->data.cFileName); | |
154 dir->entry.d_namlen = strlen(dir->data.cFileName); | |
155 dir->entry.d_size = dir->data.nFileSizeLow; | |
156 dir->entry.d_attribute = dir->data.dwFileAttributes; | |
157 #if 0 | |
158 dir->entry.d_time = *(USHORT *)&dir->next->ftimeLastWrite; | |
159 dir->entry.d_date = *(USHORT *)&dir->next->fdateLastWrite; | |
160 #endif | |
161 | |
162 dir->number++; | |
163 dir->index++; | |
164 return &dir->entry; | |
165 } | |
166 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
167 long API telldir(DIR *dir) |
3 | 168 { |
169 return dir->number; | |
170 } | |
171 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
172 void API seekdir(DIR *dir, long off) |
3 | 173 { |
174 if (dir->number > off) { | |
175 char name[MAXPATHLEN+2]; | |
176 ULONG rc; | |
177 | |
178 FindClose(dir->handle); | |
179 | |
180 strcpy(name, dir->name); | |
181 strcat(name, "*"); | |
182 | |
183 if((dir->handle = FindFirstFile(name, &(dir->data)))==NULL) | |
184 { | |
185 error(rc); | |
186 return; | |
187 } | |
188 | |
189 dir->number = 0; | |
190 dir->index = 0; | |
191 } | |
192 | |
193 while (dir->number < off && readdir(dir)) | |
194 ; | |
195 } | |
196 | |
527
e0ea29c3d1eb
Fixed dw_window_pointer() so it works on Windows. Tried to fix the
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents:
260
diff
changeset
|
197 void API closedir(DIR *dir) |
3 | 198 { |
199 FindClose(dir->handle); | |
200 free(dir); | |
201 } | |
202 | |
203 /*****************************************************************************/ | |
204 | |
205 #ifdef TEST | |
206 | |
207 main(int argc, char **argv) | |
208 { | |
209 int i; | |
210 DIR *dir; | |
211 struct dirent *ep; | |
212 | |
213 for (i = 1; i < argc; ++i) { | |
214 dir = opendir(argv[i]); | |
215 if (!dir) | |
216 continue; | |
217 while (ep = readdir(dir)) | |
218 if (strchr("\\/:", argv[i] [strlen(argv[i]) - 1])) | |
219 printf("%s%s\n", argv[i], ep->d_name); | |
220 else | |
221 printf("%s/%s\n", argv[i], ep->d_name); | |
222 closedir(dir); | |
223 } | |
224 | |
225 return 0; | |
226 } | |
227 | |
228 #endif |