changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/std/alien.lisp

changeset 678: 2b7d5a8d63ac
parent: 804b5ee20a46
child: 5f88b237ce29
author: Richard Westhaver <ellis@rwest.io>
date: Wed, 25 Sep 2024 21:39:39 -0400
permissions: -rw-r--r--
description: alien octets fix, workin with org-graph-db
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents: 88
diff changeset
1
 ;;; alien.lisp --- foreign alien friends
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 238
diff changeset
3
 ;; 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 238
diff changeset
4
 
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Commentary:
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
6
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
7
 ;; FFI in Lisp is somewhat different than FFI in other host langs. As
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
8
 ;; such, we usually refer to our Lispy FFI interfaces inline with the
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
9
 ;; CMUCL terminology: alien interfaces.
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
10
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
11
 ;; ref: https://www.sbcl.org/manual/#Foreign-Function-Interface for details
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
12
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
13
 ;; sb-alien is a high-level interface which automatically converts C
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
14
 ;; memory pointers to lisp objects and back, but this can be slow for
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
15
 ;; large or complex objects.
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
16
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
17
 ;; The lower-level interface is based on System Area Pointers (or
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
18
 ;; SAPs), which provide untyped access to foreign memory.
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
19
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
20
 ;; Objects which can't be automatically converted into Lisp values are
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
21
 ;; represented by objects of type ALIEN-VALUE.
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
22
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
23
 ;;; Code:
291
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
24
 (in-package :std/alien)
600
93ea0386a0c8 fix alien package-lock violation
Richard Westhaver <ellis@rwest.io>
parents: 476
diff changeset
25
 ;; (shadowing-import
93ea0386a0c8 fix alien package-lock violation
Richard Westhaver <ellis@rwest.io>
parents: 476
diff changeset
26
 ;;  '(sb-unix::syscall sb-unix::syscall* sb-unix::int-syscall
93ea0386a0c8 fix alien package-lock violation
Richard Westhaver <ellis@rwest.io>
parents: 476
diff changeset
27
 ;;    sb-unix::with-restarted-syscall sb-unix::void-syscall) :std)
