tools

various tools
git clone git://deadbeef.fr/tools.git
Log | Files | Refs | README | LICENSE

commit 5d4ab82bdb1c6e02a1b930dd4d5ea66c78179dfd
parent 0f4d26c460c139747d165b6b26fe6764a34f55b1
Author: Morel BĂ©renger <berengermorel76@gmail.com>
Date:   Fri, 26 Jun 2020 17:16:11 +0200

make optpaser.hpp less C-incompatible

* still needs actual testing
* adds some comments about the C++ helpers
* adds external linkage for the error message list
* adds C linkage for C-compatible symbols
* use a hack to avoid forcing stdio.h inclusion (requires #warning)

Diffstat:
Mbtl/src/optparser.cpp | 2+-
Mbtl/src/optparser.hpp | 45++++++++++++++++++++++++++++++++++++++++++---
Mlmerge/Makefile | 4++--
3 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/btl/src/optparser.cpp b/btl/src/optparser.cpp @@ -101,7 +101,7 @@ parse_error_t parse_cmd_opt( char const* arg, opt_desc_t* start, opt_desc_t cons return opt->count == UINT32_MAX ? MAX_COUNT : NONE; } -void print_opts( FILE* target, opt_desc_t const* start, opt_desc_t const* end ) +void print_opts( FILE_PTR target, opt_desc_t const* start, opt_desc_t const* end ) { char short_name[] = ",-????"; for( ; start != end; ++start ) diff --git a/btl/src/optparser.hpp b/btl/src/optparser.hpp @@ -1,6 +1,20 @@ #ifndef OPTPARSER_HPP #define OPTPARSER_HPP +#include <stdbool.h> +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#else +#define nullptr 0 +#endif + +#ifndef FILE_PTR +#warning "FILE_PTR was not defined, defaulting to void*" +#define FILE_PTR void* +#endif + // this could probably be optimized, but considering it should not be used that // often, I think it's better to just keep it as easy to use as possible. // Some doc: @@ -37,7 +51,7 @@ struct opt_desc_t uint32_t count; void* value; bool (*set) ( void* val, char const * const arg ); - bool (*show)( void const* val, FILE* target ); + bool (*show)( void const* val, FILE_PTR target ); }; //see parse_error_msgs in implementation for descriptions @@ -66,7 +80,28 @@ extern char const *parse_error_msgs[]; parse_error_t parse_cmd_opt( char const* arg, opt_desc_t* start, opt_desc_t const* end ); // prints a message describing options and their current value if applicable. -void print_opts( FILE* target, opt_desc_t const* start, opt_desc_t const* end ); +void print_opts( FILE_PTR target, opt_desc_t const* start, opt_desc_t const* end ); + +#ifdef __cplusplus +} //end of extern "C" + +// add some pretty generic and useful code for C++ users. +// C users will have to implement their owns wrappers (and maybe contribute it?). +// +// This list is wished to grow with time, but should never depend on things that +// have runtime cost (containers, exceptions, RTTI, etc). +// It is hoped that it's performance will be improved when possible. + +// Depending on what you really use, you may have to define the following functions: +// * strncpy for static C string set() +// * fputs for C string show() +// * strtoull for unsigned integers show() +// * strtoll for signed integets show() +// * strtold for floating numbers show() +// * fprintf for all number related show() + +// stdio.h is *not* included, to fasten build time and to let user use +// unlocked functions, which should be faster but not thread-safe. #include <type_traits> #include <limits> @@ -112,7 +147,9 @@ bool show( return true; } - fprintf( target, "(current value: \"%s\")", static_cast<char const*>( val ) ); + fputs( "(current value: \"", target ); + fputs( static_cast<char const*>( val ), target ); + fputs( "\")", target ); return false; } @@ -218,3 +255,5 @@ bool set( } #endif + +#endif diff --git a/lmerge/Makefile b/lmerge/Makefile @@ -8,10 +8,10 @@ all: manpages lmerge.1 lmerge pandoc -s --to=man $< -o $@ lmerge.o: src/lmerge.cpp - $(CXX) -I ../btl/src $(CXXFLAGS) -c $< -o $@ + $(CXX) -I ../btl/src -DFILE_PTR='FILE*' $(CXXFLAGS) -c $< -o $@ %.o: ../btl/src/%.cpp - $(CXX) $(CXXFLAGS) -c $< -o $@ + $(CXX) $(CXXFLAGS) -DFILE_PTR='FILE*' -c $< -o $@ lmerge: lmerge.o optparser.o $(CXX) -o $@ $^