Skip to content

Commit 3ba3023

Browse files
committed
Early return from date parsing if Length < shortest
1 parent ac8d03e commit 3ba3023

File tree

1 file changed

+61
-1
lines changed

1 file changed

+61
-1
lines changed

src/Verify/Serialization/Scrubbers/DateScrubber.cs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,15 @@ int Length(DateTime dateTime)
177177
}
178178

179179
var cultureDate = GetCultureDates(culture);
180-
var value = builder.AsSpan();
181180
var shortest = Length(cultureDate.Short);
182181
var longest = Length(cultureDate.Long);
183182

183+
if (builder.Length < shortest)
184+
{
185+
return;
186+
}
187+
188+
var value = builder.AsSpan();
184189
var builderIndex = 0;
185190
if (shortest == longest)
186191
{
@@ -233,6 +238,61 @@ int Length(DateTime dateTime)
233238
}
234239
}
235240

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+
}
236296
internal static CultureDate GetCultureDates(Culture culture)
237297
{
238298
if (cultureDates.TryGetValue(culture.Name, out var cultureDate) ||

0 commit comments

Comments
 (0)