Update C++ binding and function list

The generators use the new Introspect class of pyvips.
This commit is contained in:
Kleis Auke Wolthuizen 2019-11-29 14:51:03 +01:00
parent d88ce970b7
commit 2499b38403
9 changed files with 1322 additions and 1397 deletions

View File

@ -596,20 +596,20 @@ VImage::new_from_buffer( const std::string &buf, const char *option_string,
}
VImage
VImage::new_from_stream( const VStreamI &input, const char *option_string,
VImage::new_from_stream( VStreamI streami, const char *option_string,
VOption *options )
{
const char *operation_name;
VImage out;
if( !(operation_name = vips_foreign_find_load_stream(
input.get_stream() )) ) {
streami.get_stream() )) ) {
delete options;
throw( VError() );
}
options = (options ? options : VImage::option())->
set( "input", input )->
set( "streami", streami )->
set( "out", &out );
call_option_string( operation_name, option_string, options );
@ -702,7 +702,7 @@ VImage::write_to_buffer( const char *suffix, void **buf, size_t *size,
}
void
VImage::write_to_stream( const char *suffix, const VStreamO &output,
VImage::write_to_stream( const char *suffix, VStreamO streamo,
VOption *options ) const
{
char filename[VIPS_PATH_MAX];
@ -718,7 +718,7 @@ VImage::write_to_stream( const char *suffix, const VStreamO &output,
call_option_string( operation_name, option_string,
(options ? options : VImage::option())->
set( "in", *this )->
set( "output", output ) );
set( "streamo", streamo ) );
}
#include "vips-operators.cpp"

View File

@ -25,7 +25,7 @@
import argparse
from pyvips import Operation, GValue, Error, \
from pyvips import Introspect, Operation, GValue, Error, \
ffi, gobject_lib, type_map, type_from_name, nickname_find, type_name
# TODO Move to pyvips.GValue
@ -41,8 +41,8 @@ gtype_to_cpp = {
GValue.refstr_type: 'char *',
GValue.gflags_type: 'int',
GValue.image_type: 'VImage',
stream_input_type: 'const VStreamI &',
stream_output_type: 'const VStreamO &',
stream_input_type: 'VStreamI',
stream_output_type: 'VStreamO',
GValue.array_int_type: 'std::vector<int>',
GValue.array_double_type: 'std::vector<double>',
GValue.array_image_type: 'std::vector<VImage>',
@ -87,66 +87,42 @@ def cppize(name):
def generate_operation(operation_name, declaration_only=False):
op = Operation.new_from_name(operation_name)
intro = Introspect.get(operation_name)
# we are only interested in non-deprecated args
args = [[name, flags] for name, flags in op.get_args()
if not flags & _DEPRECATED]
# find the first required input image arg, if any ... that will be self
member_x = None
for name, flags in args:
if ((flags & _INPUT) != 0 and
(flags & _REQUIRED) != 0 and
op.get_typeof(name) == GValue.image_type):
member_x = name
break
required_input = [name for name, flags in args
if (flags & _INPUT) != 0 and
(flags & _REQUIRED) != 0 and
name != member_x]
required_output = [name for name, flags in args
if ((flags & _OUTPUT) != 0 and
(flags & _REQUIRED) != 0) or
((flags & _INPUT) != 0 and
(flags & _REQUIRED) != 0 and
(flags & _MODIFY) != 0) and
name != member_x]
required_output = [name for name in intro.required_output if name != intro.member_x]
has_output = len(required_output) >= 1
# Add a C++ style comment block with some additional markings (@param,
# Add a C++ style comment block with some additional markings (@param,
# @return)
if declaration_only:
result = '\n/**\n * {}.'.format(op.get_description().capitalize())
result = '\n/**\n * {}.'.format(intro.description.capitalize())
for name in required_input:
for name in intro.method_args:
result += '\n * @param {} {}.' \
.format(cppize(name), op.get_blurb(name))
.format(cppize(name), intro.details[name]['blurb'])
if has_output:
# skip the first element
for name in required_output[1:]:
result += '\n * @param {} {}.' \
.format(cppize(name), op.get_blurb(name))
.format(cppize(name), intro.details[name]['blurb'])
result += '\n * @param options Optional options.'
if has_output:
result += '\n * @return {}.' \
.format(op.get_blurb(required_output[0]))
.format(intro.details[required_output[0]]['blurb'])
result += '\n */\n'
else:
result = '\n'
if member_x is None and declaration_only:
if intro.member_x is None and declaration_only:
result += 'static '
if has_output:
# the first output arg will be used as the result
cpp_type = get_cpp_type(op.get_typeof(required_output[0]))
cpp_type = get_cpp_type(intro.details[required_output[0]]['type'])
spacing = '' if cpp_type.endswith(cplusplus_suffixes) else ' '
result += '{0}{1}'.format(cpp_type, spacing)
else:
@ -160,8 +136,9 @@ def generate_operation(operation_name, declaration_only=False):
cplusplus_operation += '_image'
result += '{0}( '.format(cplusplus_operation)
for name in required_input:
gtype = op.get_typeof(name)
for name in intro.method_args:
details = intro.details[name]
gtype = details['type']
cpp_type = get_cpp_type(gtype)
spacing = '' if cpp_type.endswith(cplusplus_suffixes) else ' '
result += '{0}{1}{2}, '.format(cpp_type, spacing, cppize(name))
@ -170,7 +147,8 @@ def generate_operation(operation_name, declaration_only=False):
if has_output:
# skip the first element
for name in required_output[1:]:
gtype = op.get_typeof(name)
details = intro.details[name]
gtype = details['type']
cpp_type = get_cpp_type(gtype)
spacing = '' if cpp_type.endswith(cplusplus_suffixes) else ' '
result += '{0}{1}*{2}, '.format(cpp_type, spacing, cppize(name))
@ -178,7 +156,7 @@ def generate_operation(operation_name, declaration_only=False):
result += 'VOption *options {0})'.format('= 0 ' if declaration_only else '')
# if no 'this' available, it's a class method and they are all const
if member_x is not None:
if intro.member_x is not None:
result += ' const'
if declaration_only:
@ -191,17 +169,17 @@ def generate_operation(operation_name, declaration_only=False):
if has_output:
# the first output arg will be used as the result
name = required_output[0]
cpp_type = get_cpp_type(op.get_typeof(name))
cpp_type = get_cpp_type(intro.details[name]['type'])
spacing = '' if cpp_type.endswith(cplusplus_suffixes) else ' '
result += ' {0}{1}{2};\n\n'.format(cpp_type, spacing, cppize(name))
result += ' call( "{0}",\n'.format(operation_name)
result += ' (options ? options : VImage::option())'
if member_x is not None:
if intro.member_x is not None:
result += '->\n'
result += ' set( "{0}", *this )'.format(member_x)
result += ' set( "{0}", *this )'.format(intro.member_x)
all_required = required_input
all_required = intro.method_args
if has_output:
# first element needs to be passed by reference
@ -236,10 +214,10 @@ def generate_operators(declarations_only=False):
nickname = nickname_find(gtype)
try:
# can fail for abstract types
op = Operation.new_from_name(nickname)
intro = Introspect.get(nickname)
# we are only interested in non-deprecated operations
if (op.get_flags() & _OPERATION_DEPRECATED) == 0:
if (intro.flags & _OPERATION_DEPRECATED) == 0:
all_nicknames.append(nickname)
except Error:
pass

View File

@ -514,7 +514,7 @@ public:
static VImage new_from_buffer( const std::string &buf,
const char *option_string, VOption *options = 0 );
static VImage new_from_stream( const VStreamI &input,
static VImage new_from_stream( VStreamI streami,
const char *option_string, VOption *options = 0 );
static VImage new_matrix( int width, int height );
@ -569,8 +569,8 @@ public:
void write_to_buffer( const char *suffix, void **buf, size_t *size,
VOption *options = 0 ) const;
void write_to_stream( const char *suffix,
const VStreamO &output, VOption *options = 0 ) const;
void write_to_stream( const char *suffix, VStreamO streamo,
VOption *options = 0 ) const;
void *
write_to_memory( size_t *size ) const

View File

@ -1,5 +1,5 @@
// headers for vips operations
// Mon 11 Nov 09:21:14 GMT 2019
// Fri 29 Nov 2019 02:46:41 PM CET
// this file is generated automatically, do not edit!
/**
@ -1039,11 +1039,11 @@ static VImage jpegload_buffer( VipsBlob *buffer, VOption *options = 0 );
/**
* Load image from jpeg stream.
* @param input Stream to load from.
* @param streami Stream to load from.
* @param options Optional options.
* @return Output image.
*/
static VImage jpegload_stream( const VStreamI &input, VOption *options = 0 );
static VImage jpegload_stream( VStreamI streami, VOption *options = 0 );
/**
* Save image to jpeg file.
@ -1070,7 +1070,7 @@ void jpegsave_mime( VOption *options = 0 ) const;
* @param streamo Stream to save to.
* @param options Optional options.
*/
void jpegsave_stream( const VStreamO &streamo, VOption *options = 0 ) const;
void jpegsave_stream( VStreamO streamo, VOption *options = 0 ) const;
/**
* Label regions in an image.
@ -1521,7 +1521,7 @@ static VImage pngload_buffer( VipsBlob *buffer, VOption *options = 0 );
* @param options Optional options.
* @return Output image.
*/
static VImage pngload_stream( const VStreamI &streami, VOption *options = 0 );
static VImage pngload_stream( VStreamI streami, VOption *options = 0 );
/**
* Save image to png file.
@ -1542,7 +1542,7 @@ VipsBlob *pngsave_buffer( VOption *options = 0 ) const;
* @param streamo Stream to save to.
* @param options Optional options.
*/
void pngsave_stream( const VStreamO &streamo, VOption *options = 0 ) const;
void pngsave_stream( VStreamO streamo, VOption *options = 0 ) const;
/**
* Load ppm from file.
@ -1627,7 +1627,7 @@ static VImage radload_buffer( VipsBlob *buffer, VOption *options = 0 );
* @param options Optional options.
* @return Output image.
*/
static VImage radload_stream( const VStreamI &streami, VOption *options = 0 );
static VImage radload_stream( VStreamI streami, VOption *options = 0 );
/**
* Save image to radiance file.
@ -1648,7 +1648,7 @@ VipsBlob *radsave_buffer( VOption *options = 0 ) const;
* @param streamo Stream to save to.
* @param options Optional options.
*/
void radsave_stream( const VStreamO &streamo, VOption *options = 0 ) const;
void radsave_stream( VStreamO streamo, VOption *options = 0 ) const;
/**
* Rank filter.
@ -1998,7 +1998,7 @@ static VImage svgload_buffer( VipsBlob *buffer, VOption *options = 0 );
* @param options Optional options.
* @return Output image.
*/
static VImage svgload_stream( const VStreamI &streami, VOption *options = 0 );
static VImage svgload_stream( VStreamI streami, VOption *options = 0 );
/**
* Find the index of the first non-zero pixel in tests.
@ -2056,7 +2056,7 @@ VImage thumbnail_image( int width, VOption *options = 0 ) const;
* @param options Optional options.
* @return Output image.
*/
static VImage thumbnail_stream( const VStreamI &streami, int width, VOption *options = 0 );
static VImage thumbnail_stream( VStreamI streami, int width, VOption *options = 0 );
/**
* Load tiff from file.
@ -2080,7 +2080,7 @@ static VImage tiffload_buffer( VipsBlob *buffer, VOption *options = 0 );
* @param options Optional options.
* @return Output image.
*/
static VImage tiffload_stream( const VStreamI &streami, VOption *options = 0 );
static VImage tiffload_stream( VStreamI streami, VOption *options = 0 );
/**
* Save image to tiff file.
@ -2161,7 +2161,7 @@ static VImage webpload_buffer( VipsBlob *buffer, VOption *options = 0 );
* @param options Optional options.
* @return Output image.
*/
static VImage webpload_stream( const VStreamI &streami, VOption *options = 0 );
static VImage webpload_stream( VStreamI streami, VOption *options = 0 );
/**
* Save image to webp file.
@ -2182,7 +2182,7 @@ VipsBlob *webpsave_buffer( VOption *options = 0 ) const;
* @param streamo Stream to save to.
* @param options Optional options.
*/
void webpsave_stream( const VStreamO &streamo, VOption *options = 0 ) const;
void webpsave_stream( VStreamO streamo, VOption *options = 0 ) const;
/**
* Make a worley noise image.

View File

@ -1,5 +1,5 @@
// bodies for vips operations
// Mon 11 Nov 09:21:02 GMT 2019
// Fri 29 Nov 2019 02:46:41 PM CET
// this file is generated automatically, do not edit!
VImage VImage::CMC2LCh( VOption *options ) const
@ -1628,14 +1628,14 @@ VImage VImage::jpegload_buffer( VipsBlob *buffer, VOption *options )
return( out );
}
VImage VImage::jpegload_stream( const VStreamI &input, VOption *options )
VImage VImage::jpegload_stream( VStreamI streami, VOption *options )
{
VImage out;
call( "jpegload_stream",
(options ? options : VImage::option())->
set( "out", &out )->
set( "input", input ) );
set( "streami", streami ) );
return( out );
}
@ -1667,7 +1667,7 @@ void VImage::jpegsave_mime( VOption *options ) const
set( "in", *this ) );
}
void VImage::jpegsave_stream( const VStreamO &streamo, VOption *options ) const
void VImage::jpegsave_stream( VStreamO streamo, VOption *options ) const
{
call( "jpegsave_stream",
(options ? options : VImage::option())->
@ -2319,7 +2319,7 @@ VImage VImage::pngload_buffer( VipsBlob *buffer, VOption *options )
return( out );
}
VImage VImage::pngload_stream( const VStreamI &streami, VOption *options )
VImage VImage::pngload_stream( VStreamI streami, VOption *options )
{
VImage out;
@ -2351,7 +2351,7 @@ VipsBlob *VImage::pngsave_buffer( VOption *options ) const
return( buffer );
}
void VImage::pngsave_stream( const VStreamO &streamo, VOption *options ) const
void VImage::pngsave_stream( VStreamO streamo, VOption *options ) const
{
call( "pngsave_stream",
(options ? options : VImage::option())->
@ -2478,7 +2478,7 @@ VImage VImage::radload_buffer( VipsBlob *buffer, VOption *options )
return( out );
}
VImage VImage::radload_stream( const VStreamI &streami, VOption *options )
VImage VImage::radload_stream( VStreamI streami, VOption *options )
{
VImage out;
@ -2510,7 +2510,7 @@ VipsBlob *VImage::radsave_buffer( VOption *options ) const
return( buffer );
}
void VImage::radsave_stream( const VStreamO &streamo, VOption *options ) const
void VImage::radsave_stream( VStreamO streamo, VOption *options ) const
{
call( "radsave_stream",
(options ? options : VImage::option())->
@ -3062,7 +3062,7 @@ VImage VImage::svgload_buffer( VipsBlob *buffer, VOption *options )
return( out );
}
VImage VImage::svgload_stream( const VStreamI &streami, VOption *options )
VImage VImage::svgload_stream( VStreamI streami, VOption *options )
{
VImage out;
@ -3144,7 +3144,7 @@ VImage VImage::thumbnail_image( int width, VOption *options ) const
return( out );
}
VImage VImage::thumbnail_stream( const VStreamI &streami, int width, VOption *options )
VImage VImage::thumbnail_stream( VStreamI streami, int width, VOption *options )
{
VImage out;
@ -3181,7 +3181,7 @@ VImage VImage::tiffload_buffer( VipsBlob *buffer, VOption *options )
return( out );
}
VImage VImage::tiffload_stream( const VStreamI &streami, VOption *options )
VImage VImage::tiffload_stream( VStreamI streami, VOption *options )
{
VImage out;
@ -3304,7 +3304,7 @@ VImage VImage::webpload_buffer( VipsBlob *buffer, VOption *options )
return( out );
}
VImage VImage::webpload_stream( const VStreamI &streami, VOption *options )
VImage VImage::webpload_stream( VStreamI streami, VOption *options )
{
VImage out;
@ -3336,7 +3336,7 @@ VipsBlob *VImage::webpsave_buffer( VOption *options ) const
return( buffer );
}
void VImage::webpsave_stream( const VStreamO &streamo, VOption *options ) const
void VImage::webpsave_stream( VStreamO streamo, VOption *options ) const
{
call( "webpsave_stream",
(options ? options : VImage::option())->

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@
# <entry>vips_gamma()</entry>
# </row>
from pyvips import Operation, Error, \
from pyvips import Introspect, Operation, Error, \
ffi, type_map, type_from_name, nickname_find
# for VipsOperationFlags
@ -23,13 +23,15 @@ _OPERATION_DEPRECATED = 8
def gen_function(operation_name):
op = Operation.new_from_name(operation_name)
intro = Introspect.get(operation_name)
print('<row>')
print(' <entry>{}</entry>'.format(operation_name))
print(' <entry>{}</entry>'.format(op.get_description().capitalize()))
print(' <entry>vips_{}()</entry>'.format(operation_name))
print('</row>')
result = '<row>\n'
result += ' <entry>{}</entry>\n'.format(operation_name)
result += ' <entry>{}</entry>\n'.format(intro.description.capitalize())
result += ' <entry>vips_{}()</entry>\n'.format(operation_name)
result += '</row>'
return result
def gen_function_list():
@ -39,10 +41,10 @@ def gen_function_list():
nickname = nickname_find(gtype)
try:
# can fail for abstract types
op = Operation.new_from_name(nickname)
intro = Introspect.get(nickname)
# we are only interested in non-deprecated operations
if (op.get_flags() & _OPERATION_DEPRECATED) == 0:
if (intro.flags & _OPERATION_DEPRECATED) == 0:
all_nicknames.append(nickname)
except Error:
pass
@ -53,15 +55,50 @@ def gen_function_list():
type_map(type_from_name('VipsOperation'), add_nickname)
# add 'missing' synonyms by hand
all_nicknames.append('crop')
# make list unique and sort
all_nicknames = list(set(all_nicknames))
all_nicknames.sort()
# make dict with overloads
overloads = {
'bandbool': ['bandand', 'bandor', 'bandeor', 'bandmean'],
'bandjoin': ['bandjoin2'],
'bandjoin_const': ['bandjoin_const1'],
'boolean': ['andimage', 'orimage', 'eorimage', 'lshift', 'rshift'],
'cast': ['cast_uchar', 'cast_char', 'cast_ushort', 'cast_short' 'cast_uint', 'cast_int', 'cast_float',
'cast_double', 'cast_complex', 'cast_dpcomplex'],
'complex': ['polar', 'rect', 'conj'],
'complex2': ['cross_phase'],
'complexget': ['real', 'imag'],
'draw_circle': ['draw_circle1'],
'draw_flood': ['draw_flood'],
'draw_line': ['draw_line1'],
'draw_mask': ['draw_mask1'],
'draw_rect': ['rect', 'draw_rect1', 'draw_point', 'draw_point1'],
'extract_area': ['crop'],
'linear': ['linear1'],
'math': ['sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'exp', 'exp10', 'log', 'log10'],
'math2': ['pow', 'wop'],
'rank': ['median'],
'relational': ['equal', 'notequal', 'less', 'lesseq', 'more', 'moreeq'],
'remainder_const': ['remainder_const1'],
'round': ['floor', 'ceil', 'rint'],
}
overloads['boolean_const'] = [o + '_const' for o in overloads['boolean']] + ['boolean_const1'] + \
[o + '_const1' for o in overloads['boolean']]
overloads['math2_const'] = [o + '_const' for o in overloads['boolean']] + ['math2_const1'] + \
[o + '_const1' for o in overloads['boolean']]
overloads['relational_const'] = [o + '_const' for o in overloads['relational']] + ['relational_const1'] + \
[o + '_const1' for o in overloads['relational']]
for nickname in all_nicknames:
gen_function(nickname)
result = gen_function(nickname)
if nickname in overloads:
result = result.replace('()', '(), ' + (', '.join('vips_{}()'.format(n) for n in overloads[nickname])))
print(result)
if __name__ == '__main__':

1
test/.gitignore vendored
View File

@ -1 +1,2 @@
test_descriptors
test_streams

View File

@ -1,210 +0,0 @@
#! /bin/bash
# test_streams - temporary wrapper script for .libs/test_streams
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-11
#
# The test_streams program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command=""
# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
# install mode needs the following variables:
generated_by_libtool_version='2.4.6'
notinst_deplibs=' ../libvips/libvips.la'
else
# When we are sourced in execute mode, $file and $ECHO are already set.
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
file="$0"
# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
ECHO="printf %s\\n"
fi
# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
lt_script_arg0=$0
shift
for lt_opt
do
case "$lt_opt" in
--lt-debug) lt_option_debug=1 ;;
--lt-dump-script)
lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
cat "$lt_dump_D/$lt_dump_F"
exit 0
;;
--lt-*)
$ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
exit 1
;;
esac
done
# Print the debug banner immediately:
if test -n "$lt_option_debug"; then
echo "test_streams:test_streams:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-11" 1>&2
fi
}
# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
lt_dump_args_N=1;
for lt_arg
do
$ECHO "test_streams:test_streams:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
lt_dump_args_N=`expr $lt_dump_args_N + 1`
done
}
# Core function for launching the target application
func_exec_program_core ()
{
if test -n "$lt_option_debug"; then
$ECHO "test_streams:test_streams:$LINENO: newargv[0]: $progdir/$program" 1>&2
func_lt_dump_args ${1+"$@"} 1>&2
fi
exec "$progdir/$program" ${1+"$@"}
$ECHO "$0: cannot exec $program $*" 1>&2
exit 1
}
# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
case " $* " in
*\ --lt-*)
for lt_wr_arg
do
case $lt_wr_arg in
--lt-*) ;;
*) set x "$@" "$lt_wr_arg"; shift;;
esac
shift
done ;;
esac
func_exec_program_core ${1+"$@"}
}
# Parse options
func_parse_lt_options "$0" ${1+"$@"}
# Find the directory that this script lives in.
thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
test "x$thisdir" = "x$file" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
while test -n "$file"; do
destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
# If there was a directory component, then change thisdir.
if test "x$destdir" != "x$file"; then
case "$destdir" in
[\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
*) thisdir="$thisdir/$destdir" ;;
esac
fi
file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
done
# Usually 'no', except on cygwin/mingw when embedded into
# the cwrapper.
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
# special case for '.'
if test "$thisdir" = "."; then
thisdir=`pwd`
fi
# remove .libs from thisdir
case "$thisdir" in
*[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
.libs ) thisdir=. ;;
esac
fi
# Try to get the absolute directory name.
absdir=`cd "$thisdir" && pwd`
test -n "$absdir" && thisdir="$absdir"
program='test_streams'
progdir="$thisdir/.libs"
if test -f "$progdir/$program"; then
# Add our own library path to LD_LIBRARY_PATH
LD_LIBRARY_PATH="/home/john/GIT/libvips/libvips/.libs:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
# Some systems cannot cope with colon-terminated LD_LIBRARY_PATH
# The second colon is a workaround for a bug in BeOS R4 sed
LD_LIBRARY_PATH=`$ECHO "$LD_LIBRARY_PATH" | /bin/sed 's/::*$//'`
export LD_LIBRARY_PATH
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
# Run the actual program with our arguments.
func_exec_program ${1+"$@"}
fi
else
# The program doesn't exist.
$ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
$ECHO "This script is just a wrapper for $program." 1>&2
$ECHO "See the libtool documentation for more information." 1>&2
exit 1
fi
fi