#ifndef UNIFH
#define UNIFH
-/* Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1997,1999 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
#include "libguile/__scm.h"
\f
+
+/*
+ an array SCM is a non-immediate pointing to a heap cell with:
+
+ CAR: bits 0-14 hold the dimension (0 -- 32767)
+ bit 15 is the SCM_ARRAY_CONTIGUOUS flag
+ bits 16-31 hold the smob type id: scm_tc16_array
+ CDR: pointer to a malloced block containing an scm_array structure
+ followed by an scm_array_dim structure for each dimension.
+*/
+
typedef struct scm_array
{
- SCM v;
+ SCM v; /* the contents of the array, e.g., a vector or uniform vector. */
scm_sizet base;
} scm_array;
extern long scm_tc16_array;
#define SCM_ARRAYP(a) (scm_tc16_array==SCM_TYP16(a))
-#define SCM_ARRAY_V(a) (((scm_array *)SCM_CDR(a))->v)
#define SCM_ARRAY_NDIM(x) ((scm_sizet)(SCM_CAR(x)>>17))
#define SCM_ARRAY_CONTIGUOUS 0x10000
#define SCM_ARRAY_CONTP(x) (SCM_ARRAY_CONTIGUOUS & (int)SCM_CAR(x))
-#define SCM_ARRAY_BASE(a) (((scm_array *)SCM_CDR(a))->base)
-#define SCM_ARRAY_DIMS(a) ((scm_array_dim *)(SCM_CHARS(a)+sizeof(scm_array)))
-#define SCM_HUGE_LENGTH(x) (SCM_LENGTH_MAX==SCM_LENGTH(x) ? *((long *)SCM_VELTS(x)) : SCM_LENGTH(x))
+#define SCM_ARRAY_V(a) (((scm_array *)SCM_CDR(a))->v)
+#define SCM_ARRAY_BASE(a) (((scm_array *)SCM_CDR(a))->base)
+#define SCM_ARRAY_DIMS(a) ((scm_array_dim *)(SCM_CHARS(a)+sizeof(scm_array)))
+
+/* apparently it's possible to have more than SCM_LENGTH_MAX elements
+ in an array: if the length is SCM_LENGTH_MAX then the SCM_VELTS
+ block begins with the true length (a long int). I wonder if it
+ works. */
+
+#define SCM_HUGE_LENGTH(x)\
+ (SCM_LENGTH_MAX==SCM_LENGTH(x) ? *((long *)SCM_VELTS(x)) : SCM_LENGTH(x))
\f
extern scm_sizet scm_uniform_element_size (SCM obj);
-extern SCM scm_makflo SCM_P ((float x));
-extern SCM scm_make_uve SCM_P ((long k, SCM prot));
-extern SCM scm_uniform_vector_length SCM_P ((SCM v));
-extern SCM scm_array_p SCM_P ((SCM v, SCM prot));
-extern SCM scm_array_rank SCM_P ((SCM ra));
-extern SCM scm_array_dimensions SCM_P ((SCM ra));
-extern long scm_aind SCM_P ((SCM ra, SCM args, const char *what));
-extern SCM scm_make_ra SCM_P ((int ndim));
-extern SCM scm_shap2ra SCM_P ((SCM args, const char *what));
-extern SCM scm_dimensions_to_uniform_array SCM_P ((SCM dims, SCM prot, SCM fill));
-extern void scm_ra_set_contp SCM_P ((SCM ra));
-extern SCM scm_make_shared_array SCM_P ((SCM oldra, SCM mapfunc, SCM dims));
-extern SCM scm_transpose_array SCM_P ((SCM args));
-extern SCM scm_enclose_array SCM_P ((SCM axes));
-extern SCM scm_array_in_bounds_p SCM_P ((SCM args));
-extern SCM scm_uniform_vector_ref SCM_P ((SCM v, SCM args));
-extern SCM scm_cvref SCM_P ((SCM v, scm_sizet pos, SCM last));
-extern SCM scm_array_set_x SCM_P ((SCM v, SCM obj, SCM args));
-extern SCM scm_array_contents SCM_P ((SCM ra, SCM strict));
-extern SCM scm_ra2contig SCM_P ((SCM ra, int copy));
-extern SCM scm_uniform_array_read_x SCM_P ((SCM ra, SCM port_or_fd, SCM start, SCM end));
-extern SCM scm_uniform_array_write SCM_P ((SCM v, SCM port_or_fd, SCM start, SCM end));
-extern SCM scm_bit_count SCM_P ((SCM item, SCM seq));
-extern SCM scm_bit_position SCM_P ((SCM item, SCM v, SCM k));
-extern SCM scm_bit_set_star_x SCM_P ((SCM v, SCM kv, SCM obj));
-extern SCM scm_bit_count_star SCM_P ((SCM v, SCM kv, SCM obj));
-extern SCM scm_bit_invert_x SCM_P ((SCM v));
-extern SCM scm_istr2bve SCM_P ((char *str, long len));
-extern SCM scm_array_to_list SCM_P ((SCM v));
-extern SCM scm_list_to_uniform_array SCM_P ((SCM ndim, SCM prot, SCM lst));
-extern int scm_raprin1 SCM_P ((SCM exp, SCM port, scm_print_state *pstate));
-extern SCM scm_array_prototype SCM_P ((SCM ra));
-extern void scm_init_unif SCM_P ((void));
+extern SCM scm_makflo (float x);
+extern SCM scm_make_uve (long k, SCM prot);
+extern SCM scm_uniform_vector_length (SCM v);
+extern SCM scm_array_p (SCM v, SCM prot);
+extern SCM scm_array_rank (SCM ra);
+extern SCM scm_array_dimensions (SCM ra);
+extern long scm_aind (SCM ra, SCM args, const char *what);
+extern SCM scm_make_ra (int ndim);
+extern SCM scm_shap2ra (SCM args, const char *what);
+extern SCM scm_dimensions_to_uniform_array (SCM dims, SCM prot, SCM fill);
+extern void scm_ra_set_contp (SCM ra);
+extern SCM scm_make_shared_array (SCM oldra, SCM mapfunc, SCM dims);
+extern SCM scm_transpose_array (SCM args);
+extern SCM scm_enclose_array (SCM axes);
+extern SCM scm_array_in_bounds_p (SCM args);
+extern SCM scm_uniform_vector_ref (SCM v, SCM args);
+extern SCM scm_cvref (SCM v, scm_sizet pos, SCM last);
+extern SCM scm_array_set_x (SCM v, SCM obj, SCM args);
+extern SCM scm_array_contents (SCM ra, SCM strict);
+extern SCM scm_ra2contig (SCM ra, int copy);
+extern SCM scm_uniform_array_read_x (SCM ra, SCM port_or_fd, SCM start, SCM end);
+extern SCM scm_uniform_array_write (SCM v, SCM port_or_fd, SCM start, SCM end);
+extern SCM scm_bit_count (SCM item, SCM seq);
+extern SCM scm_bit_position (SCM item, SCM v, SCM k);
+extern SCM scm_bit_set_star_x (SCM v, SCM kv, SCM obj);
+extern SCM scm_bit_count_star (SCM v, SCM kv, SCM obj);
+extern SCM scm_bit_invert_x (SCM v);
+extern SCM scm_istr2bve (char *str, long len);
+extern SCM scm_array_to_list (SCM v);
+extern SCM scm_list_to_uniform_array (SCM ndim, SCM prot, SCM lst);
+extern int scm_raprin1 (SCM exp, SCM port, scm_print_state *pstate);
+extern SCM scm_array_prototype (SCM ra);
+extern void scm_init_unif (void);
#endif /* UNIFH */