mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Refactor the Windows specific and POSIX specific implementations of
listdir into two separate coherent functions rather than interleaved #ifdef's.
This commit is contained in:
		
							parent
							
								
									e25df59427
								
							
						
					
					
						commit
						16ea14a690
					
				
					 1 changed files with 46 additions and 23 deletions
				
			
		|  | @ -3249,15 +3249,14 @@ On some platforms, path may also be specified as an open file descriptor;\n\ | |||
|   the file descriptor must refer to a directory.\n\ | ||||
|   If this functionality is unavailable, using it raises NotImplementedError."); | ||||
| 
 | ||||
| #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) | ||||
| static PyObject * | ||||
| posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) | ||||
| _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) | ||||
| { | ||||
|     path_t path; | ||||
|     PyObject *list = NULL; | ||||
|     static char *keywords[] = {"path", NULL}; | ||||
|     int fd = -1; | ||||
| 
 | ||||
| #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) | ||||
|     PyObject *v; | ||||
|     HANDLE hFindFile = INVALID_HANDLE_VALUE; | ||||
|     BOOL result; | ||||
|  | @ -3268,28 +3267,16 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) | |||
|     Py_ssize_t len = sizeof(namebuf)-5; | ||||
|     PyObject *po = NULL; | ||||
|     wchar_t *wnamebuf = NULL; | ||||
| #else | ||||
|     PyObject *v; | ||||
|     DIR *dirp = NULL; | ||||
|     struct dirent *ep; | ||||
|     int return_str; /* if false, return bytes */ | ||||
| #endif | ||||
| 
 | ||||
|     memset(&path, 0, sizeof(path)); | ||||
|     path.function_name = "listdir"; | ||||
|     path.nullable = 1; | ||||
| #ifdef HAVE_FDOPENDIR | ||||
|     path.allow_fd = 1; | ||||
|     path.fd = -1; | ||||
| #endif | ||||
|     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords, | ||||
|         path_converter, &path | ||||
|         )) | ||||
|         return NULL; | ||||
| 
 | ||||
|     /* XXX Should redo this putting the (now four) versions of opendir
 | ||||
|        in separate files instead of having them all here... */ | ||||
| #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) | ||||
|     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords, | ||||
|                                      path_converter, &path)) { | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     if (!path.narrow) { | ||||
|         WIN32_FIND_DATAW wFileData; | ||||
|         wchar_t *po_wchars; | ||||
|  | @ -3429,7 +3416,34 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) | |||
| 
 | ||||
|     return list; | ||||
| 
 | ||||
| #else | ||||
| }  /* end of _listdir_windows_no_opendir */ | ||||
| 
 | ||||
| #else  /* thus POSIX, ie: not (MS_WINDOWS and not HAVE_OPENDIR) */ | ||||
| 
 | ||||
| static PyObject * | ||||
| _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) | ||||
| { | ||||
|     path_t path; | ||||
|     PyObject *list = NULL; | ||||
|     static char *keywords[] = {"path", NULL}; | ||||
|     int fd = -1; | ||||
| 
 | ||||
|     PyObject *v; | ||||
|     DIR *dirp = NULL; | ||||
|     struct dirent *ep; | ||||
|     int return_str; /* if false, return bytes */ | ||||
| 
 | ||||
|     memset(&path, 0, sizeof(path)); | ||||
|     path.function_name = "listdir"; | ||||
|     path.nullable = 1; | ||||
| #ifdef HAVE_FDOPENDIR | ||||
|     path.allow_fd = 1; | ||||
|     path.fd = -1; | ||||
| #endif | ||||
|     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords, | ||||
|                                      path_converter, &path)) { | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     errno = 0; | ||||
| #ifdef HAVE_FDOPENDIR | ||||
|  | @ -3522,9 +3536,18 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) | |||
|     path_cleanup(&path); | ||||
| 
 | ||||
|     return list; | ||||
| }  /* end of _posix_listdir */ | ||||
| #endif  /* which OS */ | ||||
| 
 | ||||
| #endif /* which OS */ | ||||
| }  /* end of posix_listdir */ | ||||
| static PyObject * | ||||
| posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) | ||||
| { | ||||
| #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) | ||||
|     return _listdir_windows_no_opendir(self, args, kwargs); | ||||
| #else | ||||
|     return _posix_listdir(self, args, kwargs); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #ifdef MS_WINDOWS | ||||
| /* A helper function for abspath on win32 */ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gregory P. Smith
						Gregory P. Smith