/ src /
/src/string-list.lisp
1 (in-package :cl-smoke.qt.core)
2
3 (defcfun cl-smoke-string-list-size :int
4 (string-list :pointer))
5
6 (defcfun cl-smoke-string-list-at :pointer
7 (string-list :pointer)
8 (index :int))
9
10 (defcfun cl-smoke-free-string-list :void
11 (string-list :pointer))
12
13 (defcfun cl-smoke-make-string-list :pointer)
14
15 (defcfun cl-smoke-string-list-append :void
16 (string-list :pointer)
17 (string :pointer)
18 (length :int))
19
20 (defun from-string-list (string-list)
21 (let ((vector (make-array (cl-smoke-string-list-size string-list)
22 :initial-element ""
23 :element-type 'string)))
24 (dotimes (index (length vector) vector)
25 (setf (aref vector index)
26 (cxx:data (make-instance 'qt:byte-array
27 :pointer (cl-smoke-string-list-at
28 string-list index)))))))
29
30 (define-to-lisp-translation ("QStringList" "const QStringList&")
31 from-string-list cl-smoke-free-string-list)
32
33 (defun coerce-string-list (sequence)
34 (let ((string-list (cl-smoke-make-string-list)))
35 (map nil
36 #'(lambda (string)
37 (with-foreign-string ((data length) string :null-terminated-p nil)
38 (cl-smoke-string-list-append string-list data length)))
39 sequence)
40 (make-cleanup-pointer
41 string-list #'cl-smoke-free-string-list)))
42
43 (defun string-list-p (sequence)
44 (every #'stringp sequence))
45
46 (define-from-lisp-translation "const QStringList&"
47 (and (vector string)
48 (satisfies string-list-p))
49 coerce-string-list)