From: <zy...@us...> - 2008-10-12 00:25:12
|
Revision: 5378 http://jython.svn.sourceforge.net/jython/?rev=5378&view=rev Author: zyasoft Date: 2008-10-12 00:25:07 +0000 (Sun, 12 Oct 2008) Log Message: ----------- Missing module for previous commit! Added Paths: ----------- trunk/jython/src/org/python/modules/PyStruct.java Added: trunk/jython/src/org/python/modules/PyStruct.java =================================================================== --- trunk/jython/src/org/python/modules/PyStruct.java (rev 0) +++ trunk/jython/src/org/python/modules/PyStruct.java 2008-10-12 00:25:07 UTC (rev 5378) @@ -0,0 +1,88 @@ +package org.python.modules; + +import org.python.core.Py; +import org.python.core.PyArray; +import org.python.core.PyNewWrapper; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyTuple; +import org.python.core.PyType; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedNew; +import org.python.expose.ExposedType; + +@ExposedType(name = "Struct", base = PyObject.class) +public class PyStruct extends PyObject { + public static final PyType TYPE = PyType.fromClass(PyStruct.class); + + @ExposedGet + public final String format; + + @ExposedGet + public final int size; + + private final struct.FormatDef[] format_def; + + @ExposedGet(name = "__class__") + @Override + public PyType getType() { + return TYPE; + } + + public PyStruct(PyObject[] args, String[] keywords) { + final int nargs = args.length; + if (keywords.length > 0 ) { + for (String keyword : keywords) { + if (!keyword.equals("format")) { + throw Py.TypeError("'" + keyword + "' is an invalid keyword argument for this function"); + } + } + } + else if (nargs < 1 || nargs > 1) { + throw Py.TypeError("Struct() takes exactly 1 argument (" + nargs + " given)"); + } + format = args[0].toString(); + format_def = struct.whichtable(format); + size = struct.calcsize(format, format_def); + } + + @ExposedNew + final static PyObject Struct___new__ (PyNewWrapper new_, boolean init, + PyType subtype, PyObject[] args, String[] keywords) { + return new PyStruct(args, keywords); + } + + @ExposedMethod + public String pack(PyObject[] args, String[] kwds) { + return struct.pack(format, format_def, size, 0, args).toString(); + } + + @ExposedMethod + final void pack_into(PyObject[] args, String[] kwds) { + struct.pack_into(format, format_def, size, 0, args); + } + + @ExposedMethod + public PyTuple unpack(PyObject source) { + String s; + if (source instanceof PyString) + s = source.toString(); + else if (source instanceof PyArray) + s = ((PyArray)source).tostring(); + else + throw Py.TypeError("unpack of a str or array"); + if (size != s.length()) + throw struct.StructError("unpack str size does not match format"); + return struct.unpack(format_def, size, format, new struct.ByteStream(s)); + } + + // xxx - also support byte[], java.nio.(Byte)Buffer at some point? + @ExposedMethod(defaults = {"0"}) + public PyTuple unpack_from(PyObject string, int offset) { + String s = string.toString(); + if (size >= (s.length() - offset + 1)) + throw struct.StructError("unpack_from str size does not match format"); + return struct.unpack(format_def, size, format, new struct.ByteStream(s, offset)); + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |