4 ms·
I'm open to correction but I believe this is used in the Cosmopolitan library.
by kitd 4y ago
I'm open to correction but I believe this is used in the Cosmopolitan library.
- eesmith 4y agoSeems unlikely. My spot check of the the two vfprintf implementations shows no flow from one to the other, and shows that part of the Cosmopolitan code has an older lineage than nolibc. The nolibc source has many reference to copyright held by "Willy Tarreau", under LGPL-2.1 OR MIT license, with a copyright date starting in 2017. The string "Tarreau" does not exist in the Cosmopolitan library, so that's a strong negative there. Let's look closer. The file organization is quite different. And so is the implementation. So that's another negative. Compare the vfprintf in nolibc at https://elixir.bootlin.com/linux/v6.2-rc4/source/tools/include/nolibc/stdio.h#L171 https://elixir.bootlin.com/linux/v6.2-rc4/source/tools/inclu... (a 'minimal vfprintf()') with the one in cosmopolitan starting at https://github.com/jart/cosmopolitan/blob/master/libc/stdio/fvprintf.c https://github.com/jart/cosmopolitan/blob/master/libc/stdio/.... Right away we can see nolibc places many functions in the same file while Cosmopolitan uses a one-function-per-filename organization. Cosmopolitan's fvprintf locks the file (which nolibc doesn't need to do) then calls vfprintf_unlocked which calls __fmt at https://github.com/jart/cosmopolitan/blob/master/libc/fmt/fmt.c#L112 https://github.com/jart/cosmopolitan/blob/master/libc/fmt/fm... , which is the actual implementation. It look very different from NOLIBC's. Okay, so perhaps that's they way now but not at the beginning? We can also go back to Cosmopolitan's original implementation and see how vfprintf goes through https://github.com/jart/cosmopolitan/blob/c91b3c50068224929cd4d3ddf36c5a10254cbd9c/libc/fmt/vsnprintf.c https://github.com/jart/cosmopolitan/blob/c91b3c50068224929c... to call "palandprintf", which https://github.com/jart/cosmopolitan/blob/c91b3c50068224929cd4d3ddf36c5a10254cbd9c/libc/fmt/palandprintf.c https://github.com/jart/cosmopolitan/blob/c91b3c50068224929c... says is copyright "Marco Paland" from 2014-2019. That's a few years older than the start of nolibc, available from https://github.com/mpaland/printf https://github.com/mpaland/printf , and part of https://github.com/embeddedartistry/libc https://github.com/embeddedartistry/libc , a "libc targeted for embedded systems usage". Thus, multiple factors seem to agree that nolibc code is not used in the Cosmopolitan library.
- wtarreau 4y agoI can confirm that the code looks totally different. Anyway there's no reason someone writing a libc would waste their time with pieces of code from other provenance. It takes less time to write a minimalist printf than trying to adapt an existing one to your exact needs, types, validity domains etc, and it'll be easier to extend yours that someone else's. You can write it however you want, it will always end up with a loop around a switch/case :-)