24 bool uses_64bit_storage)
26 if (!Config::enable_integer)
28 return ResolvedField{.error = Error::ArgumentTypeMismatch};
30 if (uses_64bit_storage && !Config::enable_integer_64bit)
32 return ResolvedField{.error = Error::ArgumentTypeMismatch};
35 if (parsed.has_precision)
37 return ResolvedField{.error = Error::ArgumentTypeMismatch};
40 if (parsed.presentation ==
'c')
42 if (parsed.alternate ||
HasSignOption(parsed) || parsed.zero_pad)
44 return ResolvedField{.error = Error::ArgumentTypeMismatch};
47 .field =
MakeField(parsed, FormatType::Character, FormatPackKind::Character)};
54 return ResolvedField{.error = Error::ArgumentTypeMismatch};
58 return ResolvedField{.error = Error::ArgumentTypeMismatch};
65 parsed, uses_64bit_storage ? FormatType::Signed64 : FormatType::Signed32,
66 uses_64bit_storage ? FormatPackKind::I64 : FormatPackKind::I32)};
71 parsed, uses_64bit_storage ? FormatType::Unsigned64 : FormatType::Unsigned32,
72 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
75 if (!Config::enable_integer_base8_16 ||
HasSignOption(parsed))
77 return ResolvedField{.error = Error::ArgumentTypeMismatch};
80 switch (parsed.presentation)
85 parsed, uses_64bit_storage ? FormatType::Binary64 : FormatType::Binary32,
86 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
90 parsed, uses_64bit_storage ? FormatType::Binary64 : FormatType::Binary32,
91 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32,
true)};
95 parsed, uses_64bit_storage ? FormatType::Octal64 : FormatType::Octal32,
96 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
101 uses_64bit_storage ? FormatType::HexLower64 : FormatType::HexLower32,
102 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32)};
104 return ResolvedField{
107 uses_64bit_storage ? FormatType::HexUpper64 : FormatType::HexUpper32,
108 uses_64bit_storage ? FormatPackKind::U64 : FormatPackKind::U32,
true)};
110 return ResolvedField{.error = Error::ArgumentTypeMismatch};
139 if (parsed.presentation != 0 && parsed.presentation !=
'c')
141 return ResolvedField{.error = Error::ArgumentTypeMismatch};
143 if (parsed.alternate ||
HasSignOption(parsed) || parsed.zero_pad ||
144 parsed.has_precision)
146 return ResolvedField{.error = Error::ArgumentTypeMismatch};
148 if (!Config::enable_text)
150 return ResolvedField{.error = Error::ArgumentTypeMismatch};
153 ParsedField adjusted = parsed;
154 if (adjusted.align == Align::None)
156 adjusted.align = Align::Left;
159 return ResolvedField{
160 .field =
MakeField(adjusted, FormatType::Character, FormatPackKind::Character)};
172 if (parsed.presentation != 0 && parsed.presentation !=
's')
174 return ResolvedField{.error = Error::ArgumentTypeMismatch};
176 if (parsed.alternate ||
HasSignOption(parsed) || parsed.zero_pad)
178 return ResolvedField{.error = Error::ArgumentTypeMismatch};
180 if (!Config::enable_text)
182 return ResolvedField{.error = Error::ArgumentTypeMismatch};
185 ParsedField adjusted = parsed;
186 if (adjusted.align == Align::None)
188 adjusted.align = Align::Left;
191 return ResolvedField{
192 .field =
MakeField(adjusted, FormatType::String, FormatPackKind::StringView)};
204 if (parsed.presentation != 0 && parsed.presentation !=
'p')
206 return ResolvedField{.error = Error::ArgumentTypeMismatch};
208 if (parsed.alternate ||
HasSignOption(parsed) || parsed.zero_pad ||
209 parsed.has_precision)
211 return ResolvedField{.error = Error::ArgumentTypeMismatch};
213 if (!Config::enable_pointer)
215 return ResolvedField{.error = Error::ArgumentTypeMismatch};
218 return ResolvedField{
219 .field =
MakeField(parsed, FormatType::Pointer, FormatPackKind::Pointer)};
constexpr FormatField MakeField(const ParsedField &parsed, FormatType type, FormatPackKind pack, bool upper_case=false)
根据 brace 字段属性构造一条共享 FormatField 记录 / Build one shared FormatField record from parsed brace-field prop...