222
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
28
 
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
29
 ;; (reexport-from :sb-vm
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents: 88
diff changeset
30
 ;;  	       :include
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents: 88
diff changeset
31
 ;;  	       '(:with-pinned-objects :with-pinned-object-iterator :with-code-pages-pinned
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents: 88
diff changeset
32
 ;;  		 :sanctify-for-execution))
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
33
 
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
34
 (defun shared-object-name (name &optional path)
233
a47790d0e1bb ublk, simple-cli opts, stealth mixins
Richard Westhaver <ellis@rwest.io>
parents: 224
diff changeset
35
   "Return a filename with the correct extension for a shared library."
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
36
   (let ((name #+darwin (format nil "lib~a.dylib" name)
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
37
               #-darwin (format nil "lib~a.so" name)))
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
38
     (if path
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
39
       (merge-pathnames name path)
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
40
       (pathname name))))
149
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
41
 
222
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
42
 (defun list-all-shared-objects ()
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
43
   sb-alien::*shared-objects*)
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
44
 
238
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
45
 (defmacro define-alien-loader (name &optional export (root "/usr/local/lib/") path)
149
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
46
   "Define a default loader function named load-NAME which calls
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
47
 SB-ALIEN:LOAD-SHARED-OBJECT."
217
17c05cd3e549 going nuklear, cfg obj, general fixes, introduction of x.lisp
Richard Westhaver <ellis@rwest.io>
parents: 208
diff changeset
48
   (let* ((fname (sb-int:symbolicate (format nil "~@:(load-~a~)" name))))
149
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
49
     `(prog1
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
50
        (defun ,fname (&optional save)
238
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
51
          (prog1 (sb-alien:load-shared-object (shared-object-name ',(or path name) ,root) :dont-save (not save))
217
17c05cd3e549 going nuklear, cfg obj, general fixes, introduction of x.lisp
Richard Westhaver <ellis@rwest.io>
parents: 208
diff changeset
52
            (pushnew ,(sb-int:keywordicate (string-upcase name)) *features*)))
149
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
53
        ,@(when export (list `(export '(,fname)))))))
2d1fe1d7b738 ffi update to support darwin, smh
ellis <ellis@rwest.io>
parents: 119
diff changeset
54
        
362
b1f78dffbcdd rustls work, fixed https bugs
Richard Westhaver <ellis@rwest.io>
parents: 291
diff changeset
55
 (defmacro define-opaque (ty &optional no-export foreign-type)
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 96
diff changeset
56
   `(prog1
362
b1f78dffbcdd rustls work, fixed https bugs
Richard Westhaver <ellis@rwest.io>
parents: 291
diff changeset
57
        (define-alien-type ,ty (struct ,(or foreign-type (symbolicate ty '-t))))
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 96
diff changeset
58
      ,(unless no-export `(export '(,ty)))))
88
17bdf95bc114 ffi tests
ellis <ellis@rwest.io>
parents: 82
diff changeset
59
 
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
60
 (defun setfa (place from) 
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
61
   (loop for x across from
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
62
 	for i from 0 below (length from)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
63
 	do (setf (deref place i) x)))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
64
 
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
65
 (defun copy-c-string (src dest &aux (index 0))
238
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
66
   (declare (type sb-int:index index))
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
67
   (loop (let ((b (sb-sys:sap-ref-8 src index)))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
68
           (when (= b 0)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
69
             (setf (fill-pointer dest) index)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
70
             (return))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
71
           (setf (char dest index) (code-char b))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
72
           (incf index))))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
73
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
74
 (defun clone-strings (list)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
75
   (with-alien ((x (* (* char))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
76
                   (make-alien (* char) (length list))))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
77
     (unwind-protect
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
78
          (labels ((populate (list index function)
238
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
79
                     (declare (type sb-int:index index))
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
80
                     (if list
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
81
                         (let ((array (sb-ext:string-to-octets (car list) :null-terminate t)))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
82
                           (sb-sys:with-pinned-objects (array)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
83
                             (setf (deref x index) (sap-alien (sb-sys:vector-sap array) (* char)))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
84
                             (populate (cdr list) (1+ index) function)))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
85
                         (funcall function))))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
86
            (populate list 0
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
87
                      (lambda ()
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
88
                        (loop for i below (length list)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
89
                              do (print (cast (deref x i) c-string))))))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
90
       (free-alien x))))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
91
 
222
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
92
 (defun c-strings-to-string-list (c-strings)
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
93
   (declare (type (alien (* c-string)) c-strings))
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
94
   (let ((reversed-result nil))
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
95
     (dotimes (i most-positive-fixnum)
238
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
96
       (declare (type sb-int:index i))
222
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
97
       (let ((c-string (deref c-strings i)))
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
98
         (if c-string
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
99
             (push c-string reversed-result)
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
100
             (return (nreverse reversed-result)))))))
83e823b80219 add os module
Richard Westhaver <ellis@rwest.io>
parents: 217
diff changeset
101
 
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
102
 (defun clone-octets-to-alien (lispa alien)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
103
   (declare (optimize (speed 3))
678
2b7d5a8d63ac alien octets fix, workin with org-graph-db
Richard Westhaver <ellis@rwest.io>
parents: 658
diff changeset
104
            ((vector (unsigned-byte 8)) lispa))
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
105
   ;; (setf aliena (cast aliena (array (unsigned 8))))
657
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
106
   (loop for i from 0 below (length lispa)
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
107
         do (setf (deref alien i)
657
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
108
                  (aref lispa i)))
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
109
   alien)
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 18
diff changeset
110
 
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
111
 (defun octets-to-alien (lispa)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
112
   (let ((a (make-alien (unsigned 8) (length lispa))))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
113
     (clone-octets-to-alien lispa a)))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
114
 
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
115
 ;; TODO 2024-09-19: maybe want to return values, second being the length?
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
116
 (defun octets-to-alien-array (lispa)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
117
   (cast (octets-to-alien lispa) (array (unsigned 8))))
657
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
118
 
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
119
 (defun clone-octets-from-alien (aliena lispa &optional len)
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
120
   (declare (optimize (speed 3))
678
2b7d5a8d63ac alien octets fix, workin with org-graph-db
Richard Westhaver <ellis@rwest.io>
parents: 658
diff changeset
121
            (vector lispa))
657
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
122
   (unless len (setf len (length lispa)))
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
123
   (loop for i from 0 below len
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
124
         do (setf (aref lispa i)
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
125
                  (deref aliena i)))
937a6f354047 zstd tests and macros
Richard Westhaver <ellis@rwest.io>
parents: 600
diff changeset
126
   lispa)
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 18
diff changeset
127
 
5
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
128
 (defun foreign-int-to-integer (buffer size)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
129
   "Check SIZE of int BUFFER. return BUFFER."
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
130
   (assert (= size (sb-alien:alien-size sb-alien:int :bytes)))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
131
   buffer)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
132
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
133
 (defun foreign-int-to-bool (x size)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
134
   (if (zerop (foreign-int-to-integer x size))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
135
       nil
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
136
       t))
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
137
 
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
138
 (defun bool-to-foreign-int (val)
6ce26a70a11e init std
ellis <ellis@rwest.io>
parents:
diff changeset
139
   (if val 1 0))
224
fdea20982c25 deferror
Richard Westhaver <ellis@rwest.io>
parents: 222
diff changeset
140
 
469
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
141
 (define-condition invalid-enum-variant (simple-error) ())
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
142
 (define-condition invalid-enum-value (simple-error) ())
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
143
 
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
144
 (defun invalid-enum-variant (var enum)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
145
   (error 'invalid-enum-variant
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
146
          :format-control "~A is not a variant of enum ~A"
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
147
          :format-arguments (list var enum)))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
148
 
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
149
 (defun invalid-enum-value (var enum)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
150
   (error 'invalid-enum-value
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
151
          :format-control "~A is not a value associated with a variant of enum ~A"
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
152
          :format-arguments (list var enum)))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
153
 
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
154
 (defmacro define-alien-enum ((name type &key (test 'eql) (default :error)) &rest forms)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
155
   "Define a pseudo-enum type, used to work-around difficulties working with
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
156
 SB-ALIEN, groveller, typedef enums, etc.
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
157
 
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
158
 NAME specified the name of the alien-type and keyword-based lookup
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
159
 function. Additionally a NAME* reverse-lookup function is provided.
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
160
 
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
161
 Two hash-tables are defined in the environment of the accessor functions
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
162
 containing the variants. These are technically exposed anaphors
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
163
 %lisp-enum-table and %lisp-enum-table*."
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
164
   (setf forms (loop for (k . v) on forms by #'cddr
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
165
                     collect (cons k v)))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
166
   (with-gensyms (val)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
167
     (let ((%lisp-enum-table (make-hash-table :test test :size (length forms)))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
168
           (%lisp-enum-table* (make-hash-table :test 'equal :size (length forms)))) ; TODO: may want this to be EQL,
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
169
                                                                                    ; taking strings for now.
476
52a5ffbba7ac more gstreamer
Richard Westhaver <ellis@rwest.io>
parents: 469
diff changeset
170
       (mapc (lambda (x) (setf (gethash (car x) %lisp-enum-table) (eval (cadr x)))) forms)
52a5ffbba7ac more gstreamer
Richard Westhaver <ellis@rwest.io>
parents: 469
diff changeset
171
       (mapc (lambda (x) (setf (gethash (eval (cadr x)) %lisp-enum-table*) (car x))) forms)
469
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
172
       `(progn
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
173
          (define-alien-type ,name ,type)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
174
          (defun ,name (,val)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
175
            ,(format nil "Given a keyword naming a variant of ~A, return the associated value." name)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
176
            (let ((found (gethash ,val ,%lisp-enum-table ,default)))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
177
              ,@(when (eql default :error)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
178
                  `((when (eql found :error) (invalid-enum-variant ,val ',name))))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
179
              found))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
180
          (defun ,(symbolicate name '*) (,val)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
181
            ,(format nil "Given a ~A, check that it is equal to one of the variants of ~A and return
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
182
 it. This function returns a second value which indicates the name of the
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
183
 variant associated with this value." type name)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
184
            (std:when-let ((found (gethash ,val ,%lisp-enum-table*
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
185
                                           ,default)))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
186
              ,@(when (eql default :error)
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
187
                  `((when (eql found :error) (invalid-enum-value ,val ',name))))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
188
              (values ,val found)))))))
7354623e5b54 define-alien-enum, zstd, skel, and pod work
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
189
 
658
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
190
 ;; from CFFI
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
191
 (defmacro with-alien-slots (vars struct &body body)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
192
   "Create local symbol macros for each var in VARS to reference
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
193
 foreign slots in STRUCT. Similar to WITH-SLOTS.
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
194
 Each var can be of the form: 
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
195
   name                       name bound to slot of same name              
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
196
   (* name)            name bound to pointer to slot of same name
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
197
   (name slot-name)           name bound to slot-name
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
198
   (name :pointer slot-name)  name bound to pointer to slot-name"
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
199
   `(symbol-macrolet
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
200
        ,(loop for var in vars
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
201
               collect
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
202
                  (if (listp var)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
203
                      (let ((p1 (first var)) (p2 (second var)) (p3 (third var)))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
204
                        (if (eq (sb-int:keywordicate p1) :*)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
205
                            `(,p2 (addr (slot ,struct ',p2)))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
206
                            (if (eq (sb-int:keywordicate p2) :*)
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
207
                                `(,p1 (addr (slot ,struct ',p3)))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
208
                                `(,p1 (slot ,struct ',p2)))))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
209
                      `(,var (slot ,struct ',var))))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
210
      ,@body))
804b5ee20a46 zstd completed (besides zdict), working on readline
Richard Westhaver <ellis@rwest.io>
parents: 657
diff changeset
211
 
224
fdea20982c25 deferror
Richard Westhaver <ellis@rwest.io>
parents: 222
diff changeset
212
 (defun num-cpus ()
fdea20982c25 deferror
Richard Westhaver <ellis@rwest.io>
parents: 222
diff changeset
213
   "Return the number of CPU threads online."
fdea20982c25 deferror
Richard Westhaver <ellis@rwest.io>
parents: 222
diff changeset
214
   (alien-funcall (extern-alien "sysconf" (function int int)) sb-unix:sc-nprocessors-onln))
277
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
215
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
216
 (defvar *cpus* (num-cpus))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
217
 
238
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
218
 ;;; C Standard
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
219
 
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
220
 ;; types
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
221
 (define-alien-type loff-t long-long)
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
222
 
6fa723592550 audio ffi, io work
Richard Westhaver <ellis@rwest.io>
parents: 233
diff changeset
223
 (define-alien-routine memset void (ptr (* t)) (constant int) (size size-t))