diff --git a/NEWS b/NEWS index f9059f0a1..52dc567e0 100644 --- a/NEWS +++ b/NEWS @@ -152,6 +152,16 @@ a garbage collection before each allocation of a cell. This can slow down the interpreter dramatically, so the setter should be used to turn on this extra processing only when necessary. +* Changes to Scheme functions and syntax + +** string-ref: the second argument is no longer optional. + +** string, list->string: no longer accept strings in their arguments, +only characters, for compatibility with R5RS. + +** New procedure: port-closed? PORT +Returns #t if PORT is closed or #f if it is open. + * Changes to the stand-alone interpreter ** New primitives: `pkgdata-dir', `site-dir', `library-dir' @@ -182,9 +192,6 @@ at the top of the script. (The first options enables the debugging evaluator. The second enables backtraces.) -** New procedure: port-closed? PORT -Returns #t if PORT is closed or #f if it is open. - ** Attempting to get the value of an unbound variable now produces an exception with a key of 'unbound-variable instead of 'misc-error. @@ -221,6 +228,9 @@ removed in a future version. provide input or accept output. Previously only the underlying file descriptors were checked. +** New variable PIPE_BUF: the maximum number of bytes that can be +atomically written to a pipe. + ** If a facility is not available on the system when Guile is compiled, the corresponding primitive procedure will not be defined. Previously it would have been defined but would throw a system-error diff --git a/ice-9/ChangeLog b/ice-9/ChangeLog index 8e5a2e6bf..e019e2a97 100644 --- a/ice-9/ChangeLog +++ b/ice-9/ChangeLog @@ -1,3 +1,8 @@ +2000-01-30 Gary Houston + + * boot-9.scm (find-and-link-dynamic-module): pass strings, not symbols, + to string-append. + 2000-01-29 Gary Houston * expect.scm (expect): don't call char-ready? before expect-select, diff --git a/ice-9/boot-9.scm b/ice-9/boot-9.scm index 430a8f955..0efd8ecc6 100644 --- a/ice-9/boot-9.scm +++ b/ice-9/boot-9.scm @@ -1974,14 +1974,14 @@ (define (find-and-link-dynamic-module module-name) (define (make-init-name mod-name) - (string-append 'scm_init + (string-append "scm_init" (list->string (map (lambda (c) (if (or (char-alphabetic? c) (char-numeric? c)) c #\_)) (string->list mod-name))) - '_module)) + "_module")) ;; Put the subdirectory for this module in the car of SUBDIR-AND-LIBNAME, ;; and the `libname' (the name of the module prepended by `lib') in the cdr @@ -2844,7 +2844,7 @@ (sigaction (car sig-msg) (car old-handler) (cdr old-handler)))) - signals old-handlers))))) + signals old-handlers))))) (defmacro false-if-exception (expr) `(catch #t (lambda () ,expr) diff --git a/libguile/ChangeLog b/libguile/ChangeLog index dae4f34ec..3ae2a8c2a 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,24 @@ +2000-01-31 Gary Houston + + * strings.h: don't use SCM_P. don't include . + * error.c, gh_data.c, ports.c, script.c, strop.c: include . + + * strings.c (scm_string_ref): make the 2nd argument compulsory. + previously it defaulted to zero for no good reason that I can see. + use a local variable for SCM_INUM (k). replace + SCM_VALIDATE_INUM_DEF with SCM_VALIDATE_INUM_COPY. + + (scm_makfromstr): cosmetic changes. + + (scm_string): Accept only chars in the list, not strings, for + conformance to R5RS (particularly for list->string, which is + supposed to be the inverse of string->list.) remove + SCM_DEFER_INTS/SCM_ALLOW_INTS, which is unnecessary since + scm_makstr handles the cell allocation. when reporting wrong-type + arg, don't report the position as 1. + + * posix.c (scm_init_posix): intern PIPE_BUF if it's defined. + 2000-01-29 Gary Houston * posix.c (scm_pipe): rewrote the docstring. diff --git a/libguile/error.c b/libguile/error.c index 9601d4c70..2353faf29 100644 --- a/libguile/error.c +++ b/libguile/error.c @@ -45,6 +45,7 @@ #include + #include "_scm.h" #include "pairs.h" #include "genio.h" @@ -53,6 +54,9 @@ #include "scm_validate.h" #include "error.h" +#ifdef HAVE_STRING_H +#include +#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/libguile/filesys.c b/libguile/filesys.c index e8ee16c65..4b19dcf09 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999, 2000 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 @@ -1459,7 +1459,7 @@ scm_sysintern ("F_SETOWN", scm_long2num (F_SETOWN)); #endif #ifdef FD_CLOEXEC scm_sysintern ("FD_CLOEXEC", scm_long2num (FD_CLOEXEC)); -#endif +#endif #include "filesys.x" } diff --git a/libguile/gh_data.c b/libguile/gh_data.c index 2c03982cd..cd4d838e3 100644 --- a/libguile/gh_data.c +++ b/libguile/gh_data.c @@ -44,6 +44,9 @@ #include #include +#ifdef HAVE_STRING_H +#include +#endif /* data conversion C->scheme */ SCM diff --git a/libguile/ports.c b/libguile/ports.c index 4460519f4..142fe46f8 100644 --- a/libguile/ports.c +++ b/libguile/ports.c @@ -56,6 +56,10 @@ #include "scm_validate.h" #include "ports.h" +#ifdef HAVE_STRING_H +#include +#endif + #ifdef HAVE_MALLOC_H #include #endif diff --git a/libguile/posix.c b/libguile/posix.c index 5ceeef637..757354390 100644 --- a/libguile/posix.c +++ b/libguile/posix.c @@ -173,12 +173,13 @@ SCM_DEFINE (scm_pipe, "pipe", 0, 0, 0, "the CDR is the output port. Data written (and flushed) to the\n" "output port can be read from the input port.\n" "Pipes are commonly used for communication with a newly\n" - "forked child process. @code{setvbuf} can be used to remove the\n" - "buffer from the output port: then data written will be\n" - "available at the input port even if the output port is not\n" - "flushed. Note that the output port is likely\n" - "to block if too much data is written without reading from\n" - "the input port." + "forked child process. The need to flush the output port\n" + "can be avoided by making it unbuffered using @code{setvbuf}.\n\n" + "Writes occur atomically provided the size of the data in\n" + "bytes is not greater than the value of @code{PIPE_BUF}\n" + "Note that the output port is likely to block if too much data\n" + "(typically equal to @code{PIPE_BUF}) has been written but not\n" + "yet read from the input port\n" ) #define FUNC_NAME s_scm_pipe { @@ -1315,6 +1316,10 @@ scm_init_posix () #ifdef LC_ALL scm_sysintern ("LC_ALL", SCM_MAKINUM (LC_ALL)); #endif +#ifdef PIPE_BUF +scm_sysintern ("PIPE_BUF", scm_long2num (PIPE_BUF)); +#endif + #include "cpp_sig_symbols.c" #include "posix.x" } diff --git a/libguile/script.c b/libguile/script.c index 4270d55df..064f50275 100644 --- a/libguile/script.c +++ b/libguile/script.c @@ -53,6 +53,10 @@ #include "script.h" +#ifdef HAVE_STRING_H +#include +#endif + #ifdef HAVE_UNISTD_H #include /* for X_OK define */ #endif diff --git a/libguile/strings.c b/libguile/strings.c index 44e42c91a..daf1cafe3 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000 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 @@ -85,65 +85,38 @@ SCM_DEFINE (scm_read_only_string_p, "read-only-string?", 1, 0, 0, } #undef FUNC_NAME -SCM_REGISTER_PROC(s_list_to_string, "list->string", 1, 0, 0, scm_string); - +SCM_REGISTER_PROC (s_scm_list_to_string, "list->string", 1, 0, 0, scm_string); SCM_DEFINE (scm_string, "string", 0, 0, 1, (SCM chrs), "Returns a newly allocated string composed of the arguments, CHRS.") #define FUNC_NAME s_scm_string { - SCM res; - register unsigned char *data; - long i; - long len; - SCM_DEFER_INTS; - i = scm_ilength (chrs); - if (i < 0) - { - SCM_ALLOW_INTS; - SCM_ASSERT (0, chrs, SCM_ARG1, FUNC_NAME); - } - len = 0; - { - SCM s; + SCM result; - for (len = 0, s = chrs; s != SCM_EOL; s = SCM_CDR (s)) - if (SCM_ICHRP (SCM_CAR (s))) - len += 1; - else if (SCM_ROSTRINGP (SCM_CAR (s))) - len += SCM_ROLENGTH (SCM_CAR (s)); - else - { - SCM_ALLOW_INTS; - SCM_ASSERT (0, s, SCM_ARG1, FUNC_NAME); - } + { + long i = scm_ilength (chrs); + + SCM_ASSERT (i >= 0, chrs, SCM_ARGn, FUNC_NAME); + result = scm_makstr (i, 0); } - res = scm_makstr (len, 0); - data = SCM_UCHARS (res); - for (;SCM_NNULLP (chrs);chrs = SCM_CDR (chrs)) - { - if (SCM_ICHRP (SCM_CAR (chrs))) - *data++ = SCM_ICHR (SCM_CAR (chrs)); - else - { - int l; - char * c; - l = SCM_ROLENGTH (SCM_CAR (chrs)); - c = SCM_ROCHARS (SCM_CAR (chrs)); - while (l) - { - --l; - *data++ = *c++; - } - } - } - SCM_ALLOW_INTS; - return res; + + { + unsigned char *data = SCM_UCHARS (result); + + while (SCM_NNULLP (chrs)) + { + SCM elt = SCM_CAR (chrs); + + SCM_VALIDATE_ICHR (SCM_ARGn, elt); + *data++ = SCM_ICHR (elt); + chrs = SCM_CDR (chrs); + } + } + return result; } #undef FUNC_NAME - SCM scm_makstr (long len, int slots) { @@ -212,21 +185,17 @@ scm_take0str (char *s) return scm_take_str (s, strlen (s)); } - SCM scm_makfromstr (const char *src, scm_sizet len, int slots) { - SCM s; - register char *dst; - s = scm_makstr ((long) len, slots); - dst = SCM_CHARS (s); + SCM s = scm_makstr (len, slots); + char *dst = SCM_CHARS (s); + while (len--) *dst++ = *src++; return s; } - - SCM scm_makfrom0str (const char *src) { @@ -281,16 +250,18 @@ SCM_DEFINE (scm_string_length, "string-length", 1, 0, 0, } #undef FUNC_NAME -SCM_DEFINE (scm_string_ref, "string-ref", 1, 1, 0, +SCM_DEFINE (scm_string_ref, "string-ref", 2, 0, 0, (SCM str, SCM k), "Returns character K of STR using zero-origin indexing.\n" "K must be a valid index of STR.") #define FUNC_NAME s_scm_string_ref { - SCM_VALIDATE_ROSTRING (1,str); - SCM_VALIDATE_INUM_DEF (2,k,0); - SCM_ASSERT_RANGE (2,k,SCM_INUM (k) < SCM_ROLENGTH (str) && SCM_INUM (k) >= 0); - return SCM_MAKICHR (SCM_ROUCHARS (str)[SCM_INUM (k)]); + int idx; + + SCM_VALIDATE_ROSTRING (1, str); + SCM_VALIDATE_INUM_COPY (2, k, idx); + SCM_ASSERT_RANGE (2, k, idx >= 0 && idx < SCM_ROLENGTH (str)); + return SCM_MAKICHR (SCM_ROUCHARS (str)[idx]); } #undef FUNC_NAME diff --git a/libguile/strings.h b/libguile/strings.h index d7decc92f..b91aba0c9 100644 --- a/libguile/strings.h +++ b/libguile/strings.h @@ -49,13 +49,9 @@ #include "libguile/__scm.h" -#ifdef HAVE_STRING_H -#include -#endif - -#define SCM_SLOPPY_STRINGP(x) ((SCM_TYP7S(x)==scm_tc7_string)) +#define SCM_SLOPPY_STRINGP(x) (SCM_TYP7S(x)==scm_tc7_string) #define SCM_STRINGP(x) (SCM_NIMP(x) && SCM_SLOPPY_STRINGP(x)) #define SCM_NSTRINGP(x) (!SCM_STRINGP(x)) @@ -66,23 +62,23 @@ -extern SCM scm_string_p SCM_P ((SCM x)); -extern SCM scm_read_only_string_p SCM_P ((SCM x)); -extern SCM scm_string SCM_P ((SCM chrs)); -extern SCM scm_makstr SCM_P ((long len, int slots)); -extern SCM scm_makfromstrs SCM_P ((int argc, char **argv)); -extern SCM scm_take_str SCM_P ((char *s, int len)); -extern SCM scm_take0str SCM_P ((char *s)); -extern SCM scm_makfromstr SCM_P ((const char *src, scm_sizet len, int slots)); -extern SCM scm_makfrom0str SCM_P ((const char *src)); -extern SCM scm_makfrom0str_opt SCM_P ((const char *src)); -extern SCM scm_make_string SCM_P ((SCM k, SCM chr)); -extern SCM scm_string_length SCM_P ((SCM str)); -extern SCM scm_string_ref SCM_P ((SCM str, SCM k)); -extern SCM scm_string_set_x SCM_P ((SCM str, SCM k, SCM chr)); -extern SCM scm_substring SCM_P ((SCM str, SCM start, SCM end)); -extern SCM scm_string_append SCM_P ((SCM args)); -extern SCM scm_make_shared_substring SCM_P ((SCM str, SCM frm, SCM to)); -extern void scm_init_strings SCM_P ((void)); +extern SCM scm_string_p (SCM x); +extern SCM scm_read_only_string_p (SCM x); +extern SCM scm_string (SCM chrs); +extern SCM scm_makstr (long len, int slots); +extern SCM scm_makfromstrs (int argc, char **argv); +extern SCM scm_take_str (char *s, int len); +extern SCM scm_take0str (char *s); +extern SCM scm_makfromstr (const char *src, scm_sizet len, int slots); +extern SCM scm_makfrom0str (const char *src); +extern SCM scm_makfrom0str_opt (const char *src); +extern SCM scm_make_string (SCM k, SCM chr); +extern SCM scm_string_length (SCM str); +extern SCM scm_string_ref (SCM str, SCM k); +extern SCM scm_string_set_x (SCM str, SCM k, SCM chr); +extern SCM scm_substring (SCM str, SCM start, SCM end); +extern SCM scm_string_append (SCM args); +extern SCM scm_make_shared_substring (SCM str, SCM frm, SCM to); +extern void scm_init_strings (void); #endif /* STRINGSH */ diff --git a/libguile/strop.c b/libguile/strop.c index 641599905..b596f31d0 100644 --- a/libguile/strop.c +++ b/libguile/strop.c @@ -30,6 +30,11 @@ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA #include "scm_validate.h" #include "strop.h" #include "read.h" /*For SCM_CASE_INSENSITIVE_P*/ + +#ifdef HAVE_STRING_H +#include +#endif + /*