Source file: /~heha/mb-iwp/Bergwerk/fba-rpi-230421.zip/heha_print.h

#pragma once
#include <cstdio>	// FILE
#include <cstdarg>	// va_list
#include <ostream>	// std::ostream

namespace heha{

enum{
 cNaN =-0x80,		// richtiger wäre die „Erweiterung“ von std::limits<>
 cInf = 0x7F,		// Annahme: -fsigned-char
 iNaN =-0x8000,		// hier: Integer = 16 Bit (kommt vom 8-Bit-µC)
 iInf = 0x7FFF,
 lNaN =-0x80000000,
 lInf = 0x7FFFFFFF,
};

// Stringlänge in Codepoints
int utf8len(const char*,int=-1);

// Zeichenzeiger in Codepoints vor- oder zurückrücken
// Zeiger muss in gültigen UTF8-String, auf ASCII- oder Leadbyte zeigen!
const char*utf8pos(const char*,int);

// Darstellungsbreite im Terminal berechnen,
// sonst wäre die Feldbreite komplett nonsense.
// Braucht man v.a. für tabellarische Ausgabe.
// Beachtet gängige Escape-Sequenzen.
int utf8width(const char*,int=-1);

// heha::print() für jedes Ausgabeziel geeignet
struct Out{
 virtual void operator()(char) = 0;	// abstrakt!
 int count;
 Out():count(0) {}
};

// Zur Anwendung muss <out> von <Out> vererbt sein
void print(Out&out, const char*fmt,va_list);
int vprint(const char*,va_list);
int vprint(FILE*,const char*,va_list);
int vprint(int,const char*,va_list);
int vprint(std::ostream&,const char*,va_list);
int snvprint(char*, int, const char*,va_list);

// Formatierte Ausgabe für die üblichen Ausgabekanäle
// Der Returnwert ist die Anzahl der Bytes, nicht der UTF8-Zeichen.
int print(const char*,...);
int print(FILE*,const char*,...);
int print(int,const char*,...);
int print(std::ostream&,const char*,...);
int snprint(char*, int, const char*,...);
}
Detected encoding: UTF-80