1
0
Fork 0

Added travis, coveralls and coverity support

development
Marco Paland 8 years ago
parent 569de268ca
commit 59eabf489d

@ -0,0 +1,65 @@
# Use a C++11 distro
dist: trusty
sudo: required
# Enable C++ support
language: cpp
# Compiler selection
compiler: gcc
env:
global:
# coverity key
- secure: "MQNBwhFpj7NaDbN6NujsXQGRMpBYHvGtcjLXY9gCXhLUw+Ex40ArBEy1IEQAol7aGtFZiTZDijH1ihL4itzVmu4Bo2sx5WdMGRFS5tp/t4zFFiqpmmtbkYOUHY8wAp3xyxV2NL2EU0KlDloNvFd/4tY2opklUB3eTF+7TQ5CmwWRFGOf2GpGpmQ3+KS1ANhrxdn9sQIP8rSU+JD1/zwrAgeEN7RAxB23t9AU9MeGsOW3CCp3te8vrgNJ/xnOh7T4F/8hQ4lA5iCqqf7OUvcWOif3uBPzlckBTmQ6ylMvOncslj6TBkPJOd33MOmZcWHiPPEAvcXQlzERaLqgHLIg5A/0aTVo27J4iImHbwE61L2JhWvrx5mPkKz/9aTpZyYyQL1hXInk8R9VJ5+JENA5+maF+KNvdf1Zp2Foa3BLFFdRl5thpgyafvcEAZ/7KJ1BC3u4OgTBhh9Tw+1UMFXB9W9+2W2iYUIun8BunDny1aLmnp/t7O1auXjqW2lAWHtH86v9NickDupzkw1klN3Ac+hmfBDffyxUjE2LlmjpC20z2uwKrZCT7XRhalYstPPIwQ6uGr6TVZjqq6mzEjpmmF93U8WYx7iWBJmen0CHbkjY3n8dbUe7aiXQHwjbXFZ8MsWszFvr9eicJOcAOxXKK5jOw4uQSER6NI2H04rwbIs="
# addons
addons:
apt:
packages:
- gcc-6
- g++-6
sources:
- ubuntu-toolchain-r-test
coverity_scan:
project:
name: "mpaland/printf"
description: "printf implementation"
notification_email: marco@paland.com
build_command_prepend: "make clean"
build_command: "make"
branch_pattern: master
before_install:
# install coveralls
- pip install --user cpp-coveralls
# connect coverity
- echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
# Active branches
branches:
only:
- travis
script:
# Link gcc-6 and g++-6 to their standard commands
- sudo rm /usr/bin/gcc
- sudo rm /usr/bin/g++
- sudo ln -s /usr/bin/gcc-6 /usr/bin/gcc
- sudo ln -s /usr/bin/g++-6 /usr/bin/g++
# Export CC and CXX
- export CC=/usr/bin/gcc-6
- export CXX=/usr/bin/g++-6
# Check versions of gcc, g++
- gcc -v && g++ -v
# Run build commands
- make
# execute the text suite
- bin/test_suite -d yes
# coverall profiling
- tmp/cov/test_suite
after_success:
# Report to coveralls
- coveralls --build-root ${TRAVIS_BUILD_DIR} --include printf.cpp --gcov 'gcov-6' --gcov-options '\-lp'

