1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-09 23:40:29 +02:00

* strings.h: If GUILE_EXPERIMENTAL_BIG_STRINGS is defined, use

different definitions for SCM_STRING_MAX_LENGTH, SCM_STRING_LENGTH
and SCM_SET_STRING_LENGTH, and add new convenience macro
SCM_SET_SUBSTRING_LENGTH.

* strings.c (scm_makstr, scm_take_str, scm_allocate_string,
scm_make_shared_substring): Allocate a double cell for a string,
if GUILE_EXPERIMENTAL_BIG_STRINGS is defined.
This commit is contained in:
Neil Jerram 2006-11-17 14:03:35 +00:00
parent 16c2ec02fa
commit 6868a8e68f
3 changed files with 64 additions and 0 deletions

View file

@ -1,3 +1,22 @@
2006-11-17 Neil Jerram <neil@ossau.uklinux.net>
Integration of patch from Daniel Ridge to allow strings in 1.6.x
to have length up to 2^32 - 1, instead of 2^24 - 1 as currently.
All changes are subject to #ifdef GUILE_EXPERIMENTAL_BIG_STRINGS;
GUILE_EXPERIMENTAL_BIG_STRINGS is _not_ defined by default, and we
have no intention of changing this within the official 1.6.x
series. The only reason for integrating this is as a convenience
for the contributor, as and when we make further 1.6.x releases.
* strings.h: If GUILE_EXPERIMENTAL_BIG_STRINGS is defined, use
different definitions for SCM_STRING_MAX_LENGTH, SCM_STRING_LENGTH
and SCM_SET_STRING_LENGTH, and add new convenience macro
SCM_SET_SUBSTRING_LENGTH.
* strings.c (scm_makstr, scm_take_str, scm_allocate_string,
scm_make_shared_substring): Allocate a double cell for a string,
if GUILE_EXPERIMENTAL_BIG_STRINGS is defined.
2006-10-03 Kevin Ryde <user42@zip.com.au> 2006-10-03 Kevin Ryde <user42@zip.com.au>
* eval.c (SCM_APPLY): For scm_tc7_subr_2o, throw wrong-num-args on 0 * eval.c (SCM_APPLY): For scm_tc7_subr_2o, throw wrong-num-args on 0

View file

@ -131,7 +131,11 @@ scm_makstr (size_t len, int dummy)
mem = (char *) scm_must_malloc (len + 1, FUNC_NAME); mem = (char *) scm_must_malloc (len + 1, FUNC_NAME);
mem[len] = 0; mem[len] = 0;
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_NEWCELL (s); SCM_NEWCELL (s);
#else
SCM_NEWCELL2 (s);
#endif
SCM_SET_STRING_CHARS (s, mem); SCM_SET_STRING_CHARS (s, mem);
SCM_SET_STRING_LENGTH (s, len); SCM_SET_STRING_LENGTH (s, len);
@ -173,7 +177,11 @@ scm_take_str (char *s, size_t len)
SCM_ASSERT_RANGE (2, scm_ulong2num (len), len <= SCM_STRING_MAX_LENGTH); SCM_ASSERT_RANGE (2, scm_ulong2num (len), len <= SCM_STRING_MAX_LENGTH);
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_NEWCELL (answer); SCM_NEWCELL (answer);
#else
SCM_NEWCELL2 (answer);
#endif
SCM_SET_STRING_CHARS (answer, s); SCM_SET_STRING_CHARS (answer, s);
SCM_SET_STRING_LENGTH (answer, len); SCM_SET_STRING_LENGTH (answer, len);
scm_done_malloc (len + 1); scm_done_malloc (len + 1);
@ -241,7 +249,11 @@ scm_allocate_string (size_t len)
mem = (char *) scm_must_malloc (len + 1, FUNC_NAME); mem = (char *) scm_must_malloc (len + 1, FUNC_NAME);
mem[len] = 0; mem[len] = 0;
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_NEWCELL (s); SCM_NEWCELL (s);
#else
SCM_NEWCELL2 (s);
#endif
SCM_SET_STRING_CHARS (s, mem); SCM_SET_STRING_CHARS (s, mem);
SCM_SET_STRING_LENGTH (s, len); SCM_SET_STRING_LENGTH (s, len);
@ -415,13 +427,26 @@ SCM_DEFINE (scm_make_shared_substring, "make-shared-substring", 1, 2, 0,
SCM_VALIDATE_ROSTRING (1,str); SCM_VALIDATE_ROSTRING (1,str);
SCM_VALIDATE_INUM_DEF_COPY (2,start,0,f); SCM_VALIDATE_INUM_DEF_COPY (2,start,0,f);
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_VALIDATE_INUM_DEF_COPY (3,end,SCM_ROLENGTH(str),t); SCM_VALIDATE_INUM_DEF_COPY (3,end,SCM_ROLENGTH(str),t);
#else
SCM_VALIDATE_INUM_DEF_COPY (3,end,SCM_STRING_LENGTH(str),t);
#endif
SCM_ASSERT_RANGE (2,start,(f >= 0)); SCM_ASSERT_RANGE (2,start,(f >= 0));
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_ASSERT_RANGE (3,end, (f <= t) && (t <= SCM_ROLENGTH (str))); SCM_ASSERT_RANGE (3,end, (f <= t) && (t <= SCM_ROLENGTH (str)));
#else
SCM_ASSERT_RANGE (3,end, (f <= t) && (t <= SCM_STRING_LENGTH (str)));
#endif
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_NEWCELL (answer); SCM_NEWCELL (answer);
SCM_NEWCELL (len_str); SCM_NEWCELL (len_str);
#else
SCM_NEWCELL2 (answer);
SCM_NEWCELL2 (len_str);
#endif
SCM_DEFER_INTS; SCM_DEFER_INTS;
if (SCM_SUBSTRP (str)) if (SCM_SUBSTRP (str))
@ -433,14 +458,22 @@ SCM_DEFINE (scm_make_shared_substring, "make-shared-substring", 1, 2, 0,
SCM_SETCAR (len_str, SCM_MAKINUM (f)); SCM_SETCAR (len_str, SCM_MAKINUM (f));
SCM_SETCDR (len_str, SCM_SUBSTR_STR (str)); SCM_SETCDR (len_str, SCM_SUBSTR_STR (str));
SCM_SETCDR (answer, len_str); SCM_SETCDR (answer, len_str);
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_SETLENGTH (answer, t - f, scm_tc7_substring); SCM_SETLENGTH (answer, t - f, scm_tc7_substring);
#else
SCM_SET_SUBSTRING_LENGTH (answer, t - f);
#endif
} }
else else
{ {
SCM_SETCAR (len_str, SCM_MAKINUM (f)); SCM_SETCAR (len_str, SCM_MAKINUM (f));
SCM_SETCDR (len_str, str); SCM_SETCDR (len_str, str);
SCM_SETCDR (answer, len_str); SCM_SETCDR (answer, len_str);
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
SCM_SETLENGTH (answer, t - f, scm_tc7_substring); SCM_SETLENGTH (answer, t - f, scm_tc7_substring);
#else
SCM_SET_SUBSTRING_LENGTH (answer, t - f);
#endif
} }
SCM_ALLOW_INTS; SCM_ALLOW_INTS;
return answer; return answer;

View file

@ -55,10 +55,22 @@
#define SCM_STRING_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x))) #define SCM_STRING_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
#endif #endif
#define SCM_SET_STRING_CHARS(s, c) (SCM_SET_CELL_WORD_1 ((s), (c))) #define SCM_SET_STRING_CHARS(s, c) (SCM_SET_CELL_WORD_1 ((s), (c)))
#ifndef GUILE_EXPERIMENTAL_BIG_STRINGS
#define SCM_STRING_MAX_LENGTH ((1UL << 24) - 1UL) #define SCM_STRING_MAX_LENGTH ((1UL << 24) - 1UL)
#define SCM_STRING_LENGTH(x) ((size_t) (SCM_CELL_WORD_0 (x) >> 8)) #define SCM_STRING_LENGTH(x) ((size_t) (SCM_CELL_WORD_0 (x) >> 8))
#define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), (((long) (l)) << 8) + scm_tc7_string)) #define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), (((long) (l)) << 8) + scm_tc7_string))
#else
#define SCM_STRING_MAX_LENGTH ((1UL << (SCM_C_BVEC_LIMB_BITS)) - 1UL)
#define SCM_STRING_LENGTH(x) ((size_t) (SCM_CELL_WORD_2 (x)))
#define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), scm_tc7_string), SCM_SET_CELL_WORD_2 ((s), (((long) (l)))))
#define SCM_SET_SUBSTRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), scm_tc7_substring), SCM_SET_CELL_WORD_2 ((s), (((long) (l)))))
#endif
#define SCM_STRING_COERCE_0TERMINATION_X(x) \ #define SCM_STRING_COERCE_0TERMINATION_X(x) \
{ if (!SCM_IMP (x) && (SCM_TYP7 (x) == scm_tc7_substring)) \ { if (!SCM_IMP (x) && (SCM_TYP7 (x) == scm_tc7_substring)) \
x = scm_mem2string (SCM_STRING_CHARS (x), SCM_STRING_LENGTH (x)); } x = scm_mem2string (SCM_STRING_CHARS (x), SCM_STRING_LENGTH (x)); }