136 return {EFormatStringSanStatus::NotEnoughSpecifiers,
CurArgPos};
141 while (*
Fmt != (CharType)
'\0' && *
Fmt != (CharType)
'%')
145 if (*
Fmt == (CharType)
'%')
151 if (*
Fmt == (CharType)
'\0')
155 return {EFormatStringSanStatus::IncompleteFormatSpecifierOrUnescapedPercent,
CurArgPos};
163 while (*
Fmt == (CharType)
'+' || *
Fmt == (CharType)
'#' || *
Fmt == (CharType)
' ' || *
Fmt == (CharType)
'0')
168 if (*
Fmt == (CharType)
'-')
172 if (*
Fmt == (CharType)
'*')
181 if (*
Fmt == (CharType)
'.')
185 if (*
Fmt == (CharType)
'*')
194 if (
Fmt[0] == (CharType)
'l' &&
Fmt[1] == (CharType)
's')
198 return {EFormatStringSanStatus::LSNeedsDereferencedWideString,
CurArgPos};
202 return {EFormatStringSanStatus::LSNeedsPtrButGotChar,
CurArgPos};
206 return {EFormatStringSanStatus::LSNeedsWideCharPtrArg,
CurArgPos};
210 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::LSNeedsWideCharPtrArgButGotNarrowOnNarrowString : EFormatStringSanStatus::LSNeedsWideCharPtrArgButGotNarrowOnWideString,
CurArgPos};
217 else if (
Fmt[0] == (CharType)
'h' &&
Fmt[1] == (CharType)
's')
221 return {EFormatStringSanStatus::HSNeedsDereferencedNarrowString,
CurArgPos};
225 return {EFormatStringSanStatus::HSNeedsPtrButGotChar,
CurArgPos};
229 return {EFormatStringSanStatus::HSNeedsNarrowCharPtrArg,
CurArgPos};
233 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::HSNeedsNarrowCharPtrArgButGotWideOnNarrowString : EFormatStringSanStatus::HSNeedsNarrowCharPtrArgButGotWideOnWideString,
CurArgPos};
240 else if (
Fmt[0] == (CharType)
's')
244 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::SNeedsDereferencedNarrowString : EFormatStringSanStatus::SNeedsDereferencedWideString,
CurArgPos};
248 return {EFormatStringSanStatus::SNeedsPtrButGotChar,
CurArgPos};
252 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::SNeedsNarrowCharPtrArg : EFormatStringSanStatus::SNeedsWideCharPtrArg,
CurArgPos};
256 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::SNeedsNarrowCharPtrArgButGotWide : EFormatStringSanStatus::SNeedsWideCharPtrArgButGotNarrow,
CurArgPos};
263 else if (
Fmt[0] == (CharType)
'S')
267 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::CapitalSNeedsDereferencedWideString : EFormatStringSanStatus::CapitalSNeedsDereferencedNarrowString,
CurArgPos};
271 return {EFormatStringSanStatus::CapitalSNeedsPtrButGotChar,
CurArgPos};
275 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::CapitalSNeedsWideCharPtrArg : EFormatStringSanStatus::CapitalSNeedsNarrowCharPtrArg,
CurArgPos};
279 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::CapitalSNeedsWideCharPtrArgButGotNarrow : EFormatStringSanStatus::CapitalSNeedsNarrowCharPtrArgButGotWide,
CurArgPos};
292 if constexpr (!std::is_same_v<Arg, UTF8CHAR> && !(std::is_integral_v<Arg> &&
sizeof(Arg) <=
sizeof(
int)))
294 return {(
sizeof(CharType) == 1) ? EFormatStringSanStatus::CNeedsCharArgOnNarrowString : EFormatStringSanStatus::CNeedsCharArgOnWideString,
CurArgPos};
307 return {EFormatStringSanStatus::DNeedsIntegerArg,
CurArgPos};
311 return {EFormatStringSanStatus::DNeedsIntegerArg,
CurArgPos};
320 return {EFormatStringSanStatus::ZNeedsIntegerSpec,
CurArgPos};
324 return {EFormatStringSanStatus::ZNeedsIntegerArg,
CurArgPos};
331 if constexpr (!std::is_pointer_v<Arg>)
333 return {EFormatStringSanStatus::PNeedsPointerArg,
CurArgPos};
340 if (!(
Fmt[1] == (CharType)
'6' &&
Fmt[2] == (CharType)
'4'))
342 return {EFormatStringSanStatus::I64BadSpec,
CurArgPos};
346 return {EFormatStringSanStatus::I64BadSpec,
CurArgPos};
350 return {EFormatStringSanStatus::I64NeedsIntegerArg,
CurArgPos};
362 return {EFormatStringSanStatus::LNeedsIntegerArg,
CurArgPos};
369 else if (
Fmt[1] == (CharType)
'f')
373 return {EFormatStringSanStatus::FNeedsFloatOrDoubleArg,
CurArgPos};
380 else if (
Fmt[1] != (CharType)
'l')
382 return {EFormatStringSanStatus::InvalidFormatSpec,
CurArgPos};
386 return {EFormatStringSanStatus::LLNeedsIntegerSpec,
CurArgPos};
390 return {EFormatStringSanStatus::LLNeedsIntegerArg,
CurArgPos};
402 return {EFormatStringSanStatus::HNeedsIntegerArg,
CurArgPos};
406 else if (
Fmt[1] != (CharType)
'h')
408 return {EFormatStringSanStatus::InvalidFormatSpec,
CurArgPos};
412 return {EFormatStringSanStatus::HHNeedsIntegerSpec,
CurArgPos};
416 return {EFormatStringSanStatus::HHNeedsIntegerArg,
CurArgPos};
428 return {EFormatStringSanStatus::FNeedsFloatOrDoubleArg,
CurArgPos};
436 return {EFormatStringSanStatus::IncompleteFormatSpecifierOrUnescapedPercent,
CurArgPos};
439 return {EFormatStringSanStatus::InvalidFormatSpec,
CurArgPos};