summaryrefslogtreecommitdiff
path: root/AK/Format.h
AgeCommit message (Collapse)Author
2021-11-17AK: Add missing return in Formatter<unsigned char[Size]>::format()Andreas Kling
Caught by ENABLE_ALL_THE_DEBUG_MACROS.
2021-11-17AK: Convert AK::Format formatting helpers to returning ErrorOr<void>Andreas Kling
This isn't a complete conversion to ErrorOr<void>, but a good chunk. The end goal here is to propagate buffer allocation failures to the caller, and allow the use of TRY() with formatting functions.
2021-11-14AK: Move StandardFormatter argument into base class initializerAndrew Kaster
Subclasses of StandardFormatter don't need to use the formatter argument in their constructor, so move() it into the base class initializer.
2021-11-14AK: Avoid implicit conversions in TypeErasedParameter::to_size()Andrew Kaster
Refactor to a visitor+functor pattern that does an explicit static_cast to size_t after performing suitable range checks for each type.
2021-11-11Everywhere: Pass AK::ReadonlyBytes by valueAndreas Kling
2021-10-21AK: Avoid temporary String allocation in Formatter<FormatString>Daniel Bertalan
Creating a String object from the formatted data is unnecessary, as it immediately gets turned into a StringView anyways. With this change, we will no longer allocate on the heap when printing `VirtualAddress`, `VirtualRange` and `InodeIdentifier` objects, which is a step towards stronger OOM hardening.
2021-10-03AK: Add a basic formatter for wchar_tTim Schumacher
2021-08-30Everywhere: Pass AK::Format TypeErasedFormatParams by referenceBrian Gianforcaro
This silences a overeager warning in sonar cloud, warning that slicing could occur with `VariadicFormatParams` which derives from `TypeErasedFormatParams`. Reference: https://sonarcloud.io/project/issues?id=SerenityOS_serenity&issues=AXuVPBO_k92xXUF3qWsm&open=AXuVPBO_k92xXUF3qWsm
2021-08-19AK: Move FormatParser definition from header to implementation fileTimothy Flynn
This is primarily to be able to remove the GenericLexer include out of Format.h as well. A subsequent commit will add AK::Result to GenericLexer, which will cause naming conflicts with other structures named Result. This can be avoided (for now) by preventing nearly every file in the system from implicitly including GenericLexer. Other changes in this commit are to add the GenericLexer include to files where it is missing.
2021-07-19AK: Use new Formatter for each element in Formatter<Vector<T>>Andrew Kaster
The state of the formatter for the previous element should be thrown away for each iteration. This showed up when trying to format a Vector<String>, since Formatter<StringView> was unhappy about some state that gets set when it's called. Add a test for Formatter<Vector>.
2021-07-19AK: Use StringView literals in Format to avoid strlenAndrew Kaster
We don't want to be constructing StringViews at runtime if we don't have to in Formatter code.
2021-07-13AK: Add Formatter for Vectorkleines Filmröllchen
For debugging purposes, it is very useful to look at a Vector in a simple list representation. Therefore, the new Formatter for Vector provides a string representation of the following form: ``` [ 1, 2, 3, 4, 5 ] ``` This requires the content type of Vector to be formattable with default arguments. The current implementation ignores width and precision, which may be accounted for later or passed down to the content formatter.
2021-07-02AK: Support long doubles in format stringsHediadyoin1
2021-06-19AK: Add support for keeping trailing zeros in fixed precision floatsIdan Horowitz
This uses the same syntax as zero padding integers: String::formatted("{:0.5}", 1.234) => "1.23400"
2021-06-17AK: Add a :hex-dump mode to AK::FormatAli Mohammad Pur
This will just hexdump the given value. Note that not all formatters respect this, the ones that do are: - (Readonly)Bytes: formatter added in this commit - StringView / char const* - integral types
2021-05-31AK: Add Formatter<unsigned char[Size]>Linus Groh
2021-05-16Kernel/Graphics + SystemServer: Support text mode properlyLiav A
As we removed the support of VBE modesetting that was done by GRUB early on boot, we need to determine if we can modeset the resolution with our drivers, and if not, we should enable text mode and ensure that SystemServer knows about it too. Also, SystemServer should first check if there's a framebuffer device node, which is an indication that text mode was not even if it was requested. Then, if it doesn't find it, it should check what boot_mode argument the user specified (in case it's self-test). This way if we try to use bochs-display device (which is not VGA compatible) and request a text mode, it will not honor the request and will continue with graphical mode. Also try to print critical messages with mininum memory allocations possible. In LibVT, We make the implementation flexible for kernel-specific methods that are implemented in ConsoleImpl class.
2021-04-22Everything: Move to SPDX license identifiers in all files.Brian Gianforcaro
SPDX License Identifiers are a more compact / standardized way of representing file license information. See: https://spdx.dev/resources/use/#identifiers This was done with the `ambr` search and replace tool. ambr --no-parent-ignore --key-from-file --rep-from-file key.txt rep.txt *
2021-04-21AK/Format: Compute TypeErasedParameter type and size at compile-timeLenny Maiorani
Problem: - Type and size information is known at compile-time, but computations are being performed using run-time parameters. Solution: - Move function arguments to be template arguments. - Convert to `consteval` where possible. - Decorate functions with `constexpr` which are used in both run-time and compile-time contexts.
2021-04-21AK/Format: Fix incorrectly non-inlined variable templatesLenny Maiorani
Problem: - Global variables (and variable templates) defined in header files need to be decorated `inline` to avoid multiple definition issues. Solution: - Put back the `inline` keyword which was erroneously removed.
2021-04-21Everywhere: Remove redundant inline keyword with constexprLenny Maiorani
Problem: - `constexpr` functions are additionally decorated with `inline` keyword. This is redundant since `constexpr` implies `inline`. Solution: - Remove redundancies.
2021-04-16AK: Add outln_if and warnln_ifHendiadyoin1
This uses the same gating mechanism as dbgln_if and should be equivalent to #define flag etc
2021-04-10AK+Everywhere: Make StdLibExtras templates less wrapper-yAnotherTest
This commit makes the user-facing StdLibExtras templates and utilities arguably more nice-looking by removing the need to reach into the wrapper structs generated by them to get the value/type needed. The C++ standard library had to invent `_v` and `_t` variants (likely because of backwards compat), but we don't need to cater to any codebase except our own, so might as well have good things for free. :^)
2021-03-12Everywhere: Remove klog(), dbg() and purge all LogStream usage :^)Andreas Kling
Good-bye LogStream. Long live AK::Format!
2021-02-24AK: Make dbgln_if() avoid evaluating the arguments when disabledAnotherTest
Naturally, this makes the `enabled` flag on dbgln() obsolete.
2021-02-23Everywhere: Rename ASSERT => VERIFYAndreas Kling
(...and ASSERT_NOT_REACHED => VERIFY_NOT_REACHED) Since all of these checks are done in release builds as well, let's rename them to VERIFY to prevent confusion, as everyone is used to assertions being compiled out in release. We can introduce a new ASSERT macro that is specifically for debug checks, but I'm doing this wholesale conversion first since we've accumulated thousands of these already, and it's not immediately obvious which ones are suitable for ASSERT.
2021-02-23AK+Userland: Extend the compiletime format string check to other functionsAnotherTest
Thanks to @trflynn89 for the neat implicit consteval ctor trick! This allows us to basically slap `CheckedFormatString` on any formatting function, and have its format argument checked at compiletime. Note that there is a validator bug where it doesn't parse inner replaced fields like `{:~>{}}` correctly (what should be 'left align with next argument as size' is parsed as `{:~>{` following a literal closing brace), so the compiletime checks are disabled on these temporarily by forcing them to be StringViews. This commit also removes the now unused `AK::StringLiteral` type (which was introduced for use with NTTP strings).
2021-02-12AK: Set DBGLN_NO_COMPILETIME_FORMAT_CHECK for any clang, not just < 12Linus Groh
This currently breaks the OSS-Fuzz build, and attempts to make it build with clang >= 12 were unsuccessful, so let's just disable dbgln() checks for any clang version.
2021-02-12Revert "AK: Fix build with Clang>=12"Linus Groh
This reverts commit 338bb732898dbf68db9554e6a32b4a89ccabb891. This didn't work, the OSS-Fuzz build (using clang 12) is still failing. We'll just disable dbgln() checks when compiling with any clang for now.
2021-02-10AK: Fix build with Clang>=12AnotherTest
Build failure as in https://oss-fuzz-build-logs.storage.googleapis.com/log-79750138-f41e-4f39-8812-7c536f1d2e35.txt Clang does not appear to like using consteval functions' arguments as constant expressions, so move all the arguments that need to appear as constant expressions into the template parameters for now. This patch should fix the OSS-Fuzz build.
2021-02-08AK: Add dbgln() format checkingAnotherTest
This checks the following things: - No unclosed braces in format string `dbgln("a:{}}", a)` where the '}}' would be interpreted as a literal '}' `dbgln("a:{", a)` where someone with a faulty keyboard like mine could generate - No extra closed braces in format string `dbgln("a:{{}", a)` where the '{{' would interpreted as a literal '{' `dbgln("a:}", a)` where someone with a faulty keyboard could generate - No references to nonexistent arguments `dbgln("a:{} b:{}", a)` where the value of `b` is not in the arguments list - No unconsumed argument `dbgln("a:{1}", not_used, 1)` where `not_used` is extraneous
2021-02-08Everywhere: Replace dbgln<flag>(...) with dbgln_if(flag, ...)AnotherTest
Replacement made by `find Kernel Userland -name '*.h' -o -name '*.cpp' | sed -i -Ee 's/dbgln\b<(\w+)>\(/dbgln_if(\1, /g'`
2021-01-23AK+Format: Add dmesgln() to replace klog().asynts
2021-01-22AK: Add set_debug_enabled method.asynts
2021-01-16AK: Add enabled template parameter to dbgln.asynts
2021-01-12AK: Simplify constructors and conversions from nullptr_tLenny Maiorani
Problem: - Many constructors are defined as `{}` rather than using the ` = default` compiler-provided constructor. - Some types provide an implicit conversion operator from `nullptr_t` instead of requiring the caller to default construct. This violates the C++ Core Guidelines suggestion to declare single-argument constructors explicit (https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c46-by-default-declare-single-argument-constructors-explicit). Solution: - Change default constructors to use the compiler-provided default constructor. - Remove implicit conversion operators from `nullptr_t` and change usage to enforce type consistency without conversion.
2021-01-11Everywhere: Replace a bundle of dbg with dbgln.asynts
These changes are arbitrarily divided into multiple commits to make it easier to find potentially introduced bugs with git bisect.Everything:
2021-01-09AK: Add Formatter<FormatString> as helper class.asynts
2021-01-02Piggyback: AK: Add formatter for std::nullptr_t.asynts
2020-12-30AK+Format: Remove TypeErasedFormatParams& from format function.asynts
2020-12-29AK+Format: Accept unsigned long in replacement fields.asynts
I ran into this exact but at least twenty times in Serenity alone. The C++ Standard dictates that 'unsigned long' and 'unsigned long long' are distinct types even though on most platforms they are usually both 64 bit integers. Also it wasn't possible to evaluate IsIntegral<T> for types that were not integers since it used MakeUnsigned<T> internally.
2020-11-09AK: Add formatters for floating point numbers.asynts
2020-11-09AK: Rename new_out to out and new_warn to warn.asynts
2020-10-17AK+Format: Add outln(FILE*, ...) overload.asynts
This commit also removes a few functions like raw_out and vwarn. If we want to write raw output, we can do this as follows: out("{}", "Hello, World!"); The vout stuff isn't really public API anyways, so no need for another vwarn.
2020-10-09AK+Format: Remove new_dbg(dbg) and raw_dbg.asynts
We are adding the process name as prefix and a newline as suffix to any message written to debug. Thus, the following doesn't make any sense: for (u8 byte : bytes) dbg("{:02x} ", byte); dbgln(); Which function call would put the prefix? This doesn't make any sense, thus these functions must go. The example above could be converted to: StringBuilder builder; for (u8 byte : bytes) builder.appendff("{:02x} ", byte); dbgln("{}", builder.build());
2020-10-08AK+Format: Make it possible to format characters as integers.asynts
2020-10-08AK+Format: Add SFINAE wrapper 'FormatIfSupported'.asynts
2020-10-08AK+Format: Add overloads with const char* for outln, warnln and dbgln.asynts
This makes it possible to forward declare 'warnln' in TestSuite.h.
2020-10-08AK+Format: Add overloads without arguments to outln, warnln and dbgln.asynts
2020-10-08AK+Format: Use pointer mode for pointers by default.asynts