dirent.c
上传用户:qin5330
上传日期:2007-01-05
资源大小:114k
文件大小:5k
源码类别:

搜索引擎

开发平台:

Perl

  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 <systypes.h> 
  29. #include <sysstat.h> 
  30. #include "dirent.h" 
  31. #define stat _stat
  32. /* 
  33.  * NT specific 
  34.  */ 
  35. #include <stdio.h> 
  36.  
  37. /* 
  38.  * random typedefs 
  39.  */ 
  40. #define HDIR        HANDLE 
  41. #define HFILE       HANDLE 
  42. #define PHFILE      PHANDLE 
  43.  
  44. /* 
  45.  * local functions 
  46.  */ 
  47. static char *getdirent(char *); 
  48. static void free_dircontents(struct _dircontents *); 
  49.  
  50. static HDIR FindHandle; 
  51. static WIN32_FIND_DATA FileFindData; 
  52.  
  53. static struct dirent dp; 
  54.  
  55. DIR *opendirx(char *name, char *pattern) 
  56.     struct stat statb; 
  57.     DIR *dirp; 
  58.     char c; 
  59.     char *s; 
  60.     struct _dircontents *dp; 
  61.     int len;
  62.     int unc;
  63.     char path[ OFS_MAXPATHNAME ]; 
  64.     register char *ip, *op;
  65.     for (ip = name, op = path; ; op++, ip++) {
  66. *op = *ip;
  67. if (*ip == '') {
  68. break;
  69. }
  70.     }
  71.     len = ip - name;
  72.     if (len > 0) {
  73. unc = ((path[0] == '\' || path[0] == '/') &&
  74. (path[1] == '\' || path[1] == '/'));
  75. c = path[len - 1];
  76. if (unc) {
  77. if (c != '\' && c != '/') {
  78. path[len] = '/';
  79. len++;
  80. path[len] ='';
  81. }
  82. } else {
  83. if ((c == '\' || c == '/') && (len > 1)) {
  84. len--;
  85. path[len] = '';
  86. if (path[len - 1] == ':' ) {
  87. path[len] = '/'; len++;
  88. path[len] = '.'; len++;
  89. path[len] = '';
  90. }
  91. } else if (c == ':' ) {
  92. path[len] = '.';
  93. len++;
  94. path[len] ='';
  95. }
  96. }
  97.     } else {
  98. unc = 0;
  99. path[0] = '.';
  100. path[1] = '';
  101. len = 1;
  102.     }
  103.     if (stat(path, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) {
  104. return NULL; 
  105.     }
  106.     dirp = malloc(sizeof(DIR));
  107.     if (dirp == NULL) {
  108. return dirp;
  109.     }
  110.     c = path[len - 1];
  111.     if (c == '.' ) {
  112. if (len == 1) {
  113. len--;
  114. } else {
  115. c = path[len - 2];
  116. if (c == '\' || c == ':') {
  117. len--;
  118. } else {
  119. path[len] = '/';
  120. len++;
  121. }
  122. }
  123.     } else if (!unc && ((len != 1) || (c != '\' && c != '/'))) {
  124. path[len] = '/';
  125. len++;
  126.     }
  127.     strcpy(path + len, pattern);
  128.     dirp -> dd_loc = 0; 
  129.     dirp -> dd_contents = dirp -> dd_cp = NULL; 
  130.     if ((s = getdirent(path)) == NULL) {
  131. return dirp;
  132.     }
  133.     do 
  134.     { 
  135. if (((dp = malloc(sizeof(struct _dircontents))) == NULL) || 
  136. ((dp -> _d_entry = malloc(strlen(s) + 1)) == NULL)      ) 
  137. if (dp) 
  138. free(dp); 
  139. free_dircontents(dirp -> dd_contents); 
  140. return NULL; 
  141. if (dirp -> dd_contents) 
  142. dirp -> dd_cp = dirp -> dd_cp -> _d_next = dp; 
  143. else 
  144. dirp -> dd_contents = dirp -> dd_cp = dp; 
  145. strcpy(dp -> _d_entry, s); 
  146. dp -> _d_next = NULL; 
  147.     } 
  148.     while ((s = getdirent(NULL)) != NULL); 
  149.     dirp -> dd_cp = dirp -> dd_contents; 
  150.     return dirp; 
  151.  
  152. DIR *opendir(char *name)
  153. {
  154. return opendirx(name, "*");
  155. void closedir(DIR * dirp) 
  156. free_dircontents(dirp -> dd_contents); 
  157. free(dirp); 
  158.  
  159. struct dirent *readdir(DIR * dirp) 
  160. /* static struct dirent dp; */ 
  161. if (dirp -> dd_cp == NULL) 
  162. return NULL; 
  163. /*strcpy(dp.d_name,dirp->dd_cp->_d_entry); */ 
  164. dp.d_name = dirp->dd_cp->_d_entry; 
  165. dp.d_namlen = dp.d_reclen = 
  166. strlen(dp.d_name); 
  167. dp.d_ino = dirp->dd_loc+1; /* fake the inode */ 
  168. dirp -> dd_cp = dirp -> dd_cp -> _d_next; 
  169. dirp -> dd_loc++; 
  170. return &dp; 
  171. void seekdir(DIR * dirp, long off) 
  172. long i = off; 
  173. struct _dircontents *dp; 
  174. if (off >= 0) 
  175. for (dp = dirp -> dd_contents; --i >= 0 && dp; dp = dp -> _d_next); 
  176. dirp -> dd_loc = off - (i + 1); 
  177. dirp -> dd_cp = dp; 
  178.  
  179.  
  180. long telldir(DIR * dirp) 
  181. return dirp -> dd_loc; 
  182. static void free_dircontents(struct _dircontents * dp) 
  183. struct _dircontents *odp; 
  184. while (dp) 
  185. if (dp -> _d_entry) 
  186. free(dp -> _d_entry); 
  187. dp = (odp = dp) -> _d_next; 
  188. free(odp); 
  189. /* end of "free_dircontents" */ 
  190. static char *getdirent(char *dir) 
  191.     int got_dirent; 
  192.     if (dir != NULL) 
  193.     {        /* get first entry */ 
  194. if ((FindHandle = FindFirstFile( dir, &FileFindData )) 
  195. == (HDIR)0xffffffff) 
  196. return NULL; 
  197. got_dirent = 1;
  198.     } 
  199.     else        /* get next entry */ 
  200. got_dirent = FindNextFile( FindHandle, &FileFindData ); 
  201.     if (got_dirent) 
  202. return FileFindData.cFileName; 
  203.     else 
  204.     { 
  205. FindClose(FindHandle); 
  206. return NULL; 
  207.     } 
  208. /* end of getdirent() */ 
  209. struct passwd * _cdecl
  210. getpwnam(char *name)
  211. {
  212.     return NULL;
  213. }
  214. struct passwd * _cdecl
  215. getpwuid(int uid)
  216. {
  217.     return NULL;
  218. }
  219. int
  220. getuid()
  221. {
  222.     return 0;
  223. }
  224. void _cdecl
  225. endpwent(void)
  226. {
  227. }
  228. /* #endif */