aboutsummaryrefslogtreecommitdiffhomepage
path: root/libslang/src/test/sltest.c
diff options
context:
space:
mode:
Diffstat (limited to 'libslang/src/test/sltest.c')
-rw-r--r--libslang/src/test/sltest.c182
1 files changed, 182 insertions, 0 deletions
diff --git a/libslang/src/test/sltest.c b/libslang/src/test/sltest.c
new file mode 100644
index 0000000..c9f8555
--- /dev/null
+++ b/libslang/src/test/sltest.c
@@ -0,0 +1,182 @@
+#include <stdio.h>
+#include <slang.h>
+#include <math.h>
+
+#include "../sl-feat.h"
+
+#if SLANG_HAS_FLOAT
+#if defined(__FreeBSD__) || defined(__386BSD__)
+# include <floatingpoint.h>
+# define HAVE_FPSETMASK 1
+#endif
+#endif
+
+static int Ignore_Exit = 0;
+static void c_exit (int *code)
+{
+ if (Ignore_Exit == 0)
+ exit (*code);
+}
+
+static char test_char_return (char *x)
+{
+ return *x;
+}
+static short test_short_return (short *x)
+{
+ return *x;
+}
+static int test_int_return (int *x)
+{
+ return *x;
+}
+static long test_long_return (long *x)
+{
+ return *x;
+}
+/* static float test_float_return (float *x) */
+/* { */
+/* return *x; */
+/* } */
+#if SLANG_HAS_FLOAT
+static double test_double_return (double *x)
+{
+ return *x;
+}
+#endif
+typedef struct
+{
+ int i;
+ long l;
+ short h;
+ char b;
+#if SLANG_HAS_FLOAT
+ double d;
+ double c[2];
+#endif
+ char *s;
+ SLang_Array_Type *a;
+ char *ro_str;
+}
+CStruct_Type;
+
+static SLang_CStruct_Field_Type C_Struct [] =
+{
+ MAKE_CSTRUCT_FIELD(CStruct_Type, i, "i", SLANG_INT_TYPE, 0),
+#if SLANG_HAS_FLOAT
+ MAKE_CSTRUCT_FIELD(CStruct_Type, d, "d", SLANG_DOUBLE_TYPE, 0),
+ MAKE_CSTRUCT_FIELD(CStruct_Type, c, "z", SLANG_COMPLEX_TYPE, 0),
+#endif
+ MAKE_CSTRUCT_FIELD(CStruct_Type, s, "s", SLANG_STRING_TYPE, 0),
+ MAKE_CSTRUCT_FIELD(CStruct_Type, a, "a", SLANG_ARRAY_TYPE, 0),
+ MAKE_CSTRUCT_FIELD(CStruct_Type, ro_str, "ro_str", SLANG_STRING_TYPE, 1),
+ MAKE_CSTRUCT_INT_FIELD(CStruct_Type, l, "l", 0),
+ MAKE_CSTRUCT_INT_FIELD(CStruct_Type, h, "h", 0),
+ MAKE_CSTRUCT_INT_FIELD(CStruct_Type, b, "b", 0),
+ SLANG_END_CSTRUCT_TABLE
+};
+
+static CStruct_Type C_Struct_Buf;
+static void check_cstruct (void)
+{
+ static int first_time = 1;
+ if (first_time)
+ {
+ C_Struct_Buf.ro_str = "read-only";
+ first_time = 0;
+ }
+}
+
+static void get_c_struct (void)
+{
+ check_cstruct ();
+ (void) SLang_push_cstruct ((VOID_STAR) &C_Struct_Buf, C_Struct);
+}
+
+static void set_c_struct (void)
+{
+ SLang_free_cstruct ((VOID_STAR) &C_Struct_Buf, C_Struct);
+ (void) SLang_pop_cstruct ((VOID_STAR) &C_Struct_Buf, C_Struct);
+}
+
+static void get_c_struct_via_ref (SLang_Ref_Type *r)
+{
+ check_cstruct ();
+ (void) SLang_assign_cstruct_to_ref (r, (VOID_STAR) &C_Struct_Buf, C_Struct);
+}
+
+
+
+static SLang_Intrin_Fun_Type Intrinsics [] =
+{
+ MAKE_INTRINSIC_I("exit", c_exit, VOID_TYPE),
+ MAKE_INTRINSIC_1("test_char_return", test_char_return, SLANG_CHAR_TYPE, SLANG_CHAR_TYPE),
+ MAKE_INTRINSIC_1("test_short_return", test_short_return, SLANG_SHORT_TYPE, SLANG_SHORT_TYPE),
+ MAKE_INTRINSIC_1("test_int_return", test_int_return, SLANG_INT_TYPE, SLANG_INT_TYPE),
+ MAKE_INTRINSIC_1("test_long_return", test_long_return, SLANG_LONG_TYPE, SLANG_LONG_TYPE),
+ /* MAKE_INTRINSIC_1("test_float_return", test_float_return, SLANG_FLOAT_TYPE, SLANG_FLOAT_TYPE), */
+#if SLANG_HAS_FLOAT
+ MAKE_INTRINSIC_1("test_double_return", test_double_return, SLANG_DOUBLE_TYPE, SLANG_DOUBLE_TYPE),
+#endif
+ MAKE_INTRINSIC_0("get_c_struct", get_c_struct, VOID_TYPE),
+ MAKE_INTRINSIC_0("set_c_struct", set_c_struct, VOID_TYPE),
+ MAKE_INTRINSIC_1("get_c_struct_via_ref", get_c_struct_via_ref, VOID_TYPE, SLANG_REF_TYPE),
+ SLANG_END_INTRIN_FUN_TABLE
+};
+
+
+int main (int argc, char **argv)
+{
+ int i;
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "Usage: %s FILE...\n", argv[0]);
+ return 1;
+ }
+
+ if ((-1 == SLang_init_all ())
+ || (-1 == SLang_init_array_extra ())
+ || (-1 == SLadd_intrin_fun_table (Intrinsics, NULL)))
+ return 1;
+
+ SLang_Traceback = 1;
+
+ if (-1 == SLang_set_argc_argv (argc, argv))
+ return 1;
+
+#ifdef HAVE_FPSETMASK
+# ifndef FP_X_OFL
+# define FP_X_OFL 0
+# endif
+# ifndef FP_X_INV
+# define FP_X_INV 0
+# endif
+# ifndef FP_X_DZ
+# define FP_X_DZ 0
+# endif
+# ifndef FP_X_DNML
+# define FP_X_DNML 0
+# endif
+# ifndef FP_X_UFL
+# define FP_X_UFL 0
+# endif
+# ifndef FP_X_IMP
+# define FP_X_IMP 0
+# endif
+ fpsetmask (~(FP_X_OFL|FP_X_INV|FP_X_DZ|FP_X_DNML|FP_X_UFL|FP_X_IMP));
+#endif
+
+ if (argc > 2)
+ Ignore_Exit = 1;
+
+ for (i = 1; i < argc; i++)
+ {
+ if (-1 == SLang_load_file (argv[i]))
+ return 1;
+ }
+
+ return SLang_Error;
+}
+
+