2020-02-24 15:51:58 +01:00
//
// printf_lite.hpp
//
// Created by jief the 04 Apr 2019.
// Imported in CLover the 24 Feb 2020
//
# ifndef __PRINTF_LITE_H__ // do not include protect, printf-lite.cpp include that twice
# define __PRINTF_LITE_H__
# include <stdarg.h>
# include <stddef.h>
# ifdef ARDUINO
# include <WString.h>
# ifdef HAS_LIQUID_CRYSTAL
# include <LiquidCrystal.h>
# endif
# endif
# define PRINTF_OUTPUT_FORMAT_UNICODE 1
# if PRINTF_OUTPUT_FORMAT_UNICODE == 1
# define PRINTF_UTF8_SUPPORT 1
# endif
/*
* A buffer is not needed . On some case it could be faster . For example when using semihosting
* It ' s 255 max , because of bufIdx of type uint8_t . It ' s possible to change it to int if bigger buffer needed .
* This buffer isn ' t statically allocated so it won ' t use permanent RAM .
* Not more than int because of cast in transmitBufXXX functions .
* 2017 / 08 / 31 : Save 22 bytes + bufsize of my STM32F103
*/
# ifndef PRINTF_LITE_BUF_SIZE
# define PRINTF_LITE_BUF_SIZE 0
# endif
/*
* Fallback on something close if specifier is ' nt supported .
* Unsupported specifier are ignored .
* if 0 , any unsupported modifier or specifier will be seen as unknown .
*/
# ifndef PRINTF_LITE_FALLBACK_FOR_UNSUPPORTED
# define PRINTF_LITE_FALLBACK_FOR_UNSUPPORTED 1
# endif
# ifndef PRINTF_LITE_FLOAT_SUPPORT
# define PRINTF_LITE_FLOAT_SUPPORT 1
# endif
/*
* The int part of the float ( or double ) will be printed if PRINTF_LITE_FLOAT_SUPPORT is enabled
* June 2017 , avr - gcc 4.9 .2 - atmel3 .5 .4 - arduino2 :
* Float support increase 828 bytes of text and 16 bytes of data
*/
# ifndef PRINTF_LITE_FLOAT_AS_INT_SUPPORT
# define PRINTF_LITE_FLOAT_AS_INT_SUPPORT 1 // if float not supported, an int will be print instead.
# endif
/*
* Disabling LONG LONG support has an effect on printing double . If long int is disabled , the int part of the double has to be < ULONG_MAX
*/
# ifndef PRINTF_LITE_LONGLONGINT_SUPPORT
# define PRINTF_LITE_LONGLONGINT_SUPPORT 1 // 1712 bytes
# endif
/*
* Disabling LONG support automatically disable LONG LONG support whatever the value of PRINTF_LITE_LONGLONGINT_SUPPORT .
* Disabling LONG support has an effect on printing double . The int part of the double has to be < UINT_MAX max
*/
# ifndef PRINTF_LITE_LONGINT_SUPPORT
# define PRINTF_LITE_LONGINT_SUPPORT 1 // 1712 bytes
# endif
# ifndef PRINTF_LITE_TIMESTAMP_SUPPORT
# define PRINTF_LITE_TIMESTAMP_SUPPORT 0 // 240 bytes
# endif
# ifndef PRINTF_LITE_FIELDWIDTH_SUPPORT
# define PRINTF_LITE_FIELDWIDTH_SUPPORT 1 // 107 bytes
# endif
# ifndef PRINTF_LITE_FIELDPRECISION_SUPPORT
# define PRINTF_LITE_FIELDPRECISION_SUPPORT 1 // bytes
# endif
# ifndef PRINTF_LITE_PADCHAR_SUPPORT
# define PRINTF_LITE_PADCHAR_SUPPORT 1 // bytes
# endif
# ifndef PRINTF_LITE_ZSPECIFIER_SUPPORT
# define PRINTF_LITE_ZSPECIFIER_SUPPORT 1 // 230 bytes. If not supported, z modifier become llu
# endif
# ifndef PRINTF_LITE_XSPECIFIER_SUPPORT
# define PRINTF_LITE_XSPECIFIER_SUPPORT 1 // 96 bytes. If not supported, x specifier become u
# endif
# ifndef PRINTF_LITE_USPECIFIER_SUPPORT
# define PRINTF_LITE_USPECIFIER_SUPPORT 1 // 96 bytes. If not supported, u specifier become d
# endif
# ifndef PRINTF_LITE_UART_SUPPORT
# define PRINTF_LITE_UART_SUPPORT 0 //
# endif
# ifndef PRINTF_LITE_USB_SUPPORT
# define PRINTF_LITE_USB_SUPPORT 0 //
# endif
# ifndef PRINTF_LITE_SNPRINTF_SUPPORT
2020-03-12 17:16:18 +01:00
# define PRINTF_LITE_SNPRINTF_SUPPORT 0 //
2020-02-24 15:51:58 +01:00
# endif
# ifndef PRINTF_LITE_FLASHSTRING_SUPPORT
# define PRINTF_LITE_FLASHSTRING_SUPPORT 0 //
# endif
# if PRINTF_OUTPUT_FORMAT_UNICODE == 1
# define printf_char_type wchar_t
# else
# define printf_char_type char
# endif
typedef void ( * transmitBufCallBackType ) ( const printf_char_type * buf , size_t nbyte ) ;
void vprintf_with_callback ( const char * format , va_list valist , transmitBufCallBackType transmitBufCallBack
# if PRINTF_LITE_TIMESTAMP_SUPPORT == 1
, int * newline , int timestamp
# endif
) ;
# if defined(__cplusplus)
extern " C "
{
# endif
# if PRINTF_LITE_SNPRINTF_SUPPORT == 1
2020-03-12 17:16:18 +01:00
int vsnprintf ( printf_char_type * , size_t , const char * __restrict , va_list valist )
# ifndef _MSC_VER
__attribute__ ( ( __format__ ( __printf__ , 3 , 0 ) ) )
# endif
; // have to return int to conform stdio.h. Always return 1;
2020-02-24 15:51:58 +01:00
// gcc-4.9.2-atmel3.5.4-arduino2 report snprintf to undefined. Change the name and it'll work. String isn't it ?
2020-03-12 17:16:18 +01:00
int snprintf ( printf_char_type * , size_t len , const char * __restrict format , . . . )
# ifndef _MSC_VER
__attribute__ ( ( __format__ ( __printf__ , 3 , 4 ) ) )
# endif
; // have to return int to conform stdio.h. Always return 1;
2020-02-24 15:51:58 +01:00
# endif
# if PRINTF_LITE_UART_SUPPORT == 1
void vprintf_uart ( const char * str , va_list valist ) ;
void printf_uart ( const char * str , . . . ) __attribute__ ( ( format ( printf , 1 , 2 ) ) ) ;
void vlogf_uart ( const char * str , va_list valist ) ;
void logf_uart ( const char * str , . . . ) __attribute__ ( ( format ( printf , 1 , 2 ) ) ) ; // same as printf_uart but print a timestamp at beginning of line.
# endif
# ifdef LiquidCrystal_h
void printf_lcd ( int row , int col , const char * str , . . . ) __attribute__ ( ( format ( printf , 3 , 4 ) ) ) ;
# endif
# if PRINTF_LITE_USB_SUPPORT == 1 && defined(__USBD_CDC_IF_H)
void transmitBufUsb ( const char * buf , size_t nbyte ) ;
void printf_usb ( const char * str , . . . ) __attribute__ ( ( format ( printf , 1 , 2 ) ) ) ;
void vlogf_usb ( const char * str , va_list valist ) ;
void logf_usb ( const char * str , . . . ) __attribute__ ( ( format ( printf , 1 , 2 ) ) ) ;
# endif
# if defined(OS_USE_TRACE_ITM) || defined(OS_USE_TRACE_SEMIHOSTING_DEBUG) || defined(OS_USE_TRACE_SEMIHOSTING_STDOUT)
void vprintf_semih ( const char * str , va_list valist ) ;
void printf_semih ( const char * format , . . . ) __attribute__ ( ( __format__ ( __printf__ , 1 , 2 ) ) ) ;
# endif
# if defined(__cplusplus)
}
# endif
# if defined(__cplusplus)
# if defined(ARDUINO) && PRINTF_LITE_FLASHSTRING_SUPPORT == 1
int vsnprintf ( char * __restrict , size_t , const __FlashStringHelper * __restrict , va_list valist ) ; // have to return int to conform stdio.h. Always return 1;
// gcc-4.9.2-atmel3.5.4-arduino2 report snprintf to undefined. Change the name and it'll work. String isn't it ?
int snprintf ( char * __restrict buf , size_t len , const __FlashStringHelper * format , . . . ) ; // have to return int to conform stdio.h. Always return 1;
// C code can't access this because __FlashStringHelper is a class
void vlogf_uart ( const __FlashStringHelper * str , va_list valist ) ;
# ifdef __JIEF_FLASHSTRING_PRINTFWARNING_HACK__
void printf_uart ( const __FlashStringHelper * str , . . . ) __attribute__ ( ( format ( printf , 1 , 2 ) ) ) ;
void logf_uart ( const __FlashStringHelper * str , . . . ) __attribute__ ( ( format ( printf , 1 , 2 ) ) ) ; // same as printf_uart but print a timestamp at beginning of line.
# ifdef LiquidCrystal_h
void printf_lcd ( int row , int col , const __FlashStringHelper * str , . . . ) __attribute__ ( ( format ( printf , 3 , 4 ) ) ) ;
# endif
# else
// if __JIEF_FLASHSTRING_PRINTFWARNING_HACK isn't defined, it means you don't use my hacked version of GCC. "Normal" version can't handle const __FlashStringHelper* as format for warning
void printf_uart ( const __FlashStringHelper * str , . . . ) ;
void logf_uart ( const __FlashStringHelper * str , . . . ) ; // same as printf_uart but print a timestamp at beginning of line.
# ifdef LiquidCrystal_h
void printf_lcd ( int row , int col , const __FlashStringHelper * str , . . . ) ;
# endif
# endif
# endif
# endif
# endif // __PRINTF_LITE_H__