commit 8494b88b25a130a108075fac8ae24109b510124d
parent c8063ea4b3b94cd7947da06815a1a27b94ca1b79
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sun, 21 Sep 2014 17:54:00 +0200
load tls as part of cl-rw
Diffstat:
| M | cl-rw.asd |  |  | 4 | +++- | 
| A | tls-macros.lisp |  |  | 186 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| M | tls.lisp |  |  | 160 | ------------------------------------------------------------------------------- | 
3 files changed, 189 insertions(+), 161 deletions(-)
diff --git a/cl-rw.asd b/cl-rw.asd
@@ -52,4 +52,6 @@
                (:file "ui")
                (:file "cas")
                (:file "zip")
-               (:file "der")))
+               (:file "der")
+               (:file "tls-macros")
+               (:file "tls")))
diff --git a/tls-macros.lisp b/tls-macros.lisp
@@ -0,0 +1,186 @@
+;;; Copyright (C) 2014 Tomas Hlavaty <tom@logand.com>
+;;;
+;;; Permission is hereby granted, free of charge, to any person
+;;; obtaining a copy of this software and associated documentation
+;;; files (the "Software"), to deal in the Software without
+;;; restriction, including without limitation the rights to use, copy,
+;;; modify, merge, publish, distribute, sublicense, and/or sell copies
+;;; of the Software, and to permit persons to whom the Software is
+;;; furnished to do so, subject to the following conditions:
+;;;
+;;; The above copyright notice and this permission notice shall be
+;;; included in all copies or substantial portions of the Software.
+;;;
+;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+;;; DEALINGS IN THE SOFTWARE.
+
+(defpackage :rw.tls
+  (:use :cl))
+
+(in-package :rw.tls)
+
+(defun fname (x)
+  (intern (format nil "~a" x)))
+
+(defun mname (x)
+  (intern (format nil "MAKE-~a" x)))
+
+(defun rname (x)
+  (intern (format nil "NEXT-~a" x)))
+
+(defun wname (x)
+  (intern (format nil "WRITE-~a" x)))
+
+(defmacro defenum (name (&key nbits) &body alist)
+  (let ((fname (fname name))
+        (sname (intern (format nil "~a-SYMBOLS" name)))
+        (cname (intern (format nil "~a-CODES" name)))
+        (rname (rname name))
+        (wname (wname name)))
+    `(let* ((alist ',alist)
+            (symbols (mapcar #'car alist))
+            (codes (mapcar #'cdr alist)))
+       (defun ,fname (x)
+         (etypecase x
+           (symbol (cdr (assoc x alist)))
+           (integer (car (rassoc x alist)))))
+       (defun ,sname () symbols)
+       (defun ,cname () codes)
+       (defun ,rname (reader)
+         (let ((z (,fname (, (ecase nbits
+                               (8 'rw:next-u8)
+                               (16 'rw:next-u16))
+                             reader))))
+           (assert z)
+           z))
+       (defun ,wname (writer x)
+         (, (ecase nbits
+              (8 'rw:write-u8)
+              (16 'rw:write-u16))
+            writer
+            (etypecase x
+              (symbol (,fname x))
+              (integer (when (member x codes) x))))))))
+
+(defun aname (struc &optional slot)
+  (intern (format nil "~a-~a" struc slot)))
+
+(defun defun-rname-slot (slot)
+  (destructuring-bind (ty na &key length size min max compute next) slot
+    `(,na
+      , (flet ((r1 ()
+                 (if (listp ty)
+                     `(ecase ,(cadr ty)
+                        ,@(loop
+                             for (nm ty) in (cddr ty)
+                             collect (if ty
+                                         `(,nm (,(rname ty) r))
+                                         `(,nm))))
+                     `(,(rname ty) r))))
+          (cond
+            ((or compute next)
+             (assert (eq 'computed ty))
+             (assert (not (or length size min max)))
+             (or compute next))
+            (length
+             `(let ((l (,(rname length) r))
+                    (b (make-octet-buffer 100)))
+                ,@(when min `((assert (<= ,min l))))
+                ,@(when max `((assert (<= l ,max))))
+                ,@(when (integerp size) `((assert (= l ,size))))
+                (dotimes (i l)
+                  (vector-push-extend (next-u8 r) b))
+                ,(if (eq 'u8 ty)
+                     'b
+                     (if size
+                         `(let ((r (rw:peek-reader (rw:reader b))))
+                            (loop
+                               while (rw:peek r)
+                               collect ,(r1)))
+                         `(let ((r (rw:reader b)))
+                            ,(r1))))))
+            (size
+             (assert (eq 'u8 ty))
+             `(loop for i from 0 below ,size collect ,(r1)))
+            (t
+             `(let ((v ,(r1)))
+                ,@(when min `((assert (<= ,min v))))
+                ,@(when max `((assert (<= v ,max))))
+                v)))))))
+
+(defun defun-rname (name slots)
+  `(defun ,(rname name) (r)
+     (let* (,@(mapcar 'defun-rname-slot slots))
+       (,(mname name)
+         ,@(loop
+              for slot in slots
+              appending (let ((na (cadr slot)))
+                          (list (intern (symbol-name na) :keyword) na)))))))
+
+(defun defun-wname (name slots)
+  `(defun ,(wname name) (w x)
+     ,@(loop
+          for slot in slots
+          collect
+            (destructuring-bind (ty na &key length size min max compute next) slot
+              (flet ((w1 ()
+                       (if (listp ty)
+                           (ecase (car ty)
+                             (ecase `(ecase (,(aname name (cadr ty)) x)
+                                       ,@(loop
+                                            for (nm ty) in (cddr ty)
+                                            collect
+                                              (if ty
+                                                  `(,nm (,(wname ty) w v))
+                                                  `(,nm))))))
+                           `(,(wname ty) w v))))
+                (cond
+                  ((or compute next)
+                   (assert (eq 'computed ty))
+                   (assert (not (or length size min max)))
+                   (when compute
+                     `(setf (,(aname name na) x) ,compute)))
+                  (length
+                   `(let ((v (,(aname name na) x))
+                          (b (make-octet-buffer 100)))
+                      (let ((w (rw:writer b)))
+                        ,(cond
+                          (size
+                           `(if (listp v)
+                                (loop for v in v do ,(w1))
+                                (loop for v across v do ,(w1))))
+                          (t (w1))))
+                      (let ((l (length b)))
+                        ,@(when min `((assert (<= ,min l))))
+                        ,@(when max `((assert (<= l ,max))))
+                        ,@(when (integerp size) `((assert (= l ,size))))
+                        (,(wname length) w l))
+                      (loop for e across b do (write-u8 w e))))
+                  (size
+                   (assert (eq 'u8 ty))
+                   `(let ((v (,(aname name na) x)))
+                      ,@ (when (or min max (integerp size))
+                           `((let ((l (length v)))
+                               ,@(when min `((assert (<= ,min l))))
+                               ,@(when max `((assert (<= l ,max))))
+                               ,@(when (integerp size) `((assert (= l ,size)))))))
+                      (if (listp v)
+                          (loop for v in v do ,(w1))
+                          (loop for v across v do ,(w1)))))
+                  (t
+                   `(let ((v (,(aname name na) x)))
+                      ,@(when min `((assert (<= ,min v))))
+                      ,@(when max `((assert (<= v ,max))))
+                      ,(w1)))))))))
+
+(defmacro defstruc (name () &body slots)
+  `(progn
+     (defstruct ,(fname name) ,@(mapcar #'cadr slots))
+     ,(defun-rname name slots)
+     ,(defun-wname name slots)))
diff --git a/tls.lisp b/tls.lisp
@@ -61,49 +61,6 @@
 (defun write-u32 (writer x)
   (rw:write-u32 writer x))
 
-(defun fname (x)
-  (intern (format nil "~a" x)))
-
-(defun mname (x)
-  (intern (format nil "MAKE-~a" x)))
-
-(defun rname (x)
-  (intern (format nil "NEXT-~a" x)))
-
-(defun wname (x)
-  (intern (format nil "WRITE-~a" x)))
-
-(defmacro defenum (name (&key nbits) &body alist)
-  (let ((fname (fname name))
-        (sname (intern (format nil "~a-SYMBOLS" name)))
-        (cname (intern (format nil "~a-CODES" name)))
-        (rname (rname name))
-        (wname (wname name)))
-    `(let* ((alist ',alist)
-            (symbols (mapcar #'car alist))
-            (codes (mapcar #'cdr alist)))
-       (defun ,fname (x)
-         (etypecase x
-           (symbol (cdr (assoc x alist)))
-           (integer (car (rassoc x alist)))))
-       (defun ,sname () symbols)
-       (defun ,cname () codes)
-       (defun ,rname (reader)
-         (let ((z (,fname (, (ecase nbits
-                               (8 'rw:next-u8)
-                               (16 'rw:next-u16))
-                             reader))))
-           (assert z)
-           z))
-       (defun ,wname (writer x)
-         (, (ecase nbits
-              (8 'rw:write-u8)
-              (16 'rw:write-u16))
-            writer
-            (etypecase x
-              (symbol (,fname x))
-              (integer (when (member x codes) x))))))))
-
 (defenum $AlertLevel (:nbits 8)
   (WARNING . 1)
   (FATAL   . 2))
@@ -349,9 +306,6 @@
   ;;'dsa
   'ecdsa)
 
-(defun aname (struc &optional slot)
-  (intern (format nil "~a-~a" struc slot)))
-
 (defun make-octet-buffer (length)
   (make-array length
               :element-type '(unsigned-byte 8)
@@ -359,120 +313,6 @@
               :adjustable t
               :fill-pointer 0))
 
-(defun defun-rname-slot (slot)
-  (destructuring-bind (ty na &key length size min max compute next) slot
-    `(,na
-      , (flet ((r1 ()
-                 (if (listp ty)
-                     `(ecase ,(cadr ty)
-                        ,@(loop
-                             for (nm ty) in (cddr ty)
-                             collect (if ty
-                                         `(,nm (,(rname ty) r))
-                                         `(,nm))))
-                     `(,(rname ty) r))))
-          (cond
-            ((or compute next)
-             (assert (eq 'computed ty))
-             (assert (not (or length size min max)))
-             (or compute next))
-            (length
-             `(let ((l (,(rname length) r))
-                    (b (make-octet-buffer 100)))
-                ,@(when min `((assert (<= ,min l))))
-                ,@(when max `((assert (<= l ,max))))
-                ,@(when (integerp size) `((assert (= l ,size))))
-                (dotimes (i l)
-                  (vector-push-extend (next-u8 r) b))
-                ,(if (eq 'u8 ty)
-                     'b
-                     (if size
-                         `(let ((r (rw:peek-reader (rw:reader b))))
-                            (loop
-                               while (rw:peek r)
-                               collect ,(r1)))
-                         `(let ((r (rw:reader b)))
-                            ,(r1))))))
-            (size
-             (assert (eq 'u8 ty))
-             `(loop for i from 0 below ,size collect ,(r1)))
-            (t
-             `(let ((v ,(r1)))
-                ,@(when min `((assert (<= ,min v))))
-                ,@(when max `((assert (<= v ,max))))
-                v)))))))
-
-(defun defun-rname (name slots)
-  `(defun ,(rname name) (r)
-     (let* (,@(mapcar 'defun-rname-slot slots))
-       (,(mname name)
-         ,@(loop
-              for slot in slots
-              appending (let ((na (cadr slot)))
-                          (list (intern (symbol-name na) :keyword) na)))))))
-
-(defun defun-wname (name slots)
-  `(defun ,(wname name) (w x)
-     ,@(loop
-          for slot in slots
-          collect
-            (destructuring-bind (ty na &key length size min max compute next) slot
-              (flet ((w1 ()
-                       (if (listp ty)
-                           (ecase (car ty)
-                             (ecase `(ecase (,(aname name (cadr ty)) x)
-                                       ,@(loop
-                                            for (nm ty) in (cddr ty)
-                                            collect
-                                              (if ty
-                                                  `(,nm (,(wname ty) w v))
-                                                  `(,nm))))))
-                           `(,(wname ty) w v))))
-                (cond
-                  ((or compute next)
-                   (assert (eq 'computed ty))
-                   (assert (not (or length size min max)))
-                   (when compute
-                     `(setf (,(aname name na) x) ,compute)))
-                  (length
-                   `(let ((v (,(aname name na) x))
-                          (b (make-octet-buffer 100)))
-                      (let ((w (rw:writer b)))
-                        ,(cond
-                          (size
-                           `(if (listp v)
-                                (loop for v in v do ,(w1))
-                                (loop for v across v do ,(w1))))
-                          (t (w1))))
-                      (let ((l (length b)))
-                        ,@(when min `((assert (<= ,min l))))
-                        ,@(when max `((assert (<= l ,max))))
-                        ,@(when (integerp size) `((assert (= l ,size))))
-                        (,(wname length) w l))
-                      (loop for e across b do (write-u8 w e))))
-                  (size
-                   (assert (eq 'u8 ty))
-                   `(let ((v (,(aname name na) x)))
-                      ,@ (when (or min max (integerp size))
-                           `((let ((l (length v)))
-                               ,@(when min `((assert (<= ,min l))))
-                               ,@(when max `((assert (<= l ,max))))
-                               ,@(when (integerp size) `((assert (= l ,size)))))))
-                      (if (listp v)
-                          (loop for v in v do ,(w1))
-                          (loop for v across v do ,(w1)))))
-                  (t
-                   `(let ((v (,(aname name na) x)))
-                      ,@(when min `((assert (<= ,min v))))
-                      ,@(when max `((assert (<= v ,max))))
-                      ,(w1)))))))))
-
-(defmacro defstruc (name () &body slots)
-  `(progn
-     (defstruct ,(fname name) ,@(mapcar #'cadr slots))
-     ,(defun-rname name slots)
-     ,(defun-wname name slots)))
-
 (defstruc $Alert ()
   ($AlertLevel level)
   ($AlertDescription description))