@@ -3383,7 +3383,7 @@ _PyBytesWriter_Init(_PyBytesWriter *writer)
3383
3383
#endif
3384
3384
}
3385
3385
3386
-
3386
+ /*
3387
3387
PyBytesWriter* PyBytesWriter_Create(Py_ssize_t size, char **pstr)
3388
3388
{
3389
3389
_PyBytesWriter *writer = PyMem_Malloc(sizeof(_PyBytesWriter));
@@ -3405,22 +3405,22 @@ PyBytesWriter* PyBytesWriter_Create(Py_ssize_t size, char **pstr)
3405
3405
*pstr = str;
3406
3406
return (PyBytesWriter*)writer;
3407
3407
}
3408
-
3408
+ */
3409
3409
3410
3410
void
3411
3411
_PyBytesWriter_Dealloc (_PyBytesWriter * writer )
3412
3412
{
3413
3413
Py_CLEAR (writer -> buffer );
3414
3414
}
3415
3415
3416
-
3416
+ /*
3417
3417
void
3418
3418
PyBytesWriter_Discard(PyBytesWriter *writer)
3419
3419
{
3420
3420
_PyBytesWriter_Dealloc((_PyBytesWriter*)writer);
3421
3421
PyMem_Free(writer);
3422
3422
}
3423
-
3423
+ */
3424
3424
3425
3425
Py_LOCAL_INLINE (char * )
3426
3426
_PyBytesWriter_AsString (_PyBytesWriter * writer )
@@ -3593,7 +3593,7 @@ _PyBytesWriter_Prepare(_PyBytesWriter *writer, void *str, Py_ssize_t size)
3593
3593
return str ;
3594
3594
}
3595
3595
3596
-
3596
+ /*
3597
3597
int
3598
3598
PyBytesWriter_Prepare(PyBytesWriter *writer, char **str, Py_ssize_t size)
3599
3599
{
@@ -3609,6 +3609,7 @@ PyBytesWriter_Prepare(PyBytesWriter *writer, char **str, Py_ssize_t size)
3609
3609
*str = str2;
3610
3610
return 0;
3611
3611
}
3612
+ */
3612
3613
3613
3614
3614
3615
/* Allocate the buffer to write size bytes.
@@ -3688,14 +3689,15 @@ _PyBytesWriter_Finish(_PyBytesWriter *writer, void *str)
3688
3689
return result ;
3689
3690
}
3690
3691
3691
-
3692
+ /*
3692
3693
PyObject *
3693
3694
PyBytesWriter_Finish(PyBytesWriter *writer, char *str)
3694
3695
{
3695
3696
PyObject *res = _PyBytesWriter_Finish((_PyBytesWriter*)writer, str);
3696
3697
PyMem_Free(writer);
3697
3698
return res;
3698
3699
}
3700
+ */
3699
3701
3700
3702
3701
3703
void *
@@ -3714,7 +3716,7 @@ _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, void *ptr,
3714
3716
return str ;
3715
3717
}
3716
3718
3717
-
3719
+ /*
3718
3720
int
3719
3721
PyBytesWriter_WriteBytes(PyBytesWriter *writer, char **str,
3720
3722
const void *bytes, Py_ssize_t size)
@@ -3728,7 +3730,7 @@ PyBytesWriter_WriteBytes(PyBytesWriter *writer, char **str,
3728
3730
*str = str2;
3729
3731
return 0;
3730
3732
}
3731
-
3733
+ */
3732
3734
3733
3735
void
3734
3736
_PyBytes_Repeat (char * dest , Py_ssize_t len_dest ,
@@ -3753,3 +3755,78 @@ _PyBytes_Repeat(char* dest, Py_ssize_t len_dest,
3753
3755
}
3754
3756
}
3755
3757
3758
+ static inline char * _PyBytesWriter_AS_STRING (PyObject * op )
3759
+ {
3760
+ return _Py_CAST (PyBytesObject * , op )-> ob_sval ;
3761
+ }
3762
+
3763
+ // Create a bytes writer instance.
3764
+ PyBytesWriter * PyBytesWriter_Create (Py_ssize_t size , char * * str ) {
3765
+ if (size < 0 ) {
3766
+ size = 0 ;
3767
+ }
3768
+ PyObject * res = PyBytes_FromStringAndSize (NULL , size );
3769
+ if (!res ) return NULL ;
3770
+ Py_SET_TYPE (res , NULL );
3771
+ * str = _PyBytesWriter_AS_STRING (res );
3772
+ return (PyBytesWriter * )res ;
3773
+ }
3774
+
3775
+ // Return the final Python bytes object and destroy the writer instance.
3776
+ PyObject * PyBytesWriter_Finish (PyBytesWriter * writer , char * str ) {
3777
+ PyObject * o = (PyObject * )writer ;
3778
+ assert (Py_TYPE (o ) == NULL );
3779
+ Py_ssize_t size_written = str - _PyBytesWriter_AS_STRING (o );
3780
+ Py_SET_TYPE (o , & PyBytes_Type );
3781
+ if (size_written == Py_SIZE (o )) {
3782
+ return o ;
3783
+ }
3784
+ PyObject * res = PyBytes_FromStringAndSize (_PyBytesWriter_AS_STRING (o ), size_written );
3785
+ Py_DECREF (o );
3786
+ return res ;
3787
+ }
3788
+
3789
+ // Discard the internal bytes buffer and destroy the writer instance.
3790
+ void PyBytesWriter_Discard (PyBytesWriter * writer ) {
3791
+ PyObject * o = (PyObject * )writer ;
3792
+ Py_SET_TYPE (o , & PyBytes_Type );
3793
+ Py_DECREF (o );
3794
+ }
3795
+
3796
+ // Allocate *size* bytes to prepare writing *size* bytes into *writer*.
3797
+ int PyBytesWriter_Prepare (PyBytesWriter * * writer , char * * str , Py_ssize_t size ) {
3798
+ if (size < 0 ) {
3799
+ PyErr_SetString (PyExc_ValueError , "PyBytesWriter: size must not be negative" );
3800
+ return -1 ;
3801
+ }
3802
+ PyObject * o = (PyObject * )* writer ;
3803
+ Py_ssize_t size_written = * str - _PyBytesWriter_AS_STRING (o );
3804
+ assert (size_written >= 0 );
3805
+ Py_ssize_t size_left = Py_SIZE (o ) - size_written ;
3806
+ assert (size_left >= 0 );
3807
+ if (size_left >= size ) {
3808
+ return 0 ;
3809
+ }
3810
+ char * new_str ;
3811
+ PyBytesWriter * new_writer = PyBytesWriter_Create (size_written + size , & new_str );
3812
+ if (!new_writer ) {
3813
+ return -1 ;
3814
+ }
3815
+ memcpy (new_str , _PyBytesWriter_AS_STRING (o ), size_written );
3816
+ * str = new_str + size_written ;
3817
+ Py_SET_TYPE (new_writer , NULL );
3818
+ Py_SET_TYPE (o , & PyBytes_Type );
3819
+ Py_SETREF (* writer , new_writer );
3820
+ return 0 ;
3821
+ }
3822
+
3823
+ // Write a the bytes string *bytes* of *size* bytes into *writer*.
3824
+ int PyBytesWriter_WriteBytes (PyBytesWriter * * writer , char * * str , const void * bytes , Py_ssize_t size ) {
3825
+ if (PyBytesWriter_Prepare (writer , str , size ) == -1 ) {
3826
+ return -1 ;
3827
+ }
3828
+ memcpy (* str , bytes , size );
3829
+ * str += size ;
3830
+ return 0 ;
3831
+ }
3832
+
0 commit comments