This is calc.c in view mode; [Download] [Up]
/* This is a simple demo program for the S-Lang interpreter. It would
* take very little work to make this demo *really* useful.
*/
#include "config.h"
#include <math.h>
#include <stdio.h>
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#include "slang.h"
#if !defined (__GO32__) && !defined(msdos) && !defined (__EMX__)
# define USE_ANSI_COLOR
#endif
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(" print -- prints string, e.g. print(\"hello world!\\n\");");
puts("\nas well as intrinsic S-Lang functions.");
puts("See S-Lang language documentation for further details.\n");
SLang_run_hooks ("calc_help", NULL, NULL);
}
/* The following three functions will be callable from the interpreter */
static void quit_calc (void)
{
SLang_reset_tty ();
#ifdef MALLOC_DEBUG
SLmalloc_dump_statistics ();
#endif
exit (SLang_Error);
}
static void print (char *s)
{
fputs(s, stdout); fflush (stdout);
}
static void error(char *s)
{
fprintf(stderr, "%s\n", s);
SLang_Error = INTRINSIC_ERROR;
}
/* Now here is a table that provides the link between the above functions and
the S-Lang interpreter */
SLang_Name_Type Calc_Intrinsics[] =
{
MAKE_INTRINSIC(".print", print, VOID_TYPE, 1),
MAKE_INTRINSIC(".quit", quit_calc, VOID_TYPE, 0),
MAKE_INTRINSIC(".help", help, VOID_TYPE, 0),
MAKE_INTRINSIC(".error", error, VOID_TYPE, 1),
SLANG_END_TABLE
};
/* forward declarations */
static int take_input (void);
static int calc_open_readline (SLang_Load_Type *);
static int calc_close_readline (SLang_Load_Type *);
int main (int argc, char **argv)
{
if (!init_SLang() /* basic interpreter functions */
|| !init_SLmath() /* sin, cos, etc... */
#ifdef unix
|| !init_SLunix()
#endif
|| !init_SLfiles() /* file i/o */
/* || !init_SLmatrix() */ /* matrix manipluation */
|| !SLang_add_table(Calc_Intrinsics, "Calc")) /* calc specifics */
{
fprintf(stderr, "Unable to initialize S-Lang.\n");
exit(1);
}
if (SLang_init_tty (-1, 0, 1))
{
fprintf(stderr, "Unable to initialize tty.");
exit (-1);
}
SLang_set_abort_signal (NULL);
SLang_Traceback = 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("Note also that statements end in a ';'\n", stdout);
fputs("\nIt is also important to note that most binary operators +, -, *, /,\n", stdout);
fputs("as well as the '=' sign must be surrounded by spaces!\n", stdout);
fputs("\nType `quit;' to exit this program.\n", stdout);
SLang_User_Open_Slang_Object = calc_open_readline;
SLang_User_Close_Slang_Object = calc_close_readline;
while(1)
{
if (SLang_Error)
{
SLang_doerror (NULL);
SLang_restart(1);
}
SLKeyBoard_Quit = SLang_Error = 0;
if (take_input () && (SLang_Last_Key_Char == SLang_RL_EOF_Char))
break;
}
SLang_reset_tty ();
return (SLang_Error);
}
/* For a detailed explanation of all of this, see slang/demo/useropen.c */
static char *read_using_readline (SLang_Load_Type *x)
{
int n;
SLang_RLine_Info_Type *rli;
rli = (SLang_RLine_Info_Type *) x->ptr;
*rli->buf = 0;
if (x->top_level) rli->prompt = "Calc> ";
else rli->prompt = "_Calc> ";
n = SLang_read_line (rli);
putc ('\n', stdout); fflush (stdout);
if (n <= 0) return NULL;
if ((n == 1) && (*rli->buf == SLang_RL_EOF_Char)) return "quit;";
SLang_rline_save_line (rli);
return (char *) rli->buf;
}
static SLang_RLine_Info_Type Calc_RLI;
static unsigned char Calc_RLI_Buf[256];
static int calc_open_readline (SLang_Load_Type *x)
{
switch (x->type)
{
case 'r':
x->ptr = (char *) &Calc_RLI;
x->read = read_using_readline;
if (Calc_RLI.buf != NULL)
{
/* everything else already initialized. Just return. */
return 0;
}
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;
#ifdef USE_ANSI_COLOR
Calc_RLI.flags = SLRL_USE_ANSI;
#endif
SLang_init_readline (&Calc_RLI);
return 0;
default:
/* unrecognized-- let S-lang handle it */
return SL_OBJ_UNKNOWN;
}
}
static int calc_close_readline (SLang_Load_Type *x)
{
switch (x->type)
{
case 'r':
/* Nothing to do */
return 0;
default:
/* unrecognized-- let S-lang handle it */
return SL_OBJ_UNKNOWN;
}
}
static int take_input ()
{
SLang_Load_Type x;
x.type = 'r'; /* readline type */
x.read = read_using_readline; /* function to call to perform the read */
return SLang_load_object (&x);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.