Author: Armin Rigo <ar...@tunes.org> Branch: cffi-1.0 Changeset: r1680:3fba04d45c38 Date: 2015-04-08 08:58 +0200 http://bitbucket.org/cffi/cffi/changeset/3fba04d45c38/
Log: Quick and dirty hack to get started diff --git a/cffi/api.py b/cffi/api.py --- a/cffi/api.py +++ b/cffi/api.py @@ -371,6 +371,31 @@ self._libraries.append(lib) return lib + def csource(self, modulename, source='', **kwargs): + if hasattr(self, '_csource'): + raise ValueError("can't call csource() more than once") + self._csource = (modulename, source, kwargs) + + def recompile(self): + from .verifier import Verifier + if self._windows_unicode: + self._apply_windows_unicode(kwargs) + modulename, source, kwargs = self._csource + verifier = Verifier(self, source, modulename=modulename+'_ffi', + tmpdir='.', **kwargs) + verifier.compile_module() + f = open(modulename + '.py', 'w') + print >> f, 'import os, cffi as _cffi' + print >> f, 'ffi = _cffi.FFI()' + for cdef in self._cdefsources: + print >> f + print >> f, 'ffi.cdef(%r)' % (cdef,) + print >> f + print >> f, 'lib = ffi.verify(' + print >> f, ' tmpdir=os.path.dirname(__file__), modulename=%r)' % ( + modulename + '_ffi',) + f.close() + def _get_errno(self): return self._backend.get_errno() def _set_errno(self, errno): diff --git a/demo/bsdopendirtype.py b/demo/bsdopendirtype.py --- a/demo/bsdopendirtype.py +++ b/demo/bsdopendirtype.py @@ -1,22 +1,4 @@ -from cffi import FFI - -ffi = FFI() -ffi.cdef(""" - typedef ... DIR; - struct dirent { - unsigned char d_type; /* type of file */ - char d_name[]; /* filename */ - ...; - }; - DIR *opendir(const char *name); - int closedir(DIR *dirp); - struct dirent *readdir(DIR *dirp); - static const int DT_BLK, DT_CHR, DT_DIR, DT_FIFO, DT_LNK, DT_REG, DT_SOCK; -""") -lib = ffi.verify(""" - #include <sys/types.h> - #include <dirent.h> -""") +from _bsdopendirtype import ffi, lib def _posix_error(): @@ -60,3 +42,7 @@ yield name, smode finally: lib.closedir(dirp) + +if __name__ == '__main__': + for name, smode in opendir('/tmp'): + print hex(smode), name diff --git a/demo/bsdopendirtype_setup.py b/demo/bsdopendirtype_setup.py new file mode 100644 --- /dev/null +++ b/demo/bsdopendirtype_setup.py @@ -0,0 +1,22 @@ +from cffi import FFI + +ffi = FFI() +ffi.csource("_bsdopendirtype", """ + #include <sys/types.h> + #include <dirent.h> +""") +ffi.cdef(""" + typedef ... DIR; + struct dirent { + unsigned char d_type; /* type of file */ + char d_name[]; /* filename */ + ...; + }; + DIR *opendir(const char *name); + int closedir(DIR *dirp); + struct dirent *readdir(DIR *dirp); + static const int DT_BLK, DT_CHR, DT_DIR, DT_FIFO, DT_LNK, DT_REG, DT_SOCK; +""") + +if __name__ == '__main__': + ffi.recompile() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit