PageRenderTime 24ms CodeModel.GetById 16ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/Lib/python/pybuffer.i

#
Swig | 107 lines | 45 code | 11 blank | 51 comment | 0 complexity | e9a347c68372c564c8283bc4337bab2f MD5 | raw file
  1/* Implementing buffer protocol typemaps */
  2
  3/* %pybuffer_mutable_binary(TYPEMAP, SIZE)
  4 *
  5 * Macro for functions accept mutable buffer pointer with a size.
  6 * This can be used for both input and output. For example:
  7 * 
  8 *      %pybuffer_mutable_binary(char *buff, int size);
  9 *      void foo(char *buff, int size) {
 10 *        for(int i=0; i<size; ++i)
 11 *          buff[i]++;  
 12 *      }
 13 */
 14
 15%define %pybuffer_mutable_binary(TYPEMAP, SIZE)
 16%typemap(in) (TYPEMAP, SIZE)
 17  (int res, Py_ssize_t size = 0, void *buf = 0) {
 18  res = PyObject_AsWriteBuffer($input, &buf, &size);
 19  if (res<0) {
 20    PyErr_Clear();
 21    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
 22  }
 23  $1 = ($1_ltype) buf;
 24  $2 = ($2_ltype) (size/sizeof($*1_type));
 25}
 26%enddef
 27
 28/* %pybuffer_mutable_string(TYPEMAP, SIZE)
 29 *
 30 * Macro for functions accept mutable zero terminated string pointer.
 31 * This can be used for both input and output. For example:
 32 * 
 33 *      %pybuffer_mutable_string(char *str);
 34 *      void foo(char *str) {
 35 *        while(*str) {
 36 *          *str = toupper(*str);
 37 *          str++;
 38 *      }
 39 */
 40
 41%define %pybuffer_mutable_string(TYPEMAP)
 42%typemap(in) (TYPEMAP)
 43  (int res, Py_ssize_t size = 0, void *buf = 0) {
 44  res = PyObject_AsWriteBuffer($input, &buf, &size);
 45  if (res<0) {
 46    PyErr_Clear();
 47    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
 48  }
 49  $1 = ($1_ltype) buf;
 50}
 51%enddef
 52
 53/* pybuffer_binary(TYPEMAP, SIZE)
 54 *
 55 * Macro for functions accept read only buffer pointer with a size.
 56 * This must be used for input. For example:
 57 * 
 58 *      %pybuffer_binary(char *buff, int size);
 59 *      int foo(char *buff, int size) {
 60 *        int count = 0;
 61 *        for(int i=0; i<size; ++i)
 62 *          if (0==buff[i]) count++;
 63 *        return count;
 64 *      }
 65 */
 66
 67%define %pybuffer_binary(TYPEMAP, SIZE)
 68%typemap(in) (TYPEMAP, SIZE)
 69  (int res, Py_ssize_t size = 0, const void *buf = 0) {
 70  res = PyObject_AsReadBuffer($input, &buf, &size);
 71  if (res<0) {
 72    PyErr_Clear();
 73    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
 74  }
 75  $1 = ($1_ltype) buf;
 76  $2 = ($2_ltype) (size / sizeof($*1_type));
 77}
 78%enddef
 79
 80/* %pybuffer_string(TYPEMAP, SIZE)
 81 *
 82 * Macro for functions accept read only zero terminated string pointer.
 83 * This can be used for input. For example:
 84 * 
 85 *      %pybuffer_string(char *str);
 86 *      int foo(char *str) {
 87 *        int count = 0;
 88 *        while(*str) {
 89 *          if (isalnum(*str))
 90 *            count++;
 91 *          str++;
 92 *      }
 93 */
 94
 95%define %pybuffer_string(TYPEMAP)
 96%typemap(in) (TYPEMAP)
 97  (int res, Py_ssize_t size = 0, const void *buf = 0) {
 98  res = PyObject_AsReadBuffer($input, &buf, &size);
 99  if (res<0) {
100    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
101  }
102  $1 = ($1_ltype) buf;
103}
104%enddef
105
106
107