diff options
Diffstat (limited to 'libslang/src/calc.c')
-rw-r--r-- | libslang/src/calc.c | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/libslang/src/calc.c b/libslang/src/calc.c new file mode 100644 index 0000000..6dde654 --- /dev/null +++ b/libslang/src/calc.c @@ -0,0 +1,225 @@ +/* This is a simple demo program for the S-Lang interpreter. */ + +#include "config.h" +#include <stdio.h> +#include <math.h> +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#define BENCHMARK_TESTING 0 + +#if BENCHMARK_TESTING +# include <sys/time.h> +# include <sys/resource.h> +# include <unistd.h> +#endif + +#include "slang.h" + +static int open_readline (void); +static void close_readline (void); + +static void help (void) +{ + puts("ALL statements MUST be terminated with a ';' character, e.g., quit();\n"); + puts("Available functions:"); + puts(" cos, sin, tan, atan, acos, asin, exp, log, sqrt, fabs, log10, pow, PI, E"); + puts("\nas well as other intrinsic S-Lang functions."); + puts("See S-Lang language documentation for further details.\n"); + SLang_run_hooks ("calc_help", 0); +} + +/* The following three functions will be callable from the interpreter */ +static void quit_calc (void) +{ + close_readline (); + exit (SLang_Error); +} + +static void exit_calc (int *status) +{ + close_readline (); + exit (*status); +} + + +/* Now here is a table that provides the link between the above functions and + the S-Lang interpreter */ +static SLang_Intrin_Fun_Type Calc_Intrinsics [] = +{ + MAKE_INTRINSIC("quit", quit_calc, SLANG_VOID_TYPE, 0), + MAKE_INTRINSIC_I("exit", exit_calc, SLANG_VOID_TYPE), + MAKE_INTRINSIC("help", help, SLANG_VOID_TYPE, 0), + SLANG_END_INTRIN_FUN_TABLE +}; + +typedef struct +{ + int i_value; + char *s_value; + double d_value; +} +My_Struct_Type; + +static My_Struct_Type My_Struct = +{ + -41, + NULL, + 7.18 +}; + +static My_Struct_Type *My_Struct_Ptr = &My_Struct; + +static SLang_IStruct_Field_Type My_Struct_Field_Table [] = +{ + MAKE_ISTRUCT_FIELD(My_Struct_Type, i_value, "i", SLANG_INT_TYPE, 0), + MAKE_ISTRUCT_FIELD(My_Struct_Type, s_value, "s", SLANG_STRING_TYPE, 0), + MAKE_ISTRUCT_FIELD(My_Struct_Type, d_value, "d", SLANG_DOUBLE_TYPE, 0), + SLANG_END_ISTRUCT_TABLE +}; + + +static int add_my_struct_type (void) +{ + return SLadd_istruct_table (My_Struct_Field_Table, + (VOID_STAR) &My_Struct_Ptr, + "MyS"); +} + +static int take_input (void); + +int main (int argc, char **argv) +{ + if ((-1 == SLang_init_all ()) + /* || (-1 == SLang_init_import ()) / * dynamic linking */ + || (-1 == add_my_struct_type ()) + || (-1 == SLadd_intrin_fun_table (Calc_Intrinsics, NULL))) + { + fprintf(stderr, "Unable to initialize S-Lang.\n"); + exit (1); + } + + if (-1 == open_readline ()) + return SLang_Error; + + SLang_Traceback = 1; + + if (argc == 1) + SLang_load_file("calc.sl"); + + while (--argc && !SLang_Error) + { + argv++; + SLang_load_file (*argv); + } + + fputs("Type 'help();' for help and a list of available functions.\n", stdout); + fputs("All statements must end with a ';' character, e.g, 2*7+3;\n", stdout); + fputs("\nType `quit;' to exit this program.\n", stdout); + + while (1) + { + if (SLang_Error) + { + SLang_doerror (NULL); + SLang_restart (1); + } + + SLKeyBoard_Quit = SLang_Error = 0; + take_input (); + } +} + +/* For a detailed explanation of all of this, see slang/demo/useropen.c */ + +static SLang_RLine_Info_Type Calc_RLI; +static unsigned char Calc_RLI_Buf[256]; +SLang_Load_Type *Readline_Load_Object; + +static char *read_using_readline (SLang_Load_Type *x) +{ + int n; + static char *input_hook = "calc_take_input_hook"; + + Calc_RLI_Buf[0] = 0; + + if (x->parse_level == 0) + { + if ((input_hook != NULL) + && (-1 == SLang_run_hooks (input_hook, 0))) + { + input_hook = NULL; + return NULL; + } + + Calc_RLI.prompt = "Calc> "; + } + else Calc_RLI.prompt = " "; + + n = SLang_read_line (&Calc_RLI); + putc ('\n', stdout); fflush (stdout); + + if (n < 0) return NULL; + if ((n == 0) + && (SLang_Last_Key_Char == SLang_RL_EOF_Char)) + return "quit;"; + + SLang_rline_save_line (&Calc_RLI); + return (char *) Calc_RLI_Buf; +} + +static int open_readline (void) +{ + if (SLang_init_tty (-1, 0, 1)) + { + fprintf(stderr, "Unable to initialize tty.\n"); + return -1; + } + SLang_set_abort_signal (NULL); + + Calc_RLI.buf = Calc_RLI_Buf; + Calc_RLI.buf_len = 255; + Calc_RLI.tab = 8; + Calc_RLI.edit_width = 79; + Calc_RLI.dhscroll = 20; + Calc_RLI.prompt = "Calc> "; + Calc_RLI.getkey = SLang_getkey; + Calc_RLI.flags = SL_RLINE_BLINK_MATCH; + Calc_RLI.input_pending = SLang_input_pending; + +#ifndef IBMPC_SYSTEM + Calc_RLI.flags |= SL_RLINE_USE_ANSI; +#endif + + if (-1 == SLang_init_readline (&Calc_RLI)) + { + close_readline (); + return -1; + } + + if (NULL == (Readline_Load_Object = SLallocate_load_type ("<stdin>"))) + { + close_readline (); + return -1; + } + + Readline_Load_Object->read = read_using_readline; + return 0; +} + +static void close_readline (void) +{ + if (Readline_Load_Object != NULL) + { + SLdeallocate_load_type (Readline_Load_Object); + Readline_Load_Object = NULL; + } + + SLang_reset_tty (); +} + +static int take_input (void) +{ + return SLang_load_object (Readline_Load_Object); +} |