static void uname_cmd (void) { #ifdef HAVE_UNAME struct utsname u; SLFUTURE_CONST char *field_names [6]; SLtype 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 int push_select_struct (int num, SLang_Array_Type *at_read, SLang_Array_Type *at_write, SLang_Array_Type *at_except, fd_set *readfs, fd_set *writefds, fd_set *exceptfds) { SLFUTURE_CONST char *field_names [4]; SLtype field_types[4]; VOID_STAR field_values [4]; SLang_Array_Type *iread, *iwrite, *iexcept; int status; iread = iwrite = iexcept = NULL; field_names[0] = "nready"; field_names[1] = "iread"; field_names[2] = "iwrite"; field_names[3] = "iexcept"; field_types[0] = SLANG_INT_TYPE; field_types[1] = SLANG_ARRAY_TYPE; field_types[2] = SLANG_ARRAY_TYPE; field_types[3] = SLANG_ARRAY_TYPE; field_values[0] = # if ((NULL == (iread = do_fdisset (num, at_read, readfs))) || (NULL == (iwrite = do_fdisset (num, at_write, writefds))) || (NULL == (iexcept = do_fdisset (num, at_except, exceptfds)))) { SLang_free_array (iread); SLang_free_array (iwrite); return -1; } field_values[1] = &iread; field_values[2] = &iwrite; field_values[3] = &iexcept; /* Note: This function call pushes the struct and frees it upon error. */ status = SLstruct_create_struct (4, field_names, field_types, field_values); SLang_free_array (iexcept); SLang_free_array (iwrite); SLang_free_array (iread); return status; }
static void get_exception_info_intrinsic (void) { #define NUM_EXCEPT_FIELDS 8 static SLFUTURE_CONST char *field_names[NUM_EXCEPT_FIELDS] = { "error", "descr", "file", "line", "function", "object", "message", "traceback" }; SLtype field_types[NUM_EXCEPT_FIELDS]; VOID_STAR field_values[NUM_EXCEPT_FIELDS]; int err; SLCONST char *desc; SLCONST char *file; SLCONST char *function; SLCONST char *errmsg; SLCONST char *tbmsg; int linenum; err = _pSLerr_get_last_error (); if (err == 0) { (void) SLang_push_null (); return; } desc = SLerr_strerror (err); (void) _pSLerr_get_last_error_line_info (&file, &linenum, &function); field_types[0] = SLANG_INT_TYPE; field_values[0] = (VOID_STAR) &err; field_types[1] = SLANG_STRING_TYPE; field_values[1] = (VOID_STAR) &desc; field_types[2] = SLANG_STRING_TYPE; field_values[2] = (VOID_STAR) &file; field_types[3] = SLANG_INT_TYPE; field_values[3] = (VOID_STAR) &linenum; field_types[4] = SLANG_STRING_TYPE; field_values[4] = (VOID_STAR) &function; if ((Error_Context == NULL) || (Error_Context->object_was_thrown == 0)) { char *null = NULL; field_types[5] = SLANG_NULL_TYPE; field_values[5] = (VOID_STAR) &null; } else { SLtype data_type = Error_Context->object_thrown.o_data_type; field_types[5] = data_type; field_values[5] = _pSLclass_get_ptr_to_value (_pSLclass_get_class (data_type), &Error_Context->object_thrown); } errmsg = get_error_msg_from_queue (_SLERR_MSG_ERROR); if ((errmsg == NULL) || (*errmsg == 0)) errmsg = desc; field_types[6] = SLANG_STRING_TYPE; field_values[6] = (VOID_STAR) &errmsg; tbmsg = get_error_msg_from_queue (_SLERR_MSG_TRACEBACK); field_types[7] = (tbmsg == NULL) ? SLANG_NULL_TYPE : SLANG_STRING_TYPE; field_values[7] = (VOID_STAR) &tbmsg; (void) SLstruct_create_struct (NUM_EXCEPT_FIELDS, field_names, field_types, field_values); if (errmsg != desc) SLang_free_slstring ((char *) errmsg); SLang_free_slstring ((char *)tbmsg); }
static void get_frame_info (int *depth) { #define NUM_INFO_FIELDS 5 static SLFUTURE_CONST char *field_names[NUM_INFO_FIELDS] = { "file", "line", "function", "locals", "namespace" }; SLtype field_types[NUM_INFO_FIELDS]; VOID_STAR field_values[NUM_INFO_FIELDS]; SLang_Array_Type *at = NULL; _pSLang_Frame_Info_Type f; unsigned int i; if (-1 == _pSLang_get_frame_fun_info ((unsigned int)*depth, &f)) return; i = 0; field_values[i] = (VOID_STAR) &f.file; if (f.file == NULL) field_types[i] = SLANG_NULL_TYPE; else field_types[i] = SLANG_STRING_TYPE; i++; field_values[i] = &f.line; field_types[i] = SLANG_UINT_TYPE; i++; field_values[i] = (VOID_STAR) &f.function; if (f.function == NULL) field_types[i] = SLANG_NULL_TYPE; else field_types[i] = SLANG_STRING_TYPE; i++; if (f.locals == NULL) { field_types[i] = SLANG_NULL_TYPE; field_values[i] = (VOID_STAR) &f.locals; } else { if (NULL == (at = _pSLstrings_to_array (f.locals, f.nlocals))) return; field_values[i] = &at; field_types[i] = SLANG_ARRAY_TYPE; } i++; field_values[i] = (VOID_STAR) &f.ns; if (f.ns == NULL) field_types[i] = SLANG_NULL_TYPE; else field_types[i] = SLANG_STRING_TYPE; i++; (void) SLstruct_create_struct (NUM_INFO_FIELDS, field_names, field_types, field_values); if (at != NULL) SLang_free_array (at); }