cffi-ecl: support multiple FFI backends

Allow the ECL backend to support different combinations of FFI in
the same code by customizing a single special variable.
cffi-ecl: c-inline-function-pointer-call bugfix

The previous fix did not work with functions that return no values.
Surround the code with braces, so that the C compiler does not
complain about the extern declaration.
Teach groveler cstruct :count :auto to work on arrays anywhere in the struct.

The :count :auto logic assumed the struct member was an array which
filled the remainder of the struct, and would generate incorrect cffi
cstruct forms when any other struct members followed one declared
:count :auto.

The following C struct definition and groveler cstruct form
demonstrate this:

struct charbuf {
	char three_chars[3];
	int clobbered_int
};

(cstruct charbuf "struct charbuf"
  (three-chars "three_chars" :type :char :count :auto)
  (clobbered-int "clobbered_int" :type :int))
Teach the groveler's cstruct :type to guess type when :auto is given.

This means that integer size and signedness is determined by the
groveler in cases like this:

(cstruct autotype "struct mystruct"
 (myint "myint" :type :auto)
 (myarray "myarray" :type :auto :count :auto))
Don't pass user-defined strings to printf().

This allows % to be safely used in lisp symbol names which pass
through the groveler, such as the following:

(cvar ("errno" %errno) :int)
Teach the groveler to print cstruct types which are lists of symbols.

This means that forms such as the following are allowed:

(cstruct foo "struct foo"
  (mybar "mybar" :type (:struct bar)))
Expose struct slot type and count via FOREIGN-SLOT-TYPE and FOREIGN-SLOT-COUNT.

This is especially useful when the type and count have been groveled.
ecl: si:find-foreign-symbol expects a base-string, coerce it.
cffi-abcl: pointerp and null-pointer-p should work on non-pointers.
groveller: fix to work with new type syntax

Use C-WRITE instead of C-PRINT-SYMBOL when emitting types to deal with
the fact that some types are more than just one symbol now.

e.g. 'foo vs '(:struct foo) and '(:pointer (:struct foo))