Python wrapping: move some of the Pyrex definitions from tstools.pyx to

common.pxd, ready for when we have more than one .pyx file. Fiddle with
the rest.

--HG--
extra : convert_revision : svn%3Aeff31bef-be4a-0410-a8fe-e47997df2690/trunk%40110
issue20
tibs 2009-02-13 20:33:12 +00:00
rodzic 685b3b14bd
commit 47d7860fbe
5 zmienionych plików z 123 dodań i 115 usunięć

Wyświetl plik

@ -45,8 +45,8 @@ test: setup
.PHONY: clean
clean:
-rm tstools.so
-rm tstools/tstools.so
.PHONY: distclean
distclean: clean
-rm tstools.c
-rm tstools/tstools.c

Wyświetl plik

@ -29,27 +29,17 @@ from distutils.core import setup
from Pyrex.Distutils.extension import Extension
from Pyrex.Distutils import build_ext
sources = [ 'tstools/tstools.pyx' ]
tstools_ext = Extension("tstools/tstools",
sources,
include_dirs=['..'],
library_dirs=['../lib'],
libraries=['tstools'],
)
setup(
name = 'tstools',
ext_modules=[
Extension("tstools/tstools", ["tstools/tstools.pyx"],
include_dirs=['..'],
libraries=['tstools'],
library_dirs=['../lib'],
),
],
ext_modules=[tstools_ext],
cmdclass = {'build_ext': build_ext}
)
#setup(
# name = 'tstools',
# ext_modules=[
# Extension("tstools", ["tstools.pyx"],
# include_dirs=['..'],
# libraries=['tstools'],
# library_dirs=['../lib'],
# ),
# ],
# cmdclass = {'build_ext': build_ext}
#)

Wyświetl plik

@ -34,9 +34,6 @@ I can test most easily!
#
# ***** END LICENSE BLOCK *****
# For the moment, treat all entities in submodules as if they were at
# the top level
__all__ = ["tstools"]
# The following also makes available the "sys" and "array" modules as
# imported to tsools, so is probably not the best way to do it. Ho hum.
from tstools import *

Wyświetl plik

@ -0,0 +1,95 @@
"""common.pyd -- Common definitions
"""
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the MPEG TS, PS and ES tools.
#
# The Initial Developer of the Original Code is Amino Communications Ltd.
# Portions created by the Initial Developer are Copyright (C) 2008
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Tibs (tibs@berlios.de)
#
# ***** END LICENSE BLOCK *****
cdef extern from "stdio.h":
ctypedef struct FILE:
int _fileno
cdef enum:
EOF = -1
cdef FILE *stdout
# Associate a stream (returned) with an existing file descriptor.
# The specified mode must be compatible with the existing mode of
# the file descriptor. Closing the stream will close the descriptor
# as well.
cdef FILE *fdopen(int fildes, char *mode)
cdef FILE *fopen(char *path, char *mode)
cdef int fclose(FILE *stream)
cdef int fileno(FILE *stream)
cdef extern from "errno.h":
cdef int errno
cdef extern from "string.h":
cdef char *strerror(int errnum)
cdef extern from "stdlib.h":
cdef void free(void *ptr)
# From the Cython FAQ, but according to a useful message on the Pyrex mailing
# list, also applicable to Pyrex
cdef extern from *:
ctypedef void* const_void_ptr "const void*"
# Copied from the Pyrex documentation...
cdef extern from "Python.h":
# Return a new string object with a copy of the string v as value and
# length len on success, and NULL on failure. If v is NULL, the contents of
# the string are uninitialized.
object PyString_FromStringAndSize(char *v, int len)
# Return a NUL-terminated representation of the contents of the object obj
# through the output variables buffer and length.
#
# The function accepts both string and Unicode objects as input. For
# Unicode objects it returns the default encoded version of the object. If
# length is NULL, the resulting buffer may not contain NUL characters; if
# it does, the function returns -1 and a TypeError is raised.
#
# The buffer refers to an internal string buffer of obj, not a copy. The
# data must not be modified in any way, unless the string was just created
# using PyString_FromStringAndSize(NULL, size). It must not be deallocated.
# If string is a Unicode object, this function computes the default
# encoding of string and operates on that. If string is not a string object
# at all, PyString_AsStringAndSize() returns -1 and raises TypeError.
int PyString_AsStringAndSize(object obj, char **buffer, Py_ssize_t* length) except -1
# Returns a pointer to a read-only memory location containing arbitrary
# data. The obj argument must support the single-segment readable buffer
# interface. On success, returns 0, sets buffer to the memory location and
# buffer_len to the buffer length. Returns -1 and sets a TypeError on
# error.
int PyObject_AsReadBuffer(object obj, const_void_ptr *buffer, Py_ssize_t *buffer_len) except -1
# ----------------------------------------------------------------------
# vim: set filetype=python expandtab shiftwidth=4:
# [X]Emacs local variables declaration - place us into python mode
# Local Variables:
# mode:python
# py-indent-offset:4
# End:

Wyświetl plik

