X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/e690a3cbf290a39ede4b3a390e940702cddf6da8..dc7da0be90d6033d512f9772894179970af678e7:/libguile/strings.c diff --git a/libguile/strings.c b/libguile/strings.c index 628dffd01..d3c8e155c 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -240,7 +240,7 @@ scm_i_pthread_mutex_t stringbuf_write_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER; #define SET_STRING_STRINGBUF(str,buf) (SCM_SET_CELL_OBJECT_1(str,buf)) #define SET_STRING_START(str,start) (SCM_SET_CELL_WORD_2(str,start)) -#define IS_STRING(str) (SCM_NIMP(str) && SCM_TYP7(str) == STRING_TAG) +#define IS_STRING(str) (SCM_HAS_TYP7 (str, STRING_TAG)) /* Read-only strings. */ @@ -741,8 +741,8 @@ scm_i_c_make_symbol (const char *name, size_t len, SCM buf = make_stringbuf (len); memcpy (STRINGBUF_CHARS (buf), name, len); - return scm_immutable_double_cell (scm_tc7_symbol | flags, SCM_UNPACK (buf), - (scm_t_bits) hash, SCM_UNPACK (props)); + return scm_double_cell (scm_tc7_symbol | flags, SCM_UNPACK (buf), + (scm_t_bits) hash, SCM_UNPACK (props)); } /* Returns the number of characters in SYM. This may be different @@ -1489,7 +1489,7 @@ scm_from_stringn (const char *str, size_t len, const char *encoding, buf = scm_gc_malloc_pointerless (len, "bytevector"); memcpy (buf, str, len); - bv = scm_c_take_bytevector (buf, len, SCM_BOOL_F); + bv = scm_c_take_gc_bytevector (buf, len, SCM_BOOL_F); scm_decoding_error (__func__, errno, "input locale conversion error", bv); @@ -1779,14 +1779,16 @@ scm_to_latin1_stringn (SCM str, size_t *lenp) if (scm_i_is_narrow_string (str)) { + size_t len = scm_i_string_length (str); + if (lenp) - *lenp = scm_i_string_length (str); + *lenp = len; - result = scm_strdup (scm_i_string_data (str)); + result = scm_strndup (scm_i_string_data (str), len); } else result = scm_to_stringn (str, lenp, NULL, - SCM_FAILED_CONVERSION_ERROR); + SCM_FAILED_CONVERSION_ERROR); return result; } @@ -2052,8 +2054,9 @@ SCM_DEFINE (scm_string_normalize_nfkd, "string-normalize-nfkd", 1, 0, 0, } #undef FUNC_NAME -/* converts C scm_array of strings to SCM scm_list of strings. */ -/* If argc < 0, a null terminated scm_array is assumed. */ +/* converts C scm_array of strings to SCM scm_list of strings. + If argc < 0, a null terminated scm_array is assumed. + The current locale encoding is assumed */ SCM scm_makfromstrs (int argc, char **argv) { @@ -2067,37 +2070,43 @@ scm_makfromstrs (int argc, char **argv) } /* Return a newly allocated array of char pointers to each of the strings - in args, with a terminating NULL pointer. */ + in args, with a terminating NULL pointer. The strings are encoded using + the current locale. */ char ** scm_i_allocate_string_pointers (SCM list) #define FUNC_NAME "scm_i_allocate_string_pointers" { char **result; - int len = scm_ilength (list); + int list_len = scm_ilength (list); int i; - if (len < 0) + if (list_len < 0) scm_wrong_type_arg_msg (NULL, 0, list, "proper list"); - result = scm_gc_malloc ((len + 1) * sizeof (char *), + result = scm_gc_malloc ((list_len + 1) * sizeof (char *), "string pointers"); - result[len] = NULL; + result[list_len] = NULL; - /* The list might be have been modified in another thread, so + /* The list might have been modified in another thread, so we check LIST before each access. */ - for (i = 0; i < len && scm_is_pair (list); i++) + for (i = 0; i < list_len && scm_is_pair (list); i++) { - SCM str; - size_t len; - - str = SCM_CAR (list); - len = scm_c_string_length (str); - - result[i] = scm_gc_malloc_pointerless (len + 1, "string pointers"); - memcpy (result[i], scm_i_string_chars (str), len); + SCM str = SCM_CAR (list); + size_t len; /* String length in bytes */ + char *c_str = scm_to_locale_stringn (str, &len); + + /* OPTIMIZE-ME: Right now, scm_to_locale_stringn always uses + scm_malloc to allocate the returned string, which must be + explicitly deallocated. This forces us to copy the string a + second time into a new buffer. Ideally there would be variants + of scm_to_*_stringn that can return garbage-collected buffers. */ + + result[i] = scm_gc_malloc_pointerless (len + 1, "string"); + memcpy (result[i], c_str, len); result[i][len] = '\0'; + free (c_str); list = SCM_CDR (list); } @@ -2122,66 +2131,6 @@ scm_i_get_substring_spec (size_t len, *cend = scm_to_unsigned_integer (end, *cstart, len); } -#if SCM_ENABLE_DEPRECATED - -/* When these definitions are removed, it becomes reasonable to use - read-only strings for string literals. For that, change the reader - to create string literals with scm_c_substring_read_only instead of - with scm_c_substring_copy. -*/ - -int -scm_i_deprecated_stringp (SCM str) -{ - scm_c_issue_deprecation_warning - ("SCM_STRINGP is deprecated. Use scm_is_string instead."); - - return scm_is_string (str); -} - -char * -scm_i_deprecated_string_chars (SCM str) -{ - char *chars; - - scm_c_issue_deprecation_warning - ("SCM_STRING_CHARS is deprecated. See the manual for alternatives."); - - /* We don't accept shared substrings here since they are not - null-terminated. - */ - if (IS_SH_STRING (str)) - scm_misc_error (NULL, - "SCM_STRING_CHARS does not work with shared substrings", - SCM_EOL); - - /* We explicitly test for read-only strings to produce a better - error message. - */ - - if (IS_RO_STRING (str)) - scm_misc_error (NULL, - "SCM_STRING_CHARS does not work with read-only strings", - SCM_EOL); - - /* The following is still wrong, of course... - */ - str = scm_i_string_start_writing (str); - chars = scm_i_string_writable_chars (str); - scm_i_string_stop_writing (); - return chars; -} - -size_t -scm_i_deprecated_string_length (SCM str) -{ - scm_c_issue_deprecation_warning - ("SCM_STRING_LENGTH is deprecated. Use scm_c_string_length instead."); - return scm_c_string_length (str); -} - -#endif - static SCM string_handle_ref (scm_t_array_handle *h, size_t index) {