📄 calc.c
字号:
/* 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -