# first try to setup some prelimiaries

if (!dyn_supported()) exit(0);

libc = dyn_open("libc.so.6");					# Linux
if (is_void(libc)) libc = dyn_open("libc.so.1");		# Solaris
if (is_void(libc)) libc = dyn_open("libSystem.B.dylib");	# MacOS X
if (is_void(libc)) exit(0);

libm = dyn_open("libm.so.6");					# Linux
if (is_void(libm)) libm = dyn_open("libm.so.1");		# Solaris
if (is_void(libm)) libm = dyn_open("libSystem.B.dylib");	# MacOS X
if (is_void(libm)) exit(0);


# 1) obtain address of function

a = dyn_fn_pointer(libc, "abs");

if (!is_resource(a)) exit(1);


# 2) call C function that takes and returns int

a = dyn_call_int(libc, "abs", -42);

if (a != 42) exit(2);


# 3) call C function that takes and returns C double

a = dyn_call_float(libm, "fabs", -2.5);

if (a != 2.5) exit(3);


# 4) call C function that takes string and returns int

a = dyn_call_int(libc, "strlen", "foobar");

if (a != 6) exit(4);


# 5) call C function that takes and returns pointer

m = calloc(10, 1);
p = dyn_call_ptr(libc, "memset", m, 1, 10);
a = b = 0;
for (i = 0; i < 10; i++) {
  a += mgetchar(m, i);
  b += mgetchar(p, i);
}

if (a != 10 || b != 10) exit(5);


# 6) check for dynamic library resource

if (!is_dyn_resource(libc)) exit(6);


# 7) call C function takes and returns C float

a = dyn_call_float(libm, "roundf", cfloat(-2.5));
if (a != -3.0) exit(7);


print("7 subtests ");
