annotate win/dirent.c @ 1853:4790589f52a9

Initial commit for new dw_signal_connect_data() function... Same as dw_signal_connect() but it has an additional callback parameter that gets called when the callback is being removed. This allows me to free memory allocated for the data parameter and prevent memory leaks in godwindows... Tested GTK and Mac.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 27 Feb 2013 19:14:22 +0000
parents 22225eb286e5
children 3816d76835e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1617
f8d1da63fb77 Add code to allow building DW.DLL as Unicode on Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1601
diff changeset
1 #undef UNICODE
f8d1da63fb77 Add code to allow building DW.DLL as Unicode on Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1601
diff changeset
2 #undef _UNICODE
f8d1da63fb77 Add code to allow building DW.DLL as Unicode on Windows.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1601
diff changeset
3
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
4 #include <stdio.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
5 #include <stdlib.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
6 #include <string.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
7 #include <ctype.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
8
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
9 #include <windows.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
10
1839
22225eb286e5 Fixes for building with MINGW64 (specifically http://tdm-gcc.tdragon.net/).
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1617
diff changeset
11 #define _DW_INTERNAL
1594
6baf177f335c Rename compat.c/h dwcompat.c/h and configure option to --with-dwcompat.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1362
diff changeset
12 #include "dwcompat.h"
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
13 #include <errno.h>
1362
412af8059331 Attempt to get it building with Mingw again... builds but crashes.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 572
diff changeset
14 #include <direct.h>
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
15
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
16 #define error(rc) errno = 255
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
17
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
18 struct _dirdescr {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
19 HANDLE handle; /* DosFindFirst handle */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
20 char fstype; /* filesystem type */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
21 long count; /* valid entries in <ffbuf> */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
22 long number; /* absolute number of next entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
23 int index; /* relative number of next entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
24 char name[MAXPATHLEN+3]; /* directory name */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
25 unsigned attrmask; /* attribute mask for seekdir */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
26 struct dirent entry; /* buffer for directory entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
27 WIN32_FIND_DATA data;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
28 };
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
29
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
30 /*
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
31 * Return first char of filesystem type, or 0 if unknown.
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
32 */
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
33 static char API getFSType(const char *path)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
34 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
35 static char cache[1+26];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
36 char drive[3];
1601
71e0a3ad07f7 Enable level 3 warnings in DEBUG mode with Visual C to show deprecation warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1594
diff changeset
37 UCHAR unit;
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
38 char r;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
39
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
40 if (isalpha(path[0]) && path[1] == ':') {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
41 unit = toupper(path[0]) - '@';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
42 path += 2;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
43 } else {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
44 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
45 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
46
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
47 if ((path[0] == '\\' || path[0] == '/')
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
48 && (path[1] == '\\' || path[1] == '/'))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
49 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
50
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
51 if (cache [unit])
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
52 return cache [unit];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
53
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
54 drive[0] = '@' + unit;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
55 drive[1] = ':';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
56 drive[2] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
57
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
58 r = GetDriveType(drive);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
59
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
60 return cache [unit] = r;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
61 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
62
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
63 char * API abs_path(const char *name, char *buffer, int len)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
64 {
260
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
65 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
66
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
67 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
68 {
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
69 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
70 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
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((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
73
1601
71e0a3ad07f7 Enable level 3 warnings in DEBUG mode with Visual C to show deprecation warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1594
diff changeset
74 if(_getcwd(buffer, len))
260
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
75 {
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
76 _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
77 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
78 }
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
79 _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
80 return NULL;
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
81 }
260
e320dc29bfcd Rewrote abs_path() so the code will work on NT 4.0.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 184
diff changeset
82 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
83 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
84 return NULL;
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
85 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
86
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
87 DIR * API openxdir(const char *path, unsigned att_mask)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
88 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
89 DIR *dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
90 char name[MAXPATHLEN+3];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
91
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
92 dir = malloc(sizeof(DIR));
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
93 if (dir == NULL) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
94 errno = ENOMEM;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
95 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
96 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
97
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
98 strncpy(name, path, MAXPATHLEN);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
99 name[MAXPATHLEN] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
100 switch (name[strlen(name)-1]) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
101 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
102 strcat(name, "\\");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
103 case '\\':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
104 case '/':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
105 case ':':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
106 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
107 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
108 strcat(name, ".");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
109 if (!abs_path(name, dir->name, MAXPATHLEN+1))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
110 strcpy(dir->name, name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
111 if (dir->name[strlen(dir->name)-1] == '\\')
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
112 strcat(dir->name, "*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
113 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
114 strcat(dir->name, "\\*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
115
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
116 dir->fstype = getFSType(dir->name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
117 dir->attrmask = att_mask | A_DIR;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
118
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
119 dir->count = 100;
184
4ec906d40ce2 FindFirstFile returns INVALID_HANDLE_VALUE on error, not NULL.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
120 if((dir->handle = FindFirstFile(dir->name, &dir->data))==INVALID_HANDLE_VALUE)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
121 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
122 free(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
123 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
124 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
125 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
126
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
127 dir->number = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
128 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
129
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
130 return (DIR *)dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
131 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
132
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
133 DIR * API opendir(const char *pathname)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
134 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
135 return openxdir(pathname, 0);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
136 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
137
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
138 struct dirent * API readdir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
139 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
140 static int dummy_ino = 2;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
141
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
142 if (dir->number)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
143 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
144 dir->count = 100;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
145 if(!FindNextFile(dir->handle, &(dir->data)))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
146 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
147 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
148 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
149 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
150
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
151 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
152 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
153
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
154 strcpy(dir->entry.d_name, dir->data.cFileName);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
155 dir->entry.d_ino = dummy_ino++;
1601
71e0a3ad07f7 Enable level 3 warnings in DEBUG mode with Visual C to show deprecation warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1594
diff changeset
156 dir->entry.d_reclen = (int)strlen(dir->data.cFileName);
71e0a3ad07f7 Enable level 3 warnings in DEBUG mode with Visual C to show deprecation warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1594
diff changeset
157 dir->entry.d_namlen = (int)strlen(dir->data.cFileName);
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
158 dir->entry.d_size = dir->data.nFileSizeLow;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
159 dir->entry.d_attribute = dir->data.dwFileAttributes;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
160 #if 0
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
161 dir->entry.d_time = *(USHORT *)&dir->next->ftimeLastWrite;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
162 dir->entry.d_date = *(USHORT *)&dir->next->fdateLastWrite;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
163 #endif
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
164
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
165 dir->number++;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
166 dir->index++;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
167 return &dir->entry;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
168 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
169
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
170 long API telldir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
171 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
172 return dir->number;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
173 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
174
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
175 void API seekdir(DIR *dir, long off)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
176 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
177 if (dir->number > off) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
178 char name[MAXPATHLEN+2];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
179
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
180 FindClose(dir->handle);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
181
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
182 strcpy(name, dir->name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
183 strcat(name, "*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
184
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
185 if((dir->handle = FindFirstFile(name, &(dir->data)))==NULL)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
186 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
187 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
188 return;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
189 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
190
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
191 dir->number = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
192 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
193 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
194
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
195 while (dir->number < off && readdir(dir))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
196 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
197 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
198
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
199 void API closedir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
200 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
201 FindClose(dir->handle);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
202 free(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
203 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
204
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
205 /*****************************************************************************/
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
206
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
207 #ifdef TEST
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
208
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
209 main(int argc, char **argv)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
210 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
211 int i;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
212 DIR *dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
213 struct dirent *ep;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
214
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
215 for (i = 1; i < argc; ++i) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
216 dir = opendir(argv[i]);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
217 if (!dir)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
218 continue;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
219 while (ep = readdir(dir))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
220 if (strchr("\\/:", argv[i] [strlen(argv[i]) - 1]))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
221 printf("%s%s\n", argv[i], ep->d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
222 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
223 printf("%s/%s\n", argv[i], ep->d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
224 closedir(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
225 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
226
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
227 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
228 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
229
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
230 #endif