-/* 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
\f
#include <stdio.h>
-#include "_scm.h"
-#include "chars.h"
+#include <string.h>
-#include "strings.h"
-#include "scm_validate.h"
+#include "libguile/_scm.h"
+#include "libguile/chars.h"
+
+#include "libguile/strings.h"
+#include "libguile/validate.h"
\f
/* {Strings}
*/
-GUILE_PROC(scm_string_p, "string?", 1, 0, 0,
- (SCM x),
-"")
+SCM_DEFINE (scm_string_p, "string?", 1, 0, 0,
+ (SCM obj),
+ "Returns #t iff OBJ is a string, else returns #f.")
#define FUNC_NAME s_scm_string_p
{
- if (SCM_IMP (x))
- return SCM_BOOL_F;
- return SCM_BOOL(SCM_STRINGP (x));
+ return SCM_BOOL (SCM_STRINGP (obj));
}
#undef FUNC_NAME
-GUILE_PROC(scm_read_only_string_p, "read-only-string?", 1, 0, 0,
- (SCM x),
-"Return true of OBJ can be read as a string,
-
-This illustrates the difference between @code{string?} and
-@code{read-only-string?}:
+#if SCM_DEBUG_DEPRECATED == 0
-@example
-(string? \"a string\") @result{} #t
-(string? 'a-symbol) @result{} #f
+/* The concept of read-only strings will disappear in next release
+ * of Guile.
+ */
-(read-only-string? \"a string\") @result{} #t
-(read-only-string? 'a-symbol) @result{} #t
-@end example")
+SCM_DEFINE (scm_read_only_string_p, "read-only-string?", 1, 0, 0,
+ (SCM x),
+ "Return true if OBJ can be read as a string,\n\n"
+ "This illustrates the difference between @code{string?} and\n"
+ "@code{read-only-string?}:\n\n"
+ "@example\n"
+ "(string? \"a string\") @result{} #t\n"
+ "(string? 'a-symbol) @result{} #f\n\n"
+ "(read-only-string? \"a string\") @result{} #t\n"
+ "(read-only-string? 'a-symbol) @result{} #t\n"
+ "@end example")
#define FUNC_NAME s_scm_read_only_string_p
{
- if (SCM_IMP (x))
- return SCM_BOOL_F;
return SCM_BOOL(SCM_ROSTRINGP (x));
}
#undef FUNC_NAME
-SCM_REGISTER_PROC(s_list_to_string, "list->string", 1, 0, 0, scm_string);
+#endif /* DEPRECATED */
+SCM_REGISTER_PROC (s_scm_list_to_string, "list->string", 1, 0, 0, scm_string);
-GUILE_PROC(scm_string, "string", 0, 0, 1,
- (SCM chrs),
-"")
+SCM_DEFINE (scm_string, "string", 0, 0, 1,
+ (SCM chrs),
+ "@deffnx primitive list->string chrs\n"
+ "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 result;
+
{
- SCM s;
-
- 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_CHAR (SCM_ARGn, elt);
+ *data++ = SCM_CHAR (elt);
+ chrs = SCM_CDR (chrs);
+ }
+ }
+ return result;
}
#undef FUNC_NAME
-
SCM
-scm_makstr (long len, int slots)
+scm_makstr (long len, int dummy)
{
SCM s;
- SCM * mem;
+ char *mem = (char *) scm_must_malloc (len + 1, "scm_makstr");
+
+ mem[len] = 0;
SCM_NEWCELL (s);
- --slots;
- SCM_REDEFER_INTS;
- mem = (SCM *)scm_must_malloc (sizeof (SCM) * (slots + 1) + len + 1,
- "scm_makstr");
- if (slots >= 0)
- {
- int x;
- mem[slots] = (SCM)mem;
- for (x = 0; x < slots; ++x)
- mem[x] = SCM_BOOL_F;
- }
- SCM_SETCHARS (s, (char *) (mem + slots + 1));
+ SCM_SETCHARS (s, mem);
SCM_SETLENGTH (s, len, scm_tc7_string);
- SCM_REALLOW_INTS;
- SCM_CHARS (s)[len] = 0;
+
return s;
}
return scm_take_str (s, strlen (s));
}
-
SCM
-scm_makfromstr (const char *src, scm_sizet len, int slots)
+scm_makfromstr (const char *src, scm_sizet len, int dummy)
{
- SCM s;
- register char *dst;
- s = scm_makstr ((long) len, slots);
- dst = SCM_CHARS (s);
+ SCM s = scm_makstr (len, 0);
+ char *dst = SCM_CHARS (s);
+
while (len--)
*dst++ = *src++;
return s;
}
-
-
SCM
scm_makfrom0str (const char *src)
{
-GUILE_PROC(scm_make_string, "make-string", 1, 1, 0,
- (SCM k, SCM chr),
-"")
+SCM_DEFINE (scm_make_string, "make-string", 1, 1, 0,
+ (SCM k, SCM chr),
+ "Returns a newly allocated string of\n"
+ "length K. If CHR is given, then all elements of the string\n"
+ "are initialized to CHR, otherwise the contents of the\n"
+ "STRING are unspecified.\n")
#define FUNC_NAME s_scm_make_string
{
SCM res;
register long i;
- SCM_VALIDATE_INT_MIN_COPY(1,k,0,i);
+ SCM_VALIDATE_INUM_MIN_COPY (1,k,0,i);
res = scm_makstr (i, 0);
if (!SCM_UNBNDP (chr))
{
- SCM_VALIDATE_CHAR(2,chr);
+ SCM_VALIDATE_CHAR (2,chr);
{
unsigned char *dst = SCM_UCHARS (res);
- char c = SCM_ICHR (chr);
+ char c = SCM_CHAR (chr);
memset (dst, c, i);
}
}
#undef FUNC_NAME
-GUILE_PROC(scm_string_length, "string-length", 1, 0, 0,
- (SCM str),
-"")
+SCM_DEFINE (scm_string_length, "string-length", 1, 0, 0,
+ (SCM string),
+ "Returns the number of characters in STRING")
#define FUNC_NAME s_scm_string_length
{
- SCM_VALIDATE_ROSTRING(1,str);
- return SCM_MAKINUM (SCM_ROLENGTH (str));
+ SCM_VALIDATE_STRINGORSUBSTR (1, string);
+ return SCM_MAKINUM (SCM_LENGTH (string));
}
#undef FUNC_NAME
-GUILE_PROC(scm_string_ref, "string-ref", 1, 1, 0,
- (SCM str, SCM k),
-"")
+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_INT_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_STRINGORSUBSTR (1, str);
+ SCM_VALIDATE_INUM_COPY (2, k, idx);
+ SCM_ASSERT_RANGE (2, k, idx >= 0 && idx < SCM_ROLENGTH (str));
+ return SCM_MAKE_CHAR (SCM_ROUCHARS (str)[idx]);
}
#undef FUNC_NAME
-GUILE_PROC(scm_string_set_x, "string-set!", 3, 0, 0,
- (SCM str, SCM k, SCM chr),
-"")
+SCM_DEFINE (scm_string_set_x, "string-set!", 3, 0, 0,
+ (SCM str, SCM k, SCM chr),
+ "Stores CHR in element K of STRING and returns an unspecified value.\n"
+ "K must be a valid index of STR.")
#define FUNC_NAME s_scm_string_set_x
{
- SCM_VALIDATE_RWSTRING(1,str);
- SCM_VALIDATE_INT_RANGE(2,k,0,SCM_LENGTH(str));
- SCM_VALIDATE_CHAR(3,chr);
- SCM_UCHARS (str)[SCM_INUM (k)] = SCM_ICHR (chr);
+ SCM_VALIDATE_RWSTRING (1,str);
+ SCM_VALIDATE_INUM_RANGE (2,k,0,SCM_LENGTH(str));
+ SCM_VALIDATE_CHAR (3,chr);
+ SCM_UCHARS (str)[SCM_INUM (k)] = SCM_CHAR (chr);
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
-
-GUILE_PROC(scm_substring, "substring", 2, 1, 0,
+SCM_DEFINE (scm_substring, "substring", 2, 1, 0,
(SCM str, SCM start, SCM end),
-"")
+ "Returns a newly allocated string formed from the characters\n"
+ "of STR beginning with index START (inclusive) and ending with\n"
+ "index END (exclusive).\n"
+ "STR must be a string, START and END must be exact integers satisfying:\n\n"
+ "0 <= START <= END <= (string-length STR).")
#define FUNC_NAME s_scm_substring
{
- long l;
- SCM_VALIDATE_ROSTRING(1,str);
- SCM_VALIDATE_INT(2,start);
- SCM_VALIDATE_INT_DEF(3,end,SCM_ROLENGTH(str));
- SCM_ASSERT_RANGE (2,start,SCM_INUM (start) <= SCM_ROLENGTH (str));
- SCM_ASSERT_RANGE (2,end,SCM_INUM (end) <= SCM_ROLENGTH (str));
- l = SCM_INUM (end)-SCM_INUM (start);
- SCM_ASSERT (l >= 0, SCM_MAKINUM (l), SCM_OUTOFRANGE, FUNC_NAME);
- return scm_makfromstr (&SCM_ROCHARS (str)[SCM_INUM (start)], (scm_sizet)l, 0);
+ long int from;
+ long int to;
+
+ SCM_VALIDATE_STRINGORSUBSTR (1, str);
+ SCM_VALIDATE_INUM (2, start);
+ SCM_VALIDATE_INUM_DEF (3, end, SCM_ROLENGTH (str));
+
+ from = SCM_INUM (start);
+ SCM_ASSERT_RANGE (2, start, 0 <= from && from <= SCM_ROLENGTH (str));
+ to = SCM_INUM (end);
+ SCM_ASSERT_RANGE (3, end, from <= to && to <= SCM_ROLENGTH (str));
+
+ return scm_makfromstr (&SCM_ROCHARS (str)[from], (scm_sizet) (to - from), 0);
}
#undef FUNC_NAME
-GUILE_PROC(scm_string_append, "string-append", 0, 0, 1,
- (SCM args),
-"")
+
+SCM_DEFINE (scm_string_append, "string-append", 0, 0, 1,
+ (SCM args),
+ "Returns a newly allocated string whose characters form the\n"
+ "concatenation of the given strings, ARGS.")
#define FUNC_NAME s_scm_string_append
{
SCM res;
register long i = 0;
register SCM l, s;
register unsigned char *data;
- for (l = args;SCM_CONSP (l);) {
+
+ SCM_VALIDATE_REST_ARGUMENT (args);
+ for (l = args; !SCM_NULLP (l); l = SCM_CDR (l)) {
s = SCM_CAR (l);
- SCM_VALIDATE_ROSTRING(SCM_ARGn,s);
+ SCM_VALIDATE_STRINGORSUBSTR (SCM_ARGn,s);
i += SCM_ROLENGTH (s);
- l = SCM_CDR (l);
}
- SCM_ASSERT (SCM_NULLP (l), args, SCM_ARGn, FUNC_NAME);
res = scm_makstr (i, 0);
data = SCM_UCHARS (res);
for (l = args;SCM_NIMP (l);l = SCM_CDR (l)) {
}
#undef FUNC_NAME
-GUILE_PROC(scm_make_shared_substring, "make-shared-substring", 1, 2, 0,
+#if SCM_DEBUG_DEPRECATED == 0
+
+/* Explicit shared substrings will disappear from Guile.
+ *
+ * Instead, "normal" strings will be implemented using sharing
+ * internally, combined with a copy-on-write strategy.
+ */
+
+SCM_DEFINE (scm_make_shared_substring, "make-shared-substring", 1, 2, 0,
(SCM str, SCM frm, SCM to),
-"Return a shared substring of @var{str}. The semantics are the same as
-for the @code{substring} function: the shared substring returned
-includes all of the text from @var{str} between indexes @var{start}
-(inclusive) and @var{end} (exclusive). If @var{end} is omitted, it
-defaults to the end of @var{str}. The shared substring returned by
-@code{make-shared-substring} occupies the same storage space as
-@var{str}.")
+ "Return a shared substring of @var{str}. The semantics are the same as\n"
+ "for the @code{substring} function: the shared substring returned\n"
+ "includes all of the text from @var{str} between indexes @var{start}\n"
+ "(inclusive) and @var{end} (exclusive). If @var{end} is omitted, it\n"
+ "defaults to the end of @var{str}. The shared substring returned by\n"
+ "@code{make-shared-substring} occupies the same storage space as\n"
+ "@var{str}.")
#define FUNC_NAME s_scm_make_shared_substring
{
long f;
SCM answer;
SCM len_str;
- SCM_VALIDATE_ROSTRING(1,str);
- SCM_VALIDATE_INT_DEF_COPY(2,frm,0,f);
- SCM_VALIDATE_INT_DEF_COPY(3,to,SCM_ROLENGTH(str),t);
+ SCM_VALIDATE_ROSTRING (1,str);
+ SCM_VALIDATE_INUM_DEF_COPY (2,frm,0,f);
+ SCM_VALIDATE_INUM_DEF_COPY (3,to,SCM_ROLENGTH(str),t);
SCM_ASSERT_RANGE (2,frm,(f >= 0));
SCM_ASSERT_RANGE (3,to, (f <= t) && (t <= SCM_ROLENGTH (str)));
}
#undef FUNC_NAME
+#endif /* DEPRECATED */
+
void
scm_init_strings ()
{
-#include "strings.x"
+#include "libguile/strings.x"
}
+
+/*
+ Local Variables:
+ c-file-style: "gnu"
+ End:
+*/