stk/Stack/test.c

602 lines
14 KiB
C

#include <stdio.h>
#include "libstack.h"
#define MAX_DOUBLE 1.79769313486231470e+308
#define MAX_FLOAT ((float)3.40282346638528860e+38)
#define BIG_FLOAT ((float)3.4e+30)
void use_stack_void(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,
b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16)
{
return;
}
float use_stack_float(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,
b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16)
{
return 0.0;
}
double use_stack_double(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,
b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16)
{
return 0.0;
}
void use_stack()
{
use_stack_void(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
use_stack_float(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
use_stack_double(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
}
void f_void()
{
printf("void f(void):\n");
}
/******************************************************************************/
int f_int0()
{
int r=100;
printf("int f(void):");
return r;
}
int f_int1(int a)
{
int r=a+1;
printf("int f(int):(%d)", a);
return r;
}
int f_int2(int a, int b)
{
int r=a+b;
printf("int f(2*int):(%d,%d)",a,b);
return r;
}
int f_int4(int a, int b, int c, int d)
{
int r=a+b+c+d;
printf("int f(4*int):(%d,%d,%d,%d)",a,b,c,d);
return r;
}
int f_int8(int a, int b, int c, int d, int e, int f, int g, int h)
{
int r=a+b+c+d+e+f+g+h;
printf("int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h);
return r;
}
int f_int16(int a, int b, int c, int d, int e, int f, int g, int h,
int i, int j, int k, int l, int m, int n, int o, int p)
{
int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p;
printf("int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
return r;
}
/******************************************************************************/
long f_long0()
{
long r=100;
printf("long f(void):");
return r;
}
long f_long1(long a)
{
long r=a+1;
printf("long f(long):(%d)", a);
return r;
}
long f_long2(long a, long b)
{
long r=a+b;
printf("long f(2*long):(%d,%d)",a,b);
return r;
}
long f_long4(long a, long b, long c, long d)
{
long r=a+b+c+d;
printf("long f(4*long):(%d,%d,%d,%d)",a,b,c,d);
return r;
}
long f_long8(long a, long b, long c, long d, long e, long f, long g, long h)
{
long r=a+b+c+d+e+f+g+h;
printf("long f(8*long):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h);
return r;
}
long f_long16(long a, long b, long c, long d, long e, long f, long g, long h,
long i, long j, long k, long l, long m, long n, long o, long p)
{
long r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p;
printf("long f(16*long):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
return r;
}
/******************************************************************************/
float f_float0()
{
float r=100;
printf("float f(void):");
return r;
}
float f_float1(float a)
{
float r=a+1;
printf("float f(float):(%5.2f)", a);
return r;
}
float f_float2(float a, float b)
{
float r=a+b;
printf("float f(2*float):(%5.2f,%5.2f)",a,b);
return r;
}
float f_float4(float a, float b, float c, float d)
{
float r=a+b+c+d;
printf("float f(4*float):(%5.2f,%5.2f,%5.2f,%5.2f)",a,b,c,d);
return r;
}
float f_float8(float a,float b,float c,float d,float e,float f,float g,
float h)
{
float r=a+b+c+d+e+f+g+h;
printf("float f(8*float):(%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f)",a,b,c,d,e,f,g,h);
return r;
}
float f_float8max(float a,float b,float c,float d,float e,float f,float g,
float h)
{
float r=a+b+c+d+e+f+g+h;
printf("float f(8*float -- max):(%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f)",a,b,c,d,e,f,g,h);
return r;
}
float f_float16(float a,float b,float c,float d,float e,float f,
float g,float h, float i,float j,float k,float l,
float m,float n,float o,float p)
{
float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p;
printf("float f(16*float):(%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f)",
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
return r;
}
/******************************************************************************/
double f_double0()
{
double r=100;
printf("double f(void):");
return r;
}
double f_double1(double a)
{
double r=a+1;
printf("double f(double):(%5.2f)", a);
return r;
}
double f_double2(double a, double b)
{
double r=a+b;
printf("double f(2*double):(%5.2f,%5.2f)",a,b);
return r;
}
double f_double4(double a, double b, double c, double d)
{
double r=a+b+c+d;
printf("double f(4*double):(%5.2f,%5.2f,%5.2f,%5.2f)",a,b,c,d);
return r;
}
double f_double8(double a,double b,double c,double d,double e,double f,double g,
double h)
{
double r=a+b+c+d+e+f+g+h;
printf("double f(8*double):(%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f)",a,b,c,d,e,f,g,h);
return r;
}
double f_double8max(double a,double b,double c,double d,double e,double f,double g,
double h)
{
double r=a+b+c+d+e+f+g+h;
printf("double f(8*double -- max):(%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f)",a,b,c,d,e,f,g,h);
return r;
}
/******************************************************************************/
int f_int_mixed(char a, short b, int c, long d, float e, double f, char *g, int *h)
{
int r=a+b+c+d+(int)e+(int)f+*h;
printf("int f(mixed types):('%c',%d,%d,%ld,%f,%lf,%s)",a,b,c,d,e,f,g);
*h = 1234;
return r;
}
float f_float_mixed(int a, float b, int c, float d)
{
float r=a+b+c+d;
printf("float f(mixed types):(%d,%f,%d,%f)",a,b,c,d);
return r;
}
float f_float_mixed2(int a, int b, float c, float d, int e)
{
float r=a+b+c+d;
printf("float f(mixed types):(%d,%d,%f,%f,%d)",a,b,c,d,e);
return r;
}
double f_double_mixed(char a, short b, int c, long d, float e, double f, char *g,
int *h)
{
double r=a+b+c+d+e+f+*h;
printf("int f(mixed types):('%c',%d,%d,%ld,%f,%lf,%s",a,b,c,d,e,f,g);
*h = 5678;
return r;
}
/******************************************************************************/
void void_test()
{
f_void();
use_stack();
init_ext_call();
call_ext_void(f_void);
}
void int_test()
{
int r;
r = f_int0(); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
r = call_ext_int(f_int0); printf("->%d\n",r);
r = f_int1(1); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_int(1);
r = call_ext_int(f_int1); printf("->%d\n",r);
r = f_int2(1,2); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_int(1);
push_int(2);
r = call_ext_int(f_int2); printf("->%d\n",r);
r = f_int4(1,2,3,4); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_int(1);
push_int(2);
push_int(3);
push_int(4);
r = call_ext_int(f_int4); printf("->%d\n",r);
r = f_int8(1,2,3,4,5,6,7,8); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_int(1);
push_int(2);
push_int(3);
push_int(4);
push_int(5);
push_int(6);
push_int(7);
push_int(8);
r = call_ext_int(f_int8); printf("->%d\n",r);
r = f_int16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_int(1);
push_int(2);
push_int(3);
push_int(4);
push_int(5);
push_int(6);
push_int(7);
push_int(8);
push_int(9);
push_int(10);
push_int(11);
push_int(12);
push_int(13);
push_int(14);
push_int(15);
push_int(16);
r = call_ext_int(f_int16); printf("->%d\n",r);
}
void long_test()
{
long r;
long lg = 1000;
r = f_long0(); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
r = call_ext_long(f_long0); printf("->%d\n",r);
r = f_long1(lg); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_long(lg);
r = call_ext_long(f_long1); printf("->%d\n",r);
r = f_long2(lg,200); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_long(lg);
push_long(200);
r = call_ext_long(f_long2); printf("->%d\n",r);
r = f_long4(lg,2,3,4); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_long(lg);
push_long(2);
push_long(3);
push_long(4);
r = call_ext_long(f_long4); printf("->%d\n",r);
r = f_long8(lg,2,3,4,5,6,7,8); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_long(lg);
push_long(2);
push_long(3);
push_long(4);
push_long(5);
push_long(6);
push_long(7);
push_long(8);
r = call_ext_long(f_long8); printf("->%d\n",r);
r = f_long16(lg,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); printf("->%d\n",r);
r = 0; use_stack(); init_ext_call();
push_long(lg);
push_long(2);
push_long(3);
push_long(4);
push_long(5);
push_long(6);
push_long(7);
push_long(8);
push_long(9);
push_long(10);
push_long(11);
push_long(12);
push_long(13);
push_long(14);
push_long(15);
push_long(16);
r = call_ext_long(f_long16); printf("->%d\n",r);
}
void float_test()
{
float r;
r = f_float0(); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
r = call_ext_float(f_float0); printf("->%5.2f\n",r);
r = f_float1(1.0); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_float(1.0);
r = call_ext_float(f_float1); printf("->%5.2f\n",r);
r = f_float2(1,2); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_float(1);
push_float(2);
r = call_ext_float(f_float2); printf("->%5.2f\n",r);
r = f_float4(1,2,3,4); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_float(1);
push_float(2);
push_float(3);
push_float(4);
r = call_ext_float(f_float4); printf("->%5.2f\n",r);
r = f_float8(1,2,3,4,5,6,7,8); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_float(1);
push_float(2);
push_float(3);
push_float(4);
push_float(5);
push_float(6);
push_float(7);
push_float(8);
r = call_ext_float(f_float8); printf("->%5.2f\n",r);
r = f_float8max(BIG_FLOAT, BIG_FLOAT, BIG_FLOAT, BIG_FLOAT,
BIG_FLOAT, BIG_FLOAT, BIG_FLOAT, BIG_FLOAT);
printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
push_float(BIG_FLOAT);
r = call_ext_float(f_float8max); printf("->%5.2f\n",r);
r = f_float16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_float(1);
push_float(2);
push_float(3);
push_float(4);
push_float(5);
push_float(6);
push_float(7);
push_float(8);
push_float(9);
push_float(10);
push_float(11);
push_float(12);
push_float(13);
push_float(14);
push_float(15);
push_float(16);
r = call_ext_float(f_float16); printf("->%5.2f\n",r);
}
void double_test()
{
double r;
r = f_double0(); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
r = call_ext_double(f_double0); printf("->%5.2f\n",r);
r = f_double1(1); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_double(1);
r = call_ext_double(f_double1); printf("->%5.2f\n",r);
r = f_double2(1,2); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_double(1);
push_double(2);
r = call_ext_double(f_double2); printf("->%5.2f\n",r);
r = f_double4(1,2,3,4); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_double(1);
push_double(2);
push_double(3);
push_double(4);
r = call_ext_double(f_double4); printf("->%5.2f\n",r);
r = f_double8(1,2,3,4,5,6,7,8); printf("->%5.2f\n",r);
r = 0; use_stack(); init_ext_call();
push_double(1);
push_double(2);
push_double(3);
push_double(4);
push_double(5);
push_double(6);
push_double(7);
push_double(8);
r = call_ext_double(f_double8); printf("->%5.2f\n",r);
}
void mixed_test()
{
{
int r;
int dumb = 1 ;
r = f_int_mixed('?',1,2,3,4.123456,5.123456789012345,"Hello, world",&dumb);
printf("->%d (%d)\n",r, dumb);
r = 0; dumb = 1; use_stack(); init_ext_call();
push_char('?');
push_short(1);
push_int(2);
push_long(3);
push_float(4.123456);
push_double(5.123456789012345);
push_string("Hello, world");
push_ptr(&dumb);
r = call_ext_int(f_int_mixed); printf("->%d (%d)\n",r, dumb);
}
{
float r;
r = f_float_mixed(1,2,3,4); printf("->%5.2f\n", r);
r = 0; use_stack(); init_ext_call();
push_int(1);
push_float(2);
push_int(3);
push_float(4);
r = call_ext_float(f_float_mixed); printf("->%5.2f\n", r);
r = f_float_mixed2(1,2,3,4,5); printf("->%5.2f\n", r);
r = 0; use_stack(); init_ext_call();
push_int(1);
push_int(2);
push_float(3);
push_float(4);
push_int(5);
r = call_ext_float(f_float_mixed2); printf("->%5.2f\n", r);
}
{
double r;
int dumb = 1;
r = f_double_mixed('?',1,2,3,4.123456,5.123456789012345,"Hello, world",&dumb);
printf("->%5.2lf (%d)\n",r, dumb);
r = 0; dumb = 1; use_stack(); init_ext_call();
push_char('?');
push_short(1);
push_int(2);
push_long(3);
push_float(4.123456);
push_double(5.123456789012345);
push_string("Hello, world");
push_ptr(&dumb);
r = call_ext_double(f_double_mixed); printf("->%5.2lf (%d)\n",r, dumb);
}
}
main()
{
printf("On this machine we have:\n");
printf("\tsizeof(char)\t= %d\n", sizeof(char));
printf("\tsizeof(short)\t= %d\n", sizeof(short));
printf("\tsizeof(int)\t= %d\n", sizeof(int));
printf("\tsizeof(long)\t= %d\n", sizeof(long));
printf("\tsizeof(float)\t= %d\n", sizeof(float));
printf("\tsizeof(double)\t= %d\n", sizeof(double));
printf("\tsizeof(void*)\t= %d\n", sizeof(void*));
void_test();
int_test();
long_test();
float_test();
double_test();
mixed_test();
}