| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| (in-package #:cffi) |
|
|
| (defmacro discard-docstring (body-var) |
| "Discards the first element of the list in body-var if it's a |
| string." |
| `(when (stringp (car ,body-var)) |
| (pop ,body-var))) |
|
|
| (defun single-bit-p (integer) |
| "Answer whether INTEGER, which must be an integer, is a single |
| set twos-complement bit." |
| (if (<= integer 0) |
| nil |
| (loop until (logbitp 0 integer) |
| do (setf integer (ash integer -1)) |
| finally (return (zerop (ash integer -1)))))) |
|
|
| |
| |
| |
| |
| (defun warn-if-kw-or-belongs-to-cl (name) |
| (let ((package (symbol-package name))) |
| (when (and (not (eq *package* (find-package '#:cffi))) |
| (member package '(#:common-lisp #:keyword) |
| :key #'find-package)) |
| (warn "Defining a foreign type named ~S. This symbol belongs to the ~A ~ |
| package and that may interfere with other code using CFFI." |
| name (package-name package))))) |
|
|
| (define-condition obsolete-argument-warning (style-warning) |
| ((old-arg :initarg :old-arg :reader old-arg) |
| (new-arg :initarg :new-arg :reader new-arg)) |
| (:report (lambda (c s) |
| (format s "Keyword ~S is obsolete, please use ~S" |
| (old-arg c) (new-arg c))))) |
|
|
| (defun warn-obsolete-argument (old-arg new-arg) |
| (warn 'obsolete-argument-warning |
| :old-arg old-arg :new-arg new-arg)) |
|
|
| (defun split-if (test seq &optional (dir :before)) |
| (remove-if #'(lambda (x) (equal x (subseq seq 0 0))) |
| (loop with stop |
| for start fixnum = 0 |
| then (if (eq dir :before) |
| stop |
| (the fixnum (1+ (the fixnum stop)))) |
| while (< start (length seq)) |
| do (setf stop (position-if test seq |
| :start (if (eq dir :elide) |
| start |
| (the fixnum (1+ start))))) |
| collect (subseq seq start |
| (if (and stop (eq dir :after)) |
| (the fixnum (1+ (the fixnum stop))) |
| stop)) |
| while stop))) |
|
|