Skip to content

Commit 68d2fe7

Browse files
committed
Add PyBytesWriter_GetRemaining()
1 parent 8f8aeb8 commit 68d2fe7

File tree

5 files changed

+39
-0
lines changed

5 files changed

+39
-0
lines changed

Doc/c-api/bytes.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,14 @@ PyBytesWriter
284284
On success, return non-``NULL`` buffer.
285285
On error, set an exception and return ``NULL``.
286286
287+
.. c:function:: Py_ssize_t PyBytesWriter_GetRemaining(PyBytesWriter *writer, void *buf)
288+
289+
Get the number of remaining bytes to write.
290+
291+
It is the difference between total allocated bytes (bytes allocated by
292+
:c:func:`PyBytesWriter_Create` and :c:func:`PyBytesWriter_Extend`) and the
293+
current position in the buffer.
294+
287295
.. c:function:: Py_ssize_t PyBytesWriter_GetAllocated(PyBytesWriter *writer)
288296
289297
Get the number of allocated bytes.

Include/cpython/bytesobject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ PyAPI_FUNC(PyObject*) PyBytesWriter_Finish(
5555
PyBytesWriter *writer,
5656
void *buf);
5757

58+
PyAPI_FUNC(Py_ssize_t) PyBytesWriter_GetRemaining(
59+
PyBytesWriter *writer,
60+
void *buf);
5861
PyAPI_FUNC(Py_ssize_t) PyBytesWriter_GetAllocated(
5962
PyBytesWriter *writer);
6063
PyAPI_FUNC(void*) PyBytesWriter_Extend(

Lib/test/test_capi/test_bytes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ def create_writer(self, alloc):
297297
def test_empty(self):
298298
# Test PyBytesWriter_Create()
299299
writer = self.create_writer(0)
300+
self.assertEqual(writer.get_remaining(), 0)
300301
self.assertEqual(writer.finish(), b'')
301302

302303
def test_write_bytes(self):
@@ -317,29 +318,34 @@ def test_extend(self):
317318
writer = self.create_writer(0)
318319
writer.extend(20, b'number=123456')
319320
writer.extend(0, b'')
321+
self.assertEqual(writer.get_remaining(), 7)
320322
self.assertEqual(writer.finish(), b'number=123456')
321323

322324
writer = self.create_writer(0)
323325
writer.extend(0, b'')
324326
writer.extend(20, b'number=123456')
327+
self.assertEqual(writer.get_remaining(), 7)
325328
self.assertEqual(writer.finish(), b'number=123456')
326329

327330
writer = self.create_writer(0)
328331
writer.extend(10, b'number=')
329332
writer.extend(10, b'123456')
333+
self.assertEqual(writer.get_remaining(), 7)
330334
self.assertEqual(writer.finish(), b'number=123456')
331335

332336
writer = self.create_writer(0)
333337
writer.extend(10, b'number=')
334338
writer.extend(0, b'')
335339
writer.extend(10, b'123456')
340+
self.assertEqual(writer.get_remaining(), 7)
336341
self.assertEqual(writer.finish(), b'number=123456')
337342

338343
writer = self.create_writer(0)
339344
writer.extend(10, b'number')
340345
writer.extend(10, b'=')
341346
writer.extend(10, b'123')
342347
writer.extend(10, b'456')
348+
self.assertEqual(writer.get_remaining(), 27)
343349
self.assertEqual(writer.finish(), b'number=123456')
344350

345351
def test_format(self):

Modules/_testcapi/bytes.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,19 @@ writer_extend(PyObject *self_raw, PyObject *args)
196196
}
197197

198198

199+
static PyObject*
200+
writer_get_remaining(PyObject *self_raw, PyObject *Py_UNUSED(args))
201+
{
202+
WriterObject *self = (WriterObject *)self_raw;
203+
if (writer_check(self) < 0) {
204+
return NULL;
205+
}
206+
207+
Py_ssize_t size = PyBytesWriter_GetRemaining(self->writer, self->buf);
208+
return PyLong_FromSsize_t(size);
209+
}
210+
211+
199212
static PyObject*
200213
writer_finish(PyObject *self_raw, PyObject *Py_UNUSED(args))
201214
{
@@ -214,6 +227,7 @@ static PyMethodDef writer_methods[] = {
214227
{"write_bytes", _PyCFunction_CAST(writer_write_bytes), METH_VARARGS},
215228
{"format_i", _PyCFunction_CAST(writer_format_i), METH_VARARGS},
216229
{"extend", _PyCFunction_CAST(writer_extend), METH_VARARGS},
230+
{"get_remaining", _PyCFunction_CAST(writer_get_remaining), METH_NOARGS},
217231
{"finish", _PyCFunction_CAST(writer_finish), METH_NOARGS},
218232
{NULL, NULL} /* sentinel */
219233
};

Objects/bytesobject.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3627,6 +3627,14 @@ PyBytesWriter_Finish(PyBytesWriter *writer, void *buf)
36273627
}
36283628

36293629

3630+
Py_ssize_t
3631+
PyBytesWriter_GetRemaining(PyBytesWriter *writer, void *buf)
3632+
{
3633+
Py_ssize_t pos = (char*)buf - byteswriter_start(writer);
3634+
return writer->size - pos;
3635+
}
3636+
3637+
36303638
Py_ssize_t
36313639
PyBytesWriter_GetAllocated(PyBytesWriter *writer)
36323640
{

0 commit comments

Comments
 (0)