Commit 17895a96 authored by Jan Moringen's avatar Jan Moringen
Browse files

Exposed octet-vector types; added constructors

* package.lisp: added exported symbols octet, index, octet-vector,
  simple-octet-vector, make-octet-vector
* types.lisp: added type octet; added functions make-octet-vector and
  octet-vector
* tests.lisp: use make-octet-vector instead of make-array where
  possible
parent 64bc1e3b
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
(cl:defpackage :nibbles
  (:use :cl)
  ;; Basic types and constructors.
  (:export #:octet #:index
           #:octet-vector #:simple-octet-vector
           #:make-octet-vector)
  ;; Basic octet vector accessors.
  (:export #:ub16ref/le #:ub16ref/be #:sb16ref/le #:sb16ref/be
           #:ub32ref/le #:ub32ref/be #:sb32ref/le #:sb32ref/be
+26 −26
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@
          (t (values 0 nil))))))

(defun generate-random-octet-vector (n-octets)
  (loop with v = (make-array n-octets :element-type '(unsigned-byte 8))
  (loop with v = (nibbles:make-octet-vector n-octets)
        for i from 0 below n-octets
        do (setf (aref v i) (random 256))
        finally (return v)))
@@ -251,7 +251,7 @@
(defun read-file-as-octets (pathname)
  (with-open-file (stream pathname :direction :input
                          :element-type '(unsigned-byte 8))
    (let ((v (make-array (file-length stream) :element-type '(unsigned-byte 8))))
    (let ((v (nibbles:make-octet-vector (file-length stream))))
      (read-sequence v stream)
      v)))

+46 −4
Original line number Diff line number Diff line
@@ -2,11 +2,53 @@

(cl:in-package :nibbles)

(deftype index () '(mod #.array-dimension-limit))
(deftype octet ()
  '(unsigned-byte 8))

(deftype index ()
  '(mod #.array-dimension-limit))


;;; Type `octet-vector' and constructors
;;

(deftype octet-vector (&optional (length '*))
  `(array (unsigned-byte 8) (,length)))
  `(array octet (,length)))

(declaim (ftype (function (index
                           &key
                           (:initial-element octet))
                          octet-vector)
                make-octet-vector)
         (inline make-octet-vector))

(defun make-octet-vector (count
                          &key
                          (initial-element 0))
  "Make and return an `octet-vector' with COUNT elements.

If supplied, INITIAL-ELEMENT is used to populate the vector. The value
of INITIAL-ELEMENT has to of type `octet'. "
  (make-array count
              :element-type    'octet
              :initial-element initial-element))

(declaim (ftype (function (&rest octet) octet-vector) octet-vector)
         (inline octet-vector))

(defun octet-vector (&rest args)
  "Make and return an `octet-vector' containing the elements ARGS.
ARGS have to be of type `octet'."
  (make-array (length args)
              :element-type     'octet
              :initial-contents args
              :adjustable       nil
              :fill-pointer     nil))


;;; Type `simple-octet-vector'
;;

(deftype simple-octet-vector (&optional (length '*))
  #+(or sbcl cmu) `(simple-array (unsigned-byte 8) (,length))
  #-(or sbcl cmu) `(array (unsigned-byte 8) (,length)))
  #+(or sbcl cmu) `(simple-array octet (,length))
  #-(or sbcl cmu) `(array octet (,length)))