Skip to content

Commit

Permalink
fix too long long printf
Browse files Browse the repository at this point in the history
  • Loading branch information
srz-zumix committed Apr 12, 2020
1 parent 5652708 commit 61136e9
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 34 deletions.
23 changes: 7 additions & 16 deletions include/internal/iutest_stream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* @author t.shirayanagi
* @par copyright
* Copyright (C) 2012-2019, Takazumi Shirayanagi\n
* Copyright (C) 2012-2020, Takazumi Shirayanagi\n
* This software is released under the new BSD License,
* see LICENSE
*/
Expand All @@ -15,6 +15,8 @@
#ifndef INCG_IRIS_IUTEST_STREAM_HPP_3A4AF139_9F24_4730_81D0_DADFCE6DCF99_
#define INCG_IRIS_IUTEST_STREAM_HPP_3A4AF139_9F24_4730_81D0_DADFCE6DCF99_

#include "iutest_string.hpp"

namespace iutest {
namespace detail
{
Expand All @@ -34,24 +36,13 @@ class IOutStream
public:
virtual int Printf(const char* fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 3)
{
IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN()

// TODO : Fixed buffer...
char buf[1024] = {0};
va_list va;
va_start(va, fmt);
const int len = iu_vsnprintf(buf, sizeof(buf)-1, fmt, va);
const ::std::string str = StringFormat(fmt, va);
va_end(va);

if( len > 0 )
{
Write(buf, static_cast<size_t>(len), 1);
}
else
{
IUTEST_LOG_(WARNING) << "stream output trancated: " << fmt;
}
return len;
const size_t len = str.length();
Write(str.c_str(), len, 1);
return static_cast<int>(len);

IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END()
}
Expand Down
42 changes: 31 additions & 11 deletions include/internal/iutest_string.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* @author t.shirayanagi
* @par copyright
* Copyright (C) 2011-2019, Takazumi Shirayanagi\n
* Copyright (C) 2011-2020, Takazumi Shirayanagi\n
* This software is released under the new BSD License,
* see LICENSE
*/
Expand Down Expand Up @@ -47,6 +47,7 @@ namespace detail
{

::std::string StringFormat(const char* format, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 2);
::std::string StringFormat(const char* format, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 0);

namespace wrapper
{
Expand Down Expand Up @@ -144,12 +145,15 @@ int iu_vsnprintf(char* dst, size_t size, const char* format, va_list va) IUTEST_
inline int iu_vsnprintf(char* dst, size_t size, const char* format, va_list va)
{
char buffer[4096];
const int ret = vsprintf(buffer, format, va);
char* write_buffer = dst != NULL && size >= 4096 ? dst : buffer;
const int ret = vsprintf(write_buffer, format, va);
if( dst != NULL )
{
const size_t length = static_cast<size_t>(ret);
const size_t write = (size <= length) ? size - 1 : length;
strncpy(dst, buffer, write);
if( write_buffer == buffer ) {
strncpy(dst, buffer, write);
}
dst[write] = '\0';
}
return ret;
Expand Down Expand Up @@ -450,13 +454,25 @@ inline ::std::string ShowStringQuoted(const ::std::string& str)
}

inline ::std::string StringFormat(const char* format, ...)
{
va_list va;
va_start(va, format);
::std::string str = StringFormat(format, va);
va_end(va);
return str;
}
inline ::std::string StringFormat(const char* format, va_list va)
{
size_t n = strlen(format) * 2 + 1;
{
va_list va;
va_start(va, format);
const size_t ret = iu_vsnprintf(NULL, 0, format, va);
va_end(va);
va_list va2;
#ifdef va_copy
va_copy(va2, va);
#else
va2 = va;
#endif
const size_t ret = iu_vsnprintf(NULL, 0, format, va2);
va_end(va2);
if( ret > 0 )
{
n = ret + 1;
Expand All @@ -465,10 +481,14 @@ inline ::std::string StringFormat(const char* format, ...)
for( ;; )
{
char* dst = new char[n];
va_list va;
va_start(va, format);
const int written = iu_vsnprintf(dst, n, format, va);
va_end(va);
va_list va2;
#ifdef va_copy
va_copy(va2, va);
#else
va2 = va;
#endif
const int written = iu_vsnprintf(dst, n, format, va2);
va_end(va2);
if( written < 0 )
{
#if defined(EOVERFLOW)
Expand Down
19 changes: 12 additions & 7 deletions tools/docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
# Usage
# docker build tools/docker -t iutest
# docker build tools/docker --build-arg VERSION=latest -t iutest
# docker run -it -v $(pwd):/iutest iutest bash

FROM ubuntu:xenial
ARG VERSION=latest
FROM ubuntu:$VERSION
ARG VERSION
ARG CLANG_VERSION=9
RUN echo ${VERSION} > image_version

LABEL maintainer "srz_zumix <https://github.com/srz-zumix>"

Expand Down Expand Up @@ -48,14 +52,15 @@ RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test && \
--slave /usr/bin/gcov gcov /usr/bin/gcov-8

# clang
RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main" && \
RUN . /etc/os-release && \
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
apt-add-repository "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${CLANG_VERSION} main" && \
apt-get update && \
apt-get install -y --no-install-recommends clang-9 && \
apt-get install -y --no-install-recommends clang-${CLANG_VERSION} && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-9 1000 \
--slave /usr/bin/clang clang /usr/bin/clang-9
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${CLANG_VERSION} 1000 \
--slave /usr/bin/clang clang /usr/bin/clang-${CLANG_VERSION}

RUN mkdir /iutest
VOLUME [ "/iutest" ]
Expand Down

0 comments on commit 61136e9

Please sign in to comment.