@ -37,89 +37,15 @@ I can test most easily!
import sys
import array
# If we're going to use definitions like this in more than one pyx file, we'll
# need to define the shared types in a .pxd file and use cimport to import
# them.
cdef extern from "stdio.h":
ctypedef struct FILE:
int _fileno
cdef enum:
EOF = -1
cdef FILE *stdout
# Associate a stream (returned) with an existing file descriptor.
# The specified mode must be compatible with the existing mode of
# the file descriptor. Closing the stream will close the descriptor
# as well.
cdef FILE *fdopen(int fildes, char *mode)
cdef FILE *fopen(char *path, char *mode)
cdef int fclose(FILE *stream)
cdef int fileno(FILE *stream)
cdef extern from "errno.h":
cdef int errno
cdef extern from "string.h":
cdef char *strerror(int errnum)
cdef extern from "stdlib.h":
cdef void free(void *ptr)
# From the Cython FAQ, but according to a useful message on the Pyrex mailing
# list, also applicable to Pyrex
cdef extern from *:
ctypedef void* const_void_ptr "const void*"
# Copied from the Pyrex documentation...
cdef extern from "Python.h":
# Return a new string object with a copy of the string v as value and
# length len on success, and NULL on failure. If v is NULL, the contents of
# the string are uninitialized.
object PyString_FromStringAndSize(char *v, int len)
# Return a NUL-terminated representation of the contents of the object obj
# through the output variables buffer and length.
#
# The function accepts both string and Unicode objects as input. For
# Unicode objects it returns the default encoded version of the object. If
# length is NULL, the resulting buffer may not contain NUL characters; if
# it does, the function returns -1 and a TypeError is raised.
#
# The buffer refers to an internal string buffer of obj, not a copy. The
# data must not be modified in any way, unless the string was just created
# using PyString_FromStringAndSize(NULL, size). It must not be deallocated.
# If string is a Unicode object, this function computes the default
# encoding of string and operates on that. If string is not a string object
# at all, PyString_AsStringAndSize() returns -1 and raises TypeError.
int PyString_AsStringAndSize(object obj, char **buffer, Py_ssize_t* length) except -1
# Returns a pointer to a read-only memory location containing arbitrary
# data. The obj argument must support the single-segment readable buffer
# interface. On success, returns 0, sets buffer to the memory location and
# buffer_len to the buffer length. Returns -1 and sets a TypeError on
# error.
int PyObject_AsReadBuffer(object obj, const_void_ptr *buffer, Py_ssize_t *buffer_len) except -1
from common cimport FILE, EOF, stdout, fopen, fclose, fileno
from common cimport errno, strerror, free
from common cimport const_void_ptr
from common cimport PyString_FromStringAndSize, PyString_AsStringAndSize, \
PyObject_AsReadBuffer
cdef extern from "Python.h":
FILE *PySys_GetFile(char *name, FILE *default)
#cdef FILE *convert_python_file(object file):
# """Given a Python file object, return an equivalent stream.
# There are *so many things* dodgy about doing this...
# """
# return PySys_GetFile('stdout',stdout)
#cdef int fileno
#cdef char *mode
#cdef FILE *stream
#fileno = file.fileno()
#mode = file.mode
#stream = fdopen(fileno, mode)
#if stream == NULL:
# raise TSToolsException, 'Error converting Python file to C FILE *'
#else:
# return stream
cdef extern from "stdint.h":
ctypedef unsigned char uint8_t
ctypedef unsigned uint16_t
@ -194,7 +120,7 @@ cdef extern from 'es_fns.h':
class TSToolsException(Exception):
pass
def hexify_array(bytes):
def _hexify_array(bytes):
"""Return a representation of an array of bytes as a hex values string.
"""
words = []
@ -202,7 +128,7 @@ def hexify_array(bytes):
words.append('\\x%02x'%val)
return ''.join(words)
cdef hexify_C_byte_array(byte *bytes, int bytes_len):
cdef _hexify_C_byte_array(byte *bytes, int bytes_len):
"""Return a representation of a (byte) array as a hex values string.
Doesn't leave any spaces between hex bytes.
@ -337,7 +263,7 @@ cdef class ESUnit:
return text
def __repr__(self):
return 'ESUnit("%s")'%hexify_C_byte_array(self.unit.data,self.unit.data_len)
return 'ESUnit("%s")'%_hexify_C_byte_array(self.unit.data,self.unit.data_len)
cdef __set_es_unit(self, ES_unit_p unit):
if self.unit == NULL:
@ -684,7 +610,7 @@ class ProgramStream(object):
return "PID %04x (%4d) -> Stream type %02x (%3d) ES info '%s'"%(\
self.elementary_PID,
self.stream_type,
hexify_array(self.es_info))
_hexify_array(self.es_info))
def __repr__(self):
@ -692,7 +618,7 @@ class ProgramStream(object):
"""
return "ProgramStream(%#02x,%#04x,'%s')"%(self.stream_type,
self.elementary_PID,
hexify_array(self.es_info))
_hexify_array(self.es_info))
def formatted(self):
"""Return a representation that is similar to that returned by the C tools.
@ -708,7 +634,7 @@ class ProgramStream(object):
self.stream_type)
# XXX should actually output them as descriptors
if self.es_info:
print "%s ES info '%s'"%(' '*indent,hexify_array(self.es_info))
print "%s ES info '%s'"%(' '*indent,_hexify_array(self.es_info))
# XXX Should this be an extension type, and enforce the datatypes it can hold?
# XXX Or is that just too much bother?
@ -761,7 +687,7 @@ class PMT(object):
return "PMT(%d,%d,%#04x,'%s')"%(self.program_number,
self.version_number,
self.PCR_pid,
hexify_array(self.program_info))
_hexify_array(self.program_info))
def formatted(self):
"""Return a representation that is similar to that returned by the C tools.
@ -776,7 +702,7 @@ class PMT(object):
self.PCR_pid)
# XXX should actually output them as descriptors
if self.program_info:
print " Program info '%s'"%hexify_array(self.program_info)
print " Program info '%s'"%_hexify_array(self.program_info)
if self.streams:
print " Program streams:"
for stream in self.streams:
@ -881,7 +807,7 @@ cdef class TSPacket:
return text
def __repr__(self):
return 'TSPacket("%s")'%hexify_array(self.data)
return 'TSPacket("%s")'%_hexify_array(self.data)
def __richcmp__(self,other,op):
if op == 2: # ==