Add `scm_t_off' type so that `scm_t_port' has a fixed layout.
* libguile/gen-scmconfig.c (main): Produce a definition for
`scm_t_off'.
* libguile/ports.h (scm_t_port)[read_buf_size, saved_read_buf_size,
write_buf_size, seek, truncate]: Use `scm_t_off' instead of `off_t' so
that the layout and size of the structure does not depend on the
application's `_FILE_OFFSET_BITS' value. Reported by Bill
Schottstaedt, see
http://lists.gnu.org/archive/html/bug-guile/2009-06/msg00018.html.
(scm_set_port_seek, scm_set_port_truncate): Update.
* libguile/ports.c (scm_set_port_seek, scm_set_port_truncate): Use
`scm_t_off' and `off_t_or_off64_t'.
* libguile/fports.c (fport_seek, fport_truncate): Use `scm_t_off'
instead of `off_t'.
* libguile/r6rs-ports.c (bip_seek, cbp_seek, bop_seek): Use `scm_t_off'
instead of `off_t'.
* libguile/rw.c (scm_write_string_partial): Likewise.
* libguile/strports.c (st_resize_port, st_seek, st_truncate): Likewise.
* doc/ref/api-io.texi (Port Implementation): Update prototype of
`scm_set_port_seek ()' and `scm_set_port_truncate ()'.
* NEWS: Update.
2009-06-25 23:32:44 +02:00
|
|
|
|
/* Copyright (C) 2001, 2006, 2009 Free Software Foundation, Inc.
|
2001-04-29 13:03:14 +00:00
|
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* This library is free software; you can redistribute it and/or
|
2009-06-17 00:22:09 +01:00
|
|
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
|
|
|
|
* as published by the Free Software Foundation; either version 3 of
|
|
|
|
|
|
* the License, or (at your option) any later version.
|
2001-04-29 13:03:14 +00:00
|
|
|
|
*
|
2009-06-17 00:22:09 +01:00
|
|
|
|
* This library is distributed in the hope that it will be useful, but
|
|
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
|
* Lesser General Public License for more details.
|
2001-04-29 13:03:14 +00:00
|
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
|
* License along with this library; if not, write to the Free Software
|
2009-06-17 00:22:09 +01:00
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
|
|
|
|
* 02110-1301 USA
|
2003-04-05 19:15:35 +00:00
|
|
|
|
*/
|
2001-04-29 13:03:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This is the C part of the (ice-9 rw) module. */
|
|
|
|
|
|
|
2008-09-13 15:35:27 +02:00
|
|
|
|
#ifdef HAVE_CONFIG_H
|
2003-03-25 23:59:31 +00:00
|
|
|
|
# include <config.h>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2001-04-29 13:03:14 +00:00
|
|
|
|
#include <errno.h>
|
2001-06-20 17:33:43 +00:00
|
|
|
|
#include <string.h>
|
2001-04-29 13:03:14 +00:00
|
|
|
|
|
|
|
|
|
|
#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"
|
2001-05-02 00:49:11 +00:00
|
|
|
|
#include "libguile/modules.h"
|
|
|
|
|
|
#include "libguile/strports.h"
|
2001-04-29 13:03:14 +00:00
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
#endif
|
2001-07-03 15:27:56 +00:00
|
|
|
|
#ifdef HAVE_IO_H
|
|
|
|
|
|
#include <io.h>
|
|
|
|
|
|
#endif
|
2001-04-29 13:03:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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),
|
2001-06-04 21:48:25 +00:00
|
|
|
|
"Read characters from a port or file descriptor into a\n"
|
|
|
|
|
|
"string @var{str}. A port must have an underlying file\n"
|
|
|
|
|
|
"descriptor --- a so-called fport. This procedure is\n"
|
|
|
|
|
|
"scsh-compatible and can efficiently read large strings.\n"
|
|
|
|
|
|
"It will:\n\n"
|
2001-04-29 13:03:14 +00:00
|
|
|
|
"@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"
|
2001-06-04 21:48:25 +00:00
|
|
|
|
"return fewer than the requested number of characters in some\n"
|
|
|
|
|
|
"cases, e.g., on end of file, if interrupted by a signal, or if\n"
|
|
|
|
|
|
"not all the characters are immediately available.\n"
|
2001-04-29 13:03:14 +00:00
|
|
|
|
"@item\n"
|
2001-06-04 21:48:25 +00:00
|
|
|
|
"wait indefinitely for some input if no characters are\n"
|
|
|
|
|
|
"currently available,\n"
|
|
|
|
|
|
"unless the port is in non-blocking mode.\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"read characters from the port's input buffers if available,\n"
|
|
|
|
|
|
"instead from the underlying file descriptor.\n"
|
2001-04-29 13:03:14 +00:00
|
|
|
|
"@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"
|
2001-06-04 21:48:25 +00:00
|
|
|
|
"end-of-file check.\n"
|
2001-04-29 13:03:14 +00:00
|
|
|
|
"@end itemize")
|
|
|
|
|
|
#define FUNC_NAME s_scm_read_string_x_partial
|
|
|
|
|
|
{
|
|
|
|
|
|
char *dest;
|
2004-11-04 14:01:18 +00:00
|
|
|
|
size_t offset;
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long read_len;
|
|
|
|
|
|
long chars_read = 0;
|
2001-04-29 13:03:14 +00:00
|
|
|
|
int fdes;
|
|
|
|
|
|
|
|
|
|
|
|
{
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
size_t last;
|
2001-04-29 13:03:14 +00:00
|
|
|
|
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
SCM_VALIDATE_STRING (1, str);
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
scm_i_get_substring_spec (scm_i_string_length (str),
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
start, &offset, end, &last);
|
2001-04-29 13:03:14 +00:00
|
|
|
|
read_len = last - offset;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2004-07-23 15:43:02 +00:00
|
|
|
|
if (scm_is_integer (port_or_fdes))
|
|
|
|
|
|
fdes = scm_to_int (port_or_fdes);
|
2001-04-29 13:03:14 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
2005-03-02 20:42:01 +00:00
|
|
|
|
SCM port = (SCM_UNBNDP (port_or_fdes)?
|
|
|
|
|
|
scm_current_input_port () : port_or_fdes);
|
2001-04-29 13:03:14 +00:00
|
|
|
|
|
|
|
|
|
|
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. */
|
2004-11-04 14:01:18 +00:00
|
|
|
|
dest = scm_i_string_writable_chars (str) + offset;
|
2001-04-29 13:03:14 +00:00
|
|
|
|
chars_read = scm_take_from_input_buffers (port, dest, read_len);
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
scm_i_string_stop_writing ();
|
2001-04-29 13:03:14 +00:00
|
|
|
|
fdes = SCM_FPORT_FDES (port);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (chars_read == 0 && read_len > 0) /* don't confuse read_len == 0 with
|
|
|
|
|
|
EOF. */
|
|
|
|
|
|
{
|
2004-11-04 14:01:18 +00:00
|
|
|
|
dest = scm_i_string_writable_chars (str) + offset;
|
2001-04-29 13:03:14 +00:00
|
|
|
|
SCM_SYSCALL (chars_read = read (fdes, dest, read_len));
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
scm_i_string_stop_writing ();
|
2001-04-29 13:03:14 +00:00
|
|
|
|
if (chars_read == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SCM_EBLOCK (errno))
|
|
|
|
|
|
chars_read = 0;
|
|
|
|
|
|
else
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (chars_read == 0)
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
{
|
|
|
|
|
|
scm_remember_upto_here_1 (str);
|
|
|
|
|
|
return SCM_BOOL_F;
|
|
|
|
|
|
}
|
2001-04-29 13:03:14 +00:00
|
|
|
|
}
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
|
|
|
|
|
|
scm_remember_upto_here_1 (str);
|
* numbers.h, numbers.c, discouraged.h, discouraged.c (scm_short2num,
scm_ushort2num, scm_int2num, scm_uint2num, scm_long2num,
scm_ulong2num, scm_size2num, scm_ptrdiff2num, scm_num2short,
scm_num2ushort, scm_num2int, scm_num2uint, scm_num2long,
scm_num2ulong, scm_num2size, scm_num2ptrdiff, scm_long_long2num,
scm_ulong_long2num, scm_num2long_long, scm_num2ulong_long):
Discouraged by moving to discouraged.h and discouraged.c and
reimplementing in terms of scm_from_* and scm_to_*. Changed all uses
to the new scm_from_* and scm_to_* functions.
2004-08-02 16:14:04 +00:00
|
|
|
|
return scm_from_long (chars_read);
|
2001-04-29 13:03:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
2001-06-04 21:48:25 +00:00
|
|
|
|
SCM_DEFINE (scm_write_string_partial, "write-string/partial", 1, 3, 0,
|
|
|
|
|
|
(SCM str, SCM port_or_fdes, SCM start, SCM end),
|
|
|
|
|
|
"Write characters from a string @var{str} to a port or file\n"
|
|
|
|
|
|
"descriptor. A port must have an underlying file descriptor\n"
|
|
|
|
|
|
"--- a so-called fport. This procedure is\n"
|
|
|
|
|
|
"scsh-compatible and can efficiently write large strings.\n"
|
|
|
|
|
|
"It will:\n\n"
|
|
|
|
|
|
"@itemize\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"attempt to write 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 output port if @var{port_of_fdes} is not\n"
|
|
|
|
|
|
"supplied.\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"in the case of a buffered port, store the characters in the\n"
|
|
|
|
|
|
"port's output buffer, if all will fit. If they will not fit\n"
|
|
|
|
|
|
"then any existing buffered characters will be flushed\n"
|
|
|
|
|
|
"before attempting\n"
|
|
|
|
|
|
"to write the new characters directly to the underlying file\n"
|
|
|
|
|
|
"descriptor. If the port is in non-blocking mode and\n"
|
|
|
|
|
|
"buffered characters can not be flushed immediately, then an\n"
|
|
|
|
|
|
"@code{EAGAIN} system-error exception will be raised (Note:\n"
|
|
|
|
|
|
"scsh does not support the use of non-blocking buffered ports.)\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"write fewer than the requested number of\n"
|
|
|
|
|
|
"characters in some cases, e.g., if interrupted by a signal or\n"
|
|
|
|
|
|
"if not all of the output can be accepted immediately.\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"wait indefinitely for at least one character\n"
|
|
|
|
|
|
"from @var{str} to be accepted by the port, unless the port is\n"
|
|
|
|
|
|
"in non-blocking mode.\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"return the number of characters accepted by the port.\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"return 0 if the port is in non-blocking mode and can not accept\n"
|
|
|
|
|
|
"at least one character from @var{str} immediately\n"
|
|
|
|
|
|
"@item\n"
|
|
|
|
|
|
"return 0 immediately if the request size is 0 bytes.\n"
|
|
|
|
|
|
"@end itemize")
|
|
|
|
|
|
#define FUNC_NAME s_scm_write_string_partial
|
|
|
|
|
|
{
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
const char *src;
|
Add `scm_t_off' type so that `scm_t_port' has a fixed layout.
* libguile/gen-scmconfig.c (main): Produce a definition for
`scm_t_off'.
* libguile/ports.h (scm_t_port)[read_buf_size, saved_read_buf_size,
write_buf_size, seek, truncate]: Use `scm_t_off' instead of `off_t' so
that the layout and size of the structure does not depend on the
application's `_FILE_OFFSET_BITS' value. Reported by Bill
Schottstaedt, see
http://lists.gnu.org/archive/html/bug-guile/2009-06/msg00018.html.
(scm_set_port_seek, scm_set_port_truncate): Update.
* libguile/ports.c (scm_set_port_seek, scm_set_port_truncate): Use
`scm_t_off' and `off_t_or_off64_t'.
* libguile/fports.c (fport_seek, fport_truncate): Use `scm_t_off'
instead of `off_t'.
* libguile/r6rs-ports.c (bip_seek, cbp_seek, bop_seek): Use `scm_t_off'
instead of `off_t'.
* libguile/rw.c (scm_write_string_partial): Likewise.
* libguile/strports.c (st_resize_port, st_seek, st_truncate): Likewise.
* doc/ref/api-io.texi (Port Implementation): Update prototype of
`scm_set_port_seek ()' and `scm_set_port_truncate ()'.
* NEWS: Update.
2009-06-25 23:32:44 +02:00
|
|
|
|
scm_t_off write_len;
|
2001-06-04 21:48:25 +00:00
|
|
|
|
int fdes;
|
|
|
|
|
|
|
|
|
|
|
|
{
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
size_t offset;
|
|
|
|
|
|
size_t last;
|
2001-06-04 21:48:25 +00:00
|
|
|
|
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
SCM_VALIDATE_STRING (1, str);
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
src = scm_i_string_chars (str);
|
|
|
|
|
|
scm_i_get_substring_spec (scm_i_string_length (str),
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
start, &offset, end, &last);
|
2001-06-04 21:48:25 +00:00
|
|
|
|
src += offset;
|
|
|
|
|
|
write_len = last - offset;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (write_len == 0)
|
|
|
|
|
|
return SCM_INUM0;
|
|
|
|
|
|
|
2004-07-23 15:43:02 +00:00
|
|
|
|
if (scm_is_integer (port_or_fdes))
|
|
|
|
|
|
fdes = scm_to_int (port_or_fdes);
|
2001-06-04 21:48:25 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
2005-03-02 20:42:01 +00:00
|
|
|
|
SCM port = (SCM_UNBNDP (port_or_fdes)?
|
|
|
|
|
|
scm_current_output_port () : port_or_fdes);
|
2001-06-14 19:50:43 +00:00
|
|
|
|
scm_t_port *pt;
|
Add `scm_t_off' type so that `scm_t_port' has a fixed layout.
* libguile/gen-scmconfig.c (main): Produce a definition for
`scm_t_off'.
* libguile/ports.h (scm_t_port)[read_buf_size, saved_read_buf_size,
write_buf_size, seek, truncate]: Use `scm_t_off' instead of `off_t' so
that the layout and size of the structure does not depend on the
application's `_FILE_OFFSET_BITS' value. Reported by Bill
Schottstaedt, see
http://lists.gnu.org/archive/html/bug-guile/2009-06/msg00018.html.
(scm_set_port_seek, scm_set_port_truncate): Update.
* libguile/ports.c (scm_set_port_seek, scm_set_port_truncate): Use
`scm_t_off' and `off_t_or_off64_t'.
* libguile/fports.c (fport_seek, fport_truncate): Use `scm_t_off'
instead of `off_t'.
* libguile/r6rs-ports.c (bip_seek, cbp_seek, bop_seek): Use `scm_t_off'
instead of `off_t'.
* libguile/rw.c (scm_write_string_partial): Likewise.
* libguile/strports.c (st_resize_port, st_seek, st_truncate): Likewise.
* doc/ref/api-io.texi (Port Implementation): Update prototype of
`scm_set_port_seek ()' and `scm_set_port_truncate ()'.
* NEWS: Update.
2009-06-25 23:32:44 +02:00
|
|
|
|
scm_t_off space;
|
2001-06-04 21:48:25 +00:00
|
|
|
|
|
|
|
|
|
|
SCM_VALIDATE_OPFPORT (2, port);
|
|
|
|
|
|
SCM_VALIDATE_OUTPUT_PORT (2, port);
|
|
|
|
|
|
pt = SCM_PTAB_ENTRY (port);
|
|
|
|
|
|
/* filling the last character in the buffer would require a flush. */
|
|
|
|
|
|
space = pt->write_end - pt->write_pos - 1;
|
|
|
|
|
|
if (space >= write_len)
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy (pt->write_pos, src, write_len);
|
|
|
|
|
|
pt->write_pos += write_len;
|
* numbers.h, numbers.c, discouraged.h, discouraged.c (scm_short2num,
scm_ushort2num, scm_int2num, scm_uint2num, scm_long2num,
scm_ulong2num, scm_size2num, scm_ptrdiff2num, scm_num2short,
scm_num2ushort, scm_num2int, scm_num2uint, scm_num2long,
scm_num2ulong, scm_num2size, scm_num2ptrdiff, scm_long_long2num,
scm_ulong_long2num, scm_num2long_long, scm_num2ulong_long):
Discouraged by moving to discouraged.h and discouraged.c and
reimplementing in terms of scm_from_* and scm_to_*. Changed all uses
to the new scm_from_* and scm_to_* functions.
2004-08-02 16:14:04 +00:00
|
|
|
|
return scm_from_long (write_len);
|
2001-06-04 21:48:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
if (pt->write_pos > pt->write_buf)
|
|
|
|
|
|
scm_flush (port);
|
|
|
|
|
|
fdes = SCM_FPORT_FDES (port);
|
|
|
|
|
|
}
|
|
|
|
|
|
{
|
|
|
|
|
|
long rv;
|
|
|
|
|
|
|
|
|
|
|
|
SCM_SYSCALL (rv = write (fdes, src, write_len));
|
|
|
|
|
|
if (rv == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SCM_EBLOCK (errno))
|
|
|
|
|
|
rv = 0;
|
|
|
|
|
|
else
|
|
|
|
|
|
SCM_SYSERROR;
|
|
|
|
|
|
}
|
* socket.c, rw.c, deprecated.h, validate.h
(SCM_VALIDATE_STRING_COPY): Deprecated. Replaced all uses with
SCM_VALIDATE_STRING plus SCM_I_STRING_CHARS or
scm_to_locale_string, etc.
(SCM_VALIDATE_SUBSTRING_SPEC_COPY): Deprecated. Replaced as
above, plus scm_i_get_substring_spec.
* regex-posix.c, read.c, random.c, ramap.c, print.c, numbers.c,
hash.c, gc.c, gc-card.c, convert.i.c, backtrace.c, strop.c,
strorder.c, strports.c, struct.c, symbols.c, unif.c, ports.c: Use
SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH
instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and
SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first
with more explicit scm_remember_upto_here_1, etc, or introduced
them in the first place.
2004-08-12 17:45:03 +00:00
|
|
|
|
|
|
|
|
|
|
scm_remember_upto_here_1 (str);
|
* numbers.h, numbers.c, discouraged.h, discouraged.c (scm_short2num,
scm_ushort2num, scm_int2num, scm_uint2num, scm_long2num,
scm_ulong2num, scm_size2num, scm_ptrdiff2num, scm_num2short,
scm_num2ushort, scm_num2int, scm_num2uint, scm_num2long,
scm_num2ulong, scm_num2size, scm_num2ptrdiff, scm_long_long2num,
scm_ulong_long2num, scm_num2long_long, scm_num2ulong_long):
Discouraged by moving to discouraged.h and discouraged.c and
reimplementing in terms of scm_from_* and scm_to_*. Changed all uses
to the new scm_from_* and scm_to_* functions.
2004-08-02 16:14:04 +00:00
|
|
|
|
return scm_from_long (rv);
|
2001-06-04 21:48:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
2001-05-19 00:24:15 +00:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_init_rw_builtins ()
|
2001-04-29 13:03:14 +00:00
|
|
|
|
{
|
|
|
|
|
|
#include "libguile/rw.x"
|
|
|
|
|
|
|
2001-05-19 00:24:15 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_init_rw ()
|
|
|
|
|
|
{
|
(scm_c_make_gsubr, scm_c_define_gsubr, scm_c_make_gsubr_with_generic,
scm_c_define_gsubr_with_generic): New functions. They replace
scm_make_gsubr and scm_make_gsubr_with_generic. The `make' variants
only create the gsubr object, while the `define' variants also put it
into the current module. Changed all callers. (scm_make_gsubr,
scm_make_gsubr_with_generic): Deprecated.
(scm_c_make_subr, scm_c_define_subr, scm_c_make_subr_with_generic,
scm_c_define_subr_with_generic): New functions. They replace
scm_make_subr, scm_make_subr_opt and scm_make_subr_with_generic. The
`make' variants only create the subr object, while the `define'
variants also put it into the current module. Changed all callers.
(scm_make_subr, scm_make_subr_opt, scm_make_subr_with_generic):
Deprecated.
2001-05-20 00:35:43 +00:00
|
|
|
|
scm_c_define_gsubr ("%init-rw-builtins", 0, 0, 0, scm_init_rw_builtins);
|
2001-04-29 13:03:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
|
c-file-style: "gnu"
|
|
|
|
|
|
End:
|
|
|
|
|
|
*/
|