diff options
Diffstat (limited to 'mdk-stage1/slang/slstdio.c')
-rw-r--r-- | mdk-stage1/slang/slstdio.c | 1050 |
1 files changed, 0 insertions, 1050 deletions
diff --git a/mdk-stage1/slang/slstdio.c b/mdk-stage1/slang/slstdio.c deleted file mode 100644 index 05db1af77..000000000 --- a/mdk-stage1/slang/slstdio.c +++ /dev/null @@ -1,1050 +0,0 @@ -/* file stdio intrinsics for S-Lang */ -/* 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" - -#if defined(__unix__) || (defined (__os2__) && defined (__EMX__)) -# include <sys/types.h> -#endif - -#ifdef HAVE_FCNTL_H -# include <fcntl.h> -#endif -#ifdef HAVE_SYS_FCNTL_H -# include <sys/fcntl.h> -#endif - -#ifdef __unix__ -# include <sys/file.h> -#endif - -#if defined(__BORLANDC__) -# include <io.h> -# include <dir.h> -#endif - -#if defined(__DECC) && defined(VMS) -# include <unixio.h> -# include <unixlib.h> -#endif - -#ifdef VMS -# include <stat.h> -#else -# include <sys/stat.h> -#endif - -#include <errno.h> - -#define SL_APP_WANTS_FOREACH -#include "slang.h" -#include "_slang.h" - -typedef struct -{ - FILE *fp; /* kind of obvious */ - char *file; /* file name associated with pointer */ - - unsigned int flags; /* modes, etc... */ -#define SL_READ 0x0001 -#define SL_WRITE 0x0002 -#define SL_BINARY 0x0004 -#define SL_FDOPEN 0x2000 -#define SL_PIPE 0x4000 -#define SL_INUSE 0x8000 -} -SL_File_Table_Type; - -static SL_File_Table_Type *SL_File_Table; - -static SL_File_Table_Type *get_free_file_table_entry (void) -{ - SL_File_Table_Type *t = SL_File_Table, *tmax; - - tmax = t + SL_MAX_FILES; - while (t < tmax) - { - if (t->flags == 0) - { - memset ((char *) t, 0, sizeof (SL_File_Table_Type)); - return t; - } - t++; - } - - return NULL; -} - -static unsigned int file_process_flags (char *mode) -{ - char ch; - unsigned int flags = 0; - - while (1) - { - ch = *mode++; - switch (ch) - { - case 'r': flags |= SL_READ; - break; - case 'w': - case 'a': - case 'A': - flags |= SL_WRITE; - break; - case '+': flags |= SL_WRITE | SL_READ; - break; - case 'b': flags |= SL_BINARY; - break; - case 0: - return flags; - - default: - SLang_verror (SL_INVALID_PARM, "File flag %c is not supported", ch); - return 0; - } - } -} - -static int open_file_type (char *file, int fd, char *mode, - FILE *(*open_fun)(char *, char *), - int (*close_fun)(FILE *), - unsigned int xflags) -{ - FILE *fp; - SL_File_Table_Type *t; - unsigned int flags; - SLang_MMT_Type *mmt; - - fp = NULL; - t = NULL; - mmt = NULL; - - if ((NULL == (t = get_free_file_table_entry ())) - || (0 == (flags = file_process_flags(mode)))) - goto return_error; - - if (fd != -1) - fp = fdopen (fd, mode); - else - fp = open_fun (file, mode); - - if (fp == NULL) - { - _SLerrno_errno = errno; - goto return_error; - } - - if (NULL == (mmt = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) t))) - goto return_error; - - t->fp = fp; - t->flags = flags | xflags; - fp = NULL; /* allow free_mmt to close fp */ - - if ((NULL != (t->file = SLang_create_slstring (file))) - && (0 == SLang_push_mmt (mmt))) - return 0; - - /* drop */ - - return_error: - if (fp != NULL) (*close_fun) (fp); - if (mmt != NULL) SLang_free_mmt (mmt); - (void) SLang_push_null (); - return -1; -} - -/* Since some compilers do not have popen/pclose prototyped and in scope, - * and pc compilers sometimes have silly prototypes involving PASCAL, etc. - * use wrappers around the function to avoid compilation errors. - */ - -static FILE *fopen_fun (char *f, char *m) -{ - return fopen (f, m); -} -static int fclose_fun (FILE *fp) -{ - return fclose (fp); -} - -static void stdio_fopen (char *file, char *mode) -{ - (void) open_file_type (file, -1, mode, fopen_fun, fclose_fun, 0); -} - -int _SLstdio_fdopen (char *file, int fd, char *mode) -{ - if (fd == -1) - { - _SLerrno_errno = EBADF; - (void) SLang_push_null (); - return -1; - } - - return open_file_type (file, fd, mode, NULL, fclose_fun, SL_FDOPEN); -} - -#ifdef HAVE_POPEN -static int pclose_fun (FILE *fp) -{ - return pclose (fp); -} - -static FILE *popen_fun (char *file, char *mode) -{ - return popen (file, mode); -} - -static void stdio_popen (char *file, char *mode) -{ - (void) open_file_type (file, -1, mode, popen_fun, pclose_fun, SL_PIPE); -} -#endif - -/* returns pointer to file entry if it is open and consistent with - flags. Returns NULL otherwise */ -static SLang_MMT_Type *pop_fp (unsigned int flags, FILE **fp_ptr) -{ - SL_File_Table_Type *t; - SLang_MMT_Type *mmt; - - *fp_ptr = NULL; - - if (NULL == (mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE))) - return NULL; - - t = (SL_File_Table_Type *) SLang_object_from_mmt (mmt); - if ((t->flags & flags) - && (NULL != (*fp_ptr = t->fp))) - return mmt; - - SLang_free_mmt (mmt); - return NULL; -} - -static FILE *check_fp (SL_File_Table_Type *t, unsigned flags) -{ - if ((t != NULL) && (t->flags & flags)) - return t->fp; - - return NULL; -} - -char *SLang_get_name_from_fileptr (SLang_MMT_Type *mmt) -{ - SL_File_Table_Type *ft; - - ft = (SL_File_Table_Type *) SLang_object_from_mmt (mmt); - if (ft == NULL) - return NULL; - return ft->file; -} - -int SLang_pop_fileptr (SLang_MMT_Type **mmt, FILE **fp) -{ - if (NULL == (*mmt = pop_fp (0xFFFF, fp))) - { -#ifdef EBADF - _SLerrno_errno = EBADF; -#endif - return -1; - } - - return 0; -} - -static int close_file_type (SL_File_Table_Type *t) -{ - int ret = 0; - FILE *fp; - - if (t == NULL) - return -1; - - fp = t->fp; - - if (NULL == fp) ret = -1; - else - { - if (0 == (t->flags & SL_PIPE)) - { - if (EOF == (ret = fclose (fp))) - _SLerrno_errno = errno; - } -#ifdef HAVE_POPEN - else - { - if (-1 == (ret = pclose (fp))) - _SLerrno_errno = errno; - } -#endif - } - - if (t->file != NULL) SLang_free_slstring (t->file); - memset ((char *) t, 0, sizeof (SL_File_Table_Type)); - return ret; -} - -static int stdio_fclose (SL_File_Table_Type *t) -{ - int ret; - - if (NULL == check_fp (t, 0xFFFF)) - return -1; - - ret = close_file_type (t); - - t->flags = SL_INUSE; - return ret; -} - -static int read_one_line (FILE *fp, char **strp, unsigned int *lenp) -{ - char buf[512]; - char *str; - unsigned int len; - - *strp = NULL; - len = 0; - str = NULL; - - while (NULL != fgets (buf, sizeof (buf), fp)) - { - unsigned int dlen; - char *new_str; - int done_flag; - - dlen = strlen (buf); - /* Note: If the file contains embedded \0 characters, then this - * fails to work properly since dlen will not be correct. - */ - done_flag = ((dlen + 1 < sizeof (buf)) - || (buf[dlen - 1] == '\n')); - - if (done_flag && (str == NULL)) - { - /* Avoid the malloc */ - str = buf; - len = dlen; - break; - } - - if (NULL == (new_str = SLrealloc (str, len + dlen + 1))) - { - SLfree (str); - return -1; - } - - str = new_str; - strcpy (str + len, buf); - len += dlen; - - if (done_flag) break; - } - - if (str == NULL) - return 0; - - *strp = SLang_create_nslstring (str, len); - if (str != buf) SLfree (str); - - if (*strp == NULL) return -1; - - *lenp = len; - return 1; -} - -/* returns number of characters read and pushes the string to the stack. - If it fails, it returns -1 */ -static int stdio_fgets (SLang_Ref_Type *ref, SL_File_Table_Type *t) -{ - char *s; - unsigned int len; - FILE *fp; - int status; - - if (NULL == (fp = check_fp (t, SL_READ))) - return -1; - - status = read_one_line (fp, &s, &len); - if (status <= 0) - return -1; - - status = SLang_assign_to_ref (ref, SLANG_STRING_TYPE, (VOID_STAR)&s); - SLang_free_slstring (s); - - if (status == -1) - return -1; - - return (int) len; -} - -static void stdio_fgetslines_internal (FILE *fp, unsigned int n) -{ - unsigned int num_lines, max_num_lines; - char **list; - SLang_Array_Type *at; - int inum_lines; - - if (n > 1024) - max_num_lines = 1024; - else - { - max_num_lines = n; - if (max_num_lines == 0) - max_num_lines++; - } - - list = (char **) SLmalloc (sizeof (char *) * max_num_lines); - if (list == NULL) - return; - - num_lines = 0; - while (num_lines < n) - { - int status; - char *line; - unsigned int len; - - status = read_one_line (fp, &line, &len); - if (status == -1) - goto return_error; - - if (status == 0) - break; - - if (max_num_lines == num_lines) - { - char **new_list; - - if (max_num_lines + 4096 > n) - max_num_lines = n; - else - max_num_lines += 4096; - - new_list = (char **) SLrealloc ((char *)list, sizeof (char *) * max_num_lines); - if (new_list == NULL) - { - SLang_free_slstring (line); - goto return_error; - } - list = new_list; - } - - list[num_lines] = line; - num_lines++; - } - - if (num_lines != max_num_lines) - { - char **new_list; - - new_list = (char **)SLrealloc ((char *)list, sizeof (char *) * (num_lines + 1)); - if (new_list == NULL) - goto return_error; - - list = new_list; - } - - inum_lines = (int) num_lines; - if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &inum_lines, 1))) - goto return_error; - - if (-1 == SLang_push_array (at, 1)) - SLang_push_null (); - return; - - return_error: - while (num_lines > 0) - { - num_lines--; - SLfree (list[num_lines]); - } - SLfree ((char *)list); - SLang_push_null (); -} - -static void stdio_fgetslines (void) -{ - unsigned int n; - FILE *fp; - SLang_MMT_Type *mmt; - - n = (unsigned int)-1; - - if (SLang_Num_Function_Args == 2) - { - if (-1 == SLang_pop_uinteger (&n)) - return; - } - - if (NULL == (mmt = pop_fp (SL_READ, &fp))) - { - SLang_push_null (); - return; - } - - stdio_fgetslines_internal (fp, n); - SLang_free_mmt (mmt); -} - - -static int stdio_fputs (char *s, SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, SL_WRITE))) - return -1; - - if (EOF == fputs(s, fp)) return -1; - return (int) strlen (s); -} - -static int stdio_fflush (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, SL_WRITE))) - return -1; - - if (EOF == fflush (fp)) - { - _SLerrno_errno = errno; - return -1; - } - - return 0; -} - -/* Usage: n = fread (&str, data-type, nelems, fp); */ -static void stdio_fread (SLang_Ref_Type *ref, int *data_typep, unsigned int *num_elemns, SL_File_Table_Type *t) -{ - char *s; - FILE *fp; - int ret; - unsigned int num_read, num_to_read; - unsigned int nbytes; - SLang_Class_Type *cl; - unsigned int sizeof_type; - int data_type; - - ret = -1; - s = NULL; - cl = NULL; - - if (NULL == (fp = check_fp (t, SL_READ))) - goto the_return; - - /* FIXME: priority = low : I should add some mechanism to support - * other types. - */ - data_type = *data_typep; - - cl = _SLclass_get_class ((unsigned char) data_type); - - if (cl->cl_fread == NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "fread does not support %s objects", - cl->cl_name); - goto the_return; - } - - sizeof_type = cl->cl_sizeof_type; - - num_to_read = *num_elemns; - nbytes = (unsigned int) num_to_read * sizeof_type; - - s = SLmalloc (nbytes + 1); - if (s == NULL) - goto the_return; - - ret = cl->cl_fread (data_type, fp, (VOID_STAR)s, num_to_read, &num_read); - - if ((num_read == 0) - && (num_read != num_to_read)) - ret = -1; - - if ((ret == -1) && ferror (fp)) - _SLerrno_errno = errno; - - if ((ret == 0) - && (num_read != num_to_read)) - { - char *new_s; - - nbytes = num_read * sizeof_type; - new_s = SLrealloc (s, nbytes + 1); - if (new_s == NULL) - ret = -1; - else - s = new_s; - } - - if (ret == 0) - { - if (num_read == 1) - { - ret = SLang_assign_to_ref (ref, data_type, (VOID_STAR)s); - SLfree (s); - } - else if ((data_type == SLANG_CHAR_TYPE) - || (data_type == SLANG_UCHAR_TYPE)) - { - SLang_BString_Type *bs; - - bs = SLbstring_create_malloced ((unsigned char *)s, num_read, 1); - ret = SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&bs); - SLbstring_free (bs); - } - else - { - SLang_Array_Type *at; - int inum_read = (int) num_read; - at = SLang_create_array (data_type, 0, (VOID_STAR)s, &inum_read, 1); - ret = SLang_assign_to_ref (ref, SLANG_ARRAY_TYPE, (VOID_STAR)&at); - SLang_free_array (at); - } - s = NULL; - } - - the_return: - - if (s != NULL) - SLfree (s); - - if (ret == -1) - SLang_push_integer (ret); - else - SLang_push_uinteger (num_read); -} - -/* Usage: n = fwrite (str, fp); */ -static void stdio_fwrite (SL_File_Table_Type *t) -{ - FILE *fp; - unsigned char *s; - unsigned int num_to_write, num_write; - int ret; - SLang_BString_Type *b; - SLang_Array_Type *at; - SLang_Class_Type *cl; - - ret = -1; - b = NULL; - at = NULL; - - switch (SLang_peek_at_stack ()) - { - case SLANG_BSTRING_TYPE: - case SLANG_STRING_TYPE: - if (-1 == SLang_pop_bstring (&b)) - goto the_return; - - if (NULL == (s = SLbstring_get_pointer (b, &num_to_write))) - goto the_return; - - cl = _SLclass_get_class (SLANG_UCHAR_TYPE); - break; - - default: - if (-1 == SLang_pop_array (&at, 1)) - goto the_return; - - cl = at->cl; - num_to_write = at->num_elements; - s = (unsigned char *) at->data; - } - - if (NULL == (fp = check_fp (t, SL_WRITE))) - goto the_return; - - if (cl->cl_fwrite == NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "fwrite does not support %s objects", cl->cl_name); - goto the_return; - } - - ret = cl->cl_fwrite (cl->cl_data_type, fp, s, num_to_write, &num_write); - - if ((ret == -1) && ferror (fp)) - _SLerrno_errno = errno; - - /* drop */ - the_return: - if (b != NULL) - SLbstring_free (b); - if (at != NULL) - SLang_free_array (at); - - if (ret == -1) - SLang_push_integer (ret); - else - SLang_push_uinteger (num_write); -} - -static int stdio_fseek (SL_File_Table_Type *t, int *ofs, int *whence) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - if (-1 == fseek (fp, (long) *ofs, *whence)) - { - _SLerrno_errno = errno; - return -1; - } - - return 0; -} - -static int stdio_ftell (SL_File_Table_Type *t) -{ - FILE *fp; - long ofs; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - if (-1L == (ofs = ftell (fp))) - { - _SLerrno_errno = errno; - return -1; - } - - return (int) ofs; -} - -static int stdio_feof (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - return feof (fp); -} - -static int stdio_ferror (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - return ferror (fp); -} - -static void stdio_clearerr (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL != (fp = check_fp (t, 0xFFFF))) - clearerr (fp); -} - -/* () = fprintf (fp, "FORMAT", arg...); */ -static int stdio_fprintf (void) -{ - char *s; - FILE *fp; - SLang_MMT_Type *mmt; - int status; - - if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 2)) - return -1; - - if (-1 == SLang_pop_slstring (&s)) - return -1; - - if (NULL == (mmt = pop_fp (SL_WRITE, &fp))) - { - SLang_free_slstring (s); - return -1; - } - - if (EOF == fputs(s, fp)) - status = -1; - else - status = (int) strlen (s); - - SLang_free_mmt (mmt); - SLang_free_slstring (s); - return status; -} - -static int stdio_printf (void) -{ - char *s; - int status; - - if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1)) - return -1; - - if (-1 == SLang_pop_slstring (&s)) - return -1; - - if (EOF == fputs(s, stdout)) - status = -1; - else - status = (int) strlen (s); - - SLang_free_slstring (s); - return status; -} - - -#define F SLANG_FILE_PTR_TYPE -#define R SLANG_REF_TYPE -#define I SLANG_INT_TYPE -#define V SLANG_VOID_TYPE -#define S SLANG_STRING_TYPE -#define B SLANG_BSTRING_TYPE -#define U SLANG_UINT_TYPE -#define D SLANG_DATATYPE_TYPE -static SLang_Intrin_Fun_Type Stdio_Name_Table[] = -{ - MAKE_INTRINSIC_0("fgetslines", stdio_fgetslines, V), - MAKE_INTRINSIC_SS("fopen", stdio_fopen, V), - MAKE_INTRINSIC_1("feof", stdio_feof, I, F), - MAKE_INTRINSIC_1("ferror", stdio_ferror, I, F), - MAKE_INTRINSIC_1("fclose", stdio_fclose, I, F), - MAKE_INTRINSIC_2("fgets", stdio_fgets, I, R, F), - MAKE_INTRINSIC_1("fflush", stdio_fflush, I, F), - MAKE_INTRINSIC_2("fputs", stdio_fputs, I, S, F), - MAKE_INTRINSIC_0("fprintf", stdio_fprintf, I), - MAKE_INTRINSIC_0("printf", stdio_printf, I), - MAKE_INTRINSIC_3("fseek", stdio_fseek, I, F, I, I), - MAKE_INTRINSIC_1("ftell", stdio_ftell, I, F), - MAKE_INTRINSIC_1("clearerr", stdio_clearerr, V, F), - MAKE_INTRINSIC_4("fread", stdio_fread, V, R, D, U, F), - MAKE_INTRINSIC_1("fwrite", stdio_fwrite, V, F), -#ifdef HAVE_POPEN - MAKE_INTRINSIC_SS("popen", stdio_popen, V), - MAKE_INTRINSIC_1("pclose", stdio_fclose, I, F), -#endif - SLANG_END_INTRIN_FUN_TABLE -}; -#undef F -#undef I -#undef R -#undef V -#undef S -#undef B -#undef U -#undef D - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -# define SEEK_CUR 1 -#endif -#ifndef SEEK_END -# define SEEK_END 2 -#endif - -static SLang_IConstant_Type Stdio_Consts [] = -{ - MAKE_ICONSTANT("SEEK_SET", SEEK_SET), - MAKE_ICONSTANT("SEEK_END", SEEK_END), - MAKE_ICONSTANT("SEEK_CUR", SEEK_CUR), - SLANG_END_ICONST_TABLE -}; - -static void destroy_file_type (unsigned char type, VOID_STAR ptr) -{ - (void) type; - (void) close_file_type ((SL_File_Table_Type *) ptr); -} - - -struct _SLang_Foreach_Context_Type -{ - SLang_MMT_Type *mmt; - FILE *fp; -#define CTX_USE_LINE 1 -#define CTX_USE_CHAR 2 - unsigned char type; -}; - - -static SLang_Foreach_Context_Type * -cl_foreach_open (unsigned char type, unsigned int num) -{ - SLang_Foreach_Context_Type *c; - SLang_MMT_Type *mmt; - FILE *fp; - - if (NULL == (mmt = pop_fp (SL_READ, &fp))) - return NULL; - - type = CTX_USE_LINE; - - switch (num) - { - char *s; - - case 0: - type = CTX_USE_LINE; - break; - - case 1: - if (-1 == SLang_pop_slstring (&s)) - { - SLang_free_mmt (mmt); - return NULL; - } - if (0 == strcmp (s, "char")) - type = CTX_USE_CHAR; - else if (0 == strcmp (s, "line")) - type = CTX_USE_LINE; - else - { - SLang_verror (SL_NOT_IMPLEMENTED, - "using '%s' not supported by File_Type", - s); - SLang_free_slstring (s); - SLang_free_mmt (mmt); - return NULL; - } - SLang_free_slstring (s); - break; - - default: - SLdo_pop_n (num); - SLang_verror (SL_NOT_IMPLEMENTED, - "Usage: foreach (File_Type) using ([line|char])"); - SLang_free_mmt (mmt); - return NULL; - } - - if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type)))) - { - SLang_free_mmt (mmt); - return NULL; - } - memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type)); - - c->type = type; - c->mmt = mmt; - c->fp = fp; - - return c; -} - -static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - if (c == NULL) return; - SLang_free_mmt (c->mmt); - SLfree ((char *) c); -} - -static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - int status; - int ch; - unsigned int len; - char *s; - - (void) type; - - if (c == NULL) - return -1; - - switch (c->type) - { - case CTX_USE_CHAR: - if (EOF == (ch = getc (c->fp))) - return 0; - if (-1 == SLang_push_uchar ((unsigned char) ch)) - return -1; - return 1; - - case CTX_USE_LINE: - status = read_one_line (c->fp, &s, &len); - if (status <= 0) - return status; - if (0 == _SLang_push_slstring (s)) - return 1; - return -1; - } - - return -1; -} - -static int Stdio_Initialized; -static SLang_MMT_Type *Stdio_Mmts[3]; - -int SLang_init_stdio (void) -{ - unsigned int i; - SL_File_Table_Type *s; - SLang_Class_Type *cl; - char *names[3]; - - if (Stdio_Initialized) - return 0; - - SL_File_Table = (SL_File_Table_Type *)SLcalloc(sizeof (SL_File_Table_Type), SL_MAX_FILES); - if (SL_File_Table == NULL) - return -1; - - if (NULL == (cl = SLclass_allocate_class ("File_Type"))) - return -1; - cl->cl_destroy = destroy_file_type; - cl->cl_foreach_open = cl_foreach_open; - cl->cl_foreach_close = cl_foreach_close; - cl->cl_foreach = cl_foreach; - - - if (-1 == SLclass_register_class (cl, SLANG_FILE_PTR_TYPE, sizeof (SL_File_Table_Type), SLANG_CLASS_TYPE_MMT)) - return -1; - - if ((-1 == SLadd_intrin_fun_table(Stdio_Name_Table, "__STDIO__")) - || (-1 == SLadd_iconstant_table (Stdio_Consts, NULL)) - || (-1 == _SLerrno_init ())) - return -1; - - names[0] = "stdin"; - names[1] = "stdout"; - names[2] = "stderr"; - - s = SL_File_Table; - s->fp = stdin; s->flags = SL_READ; - - s++; - s->fp = stdout; s->flags = SL_WRITE; - - s++; - s->fp = stderr; s->flags = SL_WRITE|SL_READ; - - s = SL_File_Table; - for (i = 0; i < 3; i++) - { - if (NULL == (s->file = SLang_create_slstring (names[i]))) - return -1; - - if (NULL == (Stdio_Mmts[i] = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) s))) - return -1; - SLang_inc_mmt (Stdio_Mmts[i]); - - if (-1 == SLadd_intrinsic_variable (s->file, (VOID_STAR)&Stdio_Mmts[i], SLANG_FILE_PTR_TYPE, 1)) - return -1; - s++; - } - - Stdio_Initialized = 1; - return 0; -} - |