2012-11-03 00:20:23 +01:00
|
|
|
|
/* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
|
2013-04-11 13:03:45 +02:00
|
|
|
|
* 2005, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
|
2012-11-03 00:20:23 +01:00
|
|
|
|
*
|
2009-07-17 19:05:32 +02:00
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
|
|
* 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.
|
|
|
|
|
|
*
|
|
|
|
|
|
* This library 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
|
|
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
|
|
*
|
|
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
|
|
|
|
* 02110-1301 USA
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
|
# include <config.h>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#include "libguile/_scm.h"
|
|
|
|
|
|
#include "libguile/__scm.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "libguile/array-handle.h"
|
|
|
|
|
|
#include "libguile/generalized-arrays.h"
|
|
|
|
|
|
#include "libguile/generalized-vectors.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-07-18 12:43:54 +02:00
|
|
|
|
struct scm_t_vector_ctor
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM tag;
|
|
|
|
|
|
SCM (*ctor)(SCM, SCM);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#define VECTOR_CTORS_N_STATIC_ALLOC 20
|
|
|
|
|
|
static struct scm_t_vector_ctor vector_ctors[VECTOR_CTORS_N_STATIC_ALLOC];
|
|
|
|
|
|
static int num_vector_ctors_registered = 0;
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_i_register_vector_constructor (SCM type, SCM (*ctor)(SCM, SCM))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (num_vector_ctors_registered >= VECTOR_CTORS_N_STATIC_ALLOC)
|
|
|
|
|
|
/* need to increase VECTOR_CTORS_N_STATIC_ALLOC, buster */
|
|
|
|
|
|
abort ();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
vector_ctors[num_vector_ctors_registered].tag = type;
|
|
|
|
|
|
vector_ctors[num_vector_ctors_registered].ctor = ctor;
|
|
|
|
|
|
num_vector_ctors_registered++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM_DEFINE (scm_make_generalized_vector, "make-generalized-vector", 2, 1, 0,
|
|
|
|
|
|
(SCM type, SCM len, SCM fill),
|
|
|
|
|
|
"Make a generalized vector")
|
|
|
|
|
|
#define FUNC_NAME s_scm_make_generalized_vector
|
|
|
|
|
|
{
|
|
|
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < num_vector_ctors_registered; i++)
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (vector_ctors[i].tag, type))
|
2009-07-18 12:43:54 +02:00
|
|
|
|
return vector_ctors[i].ctor(len, fill);
|
|
|
|
|
|
scm_wrong_type_arg_msg (FUNC_NAME, SCM_ARG1, type, "array type");
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
2009-07-17 19:05:32 +02:00
|
|
|
|
int
|
|
|
|
|
|
scm_is_generalized_vector (SCM obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
int ret = 0;
|
|
|
|
|
|
if (scm_is_array (obj))
|
|
|
|
|
|
{
|
|
|
|
|
|
scm_t_array_handle h;
|
|
|
|
|
|
scm_array_get_handle (obj, &h);
|
|
|
|
|
|
ret = scm_array_handle_rank (&h) == 1;
|
|
|
|
|
|
scm_array_handle_release (&h);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_VALIDATE_VECTOR_WITH_HANDLE(pos, val, handle) \
|
|
|
|
|
|
scm_generalized_vector_get_handle (val, handle)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_generalized_vector_get_handle (SCM vec, scm_t_array_handle *h)
|
|
|
|
|
|
{
|
|
|
|
|
|
scm_array_get_handle (vec, h);
|
|
|
|
|
|
if (scm_array_handle_rank (h) != 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
scm_array_handle_release (h);
|
|
|
|
|
|
scm_wrong_type_arg_msg (NULL, 0, vec, "vector");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
size_t
|
|
|
|
|
|
scm_c_generalized_vector_length (SCM v)
|
|
|
|
|
|
{
|
2013-04-11 13:03:45 +02:00
|
|
|
|
return scm_c_array_length (v);
|
2009-07-17 19:05:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
2013-04-11 13:03:45 +02:00
|
|
|
|
scm_c_generalized_vector_ref (SCM v, ssize_t idx)
|
2009-07-17 19:05:32 +02:00
|
|
|
|
{
|
2013-04-11 13:03:45 +02:00
|
|
|
|
return scm_c_array_ref_1 (v, idx);
|
2009-07-17 19:05:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2013-04-11 13:03:45 +02:00
|
|
|
|
scm_c_generalized_vector_set_x (SCM v, ssize_t idx, SCM val)
|
2009-07-17 19:05:32 +02:00
|
|
|
|
{
|
2013-04-11 13:03:45 +02:00
|
|
|
|
scm_c_array_set_1_x (v, val, idx);
|
2009-07-17 19:05:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_init_generalized_vectors ()
|
|
|
|
|
|
{
|
|
|
|
|
|
#include "libguile/generalized-vectors.x"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
|
c-file-style: "gnu"
|
|
|
|
|
|
End:
|
|
|
|
|
|
*/
|