Skip to content

Commit

Permalink
* fix mulle_snprintf in truncation case
Browse files Browse the repository at this point in the history
  • Loading branch information
mulle-nat committed Dec 11, 2024
1 parent 0fdadeb commit d110c45
Show file tree
Hide file tree
Showing 15 changed files with 222 additions and 44 deletions.
2 changes: 1 addition & 1 deletion .mulle/share/env/environment-plugin.sh

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .mulle/share/env/version

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .mulle/share/sde/version/mulle-sde/cmake

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required( VERSION 3.14)

project( mulle-sprintf VERSION 3.2.0 LANGUAGES C)
project( mulle-sprintf VERSION 3.2.1 LANGUAGES C)



Expand Down
4 changes: 4 additions & 0 deletions RELEASENOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
### 3.2.1

* fix `mulle_snprintf` in truncation case

## 3.2.0

* unified printing of nan across platforms
Expand Down
2 changes: 1 addition & 1 deletion clib.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name" : "mulle-sprintf",
"version" : "3.2.0",
"version" : "3.2.1",
"description" : "🔢 An extensible sprintf function supporting stdarg and mulle-vararg",
"keywords" : [],
"license" : "BSD-3-Clause",
Expand Down
13 changes: 9 additions & 4 deletions cmake/share/InstallRpath.cmake

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

84 changes: 52 additions & 32 deletions src/mulle-sprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1024,7 +1024,10 @@ int mulle_buffer_mvsprintf( struct mulle_buffer *buffer,
return( -1);
}

return( _mulle_buffer_mvsprintf( buffer, format, arguments, mulle_sprintf_get_defaultconversion()));
return( _mulle_buffer_mvsprintf( buffer,
format,
arguments,
mulle_sprintf_get_defaultconversion()));
}


Expand Down Expand Up @@ -1074,7 +1077,10 @@ int mulle_buffer_vsprintf( struct mulle_buffer *buffer, char *format, va_list
errno = EINVAL;
return( -1);
}
return( _mulle_buffer_vsprintf( buffer, format, args, mulle_sprintf_get_defaultconversion()));
return( _mulle_buffer_vsprintf( buffer,
format,
args,
mulle_sprintf_get_defaultconversion()));
}


Expand All @@ -1092,7 +1098,10 @@ int mulle_buffer_sprintf( struct mulle_buffer *buffer, char *format, ...)
}

va_start( args, format );
rval = _mulle_buffer_vsprintf( buffer, format, args, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_vsprintf( buffer,
format,
args,
mulle_sprintf_get_defaultconversion());
va_end( args);

return( rval);
Expand All @@ -1105,9 +1114,9 @@ int mulle_buffer_sprintf( struct mulle_buffer *buffer, char *format, ...)

int mulle_vsnprintf( char *buf, size_t size, char *format, va_list va)
{
int rval;
int truncated;
struct mulle_buffer buffer;
int truncated;
int rval;

if( ! buf || ! size)
{
Expand All @@ -1117,28 +1126,28 @@ int mulle_vsnprintf( char *buf, size_t size, char *format, va_list va)

mulle_buffer_init_inflexible_with_static_bytes( &buffer, buf, size);
{
rval = _mulle_buffer_vsprintf( &buffer, format, va, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_vsprintf( &buffer,
format,
va,
mulle_sprintf_get_defaultconversion());
truncated = mulle_buffer_make_string( &buffer);
if( truncated)
{
errno = ENOMEM;
rval = -1;
}
}
mulle_buffer_done( &buffer);

if( truncated)
{
errno = ENOMEM;
rval = -1;
}

if( rval == -1)
*buf = 0;
return( rval);
}


int mulle_mvsnprintf( char *buf, size_t size, char *format, mulle_vararg_list arguments)
{
int rval;
int truncated;
struct mulle_buffer buffer;
int truncated;
int rval;

if( ! buf || ! size)
{
Expand All @@ -1148,28 +1157,27 @@ int mulle_mvsnprintf( char *buf, size_t size, char *format, mulle_vararg_list

mulle_buffer_init_inflexible_with_static_bytes( &buffer, buf, size);
{
rval = _mulle_buffer_mvsprintf( &buffer, format, arguments, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_mvsprintf( &buffer,
format,
arguments,
mulle_sprintf_get_defaultconversion());
truncated = mulle_buffer_make_string( &buffer);
if( truncated)
{
errno = ENOMEM;
rval = -1;
}
}
mulle_buffer_done( &buffer);

if( truncated)
{
errno = ENOMEM;
rval = -1;
}

if( rval == -1)
*buf = 0;

return( rval);
}


int mulle_snprintf( char *buf, size_t size, char *format, ...)
{
va_list args;
int rval;
va_list args;
int rval;

va_start( args, format );
rval = mulle_vsnprintf( buf, size, format, args);
Expand Down Expand Up @@ -1205,7 +1213,10 @@ int mulle_vasprintf( char **strp, char *format, va_list va)

mulle_buffer_do_string( buffer, NULL, s)
{
rval = _mulle_buffer_vsprintf( buffer, format, va, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_vsprintf( buffer,
format,
va,
mulle_sprintf_get_defaultconversion());
}
*strp = s;

Expand All @@ -1226,7 +1237,10 @@ int mulle_mvasprintf( char **strp, char *format, mulle_vararg_list arguments)

mulle_buffer_do_string( buffer, NULL, s)
{
rval = _mulle_buffer_mvsprintf( buffer, format, arguments, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_mvsprintf( buffer,
format,
arguments,
mulle_sprintf_get_defaultconversion());
}
*strp = s;

Expand Down Expand Up @@ -1263,7 +1277,10 @@ int mulle_allocator_vasprintf( struct mulle_allocator *allocator,

mulle_buffer_do_string( buffer, allocator, s)
{
rval = _mulle_buffer_vsprintf( buffer, format, va, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_vsprintf( buffer,
format,
va,
mulle_sprintf_get_defaultconversion());
}
*strp = s;

Expand All @@ -1287,7 +1304,10 @@ int mulle_allocator_mvasprintf( struct mulle_allocator *allocator,

mulle_buffer_do_string( buffer, allocator, s)
{
rval = _mulle_buffer_mvsprintf( buffer, format, arguments, mulle_sprintf_get_defaultconversion());
rval = _mulle_buffer_mvsprintf( buffer,
format,
arguments,
mulle_sprintf_get_defaultconversion());
}
*strp = s;

Expand Down
2 changes: 1 addition & 1 deletion src/mulle-sprintf.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
#include "mulle-sprintf-function.h"


#define MULLE__SPRINTF_VERSION ((3UL << 20) | (2 << 8) | 0)
#define MULLE__SPRINTF_VERSION ((3UL << 20) | (2 << 8) | 1)


struct mulle_buffer;
Expand Down
2 changes: 1 addition & 1 deletion test/.mulle/share/env/environment-plugin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ export MULLE_SOURCETREE_SYMLINK='YES'
#
#
#
export MULLE_SDE_INSTALLED_VERSION="3.2.0"
export MULLE_SDE_INSTALLED_VERSION="3.2.2"


2 changes: 1 addition & 1 deletion test/.mulle/share/env/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
5.3.0
5.3.1
50 changes: 50 additions & 0 deletions test/string/snprintf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include <mulle-sprintf/mulle-sprintf.h>
#include <mulle-testallocator/mulle-testallocator.h>

#include <stdio.h>
#include <errno.h>



static void snprintf_string_test( char *buf, size_t len, char *text)
{
int rval;

errno = 0;
rval = snprintf( buf, len, "%s", text);
printf( "snprintf : %zd \"%s\" (%d-%d)\n", len, buf, rval, errno);
}


static void mulle_snprintf_string_test( char *buf, size_t len, char *text)
{
int rval;

errno = 0;
rval = mulle_snprintf( buf, len, "%s", text);
printf( "mulle_snprintf : %zd \"%s\" (%d-%d)\n", len, buf, rval, errno);
}



int main()
{
char buf[ 18];
size_t i;

for( i = sizeof( buf); i;)
{
--i;

memset( buf, '*', sizeof( buf) - 1);
buf[ 15] = 0;
snprintf_string_test( buf, i, "VfL Bochum 1848");

memset( buf, '*', sizeof( buf) - 1);
buf[ 15] = 0;
mulle_snprintf_string_test( buf, i, "VfL Bochum 1848");
}

return( 0);
}

36 changes: 36 additions & 0 deletions test/string/snprintf.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
snprintf : 17 "VfL Bochum 1848" (15-0)
mulle_snprintf : 17 "VfL Bochum 1848" (15-0)
snprintf : 16 "VfL Bochum 1848" (15-0)
mulle_snprintf : 16 "VfL Bochum 1848" (15-0)
snprintf : 15 "VfL Bochum 184" (15-0)
mulle_snprintf : 15 "VfL Bochum 184" (-1-12)
snprintf : 14 "VfL Bochum 18" (15-0)
mulle_snprintf : 14 "VfL Bochum 18" (-1-12)
snprintf : 13 "VfL Bochum 1" (15-0)
mulle_snprintf : 13 "VfL Bochum 1" (-1-12)
snprintf : 12 "VfL Bochum " (15-0)
mulle_snprintf : 12 "VfL Bochum " (-1-12)
snprintf : 11 "VfL Bochum" (15-0)
mulle_snprintf : 11 "VfL Bochum" (-1-12)
snprintf : 10 "VfL Bochu" (15-0)
mulle_snprintf : 10 "VfL Bochu" (-1-12)
snprintf : 9 "VfL Boch" (15-0)
mulle_snprintf : 9 "VfL Boch" (-1-12)
snprintf : 8 "VfL Boc" (15-0)
mulle_snprintf : 8 "VfL Boc" (-1-12)
snprintf : 7 "VfL Bo" (15-0)
mulle_snprintf : 7 "VfL Bo" (-1-12)
snprintf : 6 "VfL B" (15-0)
mulle_snprintf : 6 "VfL B" (-1-12)
snprintf : 5 "VfL " (15-0)
mulle_snprintf : 5 "VfL " (-1-12)
snprintf : 4 "VfL" (15-0)
mulle_snprintf : 4 "VfL" (-1-12)
snprintf : 3 "Vf" (15-0)
mulle_snprintf : 3 "Vf" (-1-12)
snprintf : 2 "V" (15-0)
mulle_snprintf : 2 "V" (-1-12)
snprintf : 1 "" (15-0)
mulle_snprintf : 1 "" (-1-12)
snprintf : 0 "***************" (15-0)
mulle_snprintf : 0 "***************" (-1-22)
31 changes: 31 additions & 0 deletions test/string/sprintf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include <mulle-sprintf/mulle-sprintf.h>
#include <mulle-testallocator/mulle-testallocator.h>

#include <stdio.h>

// just a copy from snprintf mindlessly changed to sprintf

static void sprintf_string_test( char *buf, size_t len, char *text)
{
memset( buf, '*', len);
sprintf( buf, "%s", text);
printf( "sprintf: %zd \"%s\"\n", len, text);

memset( buf, '*', len);
mulle_sprintf( buf, "%s", text);
printf( "mulle_sprintf: %zd \"%s\"\n", len, buf);
}



int main()
{
char buf[ 16];
size_t i;

for( i = 0; i < sizeof( buf); i++)
sprintf_string_test( buf, i, "VfL Bochum 1848");

return( 0);
}

Loading

0 comments on commit d110c45

Please sign in to comment.