summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/read.c29
-rw-r--r--test-suite/lib.scm5
-rw-r--r--test-suite/tests/bytevectors.test54
3 files changed, 86 insertions, 2 deletions
diff --git a/libguile/read.c b/libguile/read.c
index 6fafc43ba..bd028ea52 100644
--- a/libguile/read.c
+++ b/libguile/read.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995,1996,1997,1999,2000,2001,2003, 2004, 2006, 2007, 2008 Free Software
+/* Copyright (C) 1995,1996,1997,1999,2000,2001,2003, 2004, 2006, 2007, 2008, 2009 Free Software
* Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -29,6 +29,7 @@
#include <string.h>
#include "libguile/_scm.h"
+#include "libguile/bytevectors.h"
#include "libguile/chars.h"
#include "libguile/eval.h"
#include "libguile/unif.h"
@@ -883,6 +884,30 @@ scm_read_srfi4_vector (int chr, SCM port)
}
static SCM
+scm_read_bytevector (int chr, SCM port)
+{
+ chr = scm_getc (port);
+ if (chr != 'u')
+ goto syntax;
+
+ chr = scm_getc (port);
+ if (chr != '8')
+ goto syntax;
+
+ chr = scm_getc (port);
+ if (chr != '(')
+ goto syntax;
+
+ return scm_u8_list_to_bytevector (scm_read_sexp (chr, port));
+
+ syntax:
+ scm_i_input_error ("read_bytevector", port,
+ "invalid bytevector prefix",
+ SCM_MAKE_CHAR (chr));
+ return SCM_UNSPECIFIED;
+}
+
+static SCM
scm_read_guile_bit_vector (int chr, SCM port)
{
/* Read the `#*10101'-style read syntax for bit vectors in Guile. This is
@@ -1050,6 +1075,8 @@ scm_read_sharp (int chr, SCM port)
case 'f':
/* This one may return either a boolean or an SRFI-4 vector. */
return (scm_read_srfi4_vector (chr, port));
+ case 'v':
+ return (scm_read_bytevector (chr, port));
case '*':
return (scm_read_guile_bit_vector (chr, port));
case 't':
diff --git a/test-suite/lib.scm b/test-suite/lib.scm
index 0a01a2756..8190d1fd0 100644
--- a/test-suite/lib.scm
+++ b/test-suite/lib.scm
@@ -1,5 +1,5 @@
;;;; test-suite/lib.scm --- generic support for testing
-;;;; Copyright (C) 1999, 2000, 2001, 2004, 2006, 2007 Free Software Foundation, Inc.
+;;;; Copyright (C) 1999, 2000, 2001, 2004, 2006, 2007, 2009 Free Software Foundation, Inc.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
@@ -32,6 +32,7 @@
exception:system-error
exception:miscellaneous-error
exception:string-contains-nul
+ exception:read-error
;; Reporting passes and failures.
run-test
@@ -265,6 +266,8 @@
(cons 'system-error ".*"))
(define exception:miscellaneous-error
(cons 'misc-error "^.*"))
+(define exception:read-error
+ (cons 'read-error "^.*$"))
;; as per throw in scm_to_locale_stringn()
(define exception:string-contains-nul
diff --git a/test-suite/tests/bytevectors.test b/test-suite/tests/bytevectors.test
index 95d6c403a..342f08a24 100644
--- a/test-suite/tests/bytevectors.test
+++ b/test-suite/tests/bytevectors.test
@@ -530,6 +530,60 @@
4)))))))
+
+(with-test-prefix "Datum Syntax"
+
+ (pass-if "empty"
+ (equal? (with-input-from-string "#vu8()" read)
+ (make-bytevector 0)))
+
+ (pass-if "simple"
+ (equal? (with-input-from-string "#vu8(1 2 3 4 5)" read)
+ (u8-list->bytevector '(1 2 3 4 5))))
+
+ (pass-if ">127"
+ (equal? (with-input-from-string "#vu8(0 255 127 128)" read)
+ (u8-list->bytevector '(0 255 127 128))))
+
+ (pass-if "self-evaluating"
+ (equal? (eval (with-input-from-string "#vu8(1 2 3 4 5)" read)
+ (current-module))
+ (u8-list->bytevector '(1 2 3 4 5))))
+
+ (pass-if "quoted"
+ (equal? (eval (with-input-from-string "'#vu8(1 2 3 4 5)" read)
+ (current-module))
+ (u8-list->bytevector '(1 2 3 4 5))))
+
+ (pass-if "literal simple"
+ (equal? #vu8(1 2 3 4 5)
+ (u8-list->bytevector '(1 2 3 4 5))))
+
+ (pass-if "literal >127"
+ (equal? #vu8(0 255 127 128)
+ (u8-list->bytevector '(0 255 127 128))))
+
+ (pass-if "literal quoted"
+ (equal? '#vu8(1 2 3 4 5)
+ (u8-list->bytevector '(1 2 3 4 5))))
+
+ (pass-if-exception "incorrect prefix"
+ exception:read-error
+ (with-input-from-string "#vi8(1 2 3)" read))
+
+ (pass-if-exception "extraneous space"
+ exception:read-error
+ (with-input-from-string "#vu8 (1 2 3)" read))
+
+ (pass-if-exception "negative integers"
+ exception:wrong-type-arg
+ (with-input-from-string "#vu8(-1 -2 -3)" read))
+
+ (pass-if-exception "out-of-range integers"
+ exception:wrong-type-arg
+ (with-input-from-string "#vu8(0 256)" read)))
+
+
;;; Local Variables:
;;; coding: latin-1
;;; mode: scheme