core: reader: Support binary #b101.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 16 May 2018 20:32:59 +0000 (22:32 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 16 May 2018 20:32:59 +0000 (22:32 +0200)
* src/reader.c (reader_read_binary): New function.
  (reader_read_hash): Use it.
* tests/scm.test ("binary"): Test it.

src/reader.c
tests/scm.test

index 098f63709a24d4337c7d999fd27fb70caa4723a8..465dfb95fe03b2289095c998ba5315107580f93c 100644 (file)
@@ -224,6 +224,8 @@ reader_read_hash (int c, SCM a)
                    cons (reader_read_sexp_ (readchar (), a), cell_nil));
     case ':':
     return MAKE_KEYWORD (CAR (reader_read_sexp_ (readchar (), a)));
+    case 'b':
+      return reader_read_binary ();
     case 'o':
       return reader_read_octal ();
     case 'x':
@@ -319,6 +321,23 @@ reader_read_character ()
   return MAKE_CHAR (c);
 }
 
+SCM
+reader_read_binary ()
+{
+  int n = 0;
+  int c = peekchar ();
+  int s = 1;
+  if (c == '-') {s = -1; readchar (); c = peekchar ();}
+  while (c == '0' || c == '1')
+    {
+      n <<= 1;
+      n+= c - '0';
+      readchar ();
+      c = peekchar ();
+    }
+  return MAKE_NUMBER (s*n);
+}
+
 SCM
 reader_read_octal ()
 {
index d83f5a3d2e737c9c25c4a8ccc0d05e05df66c15d..7254d1848c4e05cf6f6a9b56e5039c7a9a4c4c37 100755 (executable)
@@ -155,4 +155,8 @@ exit $?
 
 (pass-if "make-vector 2" (sequal? (make-vector 3 1) #(1 1 1)))
 
+(pass-if-equal "binary" 5 #b101)
+(pass-if-equal "octal" 65 #o101)
+(pass-if-equal "hex" 257 #x101)
+
 (result 'report)