############################################################## # # opendir.pyx - A class exposing the functionality of # =========== the opendir() family of C libary functions. # # By Gregory Ewing # greg.ewing@canterbury.ac.nz # # This software and derivative works created from it # may be used and redistributed without restriction. # ############################################################## cdef extern from "sys/errno.h": int errno cdef extern from "stdio.h": char *strerror(int) cdef extern from "dirent.h": ctypedef struct DIR struct dirent: int d_namlen char d_name[1] DIR *c_opendir "opendir" (char *) int readdir_r(DIR *, dirent *, dirent **) long telldir(DIR *) void seekdir(DIR *, long) void rewinddir(DIR *) int closedir(DIR *) int dirfd(DIR *) #------------------------------------------------------------------ cdef class opendir: """opendir(pathname) --> an open directory object Opens a directory and provides incremental access to the filenames it contains. May be used as a file-like object or as an iterator. When used as a file-like object, each call to read() returns one filename, or an empty string when the end of the directory is reached. The close() method should be called when finished with the directory. The close() method should also be called when used as an iterator and iteration is stopped prematurely. If iteration proceeds to completion, the directory is closed automatically.""" cdef DIR *dir def __cinit__(self, char *path): self.dir = c_opendir(path) if not self.dir: raise IOError(errno, "%s: '%s'" % (strerror(errno), path)) def __dealloc__(self): if self.dir: closedir(self.dir) def read(self): """read() --> filename or empty string Returns the next filename from the directory, or an empty string if the end of the directory has been reached.""" cdef dirent entry, *result check_open(self) if readdir_r(self.dir, &entry, &result) < 0: raise IOError(errno) if result: return entry.d_name else: return "" def tell(self): """tell() --> position Returns a value representing the current position in the directory, suitable for passing to tell(). Only valid for this directory object as long as it remains open.""" check_open(self) return telldir(self.dir) def seek(self, long pos): """seek(position) Returns the directory to the specified position, which should be a value previously returned by tell().""" check_open(self) seekdir(self.dir, pos) def rewind(self): """rewind() Resets the position to the beginning of the directory.""" check_open(self) rewinddir(self.dir) def close(self): """close() Closes the directory and frees the underlying file descriptor.""" if self.dir: if closedir(self.dir) < 0: raise IOError(errno) self.dir = NULL # MaxOSX doesn't seem to have dirfd, despite what the # man page says. :-( # # def fileno(self): # """fileno() --> file descriptor # # Returns the file descriptor associated with the open directory.""" # # check_open(self) # return dirfd(self.dir) def __iter__(self): return self def __next__(self): """next() --> filename Returns the next filename from the directory. If the end of the directory has been reached, closes the directory and raises StopIteration.""" if self.dir: result = self.read() if result: return result self.close() raise StopIteration #------------------------------------------------------------------ cdef int check_open(opendir d) except -1: if not d.dir: raise ValueError("Directory is closed") return 0 -15 21:41:43 +0200'>2008-10-15[PR] Change PR to FILE_PR and intro PR as FILE_PR + DISTRO_PRHolger Hans Peter Freyther8 2008-10-15mtn2git: remove .mtn2git_empty files in non-empty directoriesJan Luebbe3 2008-06-13util-macros-native: add 1.1.6Philipp Zabel1 2008-04-17util-macros: added forgotten patch for 1.1.6Marcin Juszkiewicz2 2008-03-15util-macros: add 1.1.6Philipp Zabel1 2007-08-17makedepend(-native): fix DEPENDS (taken from Poky) - close #2723Marcin Juszkiewicz2 2007-08-05Xorg: drop stale recipes X11R7* in PV. Those aren't needed anymore after the ...Koen Kooi15 2007-08-03makedepend-native: add DEPENDS on xproto-native - spotted by CroftonMarcin Juszkiewicz1 2007-08-02xorg mega commit: merge in change from pokyKoen Kooi9 2007-03-30util-macros: update -native to 1.1.5, needed for R7.2Koen Kooi1 2007-02-22util-macros: added patch to get it cross compiled (from poky)Marcin Juszkiewicz2 2007-02-22util-macros: added 1.1.5 from pokyMarcin Juszkiewicz1 2006-10-10Remove MAINTAINER fields from recipes, add MAINTAINER file to replace them.Koen Kooi3 2006-08-24xorg-util: use tar.bz2 sources instead of tar.gzPhilipp Zabel1 2006-08-05packages: sed -i s/^"include "/"require "/ */*.bb GNU sed rocks!Holger Freyther11 2006-07-24xorg-util: Update for X11R7.0 and X11R7.1.Raymond Danks14 2006-07-24xorg-*: Massive rename to conform to X11R7.x_a.b.c versioning and xorg-* dire...Raymond Danks3