contrib/python-zstandard/c-ext/compressionwriter.c
changeset 30895 c32454d69b85
parent 30822 b54a2984cdd4
child 31796 e0dc40530c5a
equal deleted inserted replaced
30894:5b60464efbde 30895:c32454d69b85
    50 	size_t zresult;
    50 	size_t zresult;
    51 
    51 
    52 	ZSTD_outBuffer output;
    52 	ZSTD_outBuffer output;
    53 	PyObject* res;
    53 	PyObject* res;
    54 
    54 
    55 	if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) {
    55 	if (!PyArg_ParseTuple(args, "OOO:__exit__", &exc_type, &exc_value, &exc_tb)) {
    56 		return NULL;
    56 		return NULL;
    57 	}
    57 	}
    58 
    58 
    59 	self->entered = 0;
    59 	self->entered = 0;
    60 
    60 
   117 	Py_ssize_t sourceSize;
   117 	Py_ssize_t sourceSize;
   118 	size_t zresult;
   118 	size_t zresult;
   119 	ZSTD_inBuffer input;
   119 	ZSTD_inBuffer input;
   120 	ZSTD_outBuffer output;
   120 	ZSTD_outBuffer output;
   121 	PyObject* res;
   121 	PyObject* res;
   122 
   122 	Py_ssize_t totalWrite = 0;
   123 #if PY_MAJOR_VERSION >= 3
   123 
   124 	if (!PyArg_ParseTuple(args, "y#", &source, &sourceSize)) {
   124 #if PY_MAJOR_VERSION >= 3
   125 #else
   125 	if (!PyArg_ParseTuple(args, "y#:write", &source, &sourceSize)) {
   126 	if (!PyArg_ParseTuple(args, "s#", &source, &sourceSize)) {
   126 #else
       
   127 	if (!PyArg_ParseTuple(args, "s#:write", &source, &sourceSize)) {
   127 #endif
   128 #endif
   128 		return NULL;
   129 		return NULL;
   129 	}
   130 	}
   130 
   131 
   131 	if (!self->entered) {
   132 	if (!self->entered) {
   162 #else
   163 #else
   163 			res = PyObject_CallMethod(self->writer, "write", "s#",
   164 			res = PyObject_CallMethod(self->writer, "write", "s#",
   164 #endif
   165 #endif
   165 				output.dst, output.pos);
   166 				output.dst, output.pos);
   166 			Py_XDECREF(res);
   167 			Py_XDECREF(res);
       
   168 			totalWrite += output.pos;
   167 		}
   169 		}
   168 		output.pos = 0;
   170 		output.pos = 0;
   169 	}
   171 	}
   170 
   172 
   171 	PyMem_Free(output.dst);
   173 	PyMem_Free(output.dst);
   172 
   174 
   173 	/* TODO return bytes written */
   175 	return PyLong_FromSsize_t(totalWrite);
   174 	Py_RETURN_NONE;
       
   175 }
   176 }
   176 
   177 
   177 static PyObject* ZstdCompressionWriter_flush(ZstdCompressionWriter* self, PyObject* args) {
   178 static PyObject* ZstdCompressionWriter_flush(ZstdCompressionWriter* self, PyObject* args) {
   178 	size_t zresult;
   179 	size_t zresult;
   179 	ZSTD_outBuffer output;
   180 	ZSTD_outBuffer output;
   180 	PyObject* res;
   181 	PyObject* res;
       
   182 	Py_ssize_t totalWrite = 0;
   181 
   183 
   182 	if (!self->entered) {
   184 	if (!self->entered) {
   183 		PyErr_SetString(ZstdError, "flush must be called from an active context manager");
   185 		PyErr_SetString(ZstdError, "flush must be called from an active context manager");
   184 		return NULL;
   186 		return NULL;
   185 	}
   187 	}
   213 #else
   215 #else
   214 			res = PyObject_CallMethod(self->writer, "write", "s#",
   216 			res = PyObject_CallMethod(self->writer, "write", "s#",
   215 #endif
   217 #endif
   216 				output.dst, output.pos);
   218 				output.dst, output.pos);
   217 			Py_XDECREF(res);
   219 			Py_XDECREF(res);
       
   220 			totalWrite += output.pos;
   218 		}
   221 		}
   219 		output.pos = 0;
   222 		output.pos = 0;
   220 	}
   223 	}
   221 
   224 
   222 	PyMem_Free(output.dst);
   225 	PyMem_Free(output.dst);
   223 
   226 
   224 	/* TODO return bytes written */
   227 	return PyLong_FromSsize_t(totalWrite);
   225 	Py_RETURN_NONE;
       
   226 }
   228 }
   227 
   229 
   228 static PyMethodDef ZstdCompressionWriter_methods[] = {
   230 static PyMethodDef ZstdCompressionWriter_methods[] = {
   229 	{ "__enter__", (PyCFunction)ZstdCompressionWriter_enter, METH_NOARGS,
   231 	{ "__enter__", (PyCFunction)ZstdCompressionWriter_enter, METH_NOARGS,
   230 	PyDoc_STR("Enter a compression context.") },
   232 	PyDoc_STR("Enter a compression context.") },