[cffi-devel] Accept defcfun name as single element list

Johan Ur Riise johan at riise-data.no
Tue Sep 8 23:38:30 UTC 2009


Of these 10 forms of defcfun, the last two are illegal. They have either
the name as a string or a symbol as the only element of a list.
According to the documentation, they probably should be legal too. I
suggest a change to allow it.

(defcfun "gethostname" :int
  (name :pointer)
  (namelen :int))

(defcfun gethostname :int
  (name :pointer)
  (namelen :int))

(defcfun ("gethostname" lispgethostname) :int
  (name :pointer)
  (namelen :int))

(defcfun (lispgethostname "gethostname") :int
  (name :pointer)
  (namelen :int))

(defcfun ("gethostname" :convention :stdcall) :int
  (name :pointer)
  (namelen :int))

(defcfun (gethostname :convention :stdcall) :int
  (name :pointer)
  (namelen :int))

(defcfun (lispgethostname "gethostname" :convention :stdcall) :int
  (name :pointer)
  (namelen :int))

(defcfun ("gethostname" lispgethostname :convention :stdcall) :int
  (name :pointer)
  (namelen :int))

;; illegal:

(defcfun ("gethostname") :int
  (name :pointer)
  (namelen :int))

;; illegal:

(defcfun (gethostname) :int
  (name :pointer)
  (namelen :int))

This is from function.lisp. 

;;; The following four functions take care of parsing DEFCFUN's first
;;; argument whose syntax can be one of:
;;;
;;;     1.  string
;;;     2.  symbol
;;;     3.  \( string [symbol] options* )
;;;     4.  \( symbol [string] options* )
;;;
;;; The string argument denotes the foreign function's name. The
;;; symbol argument is used to name the Lisp function. If one isn't
;;; present, its name is derived from the other. See the user
;;; documentation for an explanation of the derivation rules.

And from the documentation of defcfun. This is a bit more clear,
except that keyword parameters normally are optional, and in this
case they indeed have default values

>From the manual:
name-and-options ::= name | (name &key library calling-convention
cconv) 
name ::= lisp-name [foreign-name] | foreign-name [lisp-name] 


This is the lisp-name function

Even if the system here is conformant with the documentation, it would
not hurt to allow the last two forms. I suggest to change the first test
from (keywordp (second spec))
to (oddp (length spec))

(defun lisp-name (spec &optional varp)
  (etypecase spec
    (list (if (keywordp (second spec))
              (lisp-name (first spec) varp)
              (if (symbolp (first spec))
                  (first spec)
                  (lisp-name (second spec) varp))))
    (string (intern
             (format nil (if varp "*~A*" "~A")
                     (canonicalize-symbol-name-case
                      (substitute #\- #\_ spec)))))
    (symbol spec)))


The foreign-option function seems to be ok as it is, as it can handle a
list of length one:

(defun foreign-options (spec varp)
  (let ((opts (if (listp spec)
                  (if (keywordp (second spec))
                      (cdr spec)
                      (cddr spec))
                  nil)))
    (if varp
        (funcall 'parse-defcvar-options opts)
        (parse-function-options opts))))

What do you think?

Maybe this patch is useful - I am not yet a master of mercurial:

Tue Sep  8 22:13:56 W. Europe Daylight Time 2009  Johan Ur Riise
<johan at riise-data.no>
  * Accept defcfun name as single element list

New patches:

[Accept defcfun name as single element list
Johan Ur Riise <johan at riise-data.no>**20090908201356
 Ignore-this: 8b4f6bf7d6c7a7f6562289e931861e1d
] hunk ./src/functions.lisp 223

 (defun lisp-name (spec &optional varp)
   (etypecase spec
-    (list (if (keywordp (second spec))
+    (list (if (oddp (length spec))
               (lisp-name (first spec) varp)
               (if (symbolp (first spec))
                   (first spec)

Context:

[Deprecate groveler clause FLAG in favour of CC-FLAGS.
Stelian Ionescu <sionescu at cddr.org>**20090823121108
 Ignore-this: e1537717a9e7356b208d5cd14b34ba50
]
[cffi-allegro: define long long types on 64-bit platforms
Luis Oliveira <loliveira at common-lisp.net>**20090821210052

 Patch courtesy of John Fremlin.
]
[cffi-tests: fix pointer-to-integer casts in libtest.c
Luis Oliveira <loliveira at common-lisp.net>**20090821205447]
[cffi-tests: don't use stdcall #ifndef WIN32
Luis Oliveira <loliveira at common-lisp.net>**20090821205144]
[Also canonicalize search paths in library specs.
Stelian Ionescu <sionescu at cddr.org>**20090809005356
 Ignore-this: 86a039c7ebbc757c9934fe99368ae0bb
]
[Update manual.
Stelian Ionescu <sionescu at cddr.org>**20090808222834
 Ignore-this: 15e832e5220a6ca70722730d81edf283

 DEFCFUN & co. now take only :CONVENTION.
]
[Whitespace.
Stelian Ionescu <sionescu at cddr.org>**20090808221547
 Ignore-this: 18d99969b97b190176e88d9eb24a94ce












More information about the cffi-devel mailing list