1af1315c2SSiva Chandra Reddy //===-- PrintfMatcher.cpp ---------------------------------------*- C++ -*-===// 2af1315c2SSiva Chandra Reddy // 3af1315c2SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4af1315c2SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5af1315c2SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6af1315c2SSiva Chandra Reddy // 7af1315c2SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8af1315c2SSiva Chandra Reddy 9af1315c2SSiva Chandra Reddy #include "PrintfMatcher.h" 10af1315c2SSiva Chandra Reddy 11af1315c2SSiva Chandra Reddy #include "src/__support/FPUtil/FPBits.h" 12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 13af1315c2SSiva Chandra Reddy #include "src/stdio/printf_core/core_structs.h" 14af1315c2SSiva Chandra Reddy 15af1315c2SSiva Chandra Reddy #include "test/UnitTest/StringUtils.h" 16dcf296b5SSiva Chandra Reddy #include "test/UnitTest/Test.h" 17af1315c2SSiva Chandra Reddy 18af1315c2SSiva Chandra Reddy #include <stdint.h> 19af1315c2SSiva Chandra Reddy 20*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 21af1315c2SSiva Chandra Reddy namespace testing { 22af1315c2SSiva Chandra Reddy 230fd0b742SGuillaume Chatelet using printf_core::FormatFlags; 240fd0b742SGuillaume Chatelet using printf_core::FormatSection; 250fd0b742SGuillaume Chatelet using printf_core::LengthModifier; 260fd0b742SGuillaume Chatelet 27af1315c2SSiva Chandra Reddy bool FormatSectionMatcher::match(FormatSection actualValue) { 28af1315c2SSiva Chandra Reddy actual = actualValue; 29af1315c2SSiva Chandra Reddy return expected == actual; 30af1315c2SSiva Chandra Reddy } 31af1315c2SSiva Chandra Reddy 32af1315c2SSiva Chandra Reddy namespace { 33af1315c2SSiva Chandra Reddy 34af1315c2SSiva Chandra Reddy #define IF_FLAG_SHOW_FLAG(flag_name) \ 35af1315c2SSiva Chandra Reddy do { \ 36af1315c2SSiva Chandra Reddy if ((form.flags & FormatFlags::flag_name) == FormatFlags::flag_name) \ 37dcf296b5SSiva Chandra Reddy tlog << "\n\t\t" << #flag_name; \ 38af1315c2SSiva Chandra Reddy } while (false) 39af1315c2SSiva Chandra Reddy #define CASE_LM(lm) \ 40af1315c2SSiva Chandra Reddy case (LengthModifier::lm): \ 41dcf296b5SSiva Chandra Reddy tlog << #lm; \ 42af1315c2SSiva Chandra Reddy break 43fdef5c4fSOm Prakaash #define CASE_LM_BIT_WIDTH(lm, bw) \ 44fdef5c4fSOm Prakaash case (LengthModifier::lm): \ 45fdef5c4fSOm Prakaash tlog << #lm << "\n\tbit width: :" << bw; \ 46fdef5c4fSOm Prakaash break 47af1315c2SSiva Chandra Reddy 48dcf296b5SSiva Chandra Reddy static void display(FormatSection form) { 49dcf296b5SSiva Chandra Reddy tlog << "Raw String (len " << form.raw_string.size() << "): \""; 50af1315c2SSiva Chandra Reddy for (size_t i = 0; i < form.raw_string.size(); ++i) { 51dcf296b5SSiva Chandra Reddy tlog << form.raw_string[i]; 52af1315c2SSiva Chandra Reddy } 53dcf296b5SSiva Chandra Reddy tlog << "\""; 54af1315c2SSiva Chandra Reddy if (form.has_conv) { 55dcf296b5SSiva Chandra Reddy tlog << "\n\tHas Conv\n\tFlags:"; 56af1315c2SSiva Chandra Reddy IF_FLAG_SHOW_FLAG(LEFT_JUSTIFIED); 57af1315c2SSiva Chandra Reddy IF_FLAG_SHOW_FLAG(FORCE_SIGN); 58af1315c2SSiva Chandra Reddy IF_FLAG_SHOW_FLAG(SPACE_PREFIX); 59af1315c2SSiva Chandra Reddy IF_FLAG_SHOW_FLAG(ALTERNATE_FORM); 60af1315c2SSiva Chandra Reddy IF_FLAG_SHOW_FLAG(LEADING_ZEROES); 61dcf296b5SSiva Chandra Reddy tlog << "\n"; 62dcf296b5SSiva Chandra Reddy tlog << "\tmin width: " << form.min_width << "\n"; 63dcf296b5SSiva Chandra Reddy tlog << "\tprecision: " << form.precision << "\n"; 64dcf296b5SSiva Chandra Reddy tlog << "\tlength modifier: "; 65af1315c2SSiva Chandra Reddy switch (form.length_modifier) { 66af1315c2SSiva Chandra Reddy CASE_LM(none); 67af1315c2SSiva Chandra Reddy CASE_LM(l); 68af1315c2SSiva Chandra Reddy CASE_LM(ll); 69af1315c2SSiva Chandra Reddy CASE_LM(h); 70af1315c2SSiva Chandra Reddy CASE_LM(hh); 71af1315c2SSiva Chandra Reddy CASE_LM(j); 72af1315c2SSiva Chandra Reddy CASE_LM(z); 73af1315c2SSiva Chandra Reddy CASE_LM(t); 74af1315c2SSiva Chandra Reddy CASE_LM(L); 75fdef5c4fSOm Prakaash CASE_LM_BIT_WIDTH(w, form.bit_width); 76fdef5c4fSOm Prakaash CASE_LM_BIT_WIDTH(wf, form.bit_width); 77af1315c2SSiva Chandra Reddy } 78dcf296b5SSiva Chandra Reddy tlog << "\n"; 79dcf296b5SSiva Chandra Reddy tlog << "\tconversion name: " << form.conv_name << "\n"; 80af1315c2SSiva Chandra Reddy if (form.conv_name == 'p' || form.conv_name == 'n' || form.conv_name == 's') 81dcf296b5SSiva Chandra Reddy tlog << "\tpointer value: " 82af1315c2SSiva Chandra Reddy << int_to_hex<uintptr_t>( 83af1315c2SSiva Chandra Reddy reinterpret_cast<uintptr_t>(form.conv_val_ptr)) 84af1315c2SSiva Chandra Reddy << "\n"; 85af1315c2SSiva Chandra Reddy else if (form.conv_name != '%') 86dcf296b5SSiva Chandra Reddy tlog << "\tvalue: " 873546f4daSGuillaume Chatelet << int_to_hex<fputil::FPBits<long double>::StorageType>( 88af1315c2SSiva Chandra Reddy form.conv_val_raw) 89af1315c2SSiva Chandra Reddy << "\n"; 90af1315c2SSiva Chandra Reddy } 91af1315c2SSiva Chandra Reddy } 92af1315c2SSiva Chandra Reddy } // anonymous namespace 93af1315c2SSiva Chandra Reddy 94dcf296b5SSiva Chandra Reddy void FormatSectionMatcher::explainError() { 95dcf296b5SSiva Chandra Reddy tlog << "expected format section: "; 96dcf296b5SSiva Chandra Reddy display(expected); 97dcf296b5SSiva Chandra Reddy tlog << '\n'; 98dcf296b5SSiva Chandra Reddy tlog << "actual format section : "; 99dcf296b5SSiva Chandra Reddy display(actual); 100dcf296b5SSiva Chandra Reddy tlog << '\n'; 101af1315c2SSiva Chandra Reddy } 102af1315c2SSiva Chandra Reddy 103af1315c2SSiva Chandra Reddy } // namespace testing 104*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 105