diff options
author | Gary Houston <ghouston@arglist.com> | 2001-04-29 13:03:14 +0000 |
---|---|---|
committer | Gary Houston <ghouston@arglist.com> | 2001-04-29 13:03:14 +0000 |
commit | b0e5fd8c3d8c09b4b11224e9f8d4cbf6a20a07a8 (patch) | |
tree | c06482e6e33986ea1c8f10a41ba3979fdd1ddd2f | |
parent | 370bababdadc9bc93ef4fef1125dcdeaa1842a87 (diff) |
* rw.c: new file, implementing C part of module (ice-9 rw).
(scm_read_string_x_partial): moved from ioext.c
(scm_init_rw): new proc.
* rw.h: new file.
init.c: include rw.h and call scm_init_rw.
Makefile.am: include rw.c and rw.h.
-rw-r--r-- | libguile/ChangeLog | 9 | ||||
-rw-r--r-- | libguile/Makefile.am | 10 | ||||
-rw-r--r-- | libguile/init.c | 4 | ||||
-rw-r--r-- | libguile/ioext.c | 103 | ||||
-rw-r--r-- | libguile/ioext.h | 2 | ||||
-rw-r--r-- | libguile/rw.c | 178 | ||||
-rw-r--r-- | libguile/rw.h | 59 |
7 files changed, 254 insertions, 111 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog index 4a71762eb..961b87f40 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,12 @@ +2001-04-29 Gary Houston <ghouston@arglist.com> + + * rw.c: new file, implementing C part of module (ice-9 rw). + (scm_read_string_x_partial): moved from ioext.c + (scm_init_rw): new proc. + * rw.h: new file. + init.c: include rw.h and call scm_init_rw. + Makefile.am: include rw.c and rw.h. + 2001-04-28 Rob Browning <rlb@cs.utexas.edu> * numbers.c: enabled local definition of SCM_FLOBUFLEN until we diff --git a/libguile/Makefile.am b/libguile/Makefile.am index 145413368..4bd6aa12e 100644 --- a/libguile/Makefile.am +++ b/libguile/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with Automake to create Makefile.in ## -## Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +## Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ## ## This file is part of GUILE. ## @@ -46,7 +46,7 @@ libguile_la_SOURCES = alist.c arbiters.c async.c backtrace.c boolean.c \ hashtab.c hooks.c init.c ioext.c iselect.c keywords.c lang.c list.c \ load.c macros.c mallocs.c modules.c numbers.c objects.c objprop.c \ options.c pairs.c ports.c print.c procprop.c procs.c properties.c \ - random.c rdelim.c read.c root.c scmsigs.c script.c simpos.c smob.c \ + random.c rdelim.c read.c root.c rw.c scmsigs.c script.c simpos.c smob.c \ sort.c srcprop.c stackchk.c stacks.c stime.c strings.c strop.c \ strorder.c strports.c struct.c symbols.c tag.c throw.c values.c \ variable.c vectors.c version.c vports.c weaks.c @@ -57,7 +57,7 @@ DOT_X_FILES = alist.x arbiters.x async.x backtrace.x boolean.x chars.x \ gsubr.x guardians.x hash.x hashtab.x hooks.x init.x ioext.x iselect.x \ keywords.x lang.x list.x load.x macros.x mallocs.x modules.x \ numbers.x objects.x objprop.x options.x pairs.x ports.x print.x \ - procprop.x procs.x properties.x random.x rdelim.x read.x root.x \ + procprop.x procs.x properties.x random.x rdelim.x read.x root.x rw.x \ scmsigs.x script.x simpos.x smob.x sort.x srcprop.x \ stackchk.x stacks.x stime.x strings.x strop.x strorder.x strports.x \ struct.x symbols.x tag.x throw.x values.x variable.x vectors.x \ @@ -73,7 +73,7 @@ DOT_DOC_FILES = alist.doc arbiters.doc async.doc backtrace.doc \ iselect.doc keywords.doc lang.doc list.doc load.doc macros.doc \ mallocs.doc modules.doc numbers.doc objects.doc objprop.doc \ options.doc pairs.doc ports.doc print.doc procprop.doc \ - procs.doc properties.doc random.doc rdelim.doc read.doc root.doc \ + procs.doc properties.doc random.doc rdelim.doc read.doc root.doc rw.doc \ scmsigs.doc script.doc simpos.doc smob.doc sort.doc \ srcprop.doc stackchk.doc stacks.doc stime.doc strings.doc strop.doc \ strorder.doc strports.doc struct.doc symbols.doc tag.doc throw.doc \ @@ -118,7 +118,7 @@ modinclude_HEADERS = __scm.h alist.h arbiters.h async.h backtrace.h boolean.h \ iselect.h keywords.h lang.h list.h load.h macros.h mallocs.h modules.h \ net_db.h numbers.h objects.h objprop.h options.h pairs.h ports.h posix.h \ regex-posix.h print.h procprop.h procs.h properties.h random.h ramap.h \ - rdelim.h read.h root.h scmsigs.h validate.h script.h simpos.h smob.h \ + rdelim.h read.h root.h rw.h scmsigs.h validate.h script.h simpos.h smob.h \ snarf.h socket.h sort.h srcprop.h stackchk.h stacks.h stime.h strings.h \ strop.h strorder.h strports.h struct.h symbols.h tag.h tags.h threads.h \ throw.h unif.h values.h variable.h vectors.h version.h vports.h weaks.h diff --git a/libguile/init.c b/libguile/init.c index 75722a990..99e67cdae 100644 --- a/libguile/init.c +++ b/libguile/init.c @@ -114,6 +114,7 @@ #include "libguile/random.h" #include "libguile/rdelim.h" #include "libguile/read.h" +#include "libguile/rw.h" #include "libguile/scmsigs.h" #include "libguile/script.h" #include "libguile/simpos.h" @@ -588,10 +589,11 @@ scm_init_guile_1 (SCM_STACKITEM *base) scm_load_startup_files (); - /* this is located here, not from a deep understanding of the + /* these are located here, not from a deep understanding of the module system, but as a way of avoiding segv and other undesirable side effects that arise from various alternatives. */ scm_init_rdelim (); + scm_init_rw (); } /* Record here whether SCM_BOOT_GUILE_1 has already been called. This diff --git a/libguile/ioext.c b/libguile/ioext.c index 3923ed95c..2c1ed4a46 100644 --- a/libguile/ioext.c +++ b/libguile/ioext.c @@ -51,119 +51,16 @@ #include "libguile/fports.h" #include "libguile/feature.h" #include "libguile/ports.h" -#include "libguile/root.h" #include "libguile/strings.h" #include "libguile/validate.h" #include <fcntl.h> -#ifdef HAVE_STRING_H -#include <string.h> -#endif #ifdef HAVE_UNISTD_H #include <unistd.h> #endif -#if defined (EAGAIN) -#define SCM_MAYBE_EAGAIN || errno == EAGAIN -#else -#define SCM_MAYBE_EAGAIN -#endif - -#if defined (EWOULDBLOCK) -#define SCM_MAYBE_EWOULDBLOCK || errno == EWOULDBLOCK -#else -#define SCM_MAYBE_EWOULDBLOCK -#endif - -/* MAYBE there is EAGAIN way of defining this macro but now I EWOULDBLOCK. */ -#define SCM_EBLOCK(errno) \ - (0 SCM_MAYBE_EAGAIN SCM_MAYBE_EWOULDBLOCK) - -SCM_DEFINE (scm_read_string_x_partial, "read-string!/partial", 1, 3, 0, - (SCM str, SCM port_or_fdes, SCM start, SCM end), - "Read characters from an fport or file descriptor into a\n" - "string @var{str}. This procedure is scsh-compatible\n" - "and can efficiently read large strings. It will:\n\n" - "@itemize\n" - "@item\n" - "attempt to fill the entire string, unless the @var{start}\n" - "and/or @var{end} arguments are supplied. i.e., @var{start}\n" - "defaults to 0 and @var{end} defaults to\n" - "@code{(string-length str)}\n" - "@item\n" - "use the current input port if @var{port_or_fdes} is not\n" - "supplied.\n" - "@item\n" - "read any characters that are currently available,\n" - "without waiting for the rest (short reads are possible).\n\n" - "@item\n" - "wait for as long as it needs to for the first character to\n" - "become available, unless the port is in non-blocking mode\n" - "@item\n" - "return @code{#f} if end-of-file is encountered before reading\n" - "any characters, otherwise return the number of characters\n" - "read.\n" - "@item\n" - "return 0 if the port is in non-blocking mode and no characters\n" - "are immediately available.\n" - "@item\n" - "return 0 if the request is for 0 bytes, with no\n" - "end-of-file check\n" - "@end itemize") -#define FUNC_NAME s_scm_read_string_x_partial -{ - char *dest; - long read_len; - long chars_read = 0; - int fdes; - - { - long offset; - long last; - - SCM_VALIDATE_SUBSTRING_SPEC_COPY (1, str, dest, 3, start, offset, - 4, end, last); - dest += offset; - read_len = last - offset; - } - - if (SCM_INUMP (port_or_fdes)) - fdes = SCM_INUM (port_or_fdes); - else - { - SCM port = SCM_UNBNDP (port_or_fdes) ? scm_cur_inp : port_or_fdes; - - SCM_VALIDATE_OPFPORT (2, port); - SCM_VALIDATE_INPUT_PORT (2, port); - - /* if there's anything in the port buffers, use it, but then - don't touch the file descriptor. otherwise the - "return immediately if something is available" rule may - be violated. */ - chars_read = scm_take_from_input_buffers (port, dest, read_len); - fdes = SCM_FPORT_FDES (port); - } - - if (chars_read == 0 && read_len > 0) /* don't confuse read_len == 0 with - EOF. */ - { - SCM_SYSCALL (chars_read = read (fdes, dest, read_len)); - if (chars_read == -1) - { - if (SCM_EBLOCK (errno)) - chars_read = 0; - else - SCM_SYSERROR; - } - else if (chars_read == 0) - return SCM_BOOL_F; - } - return scm_long2num (chars_read); -} -#undef FUNC_NAME - SCM_DEFINE (scm_ftell, "ftell", 1, 0, 0, (SCM fd_port), "Return an integer representing the current position of\n" diff --git a/libguile/ioext.h b/libguile/ioext.h index 5853f4490..c6b4712ac 100644 --- a/libguile/ioext.h +++ b/libguile/ioext.h @@ -48,8 +48,6 @@ -extern SCM scm_read_string_x_partial (SCM str, SCM port_or_fdes, SCM start, - SCM end); extern SCM scm_ftell (SCM object); extern SCM scm_redirect_port (SCM into_pt, SCM from_pt); extern SCM scm_dup_to_fdes (SCM fd_or_port, SCM newfd); diff --git a/libguile/rw.c b/libguile/rw.c new file mode 100644 index 000000000..343c28210 --- /dev/null +++ b/libguile/rw.c @@ -0,0 +1,178 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * As a special exception, the Free Software Foundation gives permission + * for additional uses of the text contained in its release of GUILE. + * + * The exception is that, if you link the GUILE library with other files + * to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the GUILE library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the + * Free Software Foundation under the name GUILE. If you copy + * code from other Free Software Foundation releases into a copy of + * GUILE, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for GUILE, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. */ + + + +/* This is the C part of the (ice-9 rw) module. */ + +#include <errno.h> + +#include "libguile/_scm.h" +#include "libguile/fports.h" +#include "libguile/ports.h" +#include "libguile/root.h" +#include "libguile/rw.h" +#include "libguile/strings.h" +#include "libguile/validate.h" + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + + + +#if defined (EAGAIN) +#define SCM_MAYBE_EAGAIN || errno == EAGAIN +#else +#define SCM_MAYBE_EAGAIN +#endif + +#if defined (EWOULDBLOCK) +#define SCM_MAYBE_EWOULDBLOCK || errno == EWOULDBLOCK +#else +#define SCM_MAYBE_EWOULDBLOCK +#endif + +/* MAYBE there is EAGAIN way of defining this macro but now I EWOULDBLOCK. */ +#define SCM_EBLOCK(errno) \ + (0 SCM_MAYBE_EAGAIN SCM_MAYBE_EWOULDBLOCK) + +SCM_DEFINE (scm_read_string_x_partial, "read-string!/partial", 1, 3, 0, + (SCM str, SCM port_or_fdes, SCM start, SCM end), + "Read characters from an fport or file descriptor into a\n" + "string @var{str}. This procedure is scsh-compatible\n" + "and can efficiently read large strings. It will:\n\n" + "@itemize\n" + "@item\n" + "attempt to fill the entire string, unless the @var{start}\n" + "and/or @var{end} arguments are supplied. i.e., @var{start}\n" + "defaults to 0 and @var{end} defaults to\n" + "@code{(string-length str)}\n" + "@item\n" + "use the current input port if @var{port_or_fdes} is not\n" + "supplied.\n" + "@item\n" + "read any characters that are currently available,\n" + "without waiting for the rest (short reads are possible).\n\n" + "@item\n" + "wait for as long as it needs to for the first character to\n" + "become available, unless the port is in non-blocking mode\n" + "@item\n" + "return @code{#f} if end-of-file is encountered before reading\n" + "any characters, otherwise return the number of characters\n" + "read.\n" + "@item\n" + "return 0 if the port is in non-blocking mode and no characters\n" + "are immediately available.\n" + "@item\n" + "return 0 if the request is for 0 bytes, with no\n" + "end-of-file check\n" + "@end itemize") +#define FUNC_NAME s_scm_read_string_x_partial +{ + char *dest; + long read_len; + long chars_read = 0; + int fdes; + + { + long offset; + long last; + + SCM_VALIDATE_SUBSTRING_SPEC_COPY (1, str, dest, 3, start, offset, + 4, end, last); + dest += offset; + read_len = last - offset; + } + + if (SCM_INUMP (port_or_fdes)) + fdes = SCM_INUM (port_or_fdes); + else + { + SCM port = SCM_UNBNDP (port_or_fdes) ? scm_cur_inp : port_or_fdes; + + SCM_VALIDATE_OPFPORT (2, port); + SCM_VALIDATE_INPUT_PORT (2, port); + + /* if there's anything in the port buffers, use it, but then + don't touch the file descriptor. otherwise the + "return immediately if something is available" rule may + be violated. */ + chars_read = scm_take_from_input_buffers (port, dest, read_len); + fdes = SCM_FPORT_FDES (port); + } + + if (chars_read == 0 && read_len > 0) /* don't confuse read_len == 0 with + EOF. */ + { + SCM_SYSCALL (chars_read = read (fdes, dest, read_len)); + if (chars_read == -1) + { + if (SCM_EBLOCK (errno)) + chars_read = 0; + else + SCM_SYSERROR; + } + else if (chars_read == 0) + return SCM_BOOL_F; + } + return scm_long2num (chars_read); +} +#undef FUNC_NAME + +void +scm_init_rw () +{ + SCM rw_module = scm_make_module (scm_read_0str ("(ice-9 rw)")); + SCM old_module = scm_set_current_module (rw_module); + +#ifndef SCM_MAGIC_SNARFER +#include "libguile/rw.x" +#endif + + scm_set_current_module (old_module); +} + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/rw.h b/libguile/rw.h new file mode 100644 index 000000000..0e160cc79 --- /dev/null +++ b/libguile/rw.h @@ -0,0 +1,59 @@ +/* classes: h_files */ + +#ifndef SCM_RW +#define SCM_RW +/* Copyright (C) 2001 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * As a special exception, the Free Software Foundation gives permission + * for additional uses of the text contained in its release of GUILE. + * + * The exception is that, if you link the GUILE library with other files + * to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the GUILE library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the + * Free Software Foundation under the name GUILE. If you copy + * code from other Free Software Foundation releases into a copy of + * GUILE, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for GUILE, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. */ + + +#include "libguile/__scm.h" + +extern SCM scm_read_string_x_partial (SCM str, SCM port_or_fdes, SCM start, + SCM end); +void scm_init_rw (void); + +#endif + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ |