use vips__substitute() more

should probably remove vips_snprintf() from a few more places
This commit is contained in:
John Cupitt 2014-09-27 11:37:28 +01:00
parent 61bae5eeff
commit e458365970
6 changed files with 30 additions and 21 deletions

2
TODO
View File

@ -12,7 +12,7 @@
easier to get into CPAN or whatever the python thing is called
- [put exif autorotate into jpeg load
- put exif autorotate into jpeg load
see

View File

@ -218,7 +218,7 @@ void vips_draw_operation_init( void );
void vips_mosaicing_operation_init( void );
guint64 vips__parse_size( const char *size_string );
int vips__substitute( const char *domain, char *buf, size_t len, char *sub );
int vips__substitute( char *buf, size_t len, char *sub );
int vips_check_coding_labq( const char *domain, VipsImage *im );
int vips_check_coding_rad( const char *domain, VipsImage *im );

View File

@ -159,13 +159,19 @@ vips_system_build( VipsObject *object )
vips_strncpy( cmd, system->cmd_format, VIPS_PATH_MAX );
if( system->in )
for( i = 0; i < VIPS_AREA( system->in )->n; i++ )
if( vips__substitute( class->nickname,
cmd, VIPS_PATH_MAX, system->in_name[i] ) )
if( vips__substitute( cmd, VIPS_PATH_MAX,
system->in_name[i] ) ) {
vips_error( class->nickname, "%s",
_( "unable to substitute "
"input filename" ) );
return( -1 );
}
if( system->out_name &&
vips__substitute( class->nickname,
cmd, VIPS_PATH_MAX, system->out_name ) )
vips__substitute( cmd, VIPS_PATH_MAX, system->out_name ) ) {
vips_error( class->nickname, "%s",
_( "unable to substitute output filename" ) );
return( -1 );
}
/* Swap all "%%" in the string for a single "%". We need this for
* compatibility with older printf-based vips_system()s which

View File

@ -1596,15 +1596,13 @@ vips_enum_from_nick( const char *domain, GType type, const char *nick )
return( -1 );
}
#define BIGBUF (10000)
/* Scan @buf for the first "%ns" (eg. "%12s") and substitute the
* lowest-numbered one for @sub. @buf is @len bytes in size.
*
* If there are no %ns, use the first %s.
*/
int
vips__substitute( const char *domain, char *buf, size_t len, char *sub )
vips__substitute( char *buf, size_t len, char *sub )
{
size_t buflen = strlen( buf );
size_t sublen = strlen( sub );
@ -1646,21 +1644,15 @@ vips__substitute( const char *domain, char *buf, size_t len, char *sub )
break;
}
if( !sub_start ) {
vips_error( domain,
"%s", _( "string contains no substitute marker" ) );
if( !sub_start )
return( -1 );
}
before_len = sub_start - buf;
marker_len = sub_end - sub_start;
after_len = buflen - (before_len + marker_len);
final_len = before_len + sublen + after_len + 1;
if( final_len > len ) {
vips_error( domain,
"%s", _( "not enough space to substitute" ) );
if( final_len > len )
return( -1 );
}
memmove( buf + before_len + sublen, buf + before_len + marker_len,
after_len + 1 );

View File

@ -281,19 +281,24 @@ class TestConversion(unittest.TestCase):
black = self.mono * 0.0
for fmt in all_formats:
test = self.colour.bandjoin2(black + max_value[fmt] / 2]).cast(fmt)
print fmt
test = self.colour.bandjoin2(black + max_value[fmt] / 2.0).cast(fmt)
pixel = test.getpoint(30, 30)
print 'before', pixel
im = test.flatten()
self.assertEqual(im.bands, 3)
pixel = im.getpoint(30, 30)
self.assertAlmostEqualObjects(pixel, [2, 2, 3])
print 'after', pixel
self.assertAlmostEqualObjects(pixel, [0, 1, 1])
im = test.flatten(background = [100, 100, 100])
self.assertEqual(im.bands, 3)
pixel = im.getpoint(30, 30)
self.assertAlmostEqualObjects(pixel, [50, 50, 51])
print pixel
self.assertAlmostEqualObjects(pixel, [50, 51, 51])

View File

@ -75,6 +75,7 @@
#include <locale.h>
#include <vips/vips.h>
#include <vips/internal.h>
#define ORIENTATION ("exif-ifd0-Orientation")
@ -699,10 +700,15 @@ thumbnail_write( VipsObject *process, VipsImage *im, const char *filename )
if( (p = strrchr( file, '.' )) )
*p = '\0';
/* Don't use vips_snprintf(), we only want to optionally substitute a
* single %s.
*/
vips_strncpy( buf, output_format, FILENAME_MAX );
vips__substitute( buf, FILENAME_MAX, file );
/* output_format can be an absolute path, in which case we discard the
* path from the incoming file.
*/
vips_snprintf( buf, FILENAME_MAX, output_format, file );
if( g_path_is_absolute( output_format ) )
output_name = g_strdup( buf );
else {