Skip to content

exebook/generic-print

Repository files navigation

generic-print

Convenient generic print() for C inspired by Python/JavaScript and other high-level languages.

Still using printf("%i\n", result) for debugging?

#include "print.h"
print("number:", 25, "fractional number:", 1.2345, "expression:", (2.0 + 5) / 3);

output

output

Passing variables of various primitive types:

char *s = "abc";
void *p = main;
long l = 1234567890123456789;
print("string:", s, "pointer:", p, "long:", l);

output

output

Primitive array support:

int x[] = { 1, 2, 3 };
char *args[] = { "gcc", "hello.c", "-o", "hello" };
print(x, args);

output

output

Extra information for byte/char:

unsigned char byte = 222;
char ch = 'A';
print(byte, ch)

output

output

You can setup your own colors, arguments are: (normal, number, string, hex, fractional), defaults are (-1, 4, 1, 2, 5).

__print_setup_colors(249,236,239,244,232);

Disabling colors completely:

__print_enable_color = 0;

All code is in single no dependency header print.h.

The implementation is based on builtins that check types, variadic macros abuse and variable array initializers.

Tested on Ubuntu 20.04 x86_64, GCC 5.1+, Clang 3.4.1+, Intel C 17.0+, TinyC 0.9.27.

Tested on macOS 11.2 arm64 with Apple Clang 12.0.0.

May not work on 32-bit systems. Does not work with Microsoft C Compiler.

There is a scary looking macro code, what it compiles to? It is basically optimized out. See what GCC -O1 has done to print(42, 43), note that all type information bolied down to 0x00840084, which is type 4 (alias for int), size 8 bytes.

xor     eax, eax
mov     ecx, 43
mov     edx, 42
lea     rsi, [rsp+12]
mov     edi, 2
mov     DWORD PTR [rsp+12], 0x00840084
call    __print_func

About

Convenient generic print() for C

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Contributors 4

  •  
  •  
  •  
  •