cleanup util

just a few little things left, yay
This commit is contained in:
John Cupitt 2011-03-28 16:03:31 +01:00
parent c7b74f620f
commit 4120f7b296
20 changed files with 489 additions and 430 deletions

5
TODO
View File

@ -1,4 +1,9 @@
- work though headers making sure old im_ stuff is gone - work though headers making sure old im_ stuff is gone
especially internal.h / private.h seem to have a lot of junk in them
im__tile_width etc. need moving, see init.c
- add MATLAB write - add MATLAB write

View File

@ -274,7 +274,7 @@ int im_close_plugins( void );
/* Loop over all loaded packages. /* Loop over all loaded packages.
*/ */
void *im_map_packages( VSListMap2Fn fn, void *a ); void *im_map_packages( VipsSListMap2Fn fn, void *a );
/* Convenience functions for finding packages, functions, etc. /* Convenience functions for finding packages, functions, etc.
*/ */

View File

@ -108,7 +108,7 @@ GType vips_format_get_type( void );
/* Map over and find formats. This uses type introspection to loop over /* Map over and find formats. This uses type introspection to loop over
* subclasses of VipsFormat. * subclasses of VipsFormat.
*/ */
void *vips_format_map( VSListMap2Fn fn, void *a, void *b ); void *vips_format_map( VipsSListMap2Fn fn, void *a, void *b );
VipsFormatClass *vips_format_for_file( const char *filename ); VipsFormatClass *vips_format_for_file( const char *filename );
VipsFormatClass *vips_format_for_name( const char *filename ); VipsFormatClass *vips_format_for_name( const char *filename );

View File

@ -96,7 +96,6 @@ int vips__write_header_bytes( VipsImage *im, unsigned char *to );
int im__ftruncate( int fd, gint64 pos ); int im__ftruncate( int fd, gint64 pos );
int im__seek( int fd, gint64 pos ); int im__seek( int fd, gint64 pos );
int im__get_bytes( const char *filename, unsigned char buf[], int len );
int im__open_image_file( const char * ); int im__open_image_file( const char * );
void im__format_init( void ); void im__format_init( void );
@ -125,7 +124,7 @@ VipsImage *im__convert_saveable( VipsImage *in,
im__saveable_t saveable, int format_table[10] ); im__saveable_t saveable, int format_table[10] );
void vips__link_break_all( VipsImage *im ); void vips__link_break_all( VipsImage *im );
void *vips__link_map( VipsImage *im, VSListMap2Fn fn, void *a, void *b ); void *vips__link_map( VipsImage *im, VipsSListMap2Fn fn, void *a, void *b );
GValue *im__gvalue_ref_string_new( const char *text ); GValue *im__gvalue_ref_string_new( const char *text );
void im__gslist_gvalue_free( GSList *list ); void im__gslist_gvalue_free( GSList *list );
@ -133,7 +132,7 @@ GSList *im__gslist_gvalue_copy( const GSList *list );
GSList *im__gslist_gvalue_merge( GSList *a, const GSList *b ); GSList *im__gslist_gvalue_merge( GSList *a, const GSList *b );
char *im__gslist_gvalue_get( const GSList *list ); char *im__gslist_gvalue_get( const GSList *list );
void im__buffer_init( void ); void vips__buffer_init( void );
int im__bandup( const char *domain, VipsImage *in, VipsImage *out, int n ); int im__bandup( const char *domain, VipsImage *in, VipsImage *out, int n );
int im__bandalike_vec( const char *domain, VipsImage **in, VipsImage **out, int n ); int im__bandalike_vec( const char *domain, VipsImage **in, VipsImage **out, int n );

View File

