#include #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(); }