@ -0,0 +1,271 @@
# ------------------------------------------------------------------------------
#
# Generic Makefile
#
# Copyright Marco Paland 2007 - 2017
# Distributed under the MIT License
#
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Paths
# ------------------------------------------------------------------------------
PATH_TOOLS_CC = /usr/bin/
PATH_TOOLS_CC_LIB = /usr/lib/
PATH_TOOLS_UTIL =
PATH_BIN = bin
PATH_TMP = tmp
PATH_NUL = /dev/null
PATH_OBJ = $(PATH_TMP)/obj
PATH_LST = $(PATH_TMP)/lst
PATH_ERR = $(PATH_TMP)/err
PATH_PRE = $(PATH_TMP)/pre
PATH_COV = $(PATH_TMP)/cov
# ------------------------------------------------------------------------------
# Application to build
# ------------------------------------------------------------------------------
APP = test_suite
# -----------------------------------------------------------------------------
# Project file list
# Format is:
# FILES_PRJ = file1 \
# foo/file2 \
# bar/file3
# -----------------------------------------------------------------------------
FILES_PRJ = test/test_suite
# ------------------------------------------------------------------------------
# Additional include files and compiler defines
# Format is:
# C_INCLUDES = -Iinclude_path1 \
# -Iinclude_path2 \
# -Iinclude_path3 \
# ------------------------------------------------------------------------------
C_INCLUDES =
C_DEFINES =
# ------------------------------------------------------------------------------
# The target name and location
# ------------------------------------------------------------------------------
TRG = $(PATH_BIN)/$(APP)
# ------------------------------------------------------------------------------
# object files
# ------------------------------------------------------------------------------
FILES_TMP = $(FILES_PRJ)
FILES_O = $(addsuffix .o, $(FILES_TMP))
# ------------------------------------------------------------------------------
# VPATH definition
#
# VPATH is required for the maker to find the C-/ASM-Source files.
# Extract the directory/module names from the file list with the dir
# command and remove the duplicated directory names with the sort command.
# FILES_PRJ is listed first to make sure that the source files in the project
# directory are searched first.
# ------------------------------------------------------------------------------
VPATH := $(sort $(dir $(FILES_TMP)))
# ------------------------------------------------------------------------------
# Development tools
# ------------------------------------------------------------------------------
AR = $(PATH_TOOLS_CC)ar
AS = $(PATH_TOOLS_CC)g++
CC = $(PATH_TOOLS_CC)g++
CL = $(PATH_TOOLS_CC)g++
NM = $(PATH_TOOLS_CC)nm
GCOV = $(PATH_TOOLS_CC)gcov
OBJDUMP = $(PATH_TOOLS_CC)objdump
OBJCOPY = $(PATH_TOOLS_CC)objcopy
READELF = $(PATH_TOOLS_CC)readelf
SIZE = $(PATH_TOOLS_CC)size
ECHO = $(PATH_TOOLS_UTIL)echo
MAKE = $(PATH_TOOLS_UTIL)make
MKDIR = $(PATH_TOOLS_UTIL)mkdir
RM = $(PATH_TOOLS_UTIL)rm
SED = $(PATH_TOOLS_UTIL)sed
# ------------------------------------------------------------------------------
# Compiler flags for the target architecture
# ------------------------------------------------------------------------------
GCCFLAGS = $(C_INCLUDES) \
$(C_DEFINES) \
-std=c++11 \
-g \
-Wall \
-pedantic \
-Wmain \
-Wundef \
-Wsign-conversion \
-Wuninitialized \
-Wshadow \
-Wunreachable-code \
-Wswitch-default \
-Wswitch \
-Wcast-align \
-Wmissing-include-dirs \
-Winit-self \
-Wdouble-promotion \
-gdwarf-2 \
-fno-exceptions \
-O2 \
-ffunction-sections \
-ffat-lto-objects \
-fdata-sections \
-fverbose-asm \
-Wextra \
-Wunused-parameter \
-Wfloat-equal
CFLAGS = $(GCCFLAGS) \
-Wunsuffixed-float-constants \
-x c \
-std=c99
CPPFLAGS = $(GCCFLAGS) \
-x c++ \
-fno-rtti \
-fstrict-enums \
-fno-use-cxa-atexit \
-fno-use-cxa-get-exception-ptr \
-fno-nonansi-builtins \
-fno-threadsafe-statics \
-fno-enforce-eh-specs \
-ftemplate-depth-64 \
-fexceptions
AFLAGS = $(GCCFLAGS) \
-x assembler
LFLAGS = $(GCCFLAGS) \
-x none \
-Wl,--gc-sections
# ------------------------------------------------------------------------------
# Targets
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Main-Dependencies (app: all)
# ------------------------------------------------------------------------------
.PHONY: all
all: clean_prj $(TRG) $(TRG)_nm.txt
# ------------------------------------------------------------------------------
# Main-Dependencies (app: rebuild)
# ------------------------------------------------------------------------------
.PHONY: rebuild
rebuild: clean $(TRG) $(TRG)_nm.txt
# ------------------------------------------------------------------------------
# clean project
# ------------------------------------------------------------------------------
.PHONY: clean_prj
clean_prj:
@-$(ECHO) +++ cleaning project
@-$(RM) -rf $(PATH_BIN) 2> $(PATH_NUL)
@-$(MKDIR) -p $(PATH_BIN)
@-$(MKDIR) -p $(PATH_OBJ)
@-$(MKDIR) -p $(PATH_ERR)
@-$(MKDIR) -p $(PATH_LST)
@-$(MKDIR) -p $(PATH_PRE)
@-$(MKDIR) -p $(PATH_COV)
# ------------------------------------------------------------------------------
# clean all
# ------------------------------------------------------------------------------
.PHONY: clean
clean:
@-$(ECHO) +++ cleaning all
@-$(RM) -rf $(PATH_BIN) 2> $(PATH_NUL)
@-$(RM) -rf $(PATH_TMP) 2> $(PATH_NUL)
@-$(MKDIR) -p $(PATH_BIN)
@-$(MKDIR) -p $(PATH_OBJ)
@-$(MKDIR) -p $(PATH_ERR)
@-$(MKDIR) -p $(PATH_LST)
@-$(MKDIR) -p $(PATH_COV)
# ------------------------------------------------------------------------------
# print the GNUmake version and the compiler version
# ------------------------------------------------------------------------------
.PHONY: version
version:
# Print the GNU make version and the compiler version
@$(ECHO) GNUmake version:
@$(MAKE) --version
@$(ECHO) GCC version:
@$(CL) -v
# ------------------------------------------------------------------------------
# Rules
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Link/locate application
# ------------------------------------------------------------------------------
$(TRG) : $(FILES_O)
@-$(ECHO) +++ linkink application to generate: $(TRG)
@-$(CL) $(LFLAGS) -L. -lc $(PATH_OBJ)/*.o -Wl,-Map,$(TRG).map -o $(TRG)
# profiling
@-$(CL) $(LFLAGS) -L. -lc $(PATH_COV)/*.o --coverage -o $(PATH_COV)/$(APP)
# ------------------------------------------------------------------------------
# parse the object files to obtain symbol information, and create a size summary
# ------------------------------------------------------------------------------
$(TRG)_nm.txt : $(TRG)
@-$(ECHO) +++ parsing symbols with nm to generate: $(TRG)_nm.txt
@-$(NM) --numeric-sort --print-size $(TRG) > $(TRG)_nm.txt
@-$(ECHO) +++ demangling symbols with c++filt to generate: $(TRG)_cppfilt.txt
@-$(NM) --numeric-sort --print-size $(TRG) | $(CPPFILT) > $(TRG)_cppfilt.txt
@-$(ECHO) +++ creating size summary table with size to generate: $(TRG)_size.txt
@-$(SIZE) -A -t $(TRG) > $(TRG)_size.txt
%.o : %.cpp
@$(ECHO) +++ compile: $<
# Compile the source file
# ...and Reformat (using sed) any possible error/warning messages for the VisualStudio(R) output window
# ...and Create an assembly listing using objdump
# ...and Generate a dependency file (using the -MM flag)
@-$(CL) $(CPPFLAGS) $< -E -o $(PATH_PRE)/$(basename $(@F)).pre
@-$(CL) $(CPPFLAGS) $< -c -o $(PATH_OBJ)/$(basename $(@F)).o 2> $(PATH_ERR)/$(basename $(@F)).err
@-$(SED) -e 's|.h:\([0-9]*\),|.h(\1) :|' -e 's|:\([0-9]*\):|(\1) :|' $(PATH_ERR)/$(basename $(@F)).err
@-$(OBJDUMP) --disassemble --line-numbers -S $(PATH_OBJ)/$(basename $(@F)).o > $(PATH_LST)/$(basename $(@F)).lst
@-$(CL) $(CPPFLAGS) $< -MM > $(PATH_OBJ)/$(basename $(@F)).d
# profiling
@-$(CL) $(CPPFLAGS) -O0 --coverage $< -c -o $(PATH_COV)/$(basename $(@F)).o 2> $(PATH_NUL)
%.o : %.c
@$(ECHO) +++ compile: $<
# Compile the source file
# ...and Reformat (using sed) any possible error/warning messages for the VisualStudio(R) output window
# ...and Create an assembly listing using objdump
# ...and Generate a dependency file (using the -MM flag)
@-$(CL) $(CFLAGS) $< -E -o $(PATH_PRE)/$(basename $(@F)).pre
@-$(CC) $(CFLAGS) $< -c -o $(PATH_OBJ)/$(basename $(@F)).o 2> $(PATH_ERR)/$(basename $(@F)).err
@-$(SED) -e 's|.h:\([0-9]*\),|.h(\1) :|' -e 's|:\([0-9]*\):|(\1) :|' $(PATH_ERR)/$(basename $(@F)).err
@-$(OBJDUMP) -S $(PATH_OBJ)/$(basename $(@F)).o > $(PATH_LST)/$(basename $(@F)).lst
@-$(CC) $(CFLAGS) $< -MM > $(PATH_OBJ)/$(basename $(@F)).d

@ -1,8 +1,15 @@
# printf / sprintf for embedded systems
[![Build Status](https://travis-ci.org/mpaland/printf.svg?branch=master)](https://travis-ci.org/mpaland/printf)
[![Coveralls Status](https://coveralls.io/repos/github/mpaland/printf/badge.svg?branch=master)](https://coveralls.io/github/mpaland/printf?branch=master)
[![Coverity Status](https://img.shields.io/coverity/scan/14180.svg)](https://scan.coverity.com/projects/mpaland-printf)
[![Github Issues](https://img.shields.io/github/issues/mpaland/printf.svg)](http://github.com/mpaland/printf/issues)
[![Github Releases](https://img.shields.io/github/release/mpaland/printf.svg)](https://github.com/mpaland/printf/releases)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/mpaland/avl_array/master/LICENSE)
This is a tiny but fully loaded printf, sprintf and snprintf implementation.
Primarily designed for usage in embedded systems, where printf is not available due to memory issues or in avoidance of linking against libc.
Using the standard libc printf may pull a lot of unwanted library stuff and can bloat code size about 20k. In this case the following implementation can be used.
Using the standard libc printf may pull **a lot** of unwanted library stuff and can bloat code size about 20k. In this case the following implementation can be used.
Absolutely **NO dependencies** are required, printf.cpp brings all necessary routines, even its own fast ftoa conversion.
If memory footprint is really a critical issue, floating point support can be turned off via the `PRINTF_FLOAT_SUPPORT` compiler switch.
@ -12,13 +19,13 @@ When using printf (instead of sprintf) you have to provide your own `_putchar()`
## Design goals
There is a boatload of so called 'tiny' printf implementations around. So why this one?
I tested many implementations, but most of them have very limited flag/specifier support, a lot of other dependencies or are just not standard compliant and failing the test suite.
I've tested many implementations, but most of them have very limited flag/specifier support, a lot of other dependencies or are just not standard compliant and failing the test suite.
Therefore I decided to write an own implementation which meets the following items:
- Very small implementation (< 500 code lines)
- NO dependencies, no libs, just one module file
- Support of all important flags, width and precision sub-specifiers (see below)
- Support of float number representation (with an own fast ftoa)
- Support of dec/float number representation (with an own fast itoa/ftoa)
- Reentrant and thread-safe, malloc free
- LINT and compiler L4 warning free, clean code
- Extensive test suite passing

Loading…
Cancel
Save