/[MITgcm]/mitgcm.org/devel/buildweb/pkg/swish-e/src/win32/dirent.c
ViewVC logotype

Contents of /mitgcm.org/devel/buildweb/pkg/swish-e/src/win32/dirent.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Fri Sep 20 19:47:29 2002 UTC (22 years, 10 months ago) by adcroft
Branch: Import, MAIN
CVS Tags: baseline, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/plain
Importing web-site building process.

1 /*
2 dir.c for MS-DOS by Samuel Lam <skl@van-bc.UUCP>, June/87
3 */
4
5 /* #ifdef WIN32 */
6 /*
7 * @(#)dir.c 1.4 87/11/06 Public Domain.
8 *
9 * A public domain implementation of BSD directory routines for
10 * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield),
11 * August 1897
12 * Ported to OS/2 by Kai Uwe Rommel
13 * December 1989, February 1990
14 * Ported to Windows NT 22 May 91
15 * other mods Summer '92 brianmo@microsoft.com
16 * opendirx() was horribly written, very inefficient, and did not take care
17 * of all cases. It is still not too clean, but it is far more efficient.
18 * Changes made by Gordon Chaffee (chaffee@bugs-bunny.cs.berkeley.edu)
19 */
20
21
22 /*Includes:
23 * crt
24 */
25 #include <windows.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <sys\types.h>
29 #include <sys\stat.h>
30 #define _SWISH_PORT
31 #include "dirent.h"
32 #include "config.h"
33
34 /*
35 * NT specific
36 */
37 #include <stdio.h>
38
39 /*
40 * random typedefs
41 */
42 #define HDIR HANDLE
43 #define HFILE HANDLE
44 #define PHFILE PHANDLE
45
46 /*
47 * local functions
48 */
49 static char *getdirent(char *);
50 static void free_dircontents(struct _dircontents *);
51
52 static HDIR FindHandle;
53 static WIN32_FIND_DATA FileFindData;
54
55 static struct dirent dp;
56
57 DIR *opendirx(char *name, char *pattern)
58 {
59 struct stat statb;
60 DIR *dirp;
61 char c;
62 char *s;
63 struct _dircontents *dp;
64 int len;
65 int unc;
66 char path[ SW_MAXPATHNAME ];
67 register char *ip, *op;
68
69 for (ip = name, op = path; ; op++, ip++) {
70 *op = *ip;
71 if (*ip == '\0') {
72 break;
73 }
74 }
75
76 len = ip - name;
77 if (len > 0) {
78 /* Windows NT required a trailing '/' at some point. Now it MUST NOT have one. */
79 // unc = ((path[0] == '\\' || path[0] == '/') &&
80 // (path[1] == '\\' || path[1] == '/'));
81 unc = 0;
82 c = path[len - 1];
83 if (unc) {
84 if (c != '\\' && c != '/') {
85 path[len] = '/';
86 len++;
87 path[len] ='\0';
88 }
89 } else {
90 if ((c == '\\' || c == '/') && (len > 1)) {
91 len--;
92 path[len] = '\0';
93
94 if (path[len - 1] == ':' ) {
95 path[len] = '/'; len++;
96 path[len] = '.'; len++;
97 path[len] = '\0';
98 }
99 } else if (c == ':' ) {
100 path[len] = '.';
101 len++;
102 path[len] ='\0';
103 }
104 }
105 } else {
106 unc = 0;
107 path[0] = '.';
108 path[1] = '\0';
109 len = 1;
110 }
111
112 if (stat(path, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) {
113 return NULL;
114 }
115
116 dirp = malloc(sizeof(DIR));
117 if (dirp == NULL) {
118 return dirp;
119 }
120
121 c = path[len - 1];
122 if (c == '.' ) {
123 if (len == 1) {
124 len--;
125 } else {
126 c = path[len - 2];
127 if (c == '\\' || c == ':') {
128 len--;
129 } else {
130 path[len] = '/';
131 len++;
132 }
133 }
134 } else if (!unc && ((len != 1) || (c != '\\' && c != '/'))) {
135 path[len] = '/';
136 len++;
137 }
138 strcpy(path + len, pattern);
139
140 dirp -> dd_loc = 0;
141 dirp -> dd_contents = dirp -> dd_cp = NULL;
142
143 if ((s = getdirent(path)) == NULL) {
144 return dirp;
145 }
146
147 do
148 {
149 if (((dp = malloc(sizeof(struct _dircontents))) == NULL) ||
150 ((dp -> _d_entry = malloc(strlen(s) + 1)) == NULL) )
151 {
152 if (dp)
153 free(dp);
154 free_dircontents(dirp -> dd_contents);
155
156 return NULL;
157 }
158
159 if (dirp -> dd_contents)
160 dirp -> dd_cp = dirp -> dd_cp -> _d_next = dp;
161 else
162 dirp -> dd_contents = dirp -> dd_cp = dp;
163
164 strcpy(dp -> _d_entry, s);
165 dp -> _d_next = NULL;
166
167 }
168 while ((s = getdirent(NULL)) != NULL);
169
170 dirp -> dd_cp = dirp -> dd_contents;
171 return dirp;
172 }
173
174 DIR *opendir(char *name)
175 {
176 return opendirx(name, "*");
177 }
178
179 void closedir(DIR * dirp)
180 {
181 free_dircontents(dirp -> dd_contents);
182 free(dirp);
183 }
184
185 struct dirent *readdir(DIR * dirp)
186 {
187 /* static struct dirent dp; */
188 if (dirp -> dd_cp == NULL)
189 return NULL;
190
191 /*strcpy(dp.d_name,dirp->dd_cp->_d_entry); */
192
193 dp.d_name = dirp->dd_cp->_d_entry;
194
195 dp.d_namlen = dp.d_reclen =
196 strlen(dp.d_name);
197
198 dp.d_ino = dirp->dd_loc+1; /* fake the inode */
199
200 dirp -> dd_cp = dirp -> dd_cp -> _d_next;
201 dirp -> dd_loc++;
202
203
204 return &dp;
205 }
206
207 void seekdir(DIR * dirp, long off)
208 {
209 long i = off;
210 struct _dircontents *dp;
211
212 if (off >= 0)
213 {
214 for (dp = dirp -> dd_contents; --i >= 0 && dp; dp = dp -> _d_next);
215
216 dirp -> dd_loc = off - (i + 1);
217 dirp -> dd_cp = dp;
218 }
219 }
220
221
222 long telldir(DIR * dirp)
223 {
224 return dirp -> dd_loc;
225 }
226
227 static void free_dircontents(struct _dircontents * dp)
228 {
229 struct _dircontents *odp;
230
231 while (dp)
232 {
233 if (dp -> _d_entry)
234 free(dp -> _d_entry);
235
236 dp = (odp = dp) -> _d_next;
237 free(odp);
238 }
239 }
240 /* end of "free_dircontents" */
241
242 static char *getdirent(char *dir)
243 {
244 int got_dirent;
245
246 if (dir != NULL)
247 { /* get first entry */
248 if ((FindHandle = FindFirstFile( dir, &FileFindData ))
249 == (HDIR)0xffffffff)
250 {
251 return NULL;
252 }
253 got_dirent = 1;
254 }
255 else /* get next entry */
256 got_dirent = FindNextFile( FindHandle, &FileFindData );
257
258 if (got_dirent)
259 return FileFindData.cFileName;
260 else
261 {
262 FindClose(FindHandle);
263 return NULL;
264 }
265 }
266 /* end of getdirent() */
267
268 struct passwd * _cdecl
269 getpwnam(char *name)
270 {
271 return NULL;
272 }
273
274 struct passwd * _cdecl
275 getpwuid(int uid)
276 {
277 return NULL;
278 }
279
280 int
281 getuid()
282 {
283 return 0;
284 }
285
286 void _cdecl
287 endpwent(void)
288 {
289 }
290
291 /* #endif */

  ViewVC Help
Powered by ViewVC 1.1.22