Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wkoszek/mini_printf
mini_printf - minimal, self-contained and verified printf()
https://github.com/wkoszek/mini_printf
c mini-printf stress-test
Last synced: 3 months ago
JSON representation
mini_printf - minimal, self-contained and verified printf()
- Host: GitHub
- URL: https://github.com/wkoszek/mini_printf
- Owner: wkoszek
- License: bsd-2-clause
- Created: 2014-06-23T06:28:40.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2015-11-20T05:09:31.000Z (almost 9 years ago)
- Last Synced: 2024-06-15T06:35:45.338Z (5 months ago)
- Topics: c, mini-printf, stress-test
- Language: C
- Homepage:
- Size: 25.4 KB
- Stars: 34
- Watchers: 3
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
## mini_printf - minimal, self-contained and tested printf()
[![Build Status](https://travis-ci.org/wkoszek/mini_printf.svg)](https://travis-ci.org/wkoszek/mini_printf)
This is a minimal `printf()` implementation that doesn't depend on any other
libraries. It's meant to be used for early bootstrapping of DSLs and
embeddable programs, as well as bare-metal software. It supports `%x` and
`%d` format string specifiers only. One can easily extend `mini_printf.c`
for additional format strings.# How to use it
The `mini_printf` comes in 1 C file called `mini_printf.c`. It has a
function called `pf(const char *fmt, ...)` which works exactly how `printf`
does. It's named `pf()` to prevent from eventual collisions with other
printf-alike API you may have in your programs.To use it, include `mini_printf.c` in your program. It only wants one thing
from you: you must provide it a `io_putc(int c)` function, which is used
internally to do an actual I/O. You should be able to later call:pf("sample");
and get yours `io_putc` routine called for each character.
# How it was tested
The biggest effort went into verification. Testing of `printf` is very
important, since failure of `printf` can lead to many hours of frustration
and debugging, so I tried to make it less likely.The `testprog.c` has a randomized stress test suite proving my `pf()` is
fairly robust. Stress test basically generates random format strings in a
smart way and plays them against system `printf()` and `mini_printf` and
then tries to compare the results. Mismatch means a failure of the test.To start stress-testing, type:
make stresstest
It'll try to generate 1,000,000 random settings and play them against
`mini_printf`.Several other useful targets are:
- make test.vv
- very verbose and slow test. Mostly for development.
- make test.v
- less verbose test. Slightly slower due to not all test data printed out.
- make test
- long-running test for very stressful testing. Can make your MacBook Air
boil
- make unittest
- unit-testing, for the cases when bugs are foundUnderlying program for all tests is `testprog`. Its usage:
Flag | Description
:-------|:-------------------------------------------------
d | turn debugging on. Can be specified more than once
l | how many loops to run. 1 loop = 1 chunk of format string. Default: 6.
m | print mask: frequency of printouts after each test execution
t | start only unit test.
w | wait nanoseconds after each test. For debugging only.
p | print generated format strings
s | stop after tests.
v | verbose mode.# Examples
You've looked at the source and want to run only unit test number 11:
./testprog -d -t 11
You want to run all unit tests:
./testprog -d
You want to figure out what's going on: random format strings need to be
short (`-l 1`), output must be slow (`-w 500000`) and verbose (`-d -v -p`), and
every generated test must be printed out (`-m 0`):./testprog -w 500000 -l 1 -d -v -m 0 -p
# Author
- Wojciech Adam Koszek, [[email protected]](mailto:[email protected])
- [http://www.koszek.com](http://www.koszek.com)