diff options
Diffstat (limited to 'mdk-stage1/slang/slposio.c')
-rw-r--r-- | mdk-stage1/slang/slposio.c | 568 |
1 files changed, 0 insertions, 568 deletions
diff --git a/mdk-stage1/slang/slposio.c b/mdk-stage1/slang/slposio.c deleted file mode 100644 index ab1e9f689..000000000 --- a/mdk-stage1/slang/slposio.c +++ /dev/null @@ -1,568 +0,0 @@ -/* This module implements an interface to posix system calls */ -/* 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 - -#ifdef HAVE_IO_H -# include <io.h> -#endif - -#if defined(__BORLANDC__) -# 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> - -#include "slang.h" -#include "_slang.h" - -struct _SLFile_FD_Type -{ - char *name; - unsigned int num_refs; /* reference counting */ - int fd; - SLang_MMT_Type *stdio_mmt; /* fdopen'd stdio object */ - - /* methods */ - int (*close)(int); - int (*read) (int, char *, unsigned int *); - int (*write)(int, char *, unsigned int *); -}; - -static int close_method (int fd) -{ - return close (fd); -} - -static int write_method (int fd, char *buf, unsigned int *nump) -{ - int num; - - if (-1 == (num = write (fd, buf, *nump))) - { - *nump = 0; - return -1; - } - - *nump = (unsigned int) num; - return 0; -} - -static int read_method (int fd, char *buf, unsigned int *nump) -{ - int num; - - num = read (fd, buf, *nump); - if (num == -1) - { - *nump = 0; - return -1; - } - *nump = (unsigned int) num; - return 0; -} - -static int check_fd (int fd) -{ - if (fd == -1) - { -#ifdef EBADF - _SLerrno_errno = EBADF; -#endif - return -1; - } - - return 0; -} - -static int posix_close (SLFile_FD_Type *f) -{ - if (-1 == check_fd (f->fd)) - return -1; - - if ((f->close != NULL) - && (-1 == f->close (f->fd))) - { - _SLerrno_errno = errno; - return -1; - } - - if (f->stdio_mmt != NULL) - { - SLang_free_mmt (f->stdio_mmt); - f->stdio_mmt = NULL; - } - - f->fd = -1; - return 0; -} - -/* Usage: Uint write (f, buf); */ -static void posix_write (SLFile_FD_Type *f, SLang_BString_Type *bstr) -{ - unsigned int len; - char *p; - - if ((-1 == check_fd (f->fd)) - || (NULL == (p = (char *)SLbstring_get_pointer (bstr, &len)))) - { - SLang_push_integer (-1); - return; - } - - if (-1 == f->write (f->fd, p, &len)) - { - _SLerrno_errno = errno; - SLang_push_integer (-1); - return; - } - - (void) SLang_push_uinteger (len); -} - -/* Usage: nn = read (f, &buf, n); */ -static void posix_read (SLFile_FD_Type *f, SLang_Ref_Type *ref, unsigned int *nbytes) -{ - unsigned int len; - char *b; - SLang_BString_Type *bstr; - - b = NULL; - - len = *nbytes; - if ((-1 == check_fd (f->fd)) - || (NULL == (b = SLmalloc (len + 1)))) - goto return_error; - - if (-1 == f->read (f->fd, b, &len)) - { - _SLerrno_errno = errno; - goto return_error; - } - - if (len != *nbytes) - { - char *b1 = SLrealloc (b, len + 1); - if (b1 == NULL) - goto return_error; - b = b1; - } - - bstr = SLbstring_create_malloced ((unsigned char *) b, len, 0); - if (bstr != NULL) - { - if ((-1 != SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&bstr)) - && (-1 != SLang_push_uinteger (len))) - return; - - SLbstring_free (bstr); - b = NULL; - /* drop */ - } - - return_error: - if (b != NULL) SLfree ((char *)b); - (void) SLang_assign_to_ref (ref, SLANG_NULL_TYPE, NULL); - (void) SLang_push_integer (-1); -} - -SLFile_FD_Type *SLfile_create_fd (char *name, int fd) -{ - SLFile_FD_Type *f; - - if (NULL == (f = (SLFile_FD_Type *) SLmalloc (sizeof (SLFile_FD_Type)))) - return NULL; - - memset ((char *) f, 0, sizeof (SLFile_FD_Type)); - if (NULL == (f->name = SLang_create_slstring (name))) - { - SLfree ((char *)f); - return NULL; - } - - f->fd = fd; - f->num_refs = 1; - - f->close = close_method; - f->read = read_method; - f->write = write_method; - - return f; -} - -SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0) -{ - SLFile_FD_Type *f; - int fd0, fd; - - if (f0 == NULL) - return NULL; - fd0 = f0->fd; - if (-1 == check_fd (fd0)) - return NULL; - - while (-1 == (fd = dup (fd0))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - return NULL; - } - - if (NULL == (f = SLfile_create_fd (f0->name, fd))) - { - f0->close (fd); - return NULL; - } - - return f; -} - -int SLfile_get_fd (SLFile_FD_Type *f, int *fd) -{ - if (f == NULL) - return -1; - - *fd = f->fd; - if (-1 == check_fd (*fd)) - return -1; - - return 0; -} - -void SLfile_free_fd (SLFile_FD_Type *f) -{ - if (f == NULL) - return; - - if (f->num_refs > 1) - { - f->num_refs -= 1; - return; - } - - if (f->fd != -1) - { - if (f->close != NULL) - (void) f->close (f->fd); - - f->fd = -1; - } - - if (f->stdio_mmt != NULL) - SLang_free_mmt (f->stdio_mmt); - - SLfree ((char *) f); -} - -static int pop_string_int (char **s, int *i) -{ - *s = NULL; - if ((-1 == SLang_pop_integer (i)) - || (-1 == SLang_pop_slstring (s))) - return -1; - - return 0; -} - -static int pop_string_int_int (char **s, int *a, int *b) -{ - *s = NULL; - if ((-1 == SLang_pop_integer (b)) - || (-1 == pop_string_int (s, a))) - return -1; - - return 0; -} - -static void posix_open (void) -{ - char *file; - int mode, flags; - SLFile_FD_Type *f; - - switch (SLang_Num_Function_Args) - { - case 3: - if (-1 == pop_string_int_int (&file, &flags, &mode)) - { - SLang_push_null (); - return; - } - break; - - case 2: - default: - if (-1 == pop_string_int (&file, &flags)) - return; - mode = 0777; - break; - } - - f = SLfile_create_fd (file, -1); - if (f == NULL) - { - SLang_free_slstring (file); - SLang_push_null (); - return; - } - SLang_free_slstring (file); - - if (-1 == (f->fd = open (f->name, flags, mode))) - { - _SLerrno_errno = errno; - SLfile_free_fd (f); - SLang_push_null (); - return; - } - - if (-1 == SLfile_push_fd (f)) - SLang_push_null (); - SLfile_free_fd (f); -} - -static void posix_fileno (void) -{ - FILE *fp; - SLang_MMT_Type *mmt; - int fd; - SLFile_FD_Type *f; - char *name; - - if (-1 == SLang_pop_fileptr (&mmt, &fp)) - { - SLang_push_null (); - return; - } - name = SLang_get_name_from_fileptr (mmt); - fd = fileno (fp); - - f = SLfile_create_fd (name, fd); - if (f != NULL) - f->close = NULL; /* prevent fd from being closed - * when it goes out of scope - */ - SLang_free_mmt (mmt); - - if (-1 == SLfile_push_fd (f)) - SLang_push_null (); - SLfile_free_fd (f); -} - -static void posix_fdopen (SLFile_FD_Type *f, char *mode) -{ - if (f->stdio_mmt == NULL) - { - if (-1 == _SLstdio_fdopen (f->name, f->fd, mode)) - return; - - if (NULL == (f->stdio_mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE))) - return; - } - - (void) SLang_push_mmt (f->stdio_mmt); -} - -static long posix_lseek (SLFile_FD_Type *f, long ofs, int whence) -{ - long status; - - if (-1 == (status = lseek (f->fd, ofs, whence))) - _SLerrno_errno = errno; - - return status; -} - -static int posix_isatty (void) -{ - int ret; - SLFile_FD_Type *f; - - if (SLang_peek_at_stack () == SLANG_FILE_PTR_TYPE) - { - SLang_MMT_Type *mmt; - FILE *fp; - - if (-1 == SLang_pop_fileptr (&mmt, &fp)) - return 0; /* invalid descriptor */ - - ret = isatty (fileno (fp)); - SLang_free_mmt (mmt); - return ret; - } - - if (-1 == SLfile_pop_fd (&f)) - return 0; - - ret = isatty (f->fd); - SLfile_free_fd (f); - - return ret; -} - -static void posix_dup (SLFile_FD_Type *f) -{ - if ((NULL == (f = SLfile_dup_fd (f))) - || (-1 == SLfile_push_fd (f))) - SLang_push_null (); - - SLfile_free_fd (f); -} - -#define I SLANG_INT_TYPE -#define V SLANG_VOID_TYPE -#define F SLANG_FILE_FD_TYPE -#define B SLANG_BSTRING_TYPE -#define R SLANG_REF_TYPE -#define U SLANG_UINT_TYPE -#define S SLANG_STRING_TYPE -#define L SLANG_LONG_TYPE -static SLang_Intrin_Fun_Type Fd_Name_Table [] = -{ - MAKE_INTRINSIC_0("fileno", posix_fileno, V), - MAKE_INTRINSIC_0("isatty", posix_isatty, I), - MAKE_INTRINSIC_0("open", posix_open, V), - MAKE_INTRINSIC_3("read", posix_read, V, F, R, U), - MAKE_INTRINSIC_3("lseek", posix_lseek, L, F, L, I), - MAKE_INTRINSIC_2("fdopen", posix_fdopen, V, F, S), - MAKE_INTRINSIC_2("write", posix_write, V, F, B), - MAKE_INTRINSIC_1("dup_fd", posix_dup, V, F), - MAKE_INTRINSIC_1("close", posix_close, I, F), - SLANG_END_INTRIN_FUN_TABLE -}; -#undef I -#undef V -#undef F -#undef B -#undef R -#undef S -#undef L -#undef U - -static SLang_IConstant_Type PosixIO_Consts [] = -{ -#ifdef O_RDONLY - MAKE_ICONSTANT("O_RDONLY", O_RDONLY), -#endif -#ifdef O_WRONLY - MAKE_ICONSTANT("O_WRONLY", O_WRONLY), -#endif -#ifdef O_RDWR - MAKE_ICONSTANT("O_RDWR", O_RDWR), -#endif -#ifdef O_APPEND - MAKE_ICONSTANT("O_APPEND", O_APPEND), -#endif -#ifdef O_CREAT - MAKE_ICONSTANT("O_CREAT", O_CREAT), -#endif -#ifdef O_EXCL - MAKE_ICONSTANT("O_EXCL", O_EXCL), -#endif -#ifdef O_NOCTTY - MAKE_ICONSTANT("O_NOCTTY", O_NOCTTY), -#endif -#ifdef O_NONBLOCK - MAKE_ICONSTANT("O_NONBLOCK", O_NONBLOCK), -#endif -#ifdef O_TRUNC - MAKE_ICONSTANT("O_TRUNC", O_TRUNC), -#endif -#ifndef O_BINARY -# define O_BINARY 0 -#endif - MAKE_ICONSTANT("O_BINARY", O_BINARY), -#ifndef O_TEXT -# define O_TEXT 0 -#endif - MAKE_ICONSTANT("O_TEXT", O_TEXT), - - SLANG_END_ICONST_TABLE -}; - -int SLfile_push_fd (SLFile_FD_Type *f) -{ - if (f == NULL) - return SLang_push_null (); - - f->num_refs += 1; - - if (0 == SLclass_push_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR) f)) - return 0; - - f->num_refs -= 1; - - return -1; -} - -int SLfile_pop_fd (SLFile_FD_Type **f) -{ - return SLclass_pop_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR *) f); -} - -static void destroy_fd_type (unsigned char type, VOID_STAR ptr) -{ - (void) type; - SLfile_free_fd (*(SLFile_FD_Type **) ptr); -} - -static int fd_push (unsigned char type, VOID_STAR v) -{ - (void) type; - return SLfile_push_fd (*(SLFile_FD_Type **)v); -} - -int SLang_init_posix_io (void) -{ - SLang_Class_Type *cl; - - if (NULL == (cl = SLclass_allocate_class ("FD_Type"))) - return -1; - cl->cl_destroy = destroy_fd_type; - (void) SLclass_set_push_function (cl, fd_push); - - if (-1 == SLclass_register_class (cl, SLANG_FILE_FD_TYPE, sizeof (SLFile_FD_Type), SLANG_CLASS_TYPE_PTR)) - return -1; - - if ((-1 == SLadd_intrin_fun_table(Fd_Name_Table, "__POSIXIO__")) - || (-1 == SLadd_iconstant_table (PosixIO_Consts, NULL)) - || (-1 == _SLerrno_init ())) - return -1; - - return 0; -} - |