Author: Armin Rigo <[email protected]>
Branch: cffi-1.0
Changeset: r1879:28be0615f2f3
Date: 2015-04-29 20:14 +0200
http://bitbucket.org/cffi/cffi/changeset/28be0615f2f3/

Log:    A demo using ffi.include() --- which doesn't work right now

diff --git a/demo/recopendirtype.py b/demo/recopendirtype.py
new file mode 100644
--- /dev/null
+++ b/demo/recopendirtype.py
@@ -0,0 +1,50 @@
+from _recopendirtype import ffi, lib
+
+
+def _posix_error():
+    raise OSError(ffi.errno, os.strerror(ffi.errno))
+
+_dtype_to_smode = {
+    lib.DT_BLK:  0o060000,
+    lib.DT_CHR:  0o020000,
+    lib.DT_DIR:  0o040000,
+    lib.DT_FIFO: 0o010000,
+    lib.DT_LNK:  0o120000,
+    lib.DT_REG:  0o100000,
+    lib.DT_SOCK: 0o140000,
+}
+
+def opendir(dir):
+    if len(dir) == 0:
+        dir = '.'
+    dirname = dir
+    if not dirname.endswith('/'):
+        dirname += '/'
+    dirp = lib.opendir(dir)
+    if dirp == ffi.NULL:
+        raise _posix_error()
+    dirent = ffi.new("struct dirent *")
+    result = ffi.new("struct dirent **")
+    try:
+        while True:
+            ffi.errno = 0
+            err = lib.readdir_r(dirp, dirent, result)
+            if err:       # really got an error
+                raise OSError(err, os.strerror(err))
+            if result[0] == ffi.NULL:
+                return    # 
+            name = ffi.string(dirent.d_name)
+            if name == '.' or name == '..':
+                continue
+            name = dirname + name
+            try:
+                smode = _dtype_to_smode[dirent.d_type]
+            except KeyError:
+                smode = os.lstat(name).st_mode
+            yield name, smode
+    finally:
+        lib.closedir(dirp)
+
+if __name__ == '__main__':
+    for name, smode in opendir('/tmp'):
+        print hex(smode), name
diff --git a/demo/recopendirtype_build.py b/demo/recopendirtype_build.py
new file mode 100644
--- /dev/null
+++ b/demo/recopendirtype_build.py
@@ -0,0 +1,19 @@
+from cffi import FFI
+import bsdopendirtype_build
+
+ffi = FFI()
+
+# ========== This is a demo of ffi.include() ==========
+ffi.include(bsdopendirtype_build.ffi)
+
+ffi.cdef("""
+    int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
+""")
+
+ffi.set_source("_recopendirtype", """
+    #include <sys/types.h>
+    #include <dirent.h>
+""")
+
+if __name__ == '__main__':
+    ffi.compile()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to