1996-07-25 22:56:11 +00:00
|
|
|
|
/* classes: h_files */
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __SCMH
|
|
|
|
|
|
#define __SCMH
|
* __scm.h, backtrace.c, backtrace.h, debug.c, debug.h, dynl-dld.c,
dynwind.c, dynwind.h, eval.h, evalext.c, evalext.h, feature.c,
feature.h, hashtab.c, hashtab.h, objects.c, objects.h, print.c,
procs.c, procs.h, smob.c, smob.h, srcprop.c, strorder.c, struct.c,
struct.h: Updated copyrigth notices.
1999-09-12 11:16:13 +00:00
|
|
|
|
/* Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
|
1996-07-25 22:56:11 +00:00
|
|
|
|
*
|
|
|
|
|
|
* 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
|
1997-05-26 22:34:48 +00:00
|
|
|
|
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
|
|
|
|
* Boston, MA 02111-1307 USA
|
1996-07-25 22:56:11 +00:00
|
|
|
|
*
|
|
|
|
|
|
* 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.
|
1997-05-26 22:34:48 +00:00
|
|
|
|
* If you do not wish that, delete this exception notice. */
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
/* {Supported Options}
|
|
|
|
|
|
*
|
|
|
|
|
|
* These may be defined or undefined.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
* dynl.c, error.c, eval.c, feature.c, filesys.c, fports.c, list.c, load.c,
net_db.c, read.c, socket.c: Update error messages to use ~A for
%s, ~S for %S to work with new `simple-format' format and be
standardized better.
* print.h, print.c (scm_simple_format): Added `simple-format'
primitive. It's the old scm_display_error, with ARGS now a rest
parameter, and the destination first instead of last (and a couple
new capabilities inspired by `format' -- #t as destination means
current-output-port, #f means return the formatted text as a
string.
* gh.h, gh_data.c, ports.h, ports.c: Added some missing const specifications.
* backtrace.c (scm_display_error_message): Rewrote to use
scm_simple_format() procedure.
* __scm.h: Added commented-out #define of GUILE_DEBUG_FREELIST
2000-01-11 18:48:57 +00:00
|
|
|
|
/* #define GUILE_DEBUG_FREELIST */
|
|
|
|
|
|
|
* (__scm.h, alist.c, eval.c, feature.c, gsubr.c, numbers.c,
options.c): Rename RECKLESS -> SCM_RECKLESS, CAUTIOUS ->
SCM_CAUTIOUS; this way, 1) there's only one version of each flag
to define (we used to have both RECKLESS and SCM_RECKLESS), and 2)
if we want to use them in a header file some day, we can. (Thanks
to Michael Livshin.)
1998-10-14 07:32:13 +00:00
|
|
|
|
/* If the compile FLAG `SCM_CAUTIOUS' is #defined then the number of
|
1996-07-25 22:56:11 +00:00
|
|
|
|
* arguments is always checked for application of closures. If the
|
* (__scm.h, alist.c, eval.c, feature.c, gsubr.c, numbers.c,
options.c): Rename RECKLESS -> SCM_RECKLESS, CAUTIOUS ->
SCM_CAUTIOUS; this way, 1) there's only one version of each flag
to define (we used to have both RECKLESS and SCM_RECKLESS), and 2)
if we want to use them in a header file some day, we can. (Thanks
to Michael Livshin.)
1998-10-14 07:32:13 +00:00
|
|
|
|
* compile FLAG `SCM_RECKLESS' is #defined then they are not checked.
|
1996-07-25 22:56:11 +00:00
|
|
|
|
* Otherwise, number of argument checks for closures are made only when
|
|
|
|
|
|
* the function position (whose value is the closure) of a combination is
|
|
|
|
|
|
* not an ILOC or GLOC. When the function position of a combination is a
|
|
|
|
|
|
* symbol it will be checked only the first time it is evaluated because
|
|
|
|
|
|
* it will then be replaced with an ILOC or GLOC.
|
|
|
|
|
|
*/
|
* (__scm.h, alist.c, eval.c, feature.c, gsubr.c, numbers.c,
options.c): Rename RECKLESS -> SCM_RECKLESS, CAUTIOUS ->
SCM_CAUTIOUS; this way, 1) there's only one version of each flag
to define (we used to have both RECKLESS and SCM_RECKLESS), and 2)
if we want to use them in a header file some day, we can. (Thanks
to Michael Livshin.)
1998-10-14 07:32:13 +00:00
|
|
|
|
#undef SCM_RECKLESS
|
|
|
|
|
|
#define SCM_CAUTIOUS
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
/* After looking up a local for the first time, rewrite the
|
|
|
|
|
|
* code graph, caching its position.
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define MEMOIZE_LOCALS
|
|
|
|
|
|
|
|
|
|
|
|
/* All the number support there is.
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define SCM_FLOATS
|
|
|
|
|
|
#define BIGNUMS
|
|
|
|
|
|
|
|
|
|
|
|
/* GC should relinquish empty cons-pair arenas.
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define GC_FREE_SEGMENTS
|
|
|
|
|
|
|
|
|
|
|
|
/* Provide a scheme-accessible count-down timer that
|
|
|
|
|
|
* generates a pseudo-interrupt.
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define TICKS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Use engineering notation when converting numbers strings?
|
|
|
|
|
|
*/
|
|
|
|
|
|
#undef ENGNOT
|
|
|
|
|
|
|
|
|
|
|
|
#undef SCM_CAREFUL_INTS
|
|
|
|
|
|
|
|
|
|
|
|
/* {Unsupported Options}
|
|
|
|
|
|
*
|
1996-10-03 05:02:36 +00:00
|
|
|
|
* These must be defined as given here.
|
1996-07-25 22:56:11 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CCLO
|
1996-10-03 05:02:36 +00:00
|
|
|
|
|
|
|
|
|
|
/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
|
|
|
|
|
|
have horrible plans for their unification. */
|
|
|
|
|
|
#undef SICP
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1996-08-23 01:18:28 +00:00
|
|
|
|
/* Random options (not yet supported or in final form). */
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
1996-08-23 01:18:28 +00:00
|
|
|
|
#define STACK_CHECKING
|
|
|
|
|
|
#undef NO_CEVAL_STACK_CHECKING
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-02-08 22:16:15 +00:00
|
|
|
|
|
|
|
|
|
|
/* What did the configure script discover about the outside world? */
|
|
|
|
|
|
#include "libguile/scmconfig.h"
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_LONG_LONGS
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
/* Some auto-generated .h files contain unused prototypes
|
|
|
|
|
|
* that need these typedefs.
|
|
|
|
|
|
*/
|
* acconfig.h: add HAVE_ARRAYS.
* configure.in: add --disable-arrays option, probably temporary.
* the following changes allow guile to be built with the array
"module" omitted. some of this stuff is just tc7 type support,
which wouldn't be needed if uniform array types were converted
to smobs.
* tag.c (scm_utag_bvect ... scm_utag_cvect): don't define unless
HAVE_ARRAYS.
(scm_tag): don't check array types unless HAVE_ARRAYS.
* sort.c (scm_restricted_vector_sort_x, scm_sorted_p):
remove the unused array types.
* (scm_stable_sort, scm_sort): don't support vectors if not
HAVE_ARRAYS. a bit excessive.
* random.c (vector_scale, vector_sum_squares,
scm_random_solid_sphere_x, scm_random_hollow_sphere_x,
scm_random_normal_vector_x): don't define unless HAVE_ARRAYS.
* gh_data.c (makvect, gh_chars2byvect, gh_shorts2svect,
gh_longs2ivect, gh_ulongs2uvect, gh_floats2fvect, gh_doubles2dvect,
gh_uniform_vector_length, gh_uniform_vector_ref):
don't define unless HAVE_ARRAYS.
(gh_scm2chars, gh_scm2shorts, gh_scm2longs, gh_scm2floats,
gh_scm2doubles):
don't check vector types if not HAVE_ARRAYS.
* eq.c (scm_equal_p), eval.c (SCM_CEVAL), print.c (scm_iprin1),
gc.c (scm_gc_mark, scm_gc_sweep), objects.c (scm_class_of):
don't support the array types unless HAVE_ARRAYS is defined.
* tags.h: make nine tc7 types conditional on HAVE_ARRAYS.
* read.c (scm_lreadr): don't check for #* unless HAVE_ARRAYS is
defined (this should use read-hash-extend).
* ramap.c, unif.c: don't check whether ARRAYS is defined.
* vectors.c (scm_vector_set_length_x): moved here from unif.c. call
scm_uniform_element_size if HAVE_ARRAYS.
vectors.h: prototype too.
* unif.c (scm_uniform_element_size): new procedure.
* init.c (scm_boot_guile_1): don't call scm_init_ramap or
scm_init_unif unless HAVE_ARRAYS is defined.
* __scm.h: don't define ARRAYS.
* Makefile.am (EXTRA_libguile_la_SOURCES): unif.c and ramap.c
moved here from libguile_la_SOURCES.
* Makefile.am (ice9_sources): add arrays.scm.
* boot-9.scm: load arrays.scm if 'array is provided.
* arrays.scm: new file with stuff from boot-9.scm.
1999-11-19 18:16:19 +00:00
|
|
|
|
typedef long long long_long;
|
|
|
|
|
|
typedef unsigned long long ulong_long;
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-02-08 22:16:15 +00:00
|
|
|
|
#endif /* HAVE_LONG_LONGS */
|
1996-08-15 07:17:00 +00:00
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Define
|
|
|
|
|
|
*
|
* __scm.h, chars.c, debug.c, eval.c, eval.h, extchrs.c, extchrs.h,
fdsocket.c, feature.c, mbstrings.c, mbstrings.h, numbers.c,
numbers.h, print.c, scmhob.h, simpos.h, symbols.c, symbols.h,
tags.h, throw.c, variable.h: Name cleanup. Lots of xxxSCM_yyy
removed. (These were introduced by unsupervised name
substitution.)
1996-09-13 11:07:24 +00:00
|
|
|
|
* SCM_CHAR_CODE_LIMIT == UCHAR_MAX + 1
|
1996-07-25 22:56:11 +00:00
|
|
|
|
* SCM_MOST_POSITIVE_FIXNUM (LONG_MAX>>2)
|
|
|
|
|
|
* SCM_MOST_NEGATIVE_FIXNUM == SCM_SRS((long)LONG_MIN, 2)
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
1996-08-15 07:17:00 +00:00
|
|
|
|
#ifdef HAVE_LIMITS_H
|
1996-07-25 22:56:11 +00:00
|
|
|
|
# include <limits.h>
|
|
|
|
|
|
# ifdef UCHAR_MAX
|
* __scm.h, chars.c, debug.c, eval.c, eval.h, extchrs.c, extchrs.h,
fdsocket.c, feature.c, mbstrings.c, mbstrings.h, numbers.c,
numbers.h, print.c, scmhob.h, simpos.h, symbols.c, symbols.h,
tags.h, throw.c, variable.h: Name cleanup. Lots of xxxSCM_yyy
removed. (These were introduced by unsupervised name
substitution.)
1996-09-13 11:07:24 +00:00
|
|
|
|
# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX+1L)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
# else
|
* __scm.h, chars.c, debug.c, eval.c, eval.h, extchrs.c, extchrs.h,
fdsocket.c, feature.c, mbstrings.c, mbstrings.h, numbers.c,
numbers.h, print.c, scmhob.h, simpos.h, symbols.c, symbols.h,
tags.h, throw.c, variable.h: Name cleanup. Lots of xxxSCM_yyy
removed. (These were introduced by unsupervised name
substitution.)
1996-09-13 11:07:24 +00:00
|
|
|
|
# define SCM_CHAR_CODE_LIMIT 256L
|
1996-07-25 22:56:11 +00:00
|
|
|
|
# endif /* def UCHAR_MAX */
|
|
|
|
|
|
# define SCM_MOST_POSITIVE_FIXNUM (LONG_MAX>>2)
|
|
|
|
|
|
# ifdef _UNICOS /* Stupid cray bug */
|
|
|
|
|
|
# define SCM_MOST_NEGATIVE_FIXNUM ((long)LONG_MIN/4)
|
|
|
|
|
|
# else
|
|
|
|
|
|
# define SCM_MOST_NEGATIVE_FIXNUM SCM_SRS((long)LONG_MIN, 2)
|
|
|
|
|
|
# endif /* UNICOS */
|
|
|
|
|
|
#else
|
* __scm.h, chars.c, debug.c, eval.c, eval.h, extchrs.c, extchrs.h,
fdsocket.c, feature.c, mbstrings.c, mbstrings.h, numbers.c,
numbers.h, print.c, scmhob.h, simpos.h, symbols.c, symbols.h,
tags.h, throw.c, variable.h: Name cleanup. Lots of xxxSCM_yyy
removed. (These were introduced by unsupervised name
substitution.)
1996-09-13 11:07:24 +00:00
|
|
|
|
# define SCM_CHAR_CODE_LIMIT 256L
|
1996-07-25 22:56:11 +00:00
|
|
|
|
# define SCM_MOST_POSITIVE_FIXNUM ((long)((unsigned long)~0L>>3))
|
|
|
|
|
|
# if (0 != ~0)
|
|
|
|
|
|
# define SCM_MOST_NEGATIVE_FIXNUM (-SCM_MOST_POSITIVE_FIXNUM-1)
|
|
|
|
|
|
# else
|
|
|
|
|
|
# define SCM_MOST_NEGATIVE_FIXNUM (-SCM_MOST_POSITIVE_FIXNUM)
|
|
|
|
|
|
# endif /* (0 != ~0) */
|
1996-08-15 07:17:00 +00:00
|
|
|
|
#endif /* def HAVE_LIMITS_H */
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
* __scm.h: Doc fixes.
* __scm.h, libguile.h: Use "quotes" in the #includes, not
<angles>; this allows `make depends' to work properly.
C files should #include only the header files they need, not
libguile.h (which #includes all the header files); the pointless
recompilation was wasting my time.
* Makefile.in (all .o dependency lists): Regenerated.
* libguile.h: Don't try to get a definition for size_t here...
* __scm.h: Do it here.
* _scm.h: Since this is the internal libguile header, put things
here that all (or a majority) of the libguile files will want.
Don't #include <libguile.h> here; that generates dependencies on
way too much. Instead, get "__scm.h", "error.h", "pairs.h",
"list.h", "gc.h", "gsubr.h", "procs.h", "numbers.h", "symbols.h",
"boolean.h", "strings.h", "vectors.h", "root.h", "ports.h", and
"async.h".
* alist.c: Get "eq.h", "list.h", "alist.h".
* append.c: Get "append.h", "list.h".
* arbiters.c: Get "arbiters.h", "smob.h".
* async.c: Get "async.h", "smob.h", "throw.h", "eval.h".
* boolean.c: Get "boolean.h".
* chars.c: Get "chars.h".
* continuations.c: Get "continuations.h", "dynwind.h", "debug.h",
"stackchk.h".
* debug.c: Get "debug.h", "feature.h", "read.h", "strports.h",
"continuations.h", "alist.h", "srcprop.h", "procprop.h", "smob.h",
"genio.h", "throw.h", "eval.h".
* dynwind.c: Get "dynwind.h", "alist.h", "eval.h".
* eq.c: Get "eq.h", "unif.h", "smob.h", "strorder.h",
"stackchk.h".
* error.c: Get "error.h", "throw.h", "genio.h", "pairs.h".
* eval.c: Get "eval.h", "stackchk.h", "srcprop.h", "debug.h",
"hashtab.h", "procprop.h", "markers.h", "smob.h", "throw.h",
"continuations.h", "eq.h", "sequences.h", "alist.h", "append.h",
"debug.h".
* fdsocket.c: Get "fdsocket.h", "unif.h", "filesys.h".
* feature.c: Get "feature.h".
* files.c: Get "files.h".
* filesys.c: Get "filesys.h", "smob.h", "genio.h".
* fports.c: Get "fports.h", "markers.h".
* gc.c: Get "async.h", "unif.h", "smob.h", "weaks.h",
"genio.h", "struct.h", "stackchk.h", "stime.h".
* gdbint.c: Get "gdbint.h", "chars.h", "eval.h", "print.h",
"read.h", "strports.h", "tag.h".
* genio.c: Get "genio.h", "chars.h".
* gsubr.c: Get "gsubr.h", "genio.h".
* hash.c: Get "hash.h", "chars.h".
* hashtab.c: Get "hashtab.h", "eval.h", "hash.h", "alist.h".
* init.c: Get everyone who has an scm_init_mumble function:
"weaks.h", "vports.h", "version.h", "vectors.h", "variable.h",
"unif.h", "throw.h", "tag.h", "symbols.h", "struct.h",
"strports.h", "strorder.h", "strop.h", "strings.h", "stime.h",
"stackchk.h", "srcprop.h", "socket.h", "simpos.h", "sequences.h",
"scmsigs.h", "read.h", "ramap.h", "procs.h", "procprop.h",
"print.h", "posix.h", "ports.h", "pairs.h", "options.h",
"objprop.h", "numbers.h", "mbstrings.h", "mallocs.h", "load.h",
"list.h", "kw.h", "ioext.h", "hashtab.h", "hash.h", "gsubr.h",
"gdbint.h", "gc.h", "fports.h", "filesys.h", "files.h",
"feature.h", "fdsocket.h", "eval.h", "error.h", "eq.h",
"dynwind.h", "debug.h", "continuations.h", "chars.h", "boolean.h",
"async.h", "arbiters.h", "append.h", "alist.h".
* ioext.c: Get "ioext.h", "fports.h".
* kw.c: Get "kw.h", "smob.h", "mbstrings.h", "genio.h".
* list.c: Get "list.h", "eq.h".
* load.c: Get "load.h", "eval.h", "read.h", "fports.h".
* mallocs.c: Get "smob.h", "genio.h".
* markers.c: Get "markers.h".
* mbstrings.c: Get "mbstrings.h", "read.h", "genio.h", "unif.h",
"chars.h".
* numbers.c: Get "unif.h", "genio.h".
* objprop.c: Get "objprop.h", "weaks.h", "alist.h", "hashtab.h".
* options.c: Get "options.h".
* ports.c: Get "ports.h", "vports.h", "strports.h", "fports.h",
"markers.h", "chars.h", "genio.h".
* posix.c: Get "posix.h", "sequences.h", "feature.h", "unif.h",
"read.h", "scmsigs.h", "genio.h", "fports.h".
* print.c: Get "print.h", "unif.h", "weaks.h", "read.h",
"procprop.h", "eval.h", "smob.h", "mbstrings.h", "genio.h",
"chars.h".
* procprop.c: Get "procprop.h", "eval.h", "alist.h".
* procs.c: Get "procs.h".
* ramap.c: Get "ramap.h", "feature.h", "eval.h", "eq.h",
"chars.h", "smob.h", "unif.h".
* read.c: Get "alist.h", "kw.h", "mbstrings.h", "unif.h",
"eval.h", "genio.h", "chars.h".
* root.c: Get "root.h", "stackchk.h".
* scmsigs.c: Get "scmsigs.h".
* sequences.c: Get "sequences.h".
* simpos.c: Get "simpos.h", "scmsigs.h".
* smob.c: Get "smob.h".
* socket.c: Get "socket.h", "feature.h".
* srcprop.c: Get "srcprop.h", "weaks.h", "hashtab.h", "debug.h",
"alist.h", "smob.h".
* stackchk.c: Get "stackchk.h", "genio.h".
* stime.c: Get "stime.h"."libguile/continuations.h".
* strings.c: Get "strings.h", "chars.h".
* strop.c: Get "strop.h", "chars.h".
* strorder.c: Get "strorder.h", "chars.h".
* strports.c: Get "strports.h", "print.h", "eval.h", "unif.h".
* struct.c: Get "struct.h", "chars.h".
* symbols.c: Get "symbols.h", "mbstrings.h", "alist.h",
"variable.h", "eval.h", "chars.h".
* tag.c: Get "tag.h", "struct.h", "chars.h".
* throw.c: Get "throw.h", "continuations.h", "debug.h",
"dynwind.h", "eval.h", "alist.h", "smob.h", "genio.h".
* unif.c: Get "unif.h", "feature.h", "strop.h", "sequences.h",
"smob.h", "genio.h", "eval.h", "chars.h".
* variable.c: Get "variable.h", "smob.h", "genio.h".
* vectors.c: Get "vectors.h", "eq.h".
* version.c: Get "version.h".
* vports.c: Get "vports.h", "fports.h", "chars.h", "eval.h".
* weaks.c: Get "weaks.h".
1996-09-10 02:26:35 +00:00
|
|
|
|
#ifdef STDC_HEADERS
|
|
|
|
|
|
# include <stdlib.h>
|
|
|
|
|
|
# ifdef AMIGA
|
|
|
|
|
|
# include <stddef.h>
|
|
|
|
|
|
# endif /* def AMIGA */
|
|
|
|
|
|
# define scm_sizet size_t
|
|
|
|
|
|
#else
|
|
|
|
|
|
# ifdef _SIZE_T
|
|
|
|
|
|
# define scm_sizet size_t
|
|
|
|
|
|
# else
|
|
|
|
|
|
# define scm_sizet unsigned int
|
|
|
|
|
|
# endif /* def _SIZE_T */
|
|
|
|
|
|
#endif /* def STDC_HEADERS */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "libguile/tags.h"
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef vms
|
|
|
|
|
|
# ifndef CHEAP_CONTINUATIONS
|
|
|
|
|
|
typedef int jmp_buf[17];
|
|
|
|
|
|
extern int setjump(jmp_buf env);
|
|
|
|
|
|
extern int longjump(jmp_buf env, int ret);
|
|
|
|
|
|
# define setjmp setjump
|
|
|
|
|
|
# define longjmp longjump
|
|
|
|
|
|
# else
|
|
|
|
|
|
# include <setjmp.h>
|
|
|
|
|
|
# endif
|
|
|
|
|
|
#else /* ndef vms */
|
|
|
|
|
|
# ifdef _CRAY1
|
|
|
|
|
|
typedef int jmp_buf[112];
|
|
|
|
|
|
extern int setjump(jmp_buf env);
|
|
|
|
|
|
extern int longjump(jmp_buf env, int ret);
|
|
|
|
|
|
# define setjmp setjump
|
|
|
|
|
|
# define longjmp longjump
|
|
|
|
|
|
# else /* ndef _CRAY1 */
|
|
|
|
|
|
# include <setjmp.h>
|
|
|
|
|
|
# endif /* ndef _CRAY1 */
|
|
|
|
|
|
#endif /* ndef vms */
|
|
|
|
|
|
|
|
|
|
|
|
/* James Clark came up with this neat one instruction fix for
|
|
|
|
|
|
* continuations on the SPARC. It flushes the register windows so
|
|
|
|
|
|
* that all the state of the process is contained in the stack.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef sparc
|
|
|
|
|
|
# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
|
|
|
|
|
|
#else
|
|
|
|
|
|
# define SCM_FLUSH_REGISTER_WINDOWS /* empty */
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/* If stack is not longword aligned then
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* #define SHORT_ALIGN */
|
|
|
|
|
|
#ifdef THINK_C
|
|
|
|
|
|
# define SHORT_ALIGN
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef MSDOS
|
|
|
|
|
|
# define SHORT_ALIGN
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef atarist
|
|
|
|
|
|
# define SHORT_ALIGN
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef SHORT_ALIGN
|
|
|
|
|
|
typedef short SCM_STACKITEM;
|
|
|
|
|
|
#else
|
|
|
|
|
|
typedef long SCM_STACKITEM;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
1996-10-01 03:15:04 +00:00
|
|
|
|
#ifndef USE_THREADS
|
1996-11-02 20:52:39 +00:00
|
|
|
|
#define SCM_THREAD_DEFER
|
|
|
|
|
|
#define SCM_THREAD_ALLOW
|
|
|
|
|
|
#define SCM_THREAD_REDEFER
|
|
|
|
|
|
#define SCM_THREAD_REALLOW_1
|
|
|
|
|
|
#define SCM_THREAD_REALLOW_2
|
|
|
|
|
|
#define SCM_THREAD_SWITCHING_CODE
|
1996-10-01 03:15:04 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
extern unsigned int scm_async_clock;
|
1996-10-01 03:15:04 +00:00
|
|
|
|
|
1996-11-02 20:52:39 +00:00
|
|
|
|
#define SCM_ASYNC_TICK \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1996-11-02 20:52:39 +00:00
|
|
|
|
if (0 == --scm_async_clock) \
|
|
|
|
|
|
scm_async_click (); \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while(0)
|
1996-11-02 20:52:39 +00:00
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#ifdef SCM_CAREFUL_INTS
|
|
|
|
|
|
#define SCM_CHECK_NOT_DISABLED \
|
|
|
|
|
|
if (scm_ints_disabled) \
|
|
|
|
|
|
fputs("ints already disabled\n", stderr); \
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_CHECK_NOT_ENABLED \
|
|
|
|
|
|
if (!scm_ints_disabled) \
|
|
|
|
|
|
fputs("ints already enabled\n", stderr); \
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define SCM_CHECK_NOT_DISABLED
|
|
|
|
|
|
#define SCM_CHECK_NOT_ENABLED
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
1997-06-23 00:51:35 +00:00
|
|
|
|
/* Anthony Green writes:
|
|
|
|
|
|
When the compiler sees...
|
|
|
|
|
|
DEFER_INTS;
|
|
|
|
|
|
[critical code here]
|
|
|
|
|
|
ALLOW_INTS;
|
|
|
|
|
|
...it doesn't actually promise to keep the critical code within the
|
|
|
|
|
|
boundries of the DEFER/ALLOW_INTS instructions. It may very well
|
|
|
|
|
|
schedule it outside of the magic defined in those macros.
|
|
|
|
|
|
|
|
|
|
|
|
However, GCC's volatile asm feature forms a barrier over which code is
|
|
|
|
|
|
never moved. So if you add...
|
1999-02-12 10:13:20 +00:00
|
|
|
|
asm ("");
|
|
|
|
|
|
...to each of the DEFER_INTS and ALLOW_INTS macros, the critical
|
|
|
|
|
|
code will always remain in place. asm's without inputs or outputs
|
|
|
|
|
|
are implicitly volatile. */
|
1997-06-23 00:51:35 +00:00
|
|
|
|
#ifdef __GNUC__
|
1999-02-12 10:13:20 +00:00
|
|
|
|
#define SCM_FENCE asm /* volatile */ ("")
|
1997-06-23 00:51:35 +00:00
|
|
|
|
#else
|
|
|
|
|
|
#define SCM_FENCE
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#define SCM_DEFER_INTS \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1997-06-23 00:51:35 +00:00
|
|
|
|
SCM_FENCE; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
SCM_CHECK_NOT_DISABLED; \
|
1996-11-02 20:52:39 +00:00
|
|
|
|
SCM_THREAD_DEFER; \
|
1997-06-23 00:51:35 +00:00
|
|
|
|
SCM_FENCE; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
scm_ints_disabled = 1; \
|
1997-06-23 00:51:35 +00:00
|
|
|
|
SCM_FENCE; \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while (0)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_ALLOW_INTS_ONLY \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1996-11-02 20:52:39 +00:00
|
|
|
|
SCM_THREAD_ALLOW; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
scm_ints_disabled = 0; \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while (0)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_ALLOW_INTS \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1997-06-23 00:51:35 +00:00
|
|
|
|
SCM_FENCE; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
SCM_CHECK_NOT_ENABLED; \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_THREAD_SWITCHING_CODE; \
|
|
|
|
|
|
SCM_FENCE; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
scm_ints_disabled = 0; \
|
1997-06-23 00:51:35 +00:00
|
|
|
|
SCM_FENCE; \
|
|
|
|
|
|
SCM_THREAD_ALLOW; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
SCM_ASYNC_TICK; \
|
1997-06-23 00:51:35 +00:00
|
|
|
|
SCM_FENCE; \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while (0)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_REDEFER_INTS \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_FENCE; \
|
1996-11-02 20:52:39 +00:00
|
|
|
|
SCM_THREAD_REDEFER; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
++scm_ints_disabled; \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_FENCE; \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while (0)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_REALLOW_INTS \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_FENCE; \
|
1996-11-02 20:52:39 +00:00
|
|
|
|
SCM_THREAD_REALLOW_1; \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_THREAD_SWITCHING_CODE; \
|
|
|
|
|
|
SCM_FENCE; \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
--scm_ints_disabled; \
|
|
|
|
|
|
if (!scm_ints_disabled) \
|
1996-11-02 20:52:39 +00:00
|
|
|
|
{ \
|
|
|
|
|
|
SCM_THREAD_REALLOW_2; \
|
|
|
|
|
|
SCM_ASYNC_TICK; \
|
|
|
|
|
|
} \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_FENCE; \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while (0)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
1998-01-30 21:06:16 +00:00
|
|
|
|
#define SCM_TICK \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
do { \
|
1998-01-30 21:06:16 +00:00
|
|
|
|
SCM_DEFER_INTS; \
|
|
|
|
|
|
SCM_ALLOW_INTS; \
|
1999-09-28 00:18:16 +00:00
|
|
|
|
} while (0)
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1998-04-19 20:16:36 +00:00
|
|
|
|
/* Classification of critical sections
|
|
|
|
|
|
*
|
|
|
|
|
|
* When Guile moves to POSIX threads, it won't be possible to prevent
|
|
|
|
|
|
* context switching. In fact, the whole idea of context switching is
|
|
|
|
|
|
* bogus if threads are run by different processors. Therefore, we
|
|
|
|
|
|
* must ultimately eliminate all critical sections or enforce them by
|
|
|
|
|
|
* use of mutecis.
|
|
|
|
|
|
*
|
|
|
|
|
|
* All instances of SCM_DEFER_INTS and SCM_ALLOW_INTS should therefore
|
|
|
|
|
|
* be classified and replaced by one of the delimiters below. If you
|
|
|
|
|
|
* understand what this is all about, I'd like to encourage you to
|
|
|
|
|
|
* help with this task. The set of classes below must of course be
|
|
|
|
|
|
* incrementally augmented.
|
|
|
|
|
|
*
|
|
|
|
|
|
* MDJ 980419 <djurfeldt@nada.kth.se>
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* A sections
|
|
|
|
|
|
*
|
|
|
|
|
|
* Allocation of a cell with type tag in the CAR.
|
|
|
|
|
|
*
|
|
|
|
|
|
* With POSIX threads, each thread will have a private pool of free
|
|
|
|
|
|
* cells. Therefore, this type of section can be removed. But! It
|
|
|
|
|
|
* is important that the CDR is initialized first (with the CAR still
|
|
|
|
|
|
* indicating a free cell) so that we can guarantee a consistent heap
|
|
|
|
|
|
* at all times.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef SCM_POSIX_THREADS
|
|
|
|
|
|
#define SCM_ENTER_A_SECTION
|
|
|
|
|
|
#define SCM_EXIT_A_SECTION
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define SCM_ENTER_A_SECTION SCM_DEFER_INTS
|
|
|
|
|
|
#define SCM_EXIT_A_SECTION SCM_ALLOW_INTS
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
/** SCM_ASSERT
|
|
|
|
|
|
**
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef SCM_RECKLESS
|
|
|
|
|
|
#define SCM_ASSERT(_cond, _arg, _pos, _subr)
|
|
|
|
|
|
#define SCM_ASRTGO(_cond, _label)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
|
|
|
|
|
|
if (!(_cond)) \
|
|
|
|
|
|
scm_wta(_arg, (char *)(_pos), _subr)
|
|
|
|
|
|
#define SCM_ASRTGO(_cond, _label) \
|
|
|
|
|
|
if (!(_cond)) \
|
|
|
|
|
|
goto _label
|
|
|
|
|
|
#endif
|
1996-08-07 09:46:41 +00:00
|
|
|
|
|
* procs.c, procs.h (scm_subr_entry): New type: Stores data
associated with subrs.
(SCM_SUBRNUM, SCM_SUBR_ENTRY, SCM_SUBR_GENERIC, SCM_SUBR_PROPS,
SCM_SUBR_DOC): New macros.
(scm_subr_table): New variable.
(scm_mark_subr_table): New function.
* init.c (scm_boot_guile_1): Call scm_init_subr_table.
* gc.c (scm_gc_mark): Don't mark subr names here.
(scm_igc): Call scm_mark_subr_table.
* snarf.h (SCM_GPROC, SCM_GPROC1): New macros.
* procs.c, procs.h (scm_subr_p): New function (used internally).
* gsubr.c, gsubr.h (scm_make_gsubr_with_generic): New function.
* objects.c, objects.h (scm_primitive_generic): New class.
* objects.h (SCM_CMETHOD_CODE, SCM_CMETHOD_ENV): New macros.
* print.c (scm_iprin1): Print primitive-generics.
* __scm.h (SCM_WTA_DISPATCH_1, SCM_GASSERT1,
SCM_WTA_DISPATCH_2, SCM_GASSERT2): New macros.
* eval.c (SCM_CEVAL, SCM_APPLY): Replace scm_wta -->
SCM_WTA_DISPATCH_1 for scm_cxr's (unary floating point
primitives). NOTE: This means that it is now *required* to use
SCM_GPROC1 when creating float scm_cxr's (float scm_cxr's is an
obscured representation that will be removed in the future anyway,
so backward compatibility is no problem here).
* numbers.c: Converted most numeric primitives (all but bit
comparison operations and bit operations) to dispatch on generic
if args don't match.
* eval.c, eval.h (scm_eval_body): New function.
* objects.c (scm_call_generic_0, scm_call_generic_1,
scm_call_generic_2, scm_call_generic_3, scm_apply_generic): New
functions.
* eval.c (SCM_CEVAL): Apply the cmethod directly after having
called scm_memoize_method instead of doing a second lookup.
* objects.h (scm_memoize_method): Now returns the memoized cmethod.
* procs.c (scm_make_subr_opt): Use scm_sysintern0 instead of
scm_sysintern so that the binding connected with the subr name
isn't cleared when we give set = 0.
1999-08-26 04:24:42 +00:00
|
|
|
|
/*
|
|
|
|
|
|
* SCM_WTA_DISPATCH
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
1999-09-20 22:09:21 +00:00
|
|
|
|
extern SCM scm_call_generic_0 (SCM gf);
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_WTA_DISPATCH_0(gf, arg, pos, subr) \
|
|
|
|
|
|
return ((gf) \
|
|
|
|
|
|
? scm_call_generic_0 ((gf)) \
|
|
|
|
|
|
: scm_wta ((arg), (char *) (pos), (subr)))
|
|
|
|
|
|
#define SCM_GASSERT0(cond, gf, arg, pos, subr) \
|
1999-09-20 22:25:10 +00:00
|
|
|
|
if (!(cond)) SCM_WTA_DISPATCH_0((gf), (arg), (pos), (subr))
|
1999-09-20 22:09:21 +00:00
|
|
|
|
|
* procs.c, procs.h (scm_subr_entry): New type: Stores data
associated with subrs.
(SCM_SUBRNUM, SCM_SUBR_ENTRY, SCM_SUBR_GENERIC, SCM_SUBR_PROPS,
SCM_SUBR_DOC): New macros.
(scm_subr_table): New variable.
(scm_mark_subr_table): New function.
* init.c (scm_boot_guile_1): Call scm_init_subr_table.
* gc.c (scm_gc_mark): Don't mark subr names here.
(scm_igc): Call scm_mark_subr_table.
* snarf.h (SCM_GPROC, SCM_GPROC1): New macros.
* procs.c, procs.h (scm_subr_p): New function (used internally).
* gsubr.c, gsubr.h (scm_make_gsubr_with_generic): New function.
* objects.c, objects.h (scm_primitive_generic): New class.
* objects.h (SCM_CMETHOD_CODE, SCM_CMETHOD_ENV): New macros.
* print.c (scm_iprin1): Print primitive-generics.
* __scm.h (SCM_WTA_DISPATCH_1, SCM_GASSERT1,
SCM_WTA_DISPATCH_2, SCM_GASSERT2): New macros.
* eval.c (SCM_CEVAL, SCM_APPLY): Replace scm_wta -->
SCM_WTA_DISPATCH_1 for scm_cxr's (unary floating point
primitives). NOTE: This means that it is now *required* to use
SCM_GPROC1 when creating float scm_cxr's (float scm_cxr's is an
obscured representation that will be removed in the future anyway,
so backward compatibility is no problem here).
* numbers.c: Converted most numeric primitives (all but bit
comparison operations and bit operations) to dispatch on generic
if args don't match.
* eval.c, eval.h (scm_eval_body): New function.
* objects.c (scm_call_generic_0, scm_call_generic_1,
scm_call_generic_2, scm_call_generic_3, scm_apply_generic): New
functions.
* eval.c (SCM_CEVAL): Apply the cmethod directly after having
called scm_memoize_method instead of doing a second lookup.
* objects.h (scm_memoize_method): Now returns the memoized cmethod.
* procs.c (scm_make_subr_opt): Use scm_sysintern0 instead of
scm_sysintern so that the binding connected with the subr name
isn't cleared when we give set = 0.
1999-08-26 04:24:42 +00:00
|
|
|
|
extern SCM scm_call_generic_1 (SCM gf, SCM a1);
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
|
|
|
|
|
|
return ((gf) \
|
|
|
|
|
|
? scm_call_generic_1 ((gf), (a1)) \
|
|
|
|
|
|
: scm_wta ((a1), (char *) (pos), (subr)))
|
|
|
|
|
|
#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
|
|
|
|
|
|
if (!(cond)) SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
|
|
|
|
|
|
|
|
|
|
|
|
extern SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
|
|
|
|
|
|
return ((gf) \
|
|
|
|
|
|
? scm_call_generic_2 ((gf), (a1), (a2)) \
|
|
|
|
|
|
: scm_wta ((pos) == SCM_ARG1 ? (a1) : (a2), (char *) (pos), (subr)))
|
|
|
|
|
|
#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
|
|
|
|
|
|
if (!(cond)) SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
|
|
|
|
|
|
|
1999-09-07 09:40:35 +00:00
|
|
|
|
extern SCM scm_apply_generic (SCM gf, SCM args);
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
|
|
|
|
|
|
return ((gf) \
|
|
|
|
|
|
? scm_apply_generic ((gf), (args)) \
|
|
|
|
|
|
: scm_wta (scm_list_ref ((args), SCM_MAKINUM ((pos) - 1)), \
|
|
|
|
|
|
(char *) (pos), \
|
|
|
|
|
|
(subr)))
|
|
|
|
|
|
#define SCM_GASSERTn(cond, gf, args, pos, subr) \
|
|
|
|
|
|
if (!(cond)) SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
|
|
|
|
|
|
|
2000-01-05 18:48:07 +00:00
|
|
|
|
#ifndef SCM_MAGIC_SNARFER
|
|
|
|
|
|
/* Let these macros pass through if
|
|
|
|
|
|
we are snarfing; thus we can tell the
|
|
|
|
|
|
difference between the use of an actual
|
|
|
|
|
|
number vs. the use of one of these macros --
|
2000-01-05 18:55:04 +00:00
|
|
|
|
actual numbers in SCM_VALIDATE_* and SCM_ASSERT
|
2000-01-05 18:48:07 +00:00
|
|
|
|
constructs must match the formal argument name,
|
|
|
|
|
|
but using SCM_ARG* avoids the test */
|
|
|
|
|
|
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#define SCM_ARGn 0
|
|
|
|
|
|
#define SCM_ARG1 1
|
|
|
|
|
|
#define SCM_ARG2 2
|
|
|
|
|
|
#define SCM_ARG3 3
|
|
|
|
|
|
#define SCM_ARG4 4
|
|
|
|
|
|
#define SCM_ARG5 5
|
* ports.c: add SCM_PROC declarations for pt-size and pt-member.
* Makefile.am: remove AWK=@AWK@.
Add a rule for generating errnos.list.
(CLEANFILES): put errnos.list here instead of in DISTCLEANFILES.
* configure.in: add AC_SUBST(AWK) and AC_SUBST(ERRNO_EXTRACT).
don't extract errnos, just set a variable (avoids the
need to recompile error.c just because configure is run.)
* unif.h: update prototypes.
* unif.c (scm_uniform_array_read,write): change the offset and
length arguments to start and end, for consistency.
* __scm.h: uncomment SCM_ARG6 and SCM_ARG7, I needed SCM_ARG6.
* ioext.h: update prototypes.
* * ioext.c (scm_read_delimited_x): replaces scm_read_line and
scm_read_line_x, it's a more general procedure using an
interface from scsh. read-line and read-line! are now defined
in boot-9.scm.
* Note that the new read-line trims the terminator
by default, previously it was appended to the returned string. An
optional argument specifies how to process the terminator (scsh
compatible). For the old behaviour: (read-line port 'concat).
scm_read_line, scm_read_line_x: deleted. (read-line port 'split)
returns a pair, but is converted to multiple values if the scsh
module is loaded.
socket.h: update prototypes.
* socket.c (scm_recvfrom): for consistency with other procedures,
take start and end as separate optional arguments.
* (scm_recv, scm_recvfrom): don't allow the second argument
to be a size, only a buffer. Change the scheme names to
recv! and recvfrom!. Don't return the buffer.
* ioext.h, posix.h: move prototypes too.
* ioext.c, posix.c (scm_read_line, scm_read_line_x, scm_write_line:
moved back from posix.c to ioext.c. Also move #includes of "genio.h"
"read.h" and "unif.h".
* ioext.c: include "chars.h"
1997-01-25 18:23:49 +00:00
|
|
|
|
#define SCM_ARG6 6
|
|
|
|
|
|
#define SCM_ARG7 7
|
* filesys.c (scsm_sys_stat): don't SIGSEGV if argument is an
integer (assuming for now accepting an integer is a good thing).
* error.c, fports.c: replace use of %S in lgh_error args with %s.
%S will be used instead for write'ing arguments.
* unif.c (scm_transpose_array): change arguments in the SCM_WNA
asserts. fix a few other asserts.
(scm_aind, scm_enclose_array, scm_array_in_bounds_p,
scm_uniform_vector_ref, scm_array_set_x,
scm_dimensions_to_unform_array): change args in
SCM_WNA SCM_ASSERTS and change scm_wta's to scm_wrong_num_args.
strop.c (scm_substring_move_left_x, scm_substring_move_right_x,
scm_substring_fill_x): likewise.
gsubr.c (scm_gsubr_apply): likewise.
eval.c (SCM_APPLY): likewise.
* eval.c (4 places): replace scm_everr with lgh_error or
scm_wrong_num_args.
* error.c, error.h (scm_wrong_num_args, scm_wrong_type_arg,
scm_memory_error): new procedures.
* scm_everr: deleted. can use scm_wta, dropping first two args.
scm_error: convert NULL subr to SCM_BOOL_F.
* __scm.h: don't define SCM_STACK_OVFLOW, SCM_EXIT, SCM_ARG6, SCM_ARG7,
SCM_ARGERR.
* stackchk.c (scm_report_stack_overflow): use lgh_error instead
of scm_wta.
* error.c, error.h: new error keys: scm_arg_type_key,
scm_args_number_key, scm_memory_alloc_key, scm_stack_overflow_key,
scm_misc_error_key.
scm_wta: reimplement using lgh_error instead of scm_everr.
1996-09-19 09:08:07 +00:00
|
|
|
|
/* #define SCM_ARGERR(X) ((X) < SCM_WNA \
|
1996-07-25 22:56:11 +00:00
|
|
|
|
? (char *)(X) \
|
|
|
|
|
|
: "wrong type argument")
|
* filesys.c (scsm_sys_stat): don't SIGSEGV if argument is an
integer (assuming for now accepting an integer is a good thing).
* error.c, fports.c: replace use of %S in lgh_error args with %s.
%S will be used instead for write'ing arguments.
* unif.c (scm_transpose_array): change arguments in the SCM_WNA
asserts. fix a few other asserts.
(scm_aind, scm_enclose_array, scm_array_in_bounds_p,
scm_uniform_vector_ref, scm_array_set_x,
scm_dimensions_to_unform_array): change args in
SCM_WNA SCM_ASSERTS and change scm_wta's to scm_wrong_num_args.
strop.c (scm_substring_move_left_x, scm_substring_move_right_x,
scm_substring_fill_x): likewise.
gsubr.c (scm_gsubr_apply): likewise.
eval.c (SCM_APPLY): likewise.
* eval.c (4 places): replace scm_everr with lgh_error or
scm_wrong_num_args.
* error.c, error.h (scm_wrong_num_args, scm_wrong_type_arg,
scm_memory_error): new procedures.
* scm_everr: deleted. can use scm_wta, dropping first two args.
scm_error: convert NULL subr to SCM_BOOL_F.
* __scm.h: don't define SCM_STACK_OVFLOW, SCM_EXIT, SCM_ARG6, SCM_ARG7,
SCM_ARGERR.
* stackchk.c (scm_report_stack_overflow): use lgh_error instead
of scm_wta.
* error.c, error.h: new error keys: scm_arg_type_key,
scm_args_number_key, scm_memory_alloc_key, scm_stack_overflow_key,
scm_misc_error_key.
scm_wta: reimplement using lgh_error instead of scm_everr.
1996-09-19 09:08:07 +00:00
|
|
|
|
*/
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
/* Following must match entry indexes in scm_errmsgs[].
|
|
|
|
|
|
* Also, SCM_WNA must follow the last SCM_ARGn in sequence.
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define SCM_WNA 8
|
1996-09-14 07:47:50 +00:00
|
|
|
|
/* #define SCM_OVSCM_FLOW 9 */
|
1996-07-25 22:56:11 +00:00
|
|
|
|
#define SCM_OUTOFRANGE 10
|
|
|
|
|
|
#define SCM_NALLOC 11
|
* filesys.c (scsm_sys_stat): don't SIGSEGV if argument is an
integer (assuming for now accepting an integer is a good thing).
* error.c, fports.c: replace use of %S in lgh_error args with %s.
%S will be used instead for write'ing arguments.
* unif.c (scm_transpose_array): change arguments in the SCM_WNA
asserts. fix a few other asserts.
(scm_aind, scm_enclose_array, scm_array_in_bounds_p,
scm_uniform_vector_ref, scm_array_set_x,
scm_dimensions_to_unform_array): change args in
SCM_WNA SCM_ASSERTS and change scm_wta's to scm_wrong_num_args.
strop.c (scm_substring_move_left_x, scm_substring_move_right_x,
scm_substring_fill_x): likewise.
gsubr.c (scm_gsubr_apply): likewise.
eval.c (SCM_APPLY): likewise.
* eval.c (4 places): replace scm_everr with lgh_error or
scm_wrong_num_args.
* error.c, error.h (scm_wrong_num_args, scm_wrong_type_arg,
scm_memory_error): new procedures.
* scm_everr: deleted. can use scm_wta, dropping first two args.
scm_error: convert NULL subr to SCM_BOOL_F.
* __scm.h: don't define SCM_STACK_OVFLOW, SCM_EXIT, SCM_ARG6, SCM_ARG7,
SCM_ARGERR.
* stackchk.c (scm_report_stack_overflow): use lgh_error instead
of scm_wta.
* error.c, error.h: new error keys: scm_arg_type_key,
scm_args_number_key, scm_memory_alloc_key, scm_stack_overflow_key,
scm_misc_error_key.
scm_wta: reimplement using lgh_error instead of scm_everr.
1996-09-19 09:08:07 +00:00
|
|
|
|
/* #define SCM_STACK_OVFLOW 12 */
|
|
|
|
|
|
/* #define SCM_EXIT 13 */
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
2000-01-05 18:48:07 +00:00
|
|
|
|
#endif /* SCM_MAGIC_SNARFER */
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
/* (...still matching scm_errmsgs) These
|
|
|
|
|
|
* are signals. Signals may become errors
|
|
|
|
|
|
* but are distinguished because they first
|
|
|
|
|
|
* try to invoke a handler that can resume
|
|
|
|
|
|
* the interrupted routine.
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define SCM_HUP_SIGNAL 14
|
|
|
|
|
|
#define SCM_INT_SIGNAL 15
|
|
|
|
|
|
#define SCM_FPE_SIGNAL 16
|
|
|
|
|
|
#define SCM_BUS_SIGNAL 17
|
|
|
|
|
|
#define SCM_SEGV_SIGNAL 18
|
|
|
|
|
|
#define SCM_ALRM_SIGNAL 19
|
|
|
|
|
|
#define SCM_GC_SIGNAL 20
|
|
|
|
|
|
#define SCM_TICK_SIGNAL 21
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_SIG_ORD(X) ((X) - SCM_HUP_SIGNAL)
|
|
|
|
|
|
#define SCM_ORD_SIG(X) ((X) + SCM_HUP_SIGNAL)
|
|
|
|
|
|
#define SCM_NUM_SIGS (SCM_SIG_ORD (SCM_TICK_SIGNAL) + 1)
|
|
|
|
|
|
|
1996-10-01 03:15:04 +00:00
|
|
|
|
#if 0
|
1996-07-25 22:56:11 +00:00
|
|
|
|
struct errdesc
|
|
|
|
|
|
{
|
|
|
|
|
|
char *msg;
|
|
|
|
|
|
char *s_response;
|
|
|
|
|
|
short parent_err;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern struct errdesc scm_errmsgs[];
|
1996-10-01 03:15:04 +00:00
|
|
|
|
#endif
|
1996-07-25 22:56:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
|
|
|
|
|
|
* were encountered. SCM_EXIT_FAILURE is the default code to return from
|
|
|
|
|
|
* SCM if errors were encountered. The return code can be explicitly
|
|
|
|
|
|
* specified in a SCM program with (scm_quit <n>).
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SCM_EXIT_SUCCESS
|
|
|
|
|
|
#ifdef vms
|
|
|
|
|
|
#define SCM_EXIT_SUCCESS 1
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define SCM_EXIT_SUCCESS 0
|
|
|
|
|
|
#endif /* def vms */
|
|
|
|
|
|
#endif /* ndef SCM_EXIT_SUCCESS */
|
|
|
|
|
|
#ifndef SCM_EXIT_FAILURE
|
|
|
|
|
|
#ifdef vms
|
|
|
|
|
|
#define SCM_EXIT_FAILURE 2
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define SCM_EXIT_FAILURE 1
|
|
|
|
|
|
#endif /* def vms */
|
|
|
|
|
|
#endif /* ndef SCM_EXIT_FAILURE */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* __SCMH */
|