@ -276,7 +276,7 @@ VipsObject *vips_object_new( GType type,
VipsObject *vips_object_new_from_string( const char *base, const char *str ); VipsObject *vips_object_new_from_string( const char *base, const char *str );
void vips_object_to_string( VipsObject *object, VipsBuf *buf ); void vips_object_to_string( VipsObject *object, VipsBuf *buf );
void *vips_object_map( VSListMap2Fn fn, void *a, void *b ); void *vips_object_map( VipsSListMap2Fn fn, void *a, void *b );
typedef void *(*VipsTypeMap)( GType, void * ); typedef void *(*VipsTypeMap)( GType, void * );
typedef void *(*VipsTypeMap2)( GType, void *, void * ); typedef void *(*VipsTypeMap2)( GType, void *, void * );

View File

@ -162,57 +162,67 @@ G_STMT_START { \
(g_enum_get_value_by_nick( g_type_class_ref( ENUM ), STR ) || \ (g_enum_get_value_by_nick( g_type_class_ref( ENUM ), STR ) || \
g_enum_get_value_by_name( g_type_class_ref( ENUM ), STR )) g_enum_get_value_by_name( g_type_class_ref( ENUM ), STR ))
/* strtok replacement.
*/
char *im__break_token( char *str, char *brk );
/* Like GFunc, but return a value. /* Like GFunc, but return a value.
*/ */
typedef void *(*VSListMap2Fn)( void *, void *, void * ); typedef void *(*VipsSListMap2Fn)( void *, void *, void * );
typedef void *(*VSListMap4Fn)( void *, void *, void *, void *, void * ); typedef void *(*VipsSListMap4Fn)( void *, void *, void *, void *, void * );
typedef void *(*VSListFold2Fn)( void *, void *, void *, void * ); typedef void *(*VipsSListFold2Fn)( void *, void *, void *, void * );
gboolean im_slist_equal( GSList *l1, GSList *l2 ); gboolean vips_slist_equal( GSList *l1, GSList *l2 );
void *im_slist_map2( GSList *list, VSListMap2Fn fn, void *a, void *b ); void *vips_slist_map2( GSList *list, VipsSListMap2Fn fn, void *a, void *b );
void *im_slist_map2_rev( GSList *list, VSListMap2Fn fn, void *a, void *b ); void *vips_slist_map2_rev( GSList *list, VipsSListMap2Fn fn, void *a, void *b );
void *im_slist_map4( GSList *list, void *vips_slist_map4( GSList *list,
VSListMap4Fn fn, void *a, void *b, void *c, void *d ); VipsSListMap4Fn fn, void *a, void *b, void *c, void *d );
void *im_slist_fold2( GSList *list, void *start, void *vips_slist_fold2( GSList *list, void *start,
VSListFold2Fn fn, void *a, void *b ); VipsSListFold2Fn fn, void *a, void *b );
GSList *im_slist_filter( GSList *list, VSListMap2Fn fn, void *a, void *b ); GSList *vips_slist_filter( GSList *list, VipsSListMap2Fn fn, void *a, void *b );
void im_slist_free_all( GSList *list ); void vips_slist_free_all( GSList *list );
void *vips_map_equal( void *a, void *b );
void *im_map_equal( void *a, void *b ); void *vips_hash_table_map( GHashTable *hash, VipsSListMap2Fn fn, void *a, void *b );
void *im_hash_table_map( GHashTable *hash, VSListMap2Fn fn, void *a, void *b ); char *vips_strncpy( char *dest, const char *src, int n );
char *vips_strrstr( const char *haystack, const char *needle );
gboolean vips_ispostfix( const char *a, const char *b );
gboolean vips_isprefix( const char *a, const char *b );
char *vips_break_token( char *str, const char *brk );
char *im_strncpy( char *dest, const char *src, int n ); int vips_vsnprintf( char *str, size_t size, const char *format, va_list ap );
char *im_strrstr( const char *haystack, const char *needle ); int vips_snprintf( char *str, size_t size, const char *format, ... )
gboolean im_ispostfix( const char *a, const char *b );
gboolean im_isprefix( const char *a, const char *b );
int im_vsnprintf( char *str, size_t size, const char *format, va_list ap );
int im_snprintf( char *str, size_t size, const char *format, ... )
__attribute__((format(printf, 3, 4))); __attribute__((format(printf, 3, 4)));
char *im_break_token( char *str, const char *brk );
const char *im_skip_dir( const char *filename ); void vips_filename_split( const char *path, char *name, char *mode );
void im_filename_split( const char *path, char *name, char *mode ); const char *vips_skip_dir( const char *filename );
void im_filename_suffix( const char *path, char *suffix ); void vips_filename_suffix( const char *path, char *suffix );
int im_filename_suffix_match( const char *path, const char *suffixes[] ); int vips_filename_suffix_match( const char *path, const char *suffixes[] );
char *im_getnextoption( char **in ); char *vips_getnextoption( char **in );
char *im_getsuboption( const char *buf ); char *vips_getsuboption( const char *buf );
gint64 im_file_length( int fd ); gint64 vips_file_length( int fd );
int im__write( int fd, const void *buf, size_t count ); int vips__write( int fd, const void *buf, size_t count );
FILE *im__file_open_read( const char *filename, FILE *vips__file_open_read( const char *filename,
const char *fallback_dir, gboolean text_mode ); const char *fallback_dir, gboolean text_mode );
FILE *im__file_open_write( const char *filename, FILE *vips__file_open_write( const char *filename,
gboolean text_mode ); gboolean text_mode );
char *im__file_read( FILE *fp, const char *name, unsigned int *length_out ); char *vips__file_read( FILE *fp, const char *name, unsigned int *length_out );
char *im__file_read_name( const char *name, const char *fallback_dir, char *vips__file_read_name( const char *name, const char *fallback_dir,
unsigned int *length_out ); unsigned int *length_out );
int im__file_write( void *data, size_t size, size_t nmemb, FILE *stream ); int vips__file_write( void *data, size_t size, size_t nmemb, FILE *stream );
int vips__get_bytes( const char *filename, unsigned char buf[], int len );
GValue *vips__gvalue_ref_string_new( const char *text );
void vips__gslist_gvalue_free( GSList *list );
GSList *vips__gslist_gvalue_copy( const GSList *list );
GSList *vips__gslist_gvalue_merge( GSList *a, const GSList *b );
char *vips__gslist_gvalue_get( const GSList *list );
int vips__seek( int fd, gint64 pos );
int vips__ftruncate( int fd, gint64 pos );
int vips_existsf( const char *name, ... )
__attribute__((format(printf, 1, 2)));
FILE *vips_popenf( const char *fmt, const char *mode, ... )
__attribute__((format(printf, 1, 3)));
typedef enum { typedef enum {
VIPS_TOKEN_LEFT = 1, /* ({[ */ VIPS_TOKEN_LEFT = 1, /* ({[ */
@ -229,15 +239,10 @@ const char *vips__token_must( const char *buffer, VipsToken *token,
const char *vips__token_need( const char *buffer, VipsToken need_token, const char *vips__token_need( const char *buffer, VipsToken need_token,
char *string, int size ); char *string, int size );
int im_existsf( const char *name, ... ) int vips_ispoweroftwo( int p );
__attribute__((format(printf, 1, 2))); int vips_amiMSBfirst( void );
FILE *im_popenf( const char *fmt, const char *mode, ... )
__attribute__((format(printf, 1, 3)));
int im_ispoweroftwo( int p );
int im_isvips( const char *filename );
int im_amiMSBfirst( void );
char *im__temp_name( const char *format ); char *vips__temp_name( const char *format );
void vips__change_suffix( const char *name, char *out, int mx, void vips__change_suffix( const char *name, char *out, int mx,
const char *new_suff, const char **olds, int nolds ); const char *new_suff, const char **olds, int nolds );

View File

@ -97,7 +97,7 @@ typedef struct {
/* Set from the command-line. /* Set from the command-line.
*/ */
extern gboolean im__vector_enabled; extern gboolean vips__vector_enabled;
void vips_vector_init( void ); void vips_vector_init( void );
gboolean vips_vector_get_enabled( void ); gboolean vips_vector_get_enabled( void );

View File

@ -426,6 +426,53 @@ int im_wrapmany( VipsImage **in, VipsImage *out,
#define im__read_header_bytes vips__read_header_bytes #define im__read_header_bytes vips__read_header_bytes
#define im__write_header_bytes vips__write_header_bytes #define im__write_header_bytes vips__write_header_bytes
#define VSListMap2Fn VipsSListMap2Fn
#define VSListMap4Fn VipsSListMap4Fn
#define VSListFold2Fn VipsSListFold2Fn
#define im_slist_equal vips_slist_equal
#define im_slist_map2 vips_slist_map2
#define im_slist_map2_rev vips_slist_map2_rev
#define im_slist_map4 vips_slist_map4
#define im_slist_fold2 vips_slist_fold2
#define im_slist_filter vips_slist_filter
#define im_slist_free_all vips_slist_free_all
#define im_map_equal vips_map_equal
#define im_hash_table_map vips_hash_table_map
#define im_strncpy vips_strncpy
#define im_strrstr vips_strrstr
#define im_ispostfix vips_ispostfix
#define im_isprefix vips_isprefix
#define im_break_token vips_break_token
#define im_vsnprintf vips_vsnprintf
#define im_snprintf vips_snprintf
#define im_filename_split vips_filename_split
#define im_skip_dir vips_skip_dir
#define im_filename_suffix vips_filename_suffix
#define im_filename_suffix_match vips_filename_suffix_match
#define im_getnextoption vips_getnextoption
#define im_getsuboption vips_getsuboption
#define im_file_length vips_file_length
#define im__write vips__write
#define im__file_open_read vips__file_open_read
#define im__file_open_write vips__file_open_write
#define im__file_read vips__file_read
#define im__file_read_name vips__file_read_name
#define im__file_write vips__file_write
#define im__get_bytes vips__get_bytes
#define im__gvalue_ref_string_new vips__gvalue_ref_string_new
#define im__gslist_gvalue_free vips__gslist_gvalue_free
#define im__gslist_gvalue_copy vips__gslist_gvalue_copy
#define im__gslist_gvalue_merge vips__gslist_gvalue_merge
#define im__gslist_gvalue_get vips__gslist_gvalue_get
#define im__seek vips__seek
#define im__ftruncate vips__ftruncate
#define im_existsf vips_existsf
#define im_popenf vips_popenf
#define im_ispoweroftwo vips_ispoweroftwo
#define im_amiMSBfirst vips_amiMSBfirst
#define im__temp_name vips__temp_name
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /*__cplusplus*/ #endif /*__cplusplus*/

View File

@ -363,7 +363,7 @@ vips_buf_change( VipsBuf *buf, const char *old, const char *new )
/* Find pos of old. /* Find pos of old.
*/ */
for( i = buf->i - olen; i > 0; i-- ) for( i = buf->i - olen; i > 0; i-- )
if( im_isprefix( old, buf->base + i ) ) if( vips_isprefix( old, buf->base + i ) )
break; break;
g_assert( i >= 0 ); g_assert( i >= 0 );
@ -419,7 +419,7 @@ vips_buf_appendf( VipsBuf *buf, const char *fmt, ... )
va_list ap; va_list ap;
va_start( ap, fmt ); va_start( ap, fmt );
(void) im_vsnprintf( str, MAX_STRSIZE, fmt, ap ); (void) vips_vsnprintf( str, MAX_STRSIZE, fmt, ap );
va_end( ap ); va_end( ap );
return( vips_buf_appends( buf, str ) ); return( vips_buf_appends( buf, str ) );
@ -440,7 +440,7 @@ vips_buf_vappendf( VipsBuf *buf, const char *fmt, va_list ap )
{ {
char str[MAX_STRSIZE]; char str[MAX_STRSIZE];
(void) im_vsnprintf( str, MAX_STRSIZE, fmt, ap ); (void) vips_vsnprintf( str, MAX_STRSIZE, fmt, ap );
return( vips_buf_appends( buf, str ) ); return( vips_buf_appends( buf, str ) );
} }

View File

@ -369,7 +369,7 @@ buffer_find( VipsImage *im, VipsRect *r )
p = cache_list ? cache_list->buffers : NULL; p = cache_list ? cache_list->buffers : NULL;
/* This needs to be quick :-( don't use /* This needs to be quick :-( don't use
* im_slist_map2()/vips_rect_includesrect(), do the search inline. * vips_slist_map2()/vips_rect_includesrect(), do the search inline.
* *
* FIXME we return the first enclosing buffer, perhaps we should * FIXME we return the first enclosing buffer, perhaps we should
* search for the largest? * search for the largest?
@ -479,7 +479,7 @@ vips_buffer_print( VipsBuffer *buffer )
/* Init the buffer cache system. /* Init the buffer cache system.
*/ */
void void
im__buffer_init( void ) vips__buffer_init( void )
{ {
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
if( !thread_buffer_cache_key ) if( !thread_buffer_cache_key )

View File

@ -176,10 +176,10 @@ vips__link_break_rev( VipsImage *image_down, VipsImage *image_up )
void void
vips__link_break_all( VipsImage *image ) vips__link_break_all( VipsImage *image )
{ {
im_slist_map2( image->upstream, vips_slist_map2( image->upstream,
(VSListMap2Fn) vips__link_break, image, NULL ); (VipsSListMap2Fn) vips__link_break, image, NULL );
im_slist_map2( image->downstream, vips_slist_map2( image->downstream,
(VSListMap2Fn) vips__link_break_rev, image, NULL ); (VipsSListMap2Fn) vips__link_break_rev, image, NULL );
g_assert( !image->upstream ); g_assert( !image->upstream );
g_assert( !image->downstream ); g_assert( !image->downstream );
@ -187,7 +187,7 @@ vips__link_break_all( VipsImage *image )
static void * static void *
vips__link_mapp( VipsImage *image, vips__link_mapp( VipsImage *image,
VSListMap2Fn fn, int *serial, void *a, void *b ) VipsSListMap2Fn fn, int *serial, void *a, void *b )
{ {
void *res; void *res;
@ -200,8 +200,8 @@ vips__link_mapp( VipsImage *image,
if( (res = fn( image, a, b )) ) if( (res = fn( image, a, b )) )
return( res ); return( res );
return( im_slist_map4( image->downstream, return( vips_slist_map4( image->downstream,
(VSListMap4Fn) vips__link_mapp, fn, serial, a, b ) ); (VipsSListMap4Fn) vips__link_mapp, fn, serial, a, b ) );
} }
static void * static void *
@ -215,7 +215,7 @@ vips__link_map_cb( VipsImage *image, GSList **images )
/* Apply a function to an image and all downstream images, direct and indirect. /* Apply a function to an image and all downstream images, direct and indirect.
*/ */
void * void *
vips__link_map( VipsImage *image, VSListMap2Fn fn, void *a, void *b ) vips__link_map( VipsImage *image, VipsSListMap2Fn fn, void *a, void *b )
{ {
static int serial = 0; static int serial = 0;
@ -232,11 +232,11 @@ vips__link_map( VipsImage *image, VSListMap2Fn fn, void *a, void *b )
serial += 1; serial += 1;
images = NULL; images = NULL;
vips__link_mapp( image, vips__link_mapp( image,
(VSListMap2Fn) vips__link_map_cb, &serial, &images, NULL ); (VipsSListMap2Fn) vips__link_map_cb, &serial, &images, NULL );
for( p = images; p; p = p->next ) for( p = images; p; p = p->next )
g_object_ref( p->data ); g_object_ref( p->data );
result = im_slist_map2( images, fn, a, b ); result = vips_slist_map2( images, fn, a, b );
for( p = images; p; p = p->next ) for( p = images; p; p = p->next )
g_object_unref( p->data ); g_object_unref( p->data );
g_slist_free( images ); g_slist_free( images );
@ -431,7 +431,7 @@ vips_stop_many( void *seq, void *a, void *b )
* Start function for many images in. @a is a pointer to * Start function for many images in. @a is a pointer to
* a %NULL-terminated array of input images. * a %NULL-terminated array of input images.
* *
* See also: vips_image_generate(), im_allocate_input_array() * See also: vips_image_generate(), vips_allocate_input_array()
*/ */
void * void *
vips_start_many( VipsImage *out, void *a, void *b ) vips_start_many( VipsImage *out, void *a, void *b )
@ -607,7 +607,7 @@ vips_image_generate( VipsImage *image,
if( !image->hint_set ) { if( !image->hint_set ) {
vips_error( "vips_image_generate", vips_error( "vips_image_generate",
"%s", _( "im_demand_hint() not set" ) ); "%s", _( "demand hint not set" ) );
return( -1 ); return( -1 );
} }

View File

@ -86,7 +86,7 @@
* fields (see <link linkend="libvips-image">image</link>), then search for * fields (see <link linkend="libvips-image">image</link>), then search for
* a metadata field of that name (see * a metadata field of that name (see
* <link linkend="libvips-meta">meta</link>). * <link linkend="libvips-meta">meta</link>).
* Use im_header_get_typeof() to test for the * Use vips_image_get_typeof() to test for the
* existance and #GType * existance and #GType
* of a header field. * of a header field.
* *
@ -259,8 +259,8 @@ meta_sanity( const VipsImage *im )
if( im->meta ) if( im->meta )
g_hash_table_foreach( im->meta, g_hash_table_foreach( im->meta,
(GHFunc) meta_sanity_on_traverse, (void *) im ); (GHFunc) meta_sanity_on_traverse, (void *) im );
im_slist_map2( im->meta_traverse, vips_slist_map2( im->meta_traverse,
(VSListMap2Fn) meta_sanity_on_hash, (void *) im, NULL ); (VipsSListMap2Fn) meta_sanity_on_hash, (void *) im, NULL );
} }
#endif /*DEBUG*/ #endif /*DEBUG*/
@ -491,8 +491,8 @@ meta_cp( VipsImage *dst, const VipsImage *src )
/* Loop, copying fields. /* Loop, copying fields.
*/ */
meta_init( dst ); meta_init( dst );
im_slist_map2( src->meta_traverse, vips_slist_map2( src->meta_traverse,
(VSListMap2Fn) meta_cp_field, dst, NULL ); (VipsSListMap2Fn) meta_cp_field, dst, NULL );
} }
return( 0 ); return( 0 );
@ -557,8 +557,8 @@ vips_image_copy_fields_array( VipsImage *out, VipsImage *in[] )
/* Merge hists first to last. /* Merge hists first to last.
*/ */
for( i = 0; in[i]; i++ ) for( i = 0; in[i]; i++ )
out->history_list = im__gslist_gvalue_merge( out->history_list, out->history_list = vips__gslist_gvalue_merge(
in[i]->history_list ); out->history_list, in[i]->history_list );
return( 0 ); return( 0 );
} }
@ -681,12 +681,12 @@ vips_image_set( VipsImage *image, const char *field, GValue *value )
* but uninitialised. * but uninitialised.
* *
* This will return -1 and add a message to the error buffer if the field * This will return -1 and add a message to the error buffer if the field
* does not exist. Use im_header_get_typeof() to test for the * does not exist. Use vips_image_get_typeof() to test for the
* existence * existence
* of a field first if you are not certain it will be there. * of a field first if you are not certain it will be there.
* *
* For example, to read a double from an image (though of course you would use * For example, to read a double from an image (though of course you would use
* im_header_double() in practice): * vips_image_get_double() in practice):
* *
* |[ * |[
* GValue value = { 0 }; * GValue value = { 0 };
@ -906,8 +906,8 @@ vips_image_map( VipsImage *image, VipsImageMapFn fn, void *a )
} }
if( image->meta_traverse && if( image->meta_traverse &&
(result = im_slist_map2( image->meta_traverse, (result = vips_slist_map2( image->meta_traverse,
(VSListMap2Fn) vips_image_map_fn, fn, a )) ) (VipsSListMap2Fn) vips_image_map_fn, fn, a )) )
return( result ); return( result );
return( NULL ); return( NULL );
@ -1114,7 +1114,7 @@ transform_area_g_string( const GValue *src_value, GValue *dest_value )
char buf[256]; char buf[256];
area = g_value_get_boxed( src_value ); area = g_value_get_boxed( src_value );
im_snprintf( buf, 256, "VIPS_TYPE_AREA, count = %d, data = %p", vips_snprintf( buf, 256, "VIPS_TYPE_AREA, count = %d, data = %p",
area->count, area->data ); area->count, area->data );
g_value_set_string( dest_value, buf ); g_value_set_string( dest_value, buf );
} }
@ -1417,7 +1417,7 @@ transform_blob_g_string( const GValue *src_value, GValue *dest_value )
char buf[256]; char buf[256];
blob = vips_blob_get( src_value, &blob_length ); blob = vips_blob_get( src_value, &blob_length );
im_snprintf( buf, 256, "VIPS_TYPE_BLOB, data = %p, length = %zd", vips_snprintf( buf, 256, "VIPS_TYPE_BLOB, data = %p, length = %zd",
blob, blob_length ); blob, blob_length );
g_value_set_string( dest_value, buf ); g_value_set_string( dest_value, buf );
} }
@ -1815,7 +1815,7 @@ vips_image_get_as_string( VipsImage *image, const char *field, char **out )
/** /**
* vips_image_history_printf: * vips_image_history_printf:
* @image: add history liine to this image * @image: add history line to this image
* @format: printf() format string * @format: printf() format string
* @Varargs: arguments to format string * @Varargs: arguments to format string
* *
@ -1841,8 +1841,6 @@ vips_image_get_as_string( VipsImage *image, const char *field, char **out )
* the application level might involve many VIPS operations. History must be * the application level might involve many VIPS operations. History must be
* recorded by the application. * recorded by the application.
* *
* See also: im_updatehist().
*
* Returns: 0 on success, -1 on error. * Returns: 0 on success, -1 on error.
*/ */
int int
@ -1856,7 +1854,7 @@ vips_image_history_printf( VipsImage *image, const char *fmt, ... )
* a bit. * a bit.
*/ */
va_start( args, fmt ); va_start( args, fmt );
(void) im_vsnprintf( line, 4096 - 40, fmt, args ); (void) vips_vsnprintf( line, 4096 - 40, fmt, args );
va_end( args ); va_end( args );
strcat( line, " # " ); strcat( line, " # " );
@ -1867,12 +1865,12 @@ vips_image_history_printf( VipsImage *image, const char *fmt, ... )
line[strlen( line ) - 1] = '\0'; line[strlen( line ) - 1] = '\0';
#ifdef DEBUG #ifdef DEBUG
printf( "im_histlin: adding:\n\t%s\nto history on image %p\n", printf( "vips_image_history_printf: "
line, image ); "adding:\n\t%s\nto history on image %p\n", line, image );
#endif /*DEBUG*/ #endif /*DEBUG*/
image->history_list = g_slist_append( image->history_list, image->history_list = g_slist_append( image->history_list,
im__gvalue_ref_string_new( line ) ); vips__gvalue_ref_string_new( line ) );
return( 0 ); return( 0 );
} }
@ -1933,7 +1931,7 @@ const char *
vips_image_get_history( VipsImage *image ) vips_image_get_history( VipsImage *image )
{ {
if( !image->Hist ) if( !image->Hist )
image->Hist = im__gslist_gvalue_get( image->history_list ); image->Hist = vips__gslist_gvalue_get( image->history_list );
return( image->Hist ? image->Hist : "" ); return( image->Hist ? image->Hist : "" );
} }

View File

@ -415,7 +415,7 @@ vips_image_finalize( GObject *gobject )
VIPS_FREEF( g_mutex_free, image->sslock ); VIPS_FREEF( g_mutex_free, image->sslock );
VIPS_FREE( image->Hist ); VIPS_FREE( image->Hist );
VIPS_FREEF( im__gslist_gvalue_free, image->history_list ); VIPS_FREEF( vips__gslist_gvalue_free, image->history_list );
vips__meta_destroy( image ); vips__meta_destroy( image );
G_OBJECT_CLASS( vips_image_parent_class )->finalize( gobject ); G_OBJECT_CLASS( vips_image_parent_class )->finalize( gobject );
@ -537,11 +537,11 @@ vips_image_sanity( VipsObject *object, VipsBuf *buf )
vips_buf_appends( buf, "bad resolution\n" ); vips_buf_appends( buf, "bad resolution\n" );
} }
if( im_slist_map2( image->upstream, if( vips_slist_map2( image->upstream,
(VSListMap2Fn) vips_image_sanity_upstream, image, NULL ) ) (VipsSListMap2Fn) vips_image_sanity_upstream, image, NULL ) )
vips_buf_appends( buf, "upstream broken\n" ); vips_buf_appends( buf, "upstream broken\n" );
if( im_slist_map2( image->downstream, if( vips_slist_map2( image->downstream,
(VSListMap2Fn) vips_image_sanity_downstream, image, NULL ) ) (VipsSListMap2Fn) vips_image_sanity_downstream, image, NULL ) )
vips_buf_appends( buf, "downstream broken\n" ); vips_buf_appends( buf, "downstream broken\n" );
VIPS_OBJECT_CLASS( vips_image_parent_class )->sanity( object, buf ); VIPS_OBJECT_CLASS( vips_image_parent_class )->sanity( object, buf );
@ -928,7 +928,7 @@ vips_image_build( VipsObject *object )
VipsFormatFlags flags = VipsFormatFlags flags =
vips_format_get_flags( format, filename ); vips_format_get_flags( format, filename );
gboolean native = (flags & VIPS_FORMAT_BIGENDIAN) == gboolean native = (flags & VIPS_FORMAT_BIGENDIAN) ==
im_amiMSBfirst(); vips_amiMSBfirst();
if( native ) { if( native ) {
if( vips_image_open_input( image ) ) if( vips_image_open_input( image ) )
@ -1008,7 +1008,7 @@ vips_image_build( VipsObject *object )
/* Read the real file length and check against what we think /* Read the real file length and check against what we think
* the size should be. * the size should be.
*/ */
if( (image->file_length = im_file_length( image->fd )) == -1 ) if( (image->file_length = vips_file_length( image->fd )) == -1 )
return( -1 ); return( -1 );
/* Very common, so a special message. /* Very common, so a special message.
@ -1066,8 +1066,8 @@ vips_image_real_invalidate( VipsImage *image )
VIPS_DEBUG_MSG( "vips_image_real_invalidate: %p\n", image ); VIPS_DEBUG_MSG( "vips_image_real_invalidate: %p\n", image );
g_mutex_lock( image->sslock ); g_mutex_lock( image->sslock );
(void) im_slist_map2( image->regions, (void) vips_slist_map2( image->regions,
(VSListMap2Fn) vips_region_invalidate, NULL, NULL ); (VipsSListMap2Fn) vips_region_invalidate, NULL, NULL );
g_mutex_unlock( image->sslock ); g_mutex_unlock( image->sslock );
} }
@ -1245,7 +1245,7 @@ vips_image_init( VipsImage *image )
{ {
/* Default to native order. /* Default to native order.
*/ */
image->magic = im_amiMSBfirst() ? VIPS_MAGIC_SPARC : VIPS_MAGIC_INTEL; image->magic = vips_amiMSBfirst() ? VIPS_MAGIC_SPARC : VIPS_MAGIC_INTEL;
image->Xres = 1.0; image->Xres = 1.0;
image->Yres = 1.0; image->Yres = 1.0;
@ -1296,7 +1296,7 @@ void
vips_image_invalidate_all( VipsImage *image ) vips_image_invalidate_all( VipsImage *image )
{ {
(void) vips__link_map( image, (void) vips__link_map( image,
(VSListMap2Fn) vips_image_invalidate_all_cb, NULL, NULL ); (VipsSListMap2Fn) vips_image_invalidate_all_cb, NULL, NULL );
} }
/* Attach a new time struct, if necessary, and reset it. /* Attach a new time struct, if necessary, and reset it.
@ -1463,7 +1463,7 @@ vips_image_temp_name( void )
static int serial = 0; static int serial = 0;
static char name[256]; static char name[256];
im_snprintf( name, 256, "temp-%d", serial++ ); vips_snprintf( name, 256, "temp-%d", serial++ );
return( name ); return( name );
} }
@ -1718,7 +1718,7 @@ vips_image_new_disc_temp( const char *format )
char *name; char *name;
VipsImage *image; VipsImage *image;
if( !(name = im__temp_name( format )) ) if( !(name = vips__temp_name( format )) )
return( NULL ); return( NULL );
if( !(image = vips_image_new_from_file( name, "w" )) ) { if( !(image = vips_image_new_from_file( name, "w" )) ) {

View File

@ -205,7 +205,7 @@ vips_init( const char *argv0 )
/* Get i18n .mo files from $VIPSHOME/share/locale/. /* Get i18n .mo files from $VIPSHOME/share/locale/.
*/ */
im_snprintf( name, 256, vips_snprintf( name, 256,
"%s" G_DIR_SEPARATOR_S "share" G_DIR_SEPARATOR_S "locale", "%s" G_DIR_SEPARATOR_S "share" G_DIR_SEPARATOR_S "locale",
prefix ); prefix );
bindtextdomain( GETTEXT_PACKAGE, name ); bindtextdomain( GETTEXT_PACKAGE, name );
@ -237,7 +237,7 @@ vips_init( const char *argv0 )
/* Start up the buffer cache. /* Start up the buffer cache.
*/ */
im__buffer_init(); vips__buffer_init();
/* Get the run-time compiler going. /* Get the run-time compiler going.
*/ */
@ -289,7 +289,7 @@ static GOptionEntry option_entries[] = {
&im__disc_threshold, &im__disc_threshold,
N_( "image size above which to decompress to disc" ), NULL }, N_( "image size above which to decompress to disc" ), NULL },
{ "vips-novector", 't', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, { "vips-novector", 't', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,
&im__vector_enabled, &vips__vector_enabled,
N_( "disable vectorised versions of operations" ), NULL }, N_( "disable vectorised versions of operations" ), NULL },
{ NULL } { NULL }
}; };
@ -369,31 +369,31 @@ extract_prefix( const char *dir, const char *name )
/* Is dir relative? Prefix with cwd. /* Is dir relative? Prefix with cwd.
*/ */
if( !g_path_is_absolute( dir ) ) { if( !g_path_is_absolute( dir ) ) {
im_snprintf( edir, PATH_MAX, "%s" G_DIR_SEPARATOR_S "%s", vips_snprintf( edir, PATH_MAX, "%s" G_DIR_SEPARATOR_S "%s",
get_current_dir(), dir ); get_current_dir(), dir );
} }
else { else {
im_strncpy( edir, dir, PATH_MAX ); vips_strncpy( edir, dir, PATH_MAX );
} }
/* Chop off the trailing prog name, plus the trailing /* Chop off the trailing prog name, plus the trailing
* G_DIR_SEPARATOR_S. * G_DIR_SEPARATOR_S.
*/ */
if( !im_ispostfix( edir, name ) ) if( !vips_ispostfix( edir, name ) )
return( NULL ); return( NULL );
im_strncpy( vname, edir, PATH_MAX ); vips_strncpy( vname, edir, PATH_MAX );
vname[strlen( edir ) - strlen( name ) - 1] = '\0'; vname[strlen( edir ) - strlen( name ) - 1] = '\0';
/* Remove any "/./", any trailing "/.", any trailing "/". /* Remove any "/./", any trailing "/.", any trailing "/".
*/ */
for( i = 0; i < (int) strlen( vname ); i++ ) for( i = 0; i < (int) strlen( vname ); i++ )
if( im_isprefix( G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S, if( vips_isprefix( G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S,
vname + i ) ) vname + i ) )
memcpy( vname + i, vname + i + 2, memcpy( vname + i, vname + i + 2,
strlen( vname + i + 2 ) + 1 ); strlen( vname + i + 2 ) + 1 );
if( im_ispostfix( vname, G_DIR_SEPARATOR_S "." ) ) if( vips_ispostfix( vname, G_DIR_SEPARATOR_S "." ) )
vname[strlen( vname ) - 2] = '\0'; vname[strlen( vname ) - 2] = '\0';
if( im_ispostfix( vname, G_DIR_SEPARATOR_S ) ) if( vips_ispostfix( vname, G_DIR_SEPARATOR_S ) )
vname[strlen( vname ) - 1] = '\0'; vname[strlen( vname ) - 1] = '\0';
#ifdef DEBUG #ifdef DEBUG
@ -402,7 +402,7 @@ extract_prefix( const char *dir, const char *name )
/* Ought to be a "/bin" at the end now. /* Ought to be a "/bin" at the end now.
*/ */
if( !im_ispostfix( vname, G_DIR_SEPARATOR_S "bin" ) ) if( !vips_ispostfix( vname, G_DIR_SEPARATOR_S "bin" ) )
return( NULL ); return( NULL );
vname[strlen( vname ) - strlen( G_DIR_SEPARATOR_S "bin" )] = '\0'; vname[strlen( vname ) - strlen( G_DIR_SEPARATOR_S "bin" )] = '\0';
@ -422,12 +422,12 @@ scan_path( char *path, const char *name )
char *prefix; char *prefix;
for( p = path; for( p = path;
(q = im_break_token( p, G_SEARCHPATH_SEPARATOR_S )); p = q ) { (q = vips_break_token( p, G_SEARCHPATH_SEPARATOR_S )); p = q ) {
char str[PATH_MAX]; char str[PATH_MAX];
/* Form complete path. /* Form complete path.
*/ */
im_snprintf( str, PATH_MAX, vips_snprintf( str, PATH_MAX,
"%s" G_DIR_SEPARATOR_S "%s", p, name ); "%s" G_DIR_SEPARATOR_S "%s", p, name );
#ifdef DEBUG #ifdef DEBUG
@ -435,7 +435,7 @@ scan_path( char *path, const char *name )
p, name ); p, name );
#endif /*DEBUG*/ #endif /*DEBUG*/
if( im_existsf( "%s", str ) && if( vips_existsf( "%s", str ) &&
(prefix = extract_prefix( str, name )) ) { (prefix = extract_prefix( str, name )) ) {
return( prefix ); return( prefix );
} }
@ -463,10 +463,10 @@ find_file( const char *name )
#ifdef OS_WIN32 #ifdef OS_WIN32
/* Windows always searches '.' first, so prepend cwd to path. /* Windows always searches '.' first, so prepend cwd to path.
*/ */
im_snprintf( full_path, PATH_MAX, "%s" G_SEARCHPATH_SEPARATOR_S "%s", vips_snprintf( full_path, PATH_MAX, "%s" G_SEARCHPATH_SEPARATOR_S "%s",
get_current_dir(), path ); get_current_dir(), path );
#else /*!OS_WIN32*/ #else /*!OS_WIN32*/
im_strncpy( full_path, path, PATH_MAX ); vips_strncpy( full_path, path, PATH_MAX );
#endif /*OS_WIN32*/ #endif /*OS_WIN32*/
if( (prefix = scan_path( full_path, name )) ) if( (prefix = scan_path( full_path, name )) )
@ -517,8 +517,8 @@ guess_prefix( const char *argv0, const char *name )
char full_path[PATH_MAX]; char full_path[PATH_MAX];
char resolved[PATH_MAX]; char resolved[PATH_MAX];
im_snprintf( full_path, PATH_MAX, "%s" G_DIR_SEPARATOR_S "%s", vips_snprintf( full_path, PATH_MAX,
get_current_dir(), argv0 ); "%s" G_DIR_SEPARATOR_S "%s", get_current_dir(), argv0 );
if( realpath( full_path, resolved ) ) { if( realpath( full_path, resolved ) ) {
if( (prefix = extract_prefix( resolved, name )) ) { if( (prefix = extract_prefix( resolved, name )) ) {
@ -576,7 +576,7 @@ vips_guess_prefix( const char *argv0, const char *env_name )
/* Get the program name from argv0. /* Get the program name from argv0.
*/ */
p = im_skip_dir( argv0 ); p = vips_skip_dir( argv0 );
/* Add the exe suffix, if it's missing. /* Add the exe suffix, if it's missing.
*/ */
@ -586,7 +586,7 @@ vips_guess_prefix( const char *argv0, const char *env_name )
vips__change_suffix( p, name, PATH_MAX, IM_EXEEXT, olds, 1 ); vips__change_suffix( p, name, PATH_MAX, IM_EXEEXT, olds, 1 );
} }
else else
im_strncpy( name, p, PATH_MAX ); vips_strncpy( name, p, PATH_MAX );
#ifdef DEBUG #ifdef DEBUG
printf( "vips_guess_prefix: argv0 = %s\n", argv0 ); printf( "vips_guess_prefix: argv0 = %s\n", argv0 );

View File

@ -1212,7 +1212,7 @@ vips_object_to_string( VipsObject *object, VipsBuf *buf )
} }
typedef struct { typedef struct {
VSListMap2Fn fn; VipsSListMap2Fn fn;
void *a; void *a;
void *b; void *b;
void *result; void *result;
@ -1226,7 +1226,7 @@ vips_object_map_sub( VipsObject *object, VipsObjectMapArgs *args )
} }
void * void *
vips_object_map( VSListMap2Fn fn, void *a, void *b ) vips_object_map( VipsSListMap2Fn fn, void *a, void *b )
{ {
VipsObjectMapArgs args; VipsObjectMapArgs args;
@ -1391,7 +1391,8 @@ vips_object_print_all_cb( VipsObject *object )
void void
vips_object_print_all( void ) vips_object_print_all( void )
{ {
vips_object_map( (VSListMap2Fn) vips_object_print_all_cb, NULL, NULL ); vips_object_map(
(VipsSListMap2Fn) vips_object_print_all_cb, NULL, NULL );
} }
static void * static void *
@ -1405,5 +1406,6 @@ vips_object_sanity_all_cb( VipsObject *object )
void void
vips_object_sanity_all( void ) vips_object_sanity_all( void )
{ {
vips_object_map( (VSListMap2Fn) vips_object_sanity_all_cb, NULL, NULL ); vips_object_map(
(VipsSListMap2Fn) vips_object_sanity_all_cb, NULL, NULL );
} }

View File

@ -235,7 +235,7 @@ render_free( Render *render )
g_mutex_free( render->ref_count_lock ); g_mutex_free( render->ref_count_lock );
g_mutex_free( render->lock ); g_mutex_free( render->lock );
im_slist_map2( render->all, (VSListMap2Fn) tile_free, NULL, NULL ); vips_slist_map2( render->all, (VipsSListMap2Fn) tile_free, NULL, NULL );
VIPS_FREEF( g_slist_free, render->all ); VIPS_FREEF( g_slist_free, render->all );
render->ntiles = 0; render->ntiles = 0;
VIPS_FREEF( g_slist_free, render->dirty ); VIPS_FREEF( g_slist_free, render->dirty );
@ -537,7 +537,7 @@ render_thread_create( void )
render_thread_main, NULL, render_thread_main, NULL,
IM__DEFAULT_STACK_SIZE, TRUE, FALSE, IM__DEFAULT_STACK_SIZE, TRUE, FALSE,
G_THREAD_PRIORITY_NORMAL, NULL )) ) { G_THREAD_PRIORITY_NORMAL, NULL )) ) {
vips_error( "im_render", vips_error( "sink_screen",
"%s", _( "unable to create thread" ) ); "%s", _( "unable to create thread" ) );
return( -1 ); return( -1 );
} }

View File

@ -67,7 +67,7 @@
/* Test two lists for eqality. /* Test two lists for eqality.
*/ */
gboolean gboolean
im_slist_equal( GSList *l1, GSList *l2 ) vips_slist_equal( GSList *l1, GSList *l2 )
{ {
while( l1 && l2 ) { while( l1 && l2 ) {
if( l1->data != l2->data ) if( l1->data != l2->data )
@ -86,7 +86,7 @@ im_slist_equal( GSList *l1, GSList *l2 )
/* Map over an slist. _copy() the list in case the callback changes it. /* Map over an slist. _copy() the list in case the callback changes it.
*/ */
void * void *
im_slist_map2( GSList *list, VSListMap2Fn fn, void *a, void *b ) vips_slist_map2( GSList *list, VipsSListMap2Fn fn, void *a, void *b )
{ {
GSList *copy; GSList *copy;
GSList *i; GSList *i;
@ -101,28 +101,10 @@ im_slist_map2( GSList *list, VSListMap2Fn fn, void *a, void *b )
return( result ); return( result );
} }
void *
im_slist_map4( GSList *list,
VSListMap4Fn fn, void *a, void *b, void *c, void *d )
{
GSList *copy;
GSList *i;
void *result;
copy = g_slist_copy( list );
result = NULL;
for( i = copy;
i && !(result = fn( i->data, a, b, c, d )); i = i->next )
;
g_slist_free( copy );
return( result );
}
/* Map backwards. We _reverse() rather than recurse and unwind to save stack. /* Map backwards. We _reverse() rather than recurse and unwind to save stack.
*/ */
void * void *
im_slist_map2_rev( GSList *list, VSListMap2Fn fn, void *a, void *b ) vips_slist_map2_rev( GSList *list, VipsSListMap2Fn fn, void *a, void *b )
{ {
GSList *copy; GSList *copy;
GSList *i; GSList *i;
@ -139,16 +121,26 @@ im_slist_map2_rev( GSList *list, VSListMap2Fn fn, void *a, void *b )
} }
void * void *
im_map_equal( void *a, void *b ) vips_slist_map4( GSList *list,
VipsSListMap4Fn fn, void *a, void *b, void *c, void *d )
{ {
if( a == b ) GSList *copy;
return( a ); GSList *i;
void *result;
return( NULL ); copy = g_slist_copy( list );
result = NULL;
for( i = copy;
i && !(result = fn( i->data, a, b, c, d )); i = i->next )
;
g_slist_free( copy );
return( result );
} }
void * void *
im_slist_fold2( GSList *list, void *start, VSListFold2Fn fn, void *a, void *b ) vips_slist_fold2( GSList *list, void *start,
VipsSListFold2Fn fn, void *a, void *b )
{ {
void *c; void *c;
GSList *this, *next; GSList *this, *next;
@ -163,25 +155,10 @@ im_slist_fold2( GSList *list, void *start, VSListFold2Fn fn, void *a, void *b )
return( c ); return( c );
} }
static void
im_slist_free_all_cb( void * thing, void * dummy )
{
vips_free( thing );
}
/* Free a g_slist of things which need vips_free()ing.
*/
void
im_slist_free_all( GSList *list )
{
g_slist_foreach( list, im_slist_free_all_cb, NULL );
g_slist_free( list );
}
/* Remove all occurences of an item from a list. /* Remove all occurences of an item from a list.
*/ */
GSList * GSList *
im_slist_filter( GSList *list, VSListMap2Fn fn, void *a, void *b ) vips_slist_filter( GSList *list, VipsSListMap2Fn fn, void *a, void *b )
{ {
GSList *tmp; GSList *tmp;
GSList *prev; GSList *prev;
@ -211,15 +188,39 @@ im_slist_filter( GSList *list, VSListMap2Fn fn, void *a, void *b )
return( list ); return( list );
} }
static void
vips_slist_free_all_cb( void * thing, void * dummy )
{
vips_free( thing );
}
/* Free a g_slist of things which need vips_free()ing.
*/
void
vips_slist_free_all( GSList *list )
{
g_slist_foreach( list, vips_slist_free_all_cb, NULL );
g_slist_free( list );
}
void *
vips_map_equal( void *a, void *b )
{
if( a == b )
return( a );
return( NULL );
}
typedef struct { typedef struct {
void *a; void *a;
void *b; void *b;
VSListMap2Fn fn; VipsSListMap2Fn fn;
void *result; void *result;
} Pair; } Pair;
static gboolean static gboolean
im_hash_table_predicate( const char *key, void *value, Pair *pair ) vips_hash_table_predicate( const char *key, void *value, Pair *pair )
{ {
return( (pair->result == pair->fn( value, pair->a, pair->b )) ); return( (pair->result == pair->fn( value, pair->a, pair->b )) );
} }
@ -227,7 +228,7 @@ im_hash_table_predicate( const char *key, void *value, Pair *pair )
/* Like slist map, but for a hash table. /* Like slist map, but for a hash table.
*/ */
void * void *
im_hash_table_map( GHashTable *hash, VSListMap2Fn fn, void *a, void *b ) vips_hash_table_map( GHashTable *hash, VipsSListMap2Fn fn, void *a, void *b )
{ {
Pair pair; Pair pair;
@ -236,7 +237,7 @@ im_hash_table_map( GHashTable *hash, VSListMap2Fn fn, void *a, void *b )
pair.fn = fn; pair.fn = fn;
pair.result = NULL; pair.result = NULL;
g_hash_table_find( hash, (GHRFunc) im_hash_table_predicate, &pair ); g_hash_table_find( hash, (GHRFunc) vips_hash_table_predicate, &pair );
return( pair.result ); return( pair.result );
} }
@ -244,7 +245,7 @@ im_hash_table_map( GHashTable *hash, VSListMap2Fn fn, void *a, void *b )
/* Like strncpy(), but always NULL-terminate, and don't pad with NULLs. /* Like strncpy(), but always NULL-terminate, and don't pad with NULLs.
*/ */
char * char *
im_strncpy( char *dest, const char *src, int n ) vips_strncpy( char *dest, const char *src, int n )
{ {
int i; int i;
@ -261,7 +262,7 @@ im_strncpy( char *dest, const char *src, int n )
/* Find the rightmost occurrence of needle in haystack. /* Find the rightmost occurrence of needle in haystack.
*/ */
char * char *
im_strrstr( const char *haystack, const char *needle ) vips_strrstr( const char *haystack, const char *needle )
{ {
int haystack_len = strlen( haystack ); int haystack_len = strlen( haystack );
int needle_len = strlen( needle ); int needle_len = strlen( needle );
@ -277,7 +278,7 @@ im_strrstr( const char *haystack, const char *needle )
/* Test for string b ends string a. /* Test for string b ends string a.
*/ */
gboolean gboolean
im_ispostfix( const char *a, const char *b ) vips_ispostfix( const char *a, const char *b )
{ {
int m = strlen( a ); int m = strlen( a );
int n = strlen( b ); int n = strlen( b );
@ -291,7 +292,7 @@ im_ispostfix( const char *a, const char *b )
/* Test for string a starts string b. /* Test for string a starts string b.
*/ */
gboolean gboolean
im_isprefix( const char *a, const char *b ) vips_isprefix( const char *a, const char *b )
{ {
int n = strlen( a ); int n = strlen( a );
int m = strlen( b ); int m = strlen( b );
@ -320,7 +321,7 @@ im_isprefix( const char *a, const char *b )
* int i; * int i;
* int v[...]; * int v[...];
* *
* for( i = 0; (q = im_break_token( p, " " )); i++, p = q ) * for( i = 0; (q = vips_break_token( p, " " )); i++, p = q )
* v[i] = atoi( p ); * v[i] = atoi( p );
* *
* will set * will set
@ -335,11 +336,11 @@ im_isprefix( const char *a, const char *b )
* int i; * int i;
* int v[...]; * int v[...];
* *
* for( i = 0; p; p = im_break_token( p, " " ) ) * for( i = 0; p; p = vips_break_token( p, " " ) )
* v[i] = atoi( p ); * v[i] = atoi( p );
*/ */
char * char *
im_break_token( char *str, const char *brk ) vips_break_token( char *str, const char *brk )
{ {
char *p; char *p;
@ -378,7 +379,7 @@ im_break_token( char *str, const char *brk )
/* Wrapper over (v)snprintf() ... missing on old systems. /* Wrapper over (v)snprintf() ... missing on old systems.
*/ */
int int
im_vsnprintf( char *str, size_t size, const char *format, va_list ap ) vips_vsnprintf( char *str, size_t size, const char *format, va_list ap )
{ {
#ifdef HAVE_VSNPRINTF #ifdef HAVE_VSNPRINTF
return( vsnprintf( str, size, format, ap ) ); return( vsnprintf( str, size, format, ap ) );
@ -398,20 +399,20 @@ im_vsnprintf( char *str, size_t size, const char *format, va_list ap )
"(%d bytes written to buffer of %d bytes)", "(%d bytes written to buffer of %d bytes)",
n, MAX_BUF ); n, MAX_BUF );
im_strncpy( str, buf, size ); vips_strncpy( str, buf, size );
return( n ); return( n );
#endif /*HAVE_VSNPRINTF*/ #endif /*HAVE_VSNPRINTF*/
} }
int int
im_snprintf( char *str, size_t size, const char *format, ... ) vips_snprintf( char *str, size_t size, const char *format, ... )
{ {
va_list ap; va_list ap;
int n; int n;
va_start( ap, format ); va_start( ap, format );
n = im_vsnprintf( str, size, format, ap ); n = vips_vsnprintf( str, size, format, ap );
va_end( ap ); va_end( ap );
return( n ); return( n );
@ -428,11 +429,11 @@ im_snprintf( char *str, size_t size, const char *format, ... )
* *
*/ */
void void
im_filename_split( const char *path, char *name, char *mode ) vips_filename_split( const char *path, char *name, char *mode )
{ {
char *p; char *p;
im_strncpy( name, path, FILENAME_MAX ); vips_strncpy( name, path, FILENAME_MAX );
/* Search back towards start stopping at each ':' char. /* Search back towards start stopping at each ':' char.
*/ */
@ -448,7 +449,7 @@ im_filename_split( const char *path, char *name, char *mode )
} }
if( *p == ':' ) { if( *p == ':' ) {
im_strncpy( mode, p + 1, FILENAME_MAX ); vips_strncpy( mode, p + 1, FILENAME_MAX );
*p = '\0'; *p = '\0';
} }
else else
@ -464,7 +465,7 @@ im_filename_split( const char *path, char *name, char *mode )
* either, just return the filename. * either, just return the filename.
*/ */
const char * const char *
im_skip_dir( const char *path ) vips_skip_dir( const char *path )
{ {
char name[FILENAME_MAX]; char name[FILENAME_MAX];
char mode[FILENAME_MAX]; char mode[FILENAME_MAX];
@ -477,7 +478,7 @@ im_skip_dir( const char *path )
/* Remove any trailing save modifiers: we don't want '/' or '\' in the /* Remove any trailing save modifiers: we don't want '/' or '\' in the
* modifier confusing us. * modifier confusing us.
*/ */
im_filename_split( path, name, mode ); vips_filename_split( path, name, mode );
/* The '\0' char at the end of the string. /* The '\0' char at the end of the string.
*/ */
@ -499,13 +500,13 @@ im_skip_dir( const char *path )
* FILENAME_MAX chars. Include the "." character, if any. * FILENAME_MAX chars. Include the "." character, if any.
*/ */
void void
im_filename_suffix( const char *path, char *suffix ) vips_filename_suffix( const char *path, char *suffix )
{ {
char name[FILENAME_MAX]; char name[FILENAME_MAX];
char mode[FILENAME_MAX]; char mode[FILENAME_MAX];
char *p; char *p;
im_filename_split( path, name, mode ); vips_filename_split( path, name, mode );
if( (p = strrchr( name, '.' )) ) if( (p = strrchr( name, '.' )) )
strcpy( suffix, p ); strcpy( suffix, p );
else else
@ -515,12 +516,12 @@ im_filename_suffix( const char *path, char *suffix )
/* Does a filename have one of a set of suffixes. Ignore case. /* Does a filename have one of a set of suffixes. Ignore case.
*/ */
int int
im_filename_suffix_match( const char *path, const char *suffixes[] ) vips_filename_suffix_match( const char *path, const char *suffixes[] )
{ {
char suffix[FILENAME_MAX]; char suffix[FILENAME_MAX];
const char **p; const char **p;
im_filename_suffix( path, suffix ); vips_filename_suffix( path, suffix );
for( p = suffixes; *p; p++ ) for( p = suffixes; *p; p++ )
if( g_ascii_strcasecmp( suffix, *p ) == 0 ) if( g_ascii_strcasecmp( suffix, *p ) == 0 )
return( 1 ); return( 1 );
@ -533,7 +534,7 @@ im_filename_suffix_match( const char *path, const char *suffixes[] )
* missing). ',' characters inside options can be escaped with a '\'. * missing). ',' characters inside options can be escaped with a '\'.
*/ */
char * char *
im_getnextoption( char **in ) vips_getnextoption( char **in )
{ {
char *p = *in; char *p = *in;
char *q = p; char *q = p;
@ -568,7 +569,7 @@ im_getnextoption( char **in )
/* Get a suboption string, or NULL. /* Get a suboption string, or NULL.
*/ */
char * char *
im_getsuboption( const char *buf ) vips_getsuboption( const char *buf )
{ {
char *p, *q, *r; char *p, *q, *r;
@ -594,7 +595,7 @@ im_getsuboption( const char *buf )
/* Get file length ... 64-bitally. -1 for error. /* Get file length ... 64-bitally. -1 for error.
*/ */
gint64 gint64
im_file_length( int fd ) vips_file_length( int fd )
{ {
#ifdef OS_WIN32 #ifdef OS_WIN32
struct _stati64 st; struct _stati64 st;
@ -605,7 +606,7 @@ im_file_length( int fd )
if( fstat( fd, &st ) == -1 ) { if( fstat( fd, &st ) == -1 ) {
#endif /*OS_WIN32*/ #endif /*OS_WIN32*/
vips_error_system( errno, "im_file_length", vips_error_system( errno, "vips_file_length",
"%s", _( "unable to get file stats" ) ); "%s", _( "unable to get file stats" ) );
return( -1 ); return( -1 );
} }
@ -616,13 +617,13 @@ im_file_length( int fd )
/* Wrap write() up /* Wrap write() up
*/ */
int int
im__write( int fd, const void *buf, size_t count ) vips__write( int fd, const void *buf, size_t count )
{ {
do { do {
size_t nwritten = write( fd, buf, count ); size_t nwritten = write( fd, buf, count );
if( nwritten == (size_t) -1 ) { if( nwritten == (size_t) -1 ) {
vips_error_system( errno, "im__write", vips_error_system( errno, "vips__write",
"%s", _( "write failed" ) ); "%s", _( "write failed" ) );
return( -1 ); return( -1 );
} }
@ -634,79 +635,6 @@ im__write( int fd, const void *buf, size_t count )
return( 0 ); return( 0 );
} }
/* Load up a file as a string.
*/
char *
im__file_read( FILE *fp, const char *filename, unsigned int *length_out )
{
long len;
size_t read;
char *str;
/* Find length.
*/
fseek( fp, 0L, 2 );
len = ftell( fp );
if( len > 20 * 1024 * 1024 ) {
/* Seems crazy!
*/
vips_error( "im__file_read", _( "\"%s\" too long" ), filename );
return( NULL );
}
if( len == -1 ) {
int size;
/* Can't get length: read in chunks and realloc() to end of
* file.
*/
str = NULL;
len = 0;
size = 0;
do {
size += 1024;
if( !(str = realloc( str, size )) ) {
vips_error( "im__file_read",
"%s", _( "out of memory" ) );
return( NULL );
}
/* -1 to allow space for an extra NULL we add later.
*/
read = fread( str + len, sizeof( char ),
(size - len - 1) / sizeof( char ),
fp );
len += read;
} while( !feof( fp ) );
#ifdef DEBUG
printf( "read %ld bytes from unseekable stream\n", len );
#endif /*DEBUG*/
}
else {
/* Allocate memory and fill.
*/
if( !(str = vips_malloc( NULL, len + 1 )) )
return( NULL );
rewind( fp );
read = fread( str, sizeof( char ), (size_t) len, fp );
if( read != (size_t) len ) {
vips_free( str );
vips_error( "im__file_read",
_( "error reading from file \"%s\"" ),
filename );
return( NULL );
}
}
str[len] = '\0';
if( length_out )
*length_out = len;
return( str );
}
/* Does a filename contain a directory separator? /* Does a filename contain a directory separator?
*/ */
static gboolean static gboolean
@ -730,7 +658,7 @@ filename_hasdir( const char *filename )
* directory separator, we try looking in the fallback dir. * directory separator, we try looking in the fallback dir.
*/ */
FILE * FILE *
im__file_open_read( const char *filename, const char *fallback_dir, vips__file_open_read( const char *filename, const char *fallback_dir,
gboolean text_mode ) gboolean text_mode )
{ {
char *mode; char *mode;
@ -759,14 +687,14 @@ im__file_open_read( const char *filename, const char *fallback_dir,
return( fp ); return( fp );
} }
vips_error( "im__file_open_read", vips_error( "vips__file_open_read",
_( "unable to open file \"%s\" for reading" ), filename ); _( "unable to open file \"%s\" for reading" ), filename );
return( NULL ); return( NULL );
} }
FILE * FILE *
im__file_open_write( const char *filename, gboolean text_mode ) vips__file_open_write( const char *filename, gboolean text_mode )
{ {
char *mode; char *mode;
FILE *fp; FILE *fp;
@ -781,7 +709,7 @@ im__file_open_write( const char *filename, gboolean text_mode )
#endif /*BINARY_OPEN*/ #endif /*BINARY_OPEN*/
if( !(fp = fopen( filename, mode )) ) { if( !(fp = fopen( filename, mode )) ) {
vips_error( "im__file_open_write", vips_error( "vips__file_open_write",
_( "unable to open file \"%s\" for writing" ), _( "unable to open file \"%s\" for writing" ),
filename ); filename );
return( NULL ); return( NULL );
@ -790,19 +718,93 @@ im__file_open_write( const char *filename, gboolean text_mode )
return( fp ); return( fp );
} }
/* Load up a file as a string.
*/
char *
vips__file_read( FILE *fp, const char *filename, unsigned int *length_out )
{
long len;
size_t read;
char *str;
/* Find length.
*/
fseek( fp, 0L, 2 );
len = ftell( fp );
if( len > 20 * 1024 * 1024 ) {
/* Seems crazy!
*/
vips_error( "vips__file_read",
_( "\"%s\" too long" ), filename );
return( NULL );
}
if( len == -1 ) {
int size;
/* Can't get length: read in chunks and realloc() to end of
* file.
*/
str = NULL;
len = 0;
size = 0;
do {
size += 1024;
if( !(str = realloc( str, size )) ) {
vips_error( "vips__file_read",
"%s", _( "out of memory" ) );
return( NULL );
}
/* -1 to allow space for an extra NULL we add later.
*/
read = fread( str + len, sizeof( char ),
(size - len - 1) / sizeof( char ),
fp );
len += read;
} while( !feof( fp ) );
#ifdef DEBUG
printf( "read %ld bytes from unseekable stream\n", len );
#endif /*DEBUG*/
}
else {
/* Allocate memory and fill.
*/
if( !(str = vips_malloc( NULL, len + 1 )) )
return( NULL );
rewind( fp );
read = fread( str, sizeof( char ), (size_t) len, fp );
if( read != (size_t) len ) {
vips_free( str );
vips_error( "vips__file_read",
_( "error reading from file \"%s\"" ),
filename );
return( NULL );
}
}
str[len] = '\0';
if( length_out )
*length_out = len;
return( str );
}
/* Load from a filename as a string. Used for things like reading in ICC /* Load from a filename as a string. Used for things like reading in ICC
* profiles, ie. binary objects. * profiles, ie. binary objects.
*/ */
char * char *
im__file_read_name( const char *filename, const char *fallback_dir, vips__file_read_name( const char *filename, const char *fallback_dir,
unsigned int *length_out ) unsigned int *length_out )
{ {
FILE *fp; FILE *fp;
char *buffer; char *buffer;
if( !(fp = im__file_open_read( filename, fallback_dir, FALSE )) ) if( !(fp = vips__file_open_read( filename, fallback_dir, FALSE )) )
return( NULL ); return( NULL );
if( !(buffer = im__file_read( fp, filename, length_out )) ) { if( !(buffer = vips__file_read( fp, filename, length_out )) ) {
fclose( fp ); fclose( fp );
return( NULL ); return( NULL );
} }
@ -811,10 +813,56 @@ im__file_read_name( const char *filename, const char *fallback_dir,
return( buffer ); return( buffer );
} }
/* Like fwrite(), but returns non-zero on error and sets error message.
*/
int
vips__file_write( void *data, size_t size, size_t nmemb, FILE *stream )
{
size_t n;
if( !data )
return( 0 );
if( (n = fwrite( data, size, nmemb, stream )) != nmemb ) {
vips_error( "vips__file_write",
_( "writing error (%zd out of %zd blocks written) "
"... disc full?" ), n, nmemb );
return( -1 );
}
return( 0 );
}
/* Read a few bytes from the start of a file. For sniffing file types.
*/
int
vips__get_bytes( const char *filename, unsigned char buf[], int len )
{
int fd;
/* File may not even exist (for tmp images for example!)
* so no hasty messages. And the file might be truncated, so no error
* on read either.
*/
#ifdef BINARY_OPEN
if( (fd = open( filename, O_RDONLY | O_BINARY )) == -1 )
#else /*BINARY_OPEN*/
if( (fd = open( filename, O_RDONLY )) == -1 )
#endif /*BINARY_OPEN*/
return( 0 );
if( read( fd, buf, len ) != len ) {
close( fd );
return( 0 );
}
close( fd );
return( 1 );
}
/* Alloc/free a GValue. /* Alloc/free a GValue.
*/ */
static GValue * static GValue *
im__gvalue_new( GType type ) vips__gvalue_new( GType type )
{ {
GValue *value; GValue *value;
@ -825,29 +873,29 @@ im__gvalue_new( GType type )
} }
static GValue * static GValue *
im__gvalue_copy( GValue *value ) vips__gvalue_copy( GValue *value )
{ {
GValue *value_copy; GValue *value_copy;
value_copy = im__gvalue_new( G_VALUE_TYPE( value ) ); value_copy = vips__gvalue_new( G_VALUE_TYPE( value ) );
g_value_copy( value, value_copy ); g_value_copy( value, value_copy );
return( value_copy ); return( value_copy );
} }
static void static void
im__gvalue_free( GValue *value ) vips__gvalue_free( GValue *value )
{ {
g_value_unset( value ); g_value_unset( value );
g_free( value ); g_free( value );
} }
GValue * GValue *
im__gvalue_ref_string_new( const char *text ) vips__gvalue_ref_string_new( const char *text )
{ {
GValue *value; GValue *value;
value = im__gvalue_new( VIPS_TYPE_REF_STRING ); value = vips__gvalue_new( VIPS_TYPE_REF_STRING );
vips_ref_string_set( value, text ); vips_ref_string_set( value, text );
return( value ); return( value );
@ -856,16 +904,16 @@ im__gvalue_ref_string_new( const char *text )
/* Free a GSList of GValue. /* Free a GSList of GValue.
*/ */
void void
im__gslist_gvalue_free( GSList *list ) vips__gslist_gvalue_free( GSList *list )
{ {
g_slist_foreach( list, (GFunc) im__gvalue_free, NULL ); g_slist_foreach( list, (GFunc) vips__gvalue_free, NULL );
g_slist_free( list ); g_slist_free( list );
} }
/* Copy a GSList of GValue. /* Copy a GSList of GValue.
*/ */
GSList * GSList *
im__gslist_gvalue_copy( const GSList *list ) vips__gslist_gvalue_copy( const GSList *list )
{ {
GSList *copy; GSList *copy;
const GSList *p; const GSList *p;
@ -874,7 +922,7 @@ im__gslist_gvalue_copy( const GSList *list )
for( p = list; p; p = p->next ) for( p = list; p; p = p->next )
copy = g_slist_prepend( copy, copy = g_slist_prepend( copy,
im__gvalue_copy( (GValue *) p->data ) ); vips__gvalue_copy( (GValue *) p->data ) );
copy = g_slist_reverse( copy ); copy = g_slist_reverse( copy );
@ -886,7 +934,7 @@ im__gslist_gvalue_copy( const GSList *list )
* (string, blob, etc.). * (string, blob, etc.).
*/ */
GSList * GSList *
im__gslist_gvalue_merge( GSList *a, const GSList *b ) vips__gslist_gvalue_merge( GSList *a, const GSList *b )
{ {
const GSList *i, *j; const GSList *i, *j;
GSList *tail; GSList *tail;
@ -914,7 +962,7 @@ im__gslist_gvalue_merge( GSList *a, const GSList *b )
if( !j ) if( !j )
tail = g_slist_prepend( tail, tail = g_slist_prepend( tail,
im__gvalue_copy( value ) ); vips__gvalue_copy( value ) );
} }
a = g_slist_concat( a, g_slist_reverse( tail ) ); a = g_slist_concat( a, g_slist_reverse( tail ) );
@ -926,7 +974,7 @@ im__gslist_gvalue_merge( GSList *a, const GSList *b )
* free the result. Empty list -> "", not NULL. Join strings with '\n'. * free the result. Empty list -> "", not NULL. Join strings with '\n'.
*/ */
char * char *
im__gslist_gvalue_get( const GSList *list ) vips__gslist_gvalue_get( const GSList *list )
{ {
const GSList *p; const GSList *p;
size_t length; size_t length;
@ -976,7 +1024,7 @@ im__gslist_gvalue_get( const GSList *list )
/* Need our own seek(), since lseek() on win32 can't do long files. /* Need our own seek(), since lseek() on win32 can't do long files.
*/ */
int int
im__seek( int fd, gint64 pos ) vips__seek( int fd, gint64 pos )
{ {
#ifdef OS_WIN32 #ifdef OS_WIN32
{ {
@ -985,14 +1033,14 @@ im__seek( int fd, gint64 pos )
p.QuadPart = pos; p.QuadPart = pos;
if( !SetFilePointerEx( hFile, p, NULL, FILE_BEGIN ) ) { if( !SetFilePointerEx( hFile, p, NULL, FILE_BEGIN ) ) {
vips_error_system( GetLastError(), "im__seek", vips_error_system( GetLastError(), "vips__seek",
"%s", _( "unable to seek" ) ); "%s", _( "unable to seek" ) );
return( -1 ); return( -1 );
} }
} }
#else /*!OS_WIN32*/ #else /*!OS_WIN32*/
if( lseek( fd, pos, SEEK_SET ) == (off_t) -1 ) { if( lseek( fd, pos, SEEK_SET ) == (off_t) -1 ) {
vips_error( "im__seek", "%s", _( "unable to seek" ) ); vips_error( "vips__seek", "%s", _( "unable to seek" ) );
return( -1 ); return( -1 );
} }
#endif /*OS_WIN32*/ #endif /*OS_WIN32*/
@ -1008,7 +1056,7 @@ im__seek( int fd, gint64 pos )
*/ */
int int
im__ftruncate( int fd, gint64 pos ) vips__ftruncate( int fd, gint64 pos )
{ {
#ifdef OS_WIN32 #ifdef OS_WIN32
{ {
@ -1016,17 +1064,17 @@ im__ftruncate( int fd, gint64 pos )
LARGE_INTEGER p; LARGE_INTEGER p;
p.QuadPart = pos; p.QuadPart = pos;
if( im__seek( fd, pos ) ) if( vips__seek( fd, pos ) )
return( -1 ); return( -1 );
if( !SetEndOfFile( hFile ) ) { if( !SetEndOfFile( hFile ) ) {
vips_error_system( GetLastError(), "im__ftruncate", vips_error_system( GetLastError(), "vips__ftruncate",
"%s", _( "unable to truncate" ) ); "%s", _( "unable to truncate" ) );
return( -1 ); return( -1 );
} }
} }
#else /*!OS_WIN32*/ #else /*!OS_WIN32*/
if( ftruncate( fd, pos ) ) { if( ftruncate( fd, pos ) ) {
vips_error_system( errno, "im__ftruncate", vips_error_system( errno, "vips__ftruncate",
"%s", _( "unable to truncate" ) ); "%s", _( "unable to truncate" ) );
return( -1 ); return( -1 );
} }
@ -1035,50 +1083,54 @@ im__ftruncate( int fd, gint64 pos )
return( 0 ); return( 0 );
} }
/* Like fwrite(), but returns non-zero on error and sets error message. /* Test for file exists.
*/ */
int int
im__file_write( void *data, size_t size, size_t nmemb, FILE *stream ) vips_existsf( const char *name, ... )
{ {
size_t n; va_list ap;
char buf1[PATH_MAX];
if( !data ) va_start( ap, name );
return( 0 ); (void) vips_vsnprintf( buf1, PATH_MAX - 1, name, ap );
va_end( ap );
if( (n = fwrite( data, size, nmemb, stream )) != nmemb ) { /* Try that.
vips_error( "im__file_write", */
_( "writing error (%zd out of %zd blocks written) " if( !access( buf1, R_OK ) )
"... disc full?" ), n, nmemb ); return( 1 );
return( -1 );
}
return( 0 ); return( 0 );
} }
/* Read a few bytes from the start of a file. For sniffing file types. #ifdef OS_WIN32
#define popen(b,m) _popen(b,m)
#define pclose(f) _pclose(f)
#endif /*OS_WIN32*/
/* Do popen(), with printf-style args.
*/ */
int FILE *
im__get_bytes( const char *filename, unsigned char buf[], int len ) vips_popenf( const char *fmt, const char *mode, ... )
{ {
int fd; va_list args;
char buf[4096];
FILE *fp;
/* File may not even exist (for tmp images for example!) va_start( args, mode );
* so no hasty messages. And the file might be truncated, so no error (void) vips_vsnprintf( buf, 4096, fmt, args );
* on read either. va_end( args );
*/
#ifdef BINARY_OPEN #ifdef DEBUG
if( (fd = open( filename, O_RDONLY | O_BINARY )) == -1 ) printf( "vips_popenf: running: %s\n", buf );
#else /*BINARY_OPEN*/ #endif /*DEBUG*/
if( (fd = open( filename, O_RDONLY )) == -1 )
#endif /*BINARY_OPEN*/ if( !(fp = popen( buf, mode )) ) {
return( 0 ); vips_error( "popenf", "%s", strerror( errno ) );
if( read( fd, buf, len ) != len ) { return( NULL );
close( fd );
return( 0 );
} }
close( fd );
return( 1 ); return( fp );
} }
/* Break a command-line argument into tokens separated by whitespace. Strings /* Break a command-line argument into tokens separated by whitespace. Strings
@ -1198,7 +1250,8 @@ vips__token_must( const char *p, VipsToken *token,
char *string, int size ) char *string, int size )
{ {
if( !(p = vips__token_get( p, token, string, size )) ) { if( !(p = vips__token_get( p, token, string, size )) ) {
vips_error( "get_token", "%s", _( "unexpected end of string" ) ); vips_error( "get_token",
"%s", _( "unexpected end of string" ) );
return( NULL ); return( NULL );
} }
@ -1242,56 +1295,6 @@ vips__token_need( const char *p, VipsToken need_token,
return( p ); return( p );
} }
/* Test for file exists.
*/
int
im_existsf( const char *name, ... )
{
va_list ap;
char buf1[PATH_MAX];
va_start( ap, name );
(void) im_vsnprintf( buf1, PATH_MAX - 1, name, ap );
va_end( ap );
/* Try that.
*/
if( !access( buf1, R_OK ) )
return( 1 );
return( 0 );
}
#ifdef OS_WIN32
#define popen(b,m) _popen(b,m)
#define pclose(f) _pclose(f)
#endif /*OS_WIN32*/
/* Do popen(), with printf-style args.
*/
FILE *
im_popenf( const char *fmt, const char *mode, ... )
{
va_list args;
char buf[4096];
FILE *fp;
va_start( args, mode );
(void) im_vsnprintf( buf, 4096, fmt, args );
va_end( args );
#ifdef DEBUG
printf( "im_popenf: running: %s\n", buf );
#endif /*DEBUG*/
if( !(fp = popen( buf, mode )) ) {
vips_error( "popenf", "%s", strerror( errno ) );
return( NULL );
}
return( fp );
}
/* True if an int is a power of two ... 1, 2, 4, 8, 16, 32, etc. Do with just /* True if an int is a power of two ... 1, 2, 4, 8, 16, 32, etc. Do with just
* integer arithmetic for portability. A previous Nicos version using doubles * integer arithmetic for portability. A previous Nicos version using doubles
* and log/log failed on x86 with rounding problems. Return 0 for not * and log/log failed on x86 with rounding problems. Return 0 for not
@ -1299,7 +1302,7 @@ im_popenf( const char *fmt, const char *mode, ... )
* bit 1 as the lsb). * bit 1 as the lsb).
*/ */
int int
im_ispoweroftwo( int p ) vips_ispoweroftwo( int p )
{ {
int i, n; int i, n;
@ -1322,7 +1325,7 @@ im_ispoweroftwo( int p )
/* Test this processor for endianness. True for SPARC order. /* Test this processor for endianness. True for SPARC order.
*/ */
int int
im_amiMSBfirst( void ) vips_amiMSBfirst( void )
{ {
int test; int test;
unsigned char *p = (unsigned char *) &test; unsigned char *p = (unsigned char *) &test;
@ -1340,7 +1343,7 @@ im_amiMSBfirst( void )
* TMP, TEMP and USERPROFILE. * TMP, TEMP and USERPROFILE.
*/ */
static const char * static const char *
im__temp_dir( void ) vips__temp_dir( void )
{ {
const char *tmpd; const char *tmpd;
@ -1369,7 +1372,7 @@ im__temp_dir( void )
* delete it for you. * delete it for you.
*/ */
char * char *
im__temp_name( const char *format ) vips__temp_name( const char *format )
{ {
static int serial = 1; static int serial = 1;
@ -1379,9 +1382,9 @@ im__temp_name( const char *format )
char *name; char *name;
int fd; int fd;
im_snprintf( file, FILENAME_MAX, "vips-%d-XXXXXX", serial++ ); vips_snprintf( file, FILENAME_MAX, "vips-%d-XXXXXX", serial++ );
im_snprintf( file2, FILENAME_MAX, format, file ); vips_snprintf( file2, FILENAME_MAX, format, file );
name = g_build_filename( im__temp_dir(), file2, NULL ); name = g_build_filename( vips__temp_dir(), file2, NULL );
if( (fd = g_mkstemp( name )) == -1 ) { if( (fd = g_mkstemp( name )) == -1 ) {
vips_error( "tempfile", vips_error( "tempfile",
@ -1408,7 +1411,7 @@ vips__change_suffix( const char *name, char *out, int mx,
/* Copy start string. /* Copy start string.
*/ */
im_strncpy( out, name, mx ); vips_strncpy( out, name, mx );
/* Drop all matching suffixes. /* Drop all matching suffixes.
*/ */
@ -1431,6 +1434,6 @@ vips__change_suffix( const char *name, char *out, int mx,
/* Add new suffix. /* Add new suffix.
*/ */
len = strlen( out ); len = strlen( out );
im_strncpy( out + len, new, mx - len ); vips_strncpy( out + len, new, mx - len );
} }

View File

@ -63,7 +63,7 @@
/* Cleared by the command-line --vips-novector switch and the IM_NOVECTOR env /* Cleared by the command-line --vips-novector switch and the IM_NOVECTOR env
* var. * var.
*/ */
gboolean im__vector_enabled = TRUE; gboolean vips__vector_enabled = TRUE;
void void
vips_vector_init( void ) vips_vector_init( void )
@ -81,7 +81,7 @@ vips_vector_init( void )
* off as well. * off as well.
*/ */
if( g_getenv( "IM_NOVECTOR" ) ) if( g_getenv( "IM_NOVECTOR" ) )
im__vector_enabled = FALSE; vips__vector_enabled = FALSE;
#endif /*HAVE_ORC*/ #endif /*HAVE_ORC*/
} }
@ -89,7 +89,7 @@ gboolean
vips_vector_get_enabled( void ) vips_vector_get_enabled( void )
{ {
#ifdef HAVE_ORC #ifdef HAVE_ORC
return( im__vector_enabled ); return( vips__vector_enabled );
#else /*!HAVE_ORC*/ #else /*!HAVE_ORC*/
return( FALSE ); return( FALSE );
#endif /*HAVE_ORC*/ #endif /*HAVE_ORC*/
@ -98,7 +98,7 @@ vips_vector_get_enabled( void )
void void
vips_vector_set_enabled( gboolean enabled ) vips_vector_set_enabled( gboolean enabled )
{ {
im__vector_enabled = enabled; vips__vector_enabled = enabled;
} }
void void
@ -201,9 +201,9 @@ vips_vector_constant( VipsVector *vector, char *name, int value, int size )
} }
if( value > 0 ) if( value > 0 )
im_snprintf( name, 256, "c%d%s", value, sname ); vips_snprintf( name, 256, "c%d%s", value, sname );
else else
im_snprintf( name, 256, "cm%d%s", -value, sname ); vips_snprintf( name, 256, "cm%d%s", -value, sname );
if( orc_program_find_var_by_name( vector->program, name ) == -1 ) { if( orc_program_find_var_by_name( vector->program, name ) == -1 ) {
orc_program_add_constant( vector->program, size, value, name ); orc_program_add_constant( vector->program, size, value, name );
@ -235,7 +235,7 @@ vips_vector_source_scanline( VipsVector *vector,
char *name, int line, int size ) char *name, int line, int size )
{ {
#ifdef HAVE_ORC #ifdef HAVE_ORC
im_snprintf( name, 256, "sl%d", line ); vips_snprintf( name, 256, "sl%d", line );
if( orc_program_find_var_by_name( vector->program, name ) == -1 ) { if( orc_program_find_var_by_name( vector->program, name ) == -1 ) {
int var; int var;

View File

@ -295,7 +295,7 @@ vips__write_header_bytes( VipsImage *im, unsigned char *to )
/* Always write the magic number MSB first. /* Always write the magic number MSB first.
*/ */
magic = im_amiMSBfirst() ? VIPS_MAGIC_SPARC : VIPS_MAGIC_INTEL; magic = vips_amiMSBfirst() ? VIPS_MAGIC_SPARC : VIPS_MAGIC_INTEL;
to[0] = magic >> 24; to[0] = magic >> 24;
to[1] = magic >> 16; to[1] = magic >> 16;
to[2] = magic >> 8; to[2] = magic >> 8;
@ -322,7 +322,7 @@ read_chunk( int fd, gint64 offset, size_t length )
{ {
char *buf; char *buf;
if( im__seek( fd, offset ) ) if( vips__seek( fd, offset ) )
return( NULL ); return( NULL );
if( !(buf = vips_malloc( NULL, length + 1 )) ) if( !(buf = vips_malloc( NULL, length + 1 )) )
return( NULL ); return( NULL );
@ -407,7 +407,7 @@ read_xml( VipsImage *im )
vips_free( buf ); vips_free( buf );
if( !(node = xmlDocGetRootElement( doc )) || if( !(node = xmlDocGetRootElement( doc )) ||
!node->nsDef || !node->nsDef ||
!im_isprefix( NAMESPACE, (char *) node->nsDef->href ) ) { !vips_isprefix( NAMESPACE, (char *) node->nsDef->href ) ) {
vips_error( "VipsImage", vips_error( "VipsImage",
"%s", _( "incorrect namespace in XML" ) ); "%s", _( "incorrect namespace in XML" ) );
xmlFreeDoc( doc ); xmlFreeDoc( doc );
@ -445,7 +445,7 @@ get_sprop( xmlNode *xnode, const char *name, char *buf, int sz )
if( !value ) if( !value )
return( 0 ); return( 0 );
im_strncpy( buf, value, sz ); vips_strncpy( buf, value, sz );
VIPS_FREEF( xmlFree, value ); VIPS_FREEF( xmlFree, value );
return( 1 ); return( 1 );
@ -461,7 +461,7 @@ set_history( VipsImage *im, char *history )
/* There can be history there already if we're rewinding. /* There can be history there already if we're rewinding.
*/ */
VIPS_FREEF( im__gslist_gvalue_free, im->history_list ); VIPS_FREEF( vips__gslist_gvalue_free, im->history_list );
history_list = NULL; history_list = NULL;
@ -474,7 +474,7 @@ set_history( VipsImage *im, char *history )
q = p + strlen( p ); q = p + strlen( p );
history_list = g_slist_prepend( history_list, history_list = g_slist_prepend( history_list,
im__gvalue_ref_string_new( p ) ); vips__gvalue_ref_string_new( p ) );
} }
im->history_list = g_slist_reverse( history_list ); im->history_list = g_slist_reverse( history_list );
@ -599,7 +599,7 @@ rebuild_header( VipsImage *im )
return( 0 ); return( 0 );
} }
/* Called at the end of im_openin() ... get any XML after the pixel data /* Called at the end of vips open ... get any XML after the pixel data
* and read it in. * and read it in.
*/ */
static int static int
@ -616,7 +616,7 @@ readhist( VipsImage *im )
if( !(doc = read_xml( im )) ) if( !(doc = read_xml( im )) )
return( -1 ); return( -1 );
if( vips_image_set_area( im, VIPS_META_XML, if( vips_image_set_area( im, VIPS_META_XML,
(im_callback_fn) xmlFreeDoc, doc ) ) { (VipsCallbackFn) xmlFreeDoc, doc ) ) {
xmlFreeDoc( doc ); xmlFreeDoc( doc );
return( -1 ); return( -1 );
} }
@ -637,7 +637,7 @@ set_prop( xmlNode *node, const char *name, const char *fmt, ... )
char value[MAX_STRSIZE]; char value[MAX_STRSIZE];
va_start( ap, fmt ); va_start( ap, fmt );
(void) im_vsnprintf( value, MAX_STRSIZE, fmt, ap ); (void) vips_vsnprintf( value, MAX_STRSIZE, fmt, ap );
va_end( ap ); va_end( ap );
if( !xmlSetProp( node, (xmlChar *) name, (xmlChar *) value ) ) { if( !xmlSetProp( node, (xmlChar *) name, (xmlChar *) value ) ) {
@ -720,8 +720,8 @@ save_fields( VipsImage *im, xmlNode *node )
if( !(this = xmlNewChild( node, NULL, (xmlChar *) "meta", NULL )) ) if( !(this = xmlNewChild( node, NULL, (xmlChar *) "meta", NULL )) )
return( -1 ); return( -1 );
if( im->meta_traverse && if( im->meta_traverse &&
im_slist_map2( im->meta_traverse, vips_slist_map2( im->meta_traverse,
(VSListMap2Fn) save_fields_meta, this, NULL ) ) (VipsSListMap2Fn) save_fields_meta, this, NULL ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );
@ -734,17 +734,17 @@ vips__write_extension_block( VipsImage *im, void *buf, int size )
gint64 psize; gint64 psize;
psize = image_pixel_length( im ); psize = image_pixel_length( im );
if( (length = im_file_length( im->fd )) == -1 ) if( (length = vips_file_length( im->fd )) == -1 )
return( -1 ); return( -1 );
if( length - psize < 0 ) { if( length - psize < 0 ) {
vips_error( "VipsImage", "%s", _( "file has been truncated" ) ); vips_error( "VipsImage", "%s", _( "file has been truncated" ) );
return( -1 ); return( -1 );
} }
if( im__ftruncate( im->fd, psize ) || if( vips__ftruncate( im->fd, psize ) ||
im__seek( im->fd, psize ) ) vips__seek( im->fd, psize ) )
return( -1 ); return( -1 );
if( im__write( im->fd, buf, size ) ) if( vips__write( im->fd, buf, size ) )
return( -1 ); return( -1 );
#ifdef DEBUG #ifdef DEBUG
@ -844,7 +844,7 @@ vips__writehist( VipsImage *im )
if( !(doc = xmlNewDoc( (xmlChar *) "1.0" )) ) if( !(doc = xmlNewDoc( (xmlChar *) "1.0" )) )
return( -1 ); return( -1 );
im_snprintf( namespace, 256, "%s/%d.%d.%d", vips_snprintf( namespace, 256, "%s/%d.%d.%d",
NAMESPACE, NAMESPACE,
IM_MAJOR_VERSION, IM_MINOR_VERSION, IM_MICRO_VERSION ); IM_MAJOR_VERSION, IM_MINOR_VERSION, IM_MICRO_VERSION );
if( !(doc->children = xmlNewDocNode( doc, if( !(doc->children = xmlNewDocNode( doc,
@ -889,7 +889,7 @@ vips__writehist( VipsImage *im )
return( -1 ); return( -1 );
} }
printf( "im__writehist: saved XML is: \"%s\"", dump2 ); printf( "vips__writehist: saved XML is: \"%s\"", dump2 );
xmlFree( dump2 ); xmlFree( dump2 );
} }
#endif /*DEBUG*/ #endif /*DEBUG*/
@ -927,7 +927,7 @@ vips_image_open_input( VipsImage *image )
/* Predict and check the file size. /* Predict and check the file size.
*/ */
psize = image_pixel_length( image ); psize = image_pixel_length( image );
if( (rsize = im_file_length( image->fd )) == -1 ) if( (rsize = vips_file_length( image->fd )) == -1 )
return( -1 ); return( -1 );
image->file_length = rsize; image->file_length = rsize;
if( psize > rsize ) if( psize > rsize )
@ -970,7 +970,7 @@ vips_image_open_output( VipsImage *image )
} }
if( vips__write_header_bytes( image, header ) || if( vips__write_header_bytes( image, header ) ||
im__write( image->fd, header, IM_SIZEOF_HEADER ) ) vips__write( image->fd, header, IM_SIZEOF_HEADER ) )
return( -1 ); return( -1 );
} }

View File

@ -69,16 +69,16 @@
/* Sanity checking ... write to this during read tests to make sure we don't /* Sanity checking ... write to this during read tests to make sure we don't
* get optimised out. * get optimised out.
*/ */
int im__read_test; int vips__read_test;
/* Add this many lines above and below the mmap() window. /* Add this many lines above and below the mmap() window.
*/ */
int im__window_margin_pixels = IM__WINDOW_MARGIN_PIXELS; int vips__window_margin_pixels = IM__WINDOW_MARGIN_PIXELS;
/* Always map at least this many bytes. There's no point making tiny windows /* Always map at least this many bytes. There's no point making tiny windows
* on small files. * on small files.
*/ */
int im__window_margin_bytes = IM__WINDOW_MARGIN_BYTES; int vips__window_margin_bytes = IM__WINDOW_MARGIN_BYTES;
/* Track global mmap usage. /* Track global mmap usage.
*/ */
@ -189,7 +189,7 @@ trace_mmap_usage( void )
#endif /*DEBUG_TOTAL*/ #endif /*DEBUG_TOTAL*/
static int static int
im_getpagesize() vips_getpagesize()
{ {
static int pagesize = 0; static int pagesize = 0;
@ -205,7 +205,7 @@ im_getpagesize()
#endif /*OS_WIN32*/ #endif /*OS_WIN32*/
#ifdef DEBUG_TOTAL #ifdef DEBUG_TOTAL
printf( "im_getpagesize: 0x%x\n", pagesize ); printf( "vips_getpagesize: 0x%x\n", pagesize );
#endif /*DEBUG_TOTAL*/ #endif /*DEBUG_TOTAL*/
} }
@ -217,7 +217,7 @@ im_getpagesize()
static int static int
vips_window_set( VipsWindow *window, int top, int height ) vips_window_set( VipsWindow *window, int top, int height )
{ {
int pagesize = im_getpagesize(); int pagesize = vips_getpagesize();
void *baseaddr; void *baseaddr;
gint64 start, end, pagestart; gint64 start, end, pagestart;
@ -255,7 +255,7 @@ vips_window_set( VipsWindow *window, int top, int height )
/* Sanity check ... make sure the data pointer is readable. /* Sanity check ... make sure the data pointer is readable.
*/ */
im__read_test &= window->data[0]; vips__read_test &= window->data[0];
#ifdef DEBUG_TOTAL #ifdef DEBUG_TOTAL
g_mutex_lock( vips__global_lock ); g_mutex_lock( vips__global_lock );
@ -330,8 +330,8 @@ vips_window_find( IMAGE *im, int top, int height )
req.top = top; req.top = top;
req.height = height; req.height = height;
window = im_slist_map2( im->windows, window = vips_slist_map2( im->windows,
(VSListMap2Fn) vips_window_fits, &req, NULL ); (VipsSListMap2Fn) vips_window_fits, &req, NULL );
if( window ) { if( window ) {
window->ref_count += 1; window->ref_count += 1;
@ -360,8 +360,8 @@ vips_window_ref( IMAGE *im, int top, int height )
* window than we strictly need. There's no point making tiny * window than we strictly need. There's no point making tiny
* windows. * windows.
*/ */
int margin = VIPS_MIN( im__window_margin_pixels, int margin = VIPS_MIN( vips__window_margin_pixels,
im__window_margin_bytes / vips__window_margin_bytes /
VIPS_IMAGE_SIZEOF_LINE( im ) ); VIPS_IMAGE_SIZEOF_LINE( im ) );
top -= margin; top -= margin;