<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>dirent.cpp Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.15 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center> <hr><h1>dirent.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/*</font> 00002 <font class="comment"></font> 00003 <font class="comment"> Implementation of POSIX directory browsing functions and types for Win32.</font> 00004 <font class="comment"></font> 00005 <font class="comment"> Kevlin Henney (mailto:kevlin@acm.org), March 1997.</font> 00006 <font class="comment"></font> 00007 <font class="comment"> Copyright Kevlin Henney, 1997. All rights reserved.</font> 00008 <font class="comment"></font> 00009 <font class="comment"> Permission to use, copy, modify, and distribute this software and its</font> 00010 <font class="comment"> documentation for any purpose is hereby granted without fee, provided</font> 00011 <font class="comment"> that this copyright and permissions notice appear in all copies and</font> 00012 <font class="comment"> derivatives, and that no charge may be made for the software and its</font> 00013 <font class="comment"> documentation except to cover cost of distribution.</font> 00014 <font class="comment"> </font> 00015 <font class="comment"> This software is supplied "as is" without express or implied warranty.</font> 00016 <font class="comment"></font> 00017 <font class="comment"> But that said, if there are any problems please get in touch.</font> 00018 <font class="comment"></font> 00019 <font class="comment">*/</font> 00020 00021 <font class="preprocessor">#include <dirent.h></font> 00022 <font class="preprocessor">#include <errno.h></font> 00023 <font class="preprocessor">#include <io.h></font> 00024 <font class="preprocessor">#include <stdlib.h></font> 00025 <font class="preprocessor">#include <string.h></font> 00026 00027 <font class="keyword">struct </font>DIR 00028 { 00029 <font class="keywordtype">long</font> handle; <font class="comment">/* -1 for failed rewind */</font> 00030 <font class="keyword">struct </font>_finddata_t info; 00031 <font class="keyword">struct </font>dirent result; <font class="comment">/* d_name null iff first time */</font> 00032 <font class="keywordtype">char</font> *name; <font class="comment">/* NTBS */</font> 00033 }; 00034 00035 DIR *opendir(<font class="keyword">const</font> <font class="keywordtype">char</font> *name) 00036 { 00037 DIR *dir = 0; 00038 00039 <font class="keywordflow">if</font>(name && name[0]) 00040 { 00041 size_t base_length = strlen(name); 00042 <font class="keyword">const</font> <font class="keywordtype">char</font> *all = <font class="comment">/* the root directory is a special case... */</font> 00043 strchr(<font class="stringliteral">"/\\"</font>, name[base_length - 1]) ? <font class="stringliteral">"*"</font> : <font class="stringliteral">"/*"</font>; 00044 00045 <font class="keywordflow">if</font>((dir = (DIR *) malloc(<font class="keyword">sizeof</font> *dir)) != 0 && 00046 (dir->name = (<font class="keywordtype">char</font> *) malloc(base_length + strlen(all) + 1)) != 0) 00047 { 00048 strcat(strcpy(dir->name, name), all); 00049 00050 <font class="keywordflow">if</font>((dir->handle = _findfirst(dir->name, &dir->info)) != -1) 00051 { 00052 dir->result.d_name = 0; 00053 } 00054 <font class="keywordflow">else</font> <font class="comment">/* rollback */</font> 00055 { 00056 free(dir->name); 00057 free(dir); 00058 dir = 0; 00059 } 00060 } 00061 <font class="keywordflow">else</font> <font class="comment">/* rollback */</font> 00062 { 00063 free(dir); 00064 dir = 0; 00065 errno = ENOMEM; 00066 } 00067 } 00068 <font class="keywordflow">else</font> 00069 { 00070 errno = EINVAL; 00071 } 00072 00073 <font class="keywordflow">return</font> dir; 00074 } 00075 00076 <font class="keywordtype">int</font> closedir(DIR *dir) 00077 { 00078 <font class="keywordtype">int</font> result = -1; 00079 00080 <font class="keywordflow">if</font>(dir) 00081 { 00082 <font class="keywordflow">if</font>(dir->handle != -1) 00083 { 00084 result = _findclose(dir->handle); 00085 } 00086 00087 free(dir->name); 00088 free(dir); 00089 } 00090 00091 <font class="keywordflow">if</font>(result == -1) <font class="comment">/* map all errors to EBADF */</font> 00092 { 00093 errno = EBADF; 00094 } 00095 00096 <font class="keywordflow">return</font> result; 00097 } 00098 00099 <font class="keyword">struct </font>dirent *readdir(DIR *dir) 00100 { 00101 <font class="keyword">struct </font>dirent *result = 0; 00102 00103 <font class="keywordflow">if</font>(dir && dir->handle != -1) 00104 { 00105 <font class="keywordflow">if</font>(!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1) 00106 { 00107 result = &dir->result; 00108 result->d_name = dir->info.name; 00109 } 00110 } 00111 <font class="keywordflow">else</font> 00112 { 00113 errno = EBADF; 00114 } 00115 00116 <font class="keywordflow">return</font> result; 00117 } 00118 00119 <font class="keywordtype">void</font> rewinddir(DIR *dir) 00120 { 00121 <font class="keywordflow">if</font>(dir && dir->handle != -1) 00122 { 00123 _findclose(dir->handle); 00124 dir->handle = _findfirst(dir->name, &dir->info); 00125 dir->result.d_name = 0; 00126 } 00127 <font class="keywordflow">else</font> 00128 { 00129 errno = EBADF; 00130 } 00131 } </pre></div><hr><address align="right"><small>Generated on Thu Jun 20 22:12:58 2002 for The Sword Project by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.15 </small></address> </body> </html>