Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
// This file:
//   http://anggtwu.net/LISP/CLA/test.h.html
//   http://anggtwu.net/LISP/CLA/test.h
//          (find-angg "LISP/CLA/test.h")
// Author: Eduardo Ochs <eduardoochs@gmail.com>
//
// Based on the "test.h" from here,
//   https://github.com/rpav/cl-autowrap
// but with test blocks:
//   http://anggtwu.net/eepitch.html#test-blocks

typedef struct foo {
  int a, b;
  char c[3];

  struct {
    unsigned int b0 : 2, b1 : 3;

    struct {
      char x, y;
    } s;
  } x[2];
} foo_t;

foo_t* get_foo();
void free_foo(foo_t *foo);
int* get_int();

/*
* (eepitch-sbcl)
* (eepitch-kill)
* (eepitch-sbcl)
;; (find-quicklisp-links "cl-autowrap")
;; (find-quicklisp-links "c2ffi")
(load #P"~/quicklisp/setup.lisp")
(ql:quickload "cl-autowrap")
(in-package :autowrap)

(ql:quickload "c2ffi")

(c-include "test.h")
;; ^ Couldn't execute "c2ffi": No such file or directory

(let ((foo (get-foo)))
  (setf (foo-t.a foo) 5)             ;; foo.a = 5;
  (setf (foo-t.x[].b0 foo 0) #b10)   ;; foo.x[0].b0 = 2;
  (print (foo-t.x[].s.x foo 1))      ;; anonymous struct
  (foo-t.x[].s foo 0)                ;; => child wrapper
  (foo-t.x[].s& foo 0)               ;; &(foo.x[0].s) => pointer
  (free-foo foo))

*/