@@ -177,10 +177,15 @@ int Length(DateTime dateTime)
177
177
}
178
178
179
179
var cultureDate = GetCultureDates ( culture ) ;
180
- var value = builder . AsSpan ( ) ;
181
180
var shortest = Length ( cultureDate . Short ) ;
182
181
var longest = Length ( cultureDate . Long ) ;
183
182
183
+ if ( builder . Length < shortest )
184
+ {
185
+ return ;
186
+ }
187
+
188
+ var value = builder . AsSpan ( ) ;
184
189
var builderIndex = 0 ;
185
190
if ( shortest == longest )
186
191
{
@@ -233,6 +238,61 @@ int Length(DateTime dateTime)
233
238
}
234
239
}
235
240
241
+ static void ReplaceVariableLength ( StringBuilder builder , string format , Counter counter , Culture culture , TryConvert tryConvertDate , int longest , int shortest )
242
+ {
243
+ var value = builder . AsSpan ( ) ;
244
+ var builderIndex = 0 ;
245
+ for ( var index = 0 ; index <= value . Length ; index ++ )
246
+ {
247
+ var found = false ;
248
+ for ( var length = longest ; length >= shortest ; length -- )
249
+ {
250
+ var end = index + length ;
251
+ if ( end > value . Length )
252
+ {
253
+ continue ;
254
+ }
255
+
256
+ var slice = value . Slice ( index , length ) ;
257
+ if ( tryConvertDate ( slice , format , counter , culture , out var convert ) )
258
+ {
259
+ builder . Overwrite ( convert , builderIndex , length ) ;
260
+ builderIndex += convert . Length ;
261
+ index += length - 1 ;
262
+ found = true ;
263
+ break ;
264
+ }
265
+ }
266
+
267
+ if ( found )
268
+ {
269
+ continue ;
270
+ }
271
+
272
+ builderIndex ++ ;
273
+ }
274
+ }
275
+
276
+ static void ReplaceFixedLength ( StringBuilder builder , string format , Counter counter , Culture culture , TryConvert tryConvertDate , int length )
277
+ {
278
+ var value = builder . AsSpan ( ) ;
279
+ var builderIndex = 0 ;
280
+ var increment = length - 1 ;
281
+ for ( var index = 0 ; index <= value . Length - length ; index ++ )
282
+ {
283
+ var slice = value . Slice ( index , length ) ;
284
+ if ( tryConvertDate ( slice , format , counter , culture , out var convert ) )
285
+ {
286
+ builder . Overwrite ( convert , builderIndex , length ) ;
287
+ builderIndex += convert . Length ;
288
+ index += increment ;
289
+ }
290
+ else
291
+ {
292
+ builderIndex ++ ;
293
+ }
294
+ }
295
+ }
236
296
internal static CultureDate GetCultureDates ( Culture culture )
237
297
{
238
298
if ( cultureDates . TryGetValue ( culture . Name , out var cultureDate ) ||
0 commit comments