* libguile/strings.c (scm_encoding_error): New function.
(scm_from_stringn, scm_to_stringn): Use it instead of `scm_misc_error ()'.
* test-suite/lib.scm (exception:encoding-error): Adjust accordingly.
* test-suite/tests/encoding-escapes.test (exception:conversion):
Remove. Use `exception:encoding-error' instead.
* test-suite/tests/encoding-iso88591.test: Likewise.
* test-suite/tests/encoding-iso88597.test: Likewise.
* test-suite/tests/encoding-utf8.test: Likewise.
#include "libguile/chars.h"
#include "libguile/root.h"
#include "libguile/strings.h"
+#include "libguile/error.h"
#include "libguile/generalized-vectors.h"
#include "libguile/deprecation.h"
#include "libguile/validate.h"
return IS_STRING (obj);
}
+\f
+/* Conversion to/from other encodings. */
+
+SCM_SYMBOL (scm_encoding_error_key, "encoding-error");
+static void
+scm_encoding_error (const char *subr, const char *message, SCM args)
+{
+ scm_error (scm_encoding_error_key, subr, message, args, SCM_BOOL_F);
+}
+
SCM
scm_from_stringn (const char *str, size_t len, const char *encoding,
scm_t_string_failed_conversion_handler handler)
char *dst;
errstr = scm_i_make_string (len, &dst);
memcpy (dst, str, len);
- scm_misc_error (NULL, "input locale conversion error from ~s: ~s",
- scm_list_2 (scm_from_locale_string (encoding),
- errstr));
+ scm_encoding_error (NULL,
+ "input locale conversion error from ~s: ~s",
+ scm_list_2 (scm_from_locale_string (encoding),
+ errstr));
scm_remember_upto_here_1 (errstr);
}
}
unistring_escapes_to_guile_escapes (&buf, &len);
if (ret != 0)
- {
- scm_misc_error (NULL, "cannot convert to output locale ~s: \"~s\"",
- scm_list_2 (scm_from_locale_string (enc),
- str));
- }
+ scm_encoding_error (NULL, "cannot convert to output locale ~s: \"~s\"",
+ scm_list_2 (scm_from_locale_string (enc), str));
}
else
{
NULL,
NULL, &len);
if (buf == NULL)
- {
- scm_misc_error (NULL, "cannot convert to output locale ~s: \"~s\"",
- scm_list_2 (scm_from_locale_string (enc),
- str));
- }
+ scm_encoding_error (NULL, "cannot convert to output locale ~s: \"~s\"",
+ scm_list_2 (scm_from_locale_string (enc), str));
+
if (handler == SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE)
unistring_escapes_to_guile_escapes (&buf, &len);
}
return len;
}
+\f
+/* Unicode string normalization. */
+
/* This function is a partial clone of SCM_STRING_TO_U32_BUF from
libguile/i18n.c. It would be useful to have this factored out into a more
convenient location, but its use of alloca makes that tricky to do. */
(define exception:system-error
(cons 'system-error ".*"))
(define exception:encoding-error
- (cons 'misc-error "(cannot convert to output locale|input locale conversion error)"))
+ (cons 'encoding-error "(cannot convert to output locale|input locale conversion error)"))
(define exception:miscellaneous-error
(cons 'misc-error "^.*"))
(define exception:read-error
;;;; encoding-escapes.test --- test suite for Guile's string encodings -*- mode: scheme; coding: utf-8 -*-
;;;;
-;;;; Copyright (C) 2009 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
#:use-module (test-suite lib)
#:use-module (srfi srfi-1))
-(define exception:conversion
- (cons 'misc-error "^cannot convert to output locale"))
-
;; Create a string from integer char values, eg. (string-ints 65) => "A"
(define (string-ints . args)
(apply string (map integer->char args)))
(with-test-prefix "display output errors"
(pass-if-exception "ultima"
- exception:conversion
+ exception:encoding-error
(let ((pt (open-output-string)))
(set-port-encoding! pt "ASCII")
(set-port-conversion-strategy! pt 'error)
(display s1 pt)))
(pass-if-exception "Rashomon"
- exception:conversion
+ exception:encoding-error
(let ((pt (open-output-string)))
(set-port-encoding! pt "ASCII")
(set-port-conversion-strategy! pt 'error)
;;;; encoding-iso88591.test --- test suite for Guile's string encodings -*- mode: scheme; coding: iso-8859-1 -*-
;;;;
-;;;; Copyright (C) 2009 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
#:use-module (test-suite lib)
#:use-module (srfi srfi-1))
-(define exception:conversion
- (cons 'misc-error "^cannot convert to output locale"))
-
;; Create a string from integer char values, eg. (string-ints 65) => "A"
(define (string-ints . args)
(apply string (map integer->char args)))
(with-test-prefix "output errors"
- (pass-if-exception "char 256" exception:conversion
+ (pass-if-exception "char 256" exception:encoding-error
(let ((pt (open-output-string)))
(set-port-encoding! pt "ISO-8859-1")
(set-port-conversion-strategy! pt 'error)
;;;; encoding-iso88697.test --- test suite for Guile's string encodings -*- mode: scheme; coding: iso-8859-7 -*-
;;;;
-;;;; Copyright (C) 2009 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
#:use-module (test-suite lib)
#:use-module (srfi srfi-1))
-(define exception:conversion
- (cons 'misc-error "^cannot convert to output locale"))
-
;; Create a string from integer char values, eg. (string-ints 65) => "A"
(define (string-ints . args)
(apply string (map integer->char args)))
(with-test-prefix "output errors"
(pass-if-exception "char #x0400"
- exception:conversion
+ exception:encoding-error
(let ((pt (open-output-string)))
(set-port-encoding! pt "ISO-8859-7")
(set-port-conversion-strategy! pt 'error)
;;;; encoding-utf8.test --- test suite for Guile's string encodings -*- mode: scheme; coding: utf-8 -*-
;;;;
-;;;; Copyright (C) 2009 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
#:use-module (test-suite lib)
#:use-module (srfi srfi-1))
-(define exception:conversion
- (cons 'misc-error "^cannot convert to output locale"))
-
;; Create a string from integer char values, eg. (string-ints 65) => "A"
(define (string-ints . args)
(apply string (map integer->char args)))