@@ -2869,23 +2869,21 @@ unicode_fromformat_arg(_PyUnicodeWriter *writer,
2869
2869
return f ;
2870
2870
}
2871
2871
2872
- PyObject *
2873
- PyUnicode_FromFormatV ( const char * format , va_list vargs )
2872
+ static int
2873
+ unicode_from_format ( _PyUnicodeWriter * writer , const char * format , va_list vargs )
2874
2874
{
2875
+ writer -> min_length += strlen (format ) + 100 ;
2876
+ writer -> overallocate = 1 ;
2877
+
2875
2878
va_list vargs2 ;
2876
2879
const char * f ;
2877
- _PyUnicodeWriter writer ;
2878
-
2879
- _PyUnicodeWriter_Init (& writer );
2880
- writer .min_length = strlen (format ) + 100 ;
2881
- writer .overallocate = 1 ;
2882
2880
2883
2881
// Copy varags to be able to pass a reference to a subfunction.
2884
2882
va_copy (vargs2 , vargs );
2885
2883
2886
2884
for (f = format ; * f ; ) {
2887
2885
if (* f == '%' ) {
2888
- f = unicode_fromformat_arg (& writer , f , & vargs2 );
2886
+ f = unicode_fromformat_arg (writer , f , & vargs2 );
2889
2887
if (f == NULL )
2890
2888
goto fail ;
2891
2889
}
@@ -2909,21 +2907,33 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
2909
2907
len = p - f ;
2910
2908
2911
2909
if (* p == '\0' )
2912
- writer . overallocate = 0 ;
2910
+ writer -> overallocate = 0 ;
2913
2911
2914
- if (_PyUnicodeWriter_WriteASCIIString (& writer , f , len ) < 0 )
2912
+ if (_PyUnicodeWriter_WriteASCIIString (writer , f , len ) < 0 )
2915
2913
goto fail ;
2916
2914
2917
2915
f = p ;
2918
2916
}
2919
2917
}
2920
2918
va_end (vargs2 );
2921
- return _PyUnicodeWriter_Finish ( & writer ) ;
2919
+ return 0 ;
2922
2920
2923
2921
fail :
2924
2922
va_end (vargs2 );
2925
- _PyUnicodeWriter_Dealloc (& writer );
2926
- return NULL ;
2923
+ return -1 ;
2924
+ }
2925
+
2926
+ PyObject *
2927
+ PyUnicode_FromFormatV (const char * format , va_list vargs )
2928
+ {
2929
+ _PyUnicodeWriter writer ;
2930
+ _PyUnicodeWriter_Init (& writer );
2931
+
2932
+ if (unicode_from_format (& writer , format , vargs ) < 0 ) {
2933
+ _PyUnicodeWriter_Dealloc (& writer );
2934
+ return NULL ;
2935
+ }
2936
+ return _PyUnicodeWriter_Finish (& writer );
2927
2937
}
2928
2938
2929
2939
PyObject *
@@ -2938,6 +2948,18 @@ PyUnicode_FromFormat(const char *format, ...)
2938
2948
return ret ;
2939
2949
}
2940
2950
2951
+ int
2952
+ PyUnicodeWriter_Format (PyUnicodeWriter * writer , const char * format , ...)
2953
+ {
2954
+ _PyUnicodeWriter * _writer = (_PyUnicodeWriter * )writer ;
2955
+
2956
+ va_list vargs ;
2957
+ va_start (vargs , format );
2958
+ int ret = unicode_from_format (_writer , format , vargs );
2959
+ va_end (vargs );
2960
+ return ret ;
2961
+ }
2962
+
2941
2963
static Py_ssize_t
2942
2964
unicode_get_widechar_size (PyObject * unicode )
2943
2965
{
@@ -13179,9 +13201,9 @@ _PyUnicodeWriter_Init(_PyUnicodeWriter *writer)
13179
13201
/* ASCII is the bare minimum */
13180
13202
writer -> min_char = 127 ;
13181
13203
13182
- /* use a value smaller than PyUnicode_1BYTE_KIND() so
13204
+ /* use a kind value smaller than PyUnicode_1BYTE_KIND so
13183
13205
_PyUnicodeWriter_PrepareKind() will copy the buffer. */
13184
- writer -> kind = 0 ;
13206
+ assert ( writer -> kind == 0 ) ;
13185
13207
assert (writer -> kind <= PyUnicode_1BYTE_KIND );
13186
13208
}
13187
13209
0 commit comments