Module:    dylan-user
Copyright:    Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
              All rights reserved.
License:      Functional Objects Library Public License Version 1.0
Dual-license: GNU Lesser General Public License
Warranty:     Distributed WITHOUT WARRANTY OF ANY KIND

define library c-ffi
  use functional-dylan;
  export c-ffi;
end;

define module c-ffi-interface
  create
    destroy,
    C-char-at,
    C-char-at-setter,
    C-signed-char-at,
    C-signed-char-at-setter,
    C-unsigned-char-at,
    C-unsigned-char-at-setter,
    C-short-at,
    C-short-at-setter,
    C-signed-short-at,
    C-signed-short-at-setter,
    C-unsigned-short-at,
    C-unsigned-short-at-setter,
    C-long-at,
    C-long-at-setter,
    C-signed-long-at,
    C-signed-long-at-setter,
    C-unsigned-long-at,
    C-unsigned-long-at-setter,
    C-int-at,
    C-int-at-setter,
    C-signed-int-at,
    C-signed-int-at-setter,
    C-unsigned-int-at,
    C-unsigned-int-at-setter,

    C-float-at,
    C-float-at-setter,
    C-double-at,
    C-double-at-setter,

    <C-unsigned-char>,
    <C-unsafe-unsigned-char>,
    <C-both-unsigned-char>,
    <C-unsigned-char*>,
    <C-unsafe-unsigned-char*>,
    <C-both-unsigned-char*>,

    <C-signed-char>,
    <C-unsafe-signed-char>,
    <C-both-signed-char>,
    <C-signed-char*>,
    <C-unsafe-signed-char*>,
    <C-both-signed-char*>,

    <C-char>,
    <C-unsafe-char>,
    <C-both-char>,
    <C-char*>,
    <C-unsafe-char*>,
    <C-both-char*>,

    <C-unsigned-long>,
    <C-unsafe-unsigned-long>,
    <C-both-unsigned-long>,
    <C-unsigned-long*>,
    <C-unsafe-unsigned-long*>,
    <C-both-unsigned-long*>,

    <C-signed-long>,
    <C-unsafe-signed-long>,
    <C-both-signed-long>,
    <C-signed-long*>,
    <C-unsafe-signed-long*>,
    <C-both-signed-long*>,
    
    <C-long>,
    <C-unsafe-long>,
    <C-both-long>,
    <C-long*>,
    <C-unsafe-long*>,
    <C-both-long*>,

    <C-unsigned-short>,
    <C-unsafe-unsigned-short>,
    <C-both-unsigned-short>,
    <C-unsigned-short*>,
    <C-unsafe-unsigned-short*>,
    <C-both-unsigned-short*>,

    <C-signed-short>,
    <C-unsafe-signed-short>,
    <C-both-signed-short>,
    <C-signed-short*>,
    <C-unsafe-signed-short*>,
    <C-both-signed-short*>,

    <C-short>,
    <C-unsafe-short>,
    <C-both-short>,
    <C-short*>,
    <C-unsafe-short*>,
    <C-both-short*>,

    <C-unsigned-int>,
    <C-unsafe-unsigned-int>,
    <C-both-unsigned-int>,
    <C-unsigned-int*>,
    <C-unsafe-unsigned-int*>,
    <C-both-unsigned-int*>,

    <C-signed-int>,
    <C-unsafe-signed-int>,
    <C-both-signed-int>,
    <C-signed-int*>,
    <C-unsafe-signed-int*>,
    <C-both-signed-int*>,

    <C-int>,
    <C-unsafe-int>,
    <C-both-int>,
    <C-int*>,
    <C-unsafe-int*>,
    <C-both-int*>,

    <C-raw-long>,
    <C-raw-short>,
    <C-raw-long*>,
    <C-raw-short*>,

    <C-character>,
    <C-character*>,
    <C-dylan-object>,
    <C-dylan-object*>,

    C-pointer-at,
    C-pointer-at-setter,
    pointer-address,
    null-pointer,
    null-pointer?,
    <C-string>, C-string-constant,
    <C-string*>,
    <C-unicode-string>, C-unicode-string-constant,
    <C-unicode-string*>,
    <C-boolean>,
    <C-dylan-object>,
    register-c-dylan-object,
    unregister-c-dylan-object,
    export-c-dylan-object,
    import-c-dylan-object,

/* [gts, 11/97, wait until harp backend ready]
   once handled by conversion, the following line should be commented out */
    \with-stack-structure,
    \with-c-string,
    pointer-cast,
    c-type-cast,

    copy-into!,
    copy-bytes!,
    equal-memory?,
    clear-memory!,

    <ffi-integer>
    ;
end module;

define module c-ffi-kludges
  use machine-words, export: all;
  create
    check-import-range,
    check-export-range,
    export-to-machine-word,
    export-c-string,
    export-c-boolean,
    import-c-boolean;
end;

define module c-ffi
  use c-ffi-interface, export: all;
  use dylan-c-ffi, export: all;
  use dylan-extensions, export: { <abstract-integer>, <big-integer> };
  use c-ffi-kludges, export: all;
end;

define module c-ffi-implementation
  use c-ffi;
  use functional-dylan;
  use dylan-extensions;
  use dylan-primitives;
  use dylan-c-ffi;
  use machine-words;
  use simple-format;
end;