diff options
Diffstat (limited to 'mdk-stage1/slang/slstd.c')
-rw-r--r-- | mdk-stage1/slang/slstd.c | 724 |
1 files changed, 0 insertions, 724 deletions
diff --git a/mdk-stage1/slang/slstd.c b/mdk-stage1/slang/slstd.c deleted file mode 100644 index b05dfcddb..000000000 --- a/mdk-stage1/slang/slstd.c +++ /dev/null @@ -1,724 +0,0 @@ -/* -*- mode: C; mode: fold; -*- */ -/* Standard intrinsic functions for S-Lang. Included here are string - and array operations */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" -/*{{{ Include Files */ - -#include <time.h> - -#ifndef __QNX__ -# if defined(__GO32__) || defined(__WATCOMC__) -# include <dos.h> -# include <bios.h> -# endif -#endif - -#if SLANG_HAS_FLOAT -# include <math.h> -#endif - -#include "slang.h" -#include "_slang.h" - -/*}}}*/ - -/* builtin stack manipulation functions */ -int SLdo_pop(void) /*{{{*/ -{ - return SLdo_pop_n (1); -} - -/*}}}*/ - -int SLdo_pop_n (unsigned int n) -{ - SLang_Object_Type x; - - while (n--) - { - if (SLang_pop(&x)) return -1; - SLang_free_object (&x); - } - - return 0; -} - -static void do_dup(void) /*{{{*/ -{ - (void) SLdup_n (1); -} - -/*}}}*/ - -static int length_cmd (void) -{ - SLang_Class_Type *cl; - SLang_Object_Type obj; - VOID_STAR p; - unsigned int length; - int len; - - if (-1 == SLang_pop (&obj)) - return -1; - - cl = _SLclass_get_class (obj.data_type); - p = _SLclass_get_ptr_to_value (cl, &obj); - - len = 1; - if (cl->cl_length != NULL) - { - if (0 == (*cl->cl_length)(obj.data_type, p, &length)) - len = (int) length; - else - len = -1; - } - - SLang_free_object (&obj); - return len; -} - -/* convert integer to a string of length 1 */ -static void char_cmd (int *x) /*{{{*/ -{ - char ch, buf[2]; - - ch = (char) *x; - buf[0] = ch; - buf[1] = 0; - SLang_push_string (buf); -} - -/*}}}*/ - -/* format object into a string and returns slstring */ -char *_SLstringize_object (SLang_Object_Type *obj) /*{{{*/ -{ - SLang_Class_Type *cl; - unsigned char stype; - VOID_STAR p; - char *s, *s1; - - stype = obj->data_type; - p = (VOID_STAR) &obj->v.ptr_val; - - cl = _SLclass_get_class (stype); - - s = (*cl->cl_string) (stype, p); - if (s != NULL) - { - s1 = SLang_create_slstring (s); - SLfree (s); - s = s1; - } - return s; -} -/*}}}*/ - -int SLang_run_hooks(char *hook, unsigned int num_args, ...) -{ - unsigned int i; - va_list ap; - - if (SLang_Error) return -1; - - if (0 == SLang_is_defined (hook)) - return 0; - - (void) SLang_start_arg_list (); - va_start (ap, num_args); - for (i = 0; i < num_args; i++) - { - char *arg; - - arg = va_arg (ap, char *); - if (-1 == SLang_push_string (arg)) - break; - } - va_end (ap); - (void) SLang_end_arg_list (); - - if (SLang_Error) return -1; - return SLang_execute_function (hook); -} - -static void intrin_getenv_cmd (char *s) -{ - SLang_push_string (getenv (s)); -} - -#ifdef HAVE_PUTENV -static void intrin_putenv (void) /*{{{*/ -{ - char *s; - - /* Some putenv implementations required malloced strings. */ - if (SLpop_string(&s)) return; - - if (putenv (s)) - { - SLang_Error = SL_INTRINSIC_ERROR; - SLfree (s); - } - - /* Note that s is NOT freed */ -} - -/*}}}*/ - -#endif - -static void lang_print_stack (void) /*{{{*/ -{ - char buf[32]; - unsigned int n; - - n = (unsigned int) (_SLStack_Pointer - _SLRun_Stack); - while (n) - { - n--; - sprintf (buf, "(%u)", n); - _SLdump_objects (buf, _SLRun_Stack + n, 1, 1); - } -} - -/*}}}*/ - -static void byte_compile_file (char *f, int *m) -{ - SLang_byte_compile_file (f, *m); -} - -static void intrin_type_info1 (void) -{ - SLang_Object_Type obj; - unsigned int type; - - if (-1 == SLang_pop (&obj)) - return; - - type = obj.data_type; - if (type == SLANG_ARRAY_TYPE) - type = obj.v.array_val->data_type; - - SLang_free_object (&obj); - - _SLang_push_datatype (type); -} - -static void intrin_type_info (void) -{ - SLang_Object_Type obj; - - if (-1 == SLang_pop (&obj)) - return; - - _SLang_push_datatype (obj.data_type); - SLang_free_object (&obj); -} - -void _SLstring_intrinsic (void) /*{{{*/ -{ - SLang_Object_Type x; - char *s; - - if (SLang_pop (&x)) return; - if (NULL != (s = _SLstringize_object (&x))) - _SLang_push_slstring (s); - - SLang_free_object (&x); -} - -/*}}}*/ - -static void intrin_typecast (void) -{ - unsigned char to_type; - if (0 == _SLang_pop_datatype (&to_type)) - (void) SLclass_typecast (to_type, 0, 1); -} - -#if SLANG_HAS_FLOAT -static void intrin_double (void) -{ - (void) SLclass_typecast (SLANG_DOUBLE_TYPE, 0, 1); -} - -#endif - -static void intrin_int (void) /*{{{*/ -{ - (void) SLclass_typecast (SLANG_INT_TYPE, 0, 1); -} - -/*}}}*/ - -static char * -intrin_function_name (void) -{ - if (NULL == _SLang_Current_Function_Name) - return ""; - return _SLang_Current_Function_Name; -} - -static void intrin_message (char *s) -{ - SLang_vmessage ("%s", s); -} - -static void intrin_error (char *s) -{ - SLang_verror (SL_USER_ERROR, "%s", s); -} - -static void intrin_pop_n (int *n) -{ - SLdo_pop_n ((unsigned int) *n); -} - -static void intrin_reverse_stack (int *n) -{ - SLreverse_stack (*n); -} - -static void intrin_roll_stack (int *n) -{ - SLroll_stack (*n); -} - -static void usage (void) -{ - char *msg; - - _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1); /* do not include format */ - - if (-1 == SLang_pop_slstring (&msg)) - return; - - SLang_verror (SL_USAGE_ERROR, "Usage: %s", msg); - SLang_free_slstring (msg); -} - -/* Convert string to integer */ -static int intrin_integer (char *s) -{ - int i; - - i = SLatoi ((unsigned char *) s); - - if (SLang_Error) - SLang_verror (SL_TYPE_MISMATCH, "Unable to convert string to integer"); - return i; -} -/*}}}*/ - -static void guess_type (char *s) -{ - _SLang_push_datatype (SLang_guess_type(s)); -} - -static int load_file (char *s) -{ - if (-1 == SLang_load_file (s)) - return 0; - return 1; -} - -static void get_doc_string (char *file, char *topic) -{ - FILE *fp; - char line[1024]; - unsigned int topic_len, str_len; - char *str; - char ch; - - if (NULL == (fp = fopen (file, "r"))) - { - SLang_push_null (); - return; - } - - topic_len = strlen (topic); - ch = *topic; - - while (1) - { - if (NULL == fgets (line, sizeof(line), fp)) - { - fclose (fp); - (void) SLang_push_null (); - return; - } - - if ((ch == *line) - && (0 == strncmp (line, topic, topic_len)) - && ((line[topic_len] == '\n') || (line [topic_len] == 0) - || (line[topic_len] == ' ') || (line[topic_len] == '\t'))) - break; - } - - if (NULL == (str = SLmake_string (line))) - { - fclose (fp); - (void) SLang_push_null (); - return; - } - str_len = strlen (str); - - while (NULL != fgets (line, sizeof (line), fp)) - { - unsigned int len; - char *new_str; - - ch = *line; - if (ch == '#') continue; - if (ch == '-') break; - - len = strlen (line); - if (NULL == (new_str = SLrealloc (str, str_len + len + 1))) - { - SLfree (str); - str = NULL; - break; - } - str = new_str; - strcpy (str + str_len, line); - str_len += len; - } - - fclose (fp); - - (void) SLang_push_malloced_string (str); -} - -static int push_string_array_elements (SLang_Array_Type *at) -{ - char **strs; - unsigned int num; - unsigned int i; - - if (at == NULL) - return -1; - - strs = (char **)at->data; - num = at->num_elements; - for (i = 0; i < num; i++) - { - if (-1 == SLang_push_string (strs[i])) - { - SLdo_pop_n (i); - return -1; - } - } - SLang_push_integer ((int) num); - return 0; -} - - -static void intrin_apropos (void) -{ - int num_args; - char *pat; - char *namespace_name; - unsigned int flags; - SLang_Array_Type *at; - - num_args = SLang_Num_Function_Args; - - if (-1 == SLang_pop_uinteger (&flags)) - return; - if (-1 == SLang_pop_slstring (&pat)) - return; - - namespace_name = NULL; - at = NULL; - if (num_args == 3) - { - if (-1 == SLang_pop_slstring (&namespace_name)) - goto free_and_return; - } - - at = _SLang_apropos (namespace_name, pat, flags); - if (num_args == 3) - { - (void) SLang_push_array (at, 0); - goto free_and_return; - } - - /* Maintain compatibility with old version of the function. That version - * did not take three arguments and returned everything to the stack. - * Yuk. - */ - (void) push_string_array_elements (at); - - free_and_return: - /* NULLs ok */ - SLang_free_slstring (namespace_name); - SLang_free_slstring (pat); - SLang_free_array (at); -} - -static int intrin_get_defines (void) -{ - int n = 0; - char **s = _SLdefines; - - while (*s != NULL) - { - if (-1 == SLang_push_string (*s)) - { - SLdo_pop_n ((unsigned int) n); - return -1; - } - s++; - n++; - } - return n; -} - -static void intrin_get_reference (char *name) -{ - _SLang_push_ref (1, (VOID_STAR) _SLlocate_name (name)); -} - -#ifdef HAVE_SYS_UTSNAME_H -# include <sys/utsname.h> -#endif - -static void uname_cmd (void) -{ -#ifdef HAVE_UNAME - struct utsname u; - char *field_names [6]; - unsigned char field_types[6]; - VOID_STAR field_values [6]; - char *ptrs[6]; - int i; - - if (-1 == uname (&u)) - (void) SLang_push_null (); - - field_names[0] = "sysname"; ptrs[0] = u.sysname; - field_names[1] = "nodename"; ptrs[1] = u.nodename; - field_names[2] = "release"; ptrs[2] = u.release; - field_names[3] = "version"; ptrs[3] = u.version; - field_names[4] = "machine"; ptrs[4] = u.machine; - - for (i = 0; i < 5; i++) - { - field_types[i] = SLANG_STRING_TYPE; - field_values[i] = (VOID_STAR) &ptrs[i]; - } - - if (0 == SLstruct_create_struct (5, field_names, field_types, field_values)) - return; -#endif - - SLang_push_null (); -} - -static void uninitialize_ref_intrin (SLang_Ref_Type *ref) -{ - (void) _SLang_uninitialize_ref (ref); -} - -static SLang_Intrin_Fun_Type SLang_Basic_Table [] = /*{{{*/ -{ - MAKE_INTRINSIC_1("__is_initialized", _SLang_is_ref_initialized, SLANG_INT_TYPE, SLANG_REF_TYPE), - MAKE_INTRINSIC_S("__get_reference", intrin_get_reference, SLANG_VOID_TYPE), - MAKE_INTRINSIC_1("__uninitialize", uninitialize_ref_intrin, SLANG_VOID_TYPE, SLANG_REF_TYPE), - MAKE_INTRINSIC_SS("get_doc_string_from_file", get_doc_string, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SS("autoload", SLang_autoload, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("is_defined", SLang_is_defined, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("string", _SLstring_intrinsic, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("uname", uname_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("getenv", intrin_getenv_cmd, SLANG_VOID_TYPE), -#ifdef HAVE_PUTENV - MAKE_INTRINSIC_0("putenv", intrin_putenv, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_S("evalfile", load_file, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("char", char_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("eval", SLang_load_string, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("dup", do_dup, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("integer", intrin_integer, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("system", SLsystem, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("_apropos", intrin_apropos, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("_trace_function", _SLang_trace_fun, SLANG_VOID_TYPE), -#if SLANG_HAS_FLOAT - MAKE_INTRINSIC_S("atof", _SLang_atof, SLANG_DOUBLE_TYPE), - MAKE_INTRINSIC_0("double", intrin_double, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_0("int", intrin_int, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("typecast", intrin_typecast, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_stkdepth", _SLstack_depth, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("_stk_reverse", intrin_reverse_stack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("typeof", intrin_type_info, VOID_TYPE), - MAKE_INTRINSIC_0("_typeof", intrin_type_info1, VOID_TYPE), - MAKE_INTRINSIC_I("_pop_n", intrin_pop_n, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_print_stack", lang_print_stack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_I("_stk_roll", intrin_roll_stack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SI("byte_compile_file", byte_compile_file, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_clear_error", _SLang_clear_error, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_function_name", intrin_function_name, SLANG_STRING_TYPE), -#if SLANG_HAS_FLOAT - MAKE_INTRINSIC_S("set_float_format", _SLset_double_format, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_S("_slang_guess_type", guess_type, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("error", intrin_error, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("message", intrin_message, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("__get_defined_symbols", intrin_get_defines, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("__pop_args", _SLstruct_pop_args, SLANG_VOID_TYPE), - MAKE_INTRINSIC_1("__push_args", _SLstruct_push_args, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE), - MAKE_INTRINSIC_0("usage", usage, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("implements", _SLang_implements_intrinsic, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("use_namespace", _SLang_use_namespace_intrinsic, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("current_namespace", _SLang_cur_namespace_intrinsic, SLANG_STRING_TYPE), - MAKE_INTRINSIC_0("length", length_cmd, SLANG_INT_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -/*}}}*/ - -#ifdef SLANG_DOC_DIR -char *SLang_Doc_Dir = SLANG_DOC_DIR; -#else -char *SLang_Doc_Dir = ""; -#endif - -static SLang_Intrin_Var_Type Intrin_Vars[] = -{ - MAKE_VARIABLE("_debug_info", &_SLang_Compile_Line_Num_Info, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_auto_declare", &_SLang_Auto_Declare_Globals, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_traceback", &SLang_Traceback, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_slangtrace", &_SLang_Trace, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_slang_version", &SLang_Version, SLANG_INT_TYPE, 1), - MAKE_VARIABLE("_slang_version_string", &SLang_Version_String, SLANG_STRING_TYPE, 1), - MAKE_VARIABLE("_NARGS", &SLang_Num_Function_Args, SLANG_INT_TYPE, 1), - MAKE_VARIABLE("_slang_doc_dir", &SLang_Doc_Dir, SLANG_STRING_TYPE, 1), - MAKE_VARIABLE("NULL", NULL, SLANG_NULL_TYPE, 1), - SLANG_END_INTRIN_VAR_TABLE -}; - -int SLang_init_slang (void) /*{{{*/ -{ - char name[3]; - unsigned int i; - char **s; - static char *sys_defines [] = - { -#if defined(__os2__) - "OS2", -#endif -#if defined(__MSDOS__) - "MSDOS", -#endif -#if defined(__WIN16__) - "WIN16", -#endif -#if defined (__WIN32__) - "WIN32", -#endif -#if defined(__NT__) - "NT", -#endif -#if defined (VMS) - "VMS", -#endif -#ifdef REAL_UNIX_SYSTEM - "UNIX", -#endif -#if SLANG_HAS_FLOAT - "SLANG_DOUBLE_TYPE", -#endif - NULL - }; - - if (-1 == _SLregister_types ()) return -1; - - if ((-1 == SLadd_intrin_fun_table(SLang_Basic_Table, NULL)) - || (-1 == SLadd_intrin_var_table (Intrin_Vars, NULL)) - || (-1 == _SLang_init_slstrops ()) - || (-1 == _SLang_init_sltime ()) - || (-1 == _SLstruct_init ()) -#if SLANG_HAS_COMPLEX - || (-1 == _SLinit_slcomplex ()) -#endif -#if SLANG_HAS_ASSOC_ARRAYS - || (-1 == SLang_init_slassoc ()) -#endif - ) - return -1; - - SLadd_global_variable (SLANG_SYSTEM_NAME); - - s = sys_defines; - while (*s != NULL) - { - if (-1 == SLdefine_for_ifdef (*s)) return -1; - s++; - } - - /* give temp global variables $0 --> $9 */ - name[2] = 0; name[0] = '$'; - for (i = 0; i < 10; i++) - { - name[1] = (char) (i + '0'); - SLadd_global_variable (name); - } - - SLang_init_case_tables (); - - /* Now add a couple of macros */ - SLang_load_string (".(_NARGS 1 - Sprintf error)verror"); - SLang_load_string (".(_NARGS 1 - Sprintf message)vmessage"); - - if (SLang_Error) - return -1; - - return 0; -} - -/*}}}*/ - -int SLang_set_argc_argv (int argc, char **argv) -{ - static int this_argc; - static char **this_argv; - int i; - - if (argc < 0) argc = 0; - this_argc = argc; - - if (NULL == (this_argv = (char **) SLmalloc ((argc + 1) * sizeof (char *)))) - return -1; - memset ((char *) this_argv, 0, sizeof (char *) * (argc + 1)); - - for (i = 0; i < argc; i++) - { - if (NULL == (this_argv[i] = SLang_create_slstring (argv[i]))) - goto return_error; - } - - if (-1 == SLadd_intrinsic_variable ("__argc", (VOID_STAR)&this_argc, - SLANG_INT_TYPE, 1)) - goto return_error; - - if (-1 == SLang_add_intrinsic_array ("__argv", SLANG_STRING_TYPE, 1, - (VOID_STAR) this_argv, 1, argc)) - goto return_error; - - return 0; - - return_error: - for (i = 0; i < argc; i++) - SLang_free_slstring (this_argv[i]); /* NULL ok */ - SLfree ((char *) this_argv); - - return -1; -} |