Paste: factor FFI for libexempi
Author: | maali |
Mode: | factor |
Date: | Wed, 11 Feb 2009 00:39:46 |
Plain Text |
USING: accessors alien alien.syntax
combinators kernel system math locals ;
IN: libexempi.ffi
<< "exempi" {
{ [ os winnt? ] [ "libexempi.dll" ] }
{ [ os macosx? ] [ "libexempi.dylib" ] }
{ [ os unix? ] [ "libexempi.so" ] }
} cond "cdecl" add-library >>
LIBRARY: exempi
TYPEDEF: uint uint32_t
TYPEDEF: int int32_t
TYPEDEF: longlong int64_t
TYPEDEF: ulonglong uint64_t
TYPEDEF: void* XmpPtr
TYPEDEF: void* XmpFilePtr
TYPEDEF: void* XmpStringPtr
TYPEDEF: void* XmpIteratorPtr
TYPEDEF: uint XmpOpenFileOptions
TYPEDEF: uint XmpCloseFileOptions
TYPEDEF: uint XmpFileType
TYPEDEF: uint XmpIterOptions
TYPEDEF: uint XmpIterSkipOptions
TYPEDEF: uint XmpPropsBits
: XMP_OPEN_NOOPTION HEX: 00000000 ; inline
: XMP_OPEN_READ HEX: 00000001 ; inline
: XMP_OPEN_FORUPDATE HEX: 00000002 ; inline
: XMP_OPEN_ONLYXMP HEX: 00000004 ; inline
: XMP_OPEN_CACHETNAIL HEX: 00000008 ; inline
: XMP_OPEN_STRICTLY HEX: 00000010 ; inline
: XMP_OPEN_USESMARTHANDLER HEX: 00000020 ; inline
: XMP_OPEN_USEPACKETSCANNING HEX: 00000040 ; inline
: XMP_OPEN_LIMITSCANNING HEX: 00000080 ; inline
: XMP_OPEN_INBACKGROUND HEX: 10000000 ; inline
: XMP_CLOSE_NOOPTION HEX: 0000 ; inline
: XMP_CLOSE_SAFEUPDATE HEX: 0001 ; inline
: XMP_FT_PDF HEX: 50444620 ; inline
: XMP_FT_PS HEX: 50532020 ; inline
: XMP_FT_EPS HEX: 45505320 ; inline
: XMP_FT_JPEG HEX: 4A504547 ; inline
: XMP_FT_JPEG2K HEX: 4A505820 ; inline
: XMP_FT_TIFF HEX: 54494646 ; inline
: XMP_FT_GIF HEX: 47494620 ; inline
: XMP_FT_PNG HEX: 504E4720 ; inline
: XMP_FT_SWF HEX: 53574620 ; inline
: XMP_FT_FLA HEX: 464C4120 ; inline
: XMP_FT_FLV HEX: 464C5620 ; inline
: XMP_FT_MOV HEX: 4D4F5620 ; inline
: XMP_FT_AVI HEX: 41564920 ; inline
: XMP_FT_CIN HEX: 43494E20 ; inline
: XMP_FT_WAV HEX: 57415620 ; inline
: XMP_FT_MP3 HEX: 4D503320 ; inline
: XMP_FT_SES HEX: 53455320 ; inline
: XMP_FT_CEL HEX: 43454C20 ; inline
: XMP_FT_MPEG HEX: 4D504547 ; inline
: XMP_FT_MPEG2 HEX: 4D503220 ; inline
: XMP_FT_MPEG4 HEX: 4D503420 ; inline
: XMP_FT_WMAV HEX: 574D4156 ; inline
: XMP_FT_AIFF HEX: 41494646 ; inline
: XMP_FT_HTML HEX: 48544D4C ; inline
: XMP_FT_XML HEX: 584D4C20 ; inline
: XMP_FT_TEXT HEX: 74657874 ; inline
: XMP_FT_PHOTOSHOP HEX: 50534420 ; inline
: XMP_FT_ILLUSTRATOR HEX: 41492020 ; inline
: XMP_FT_INDESIGN HEX: 494E4444 ; inline
: XMP_FT_AEPROJECT HEX: 41455020 ; inline
: XMP_FT_AEPROJTEMPLATE HEX: 41455420 ; inline
: XMP_FT_AEFILTERPRESET HEX: 46465820 ; inline
: XMP_FT_ENCOREPROJECT HEX: 4E434F52 ; inline
: XMP_FT_PREMIEREPROJECT HEX: 5052504A ; inline
: XMP_FT_PREMIERETITLE HEX: 5052544C ; inline
: XMP_FT_UNKNOWN HEX: 20202020 ; inline
: XMP_ITER_CLASSMASK HEX: 00FF ; inline
: XMP_ITER_PROPERTIES HEX: 0000 ; inline
: XMP_ITER_ALIASES HEX: 0001 ; inline
: XMP_ITER_NAMESPACES HEX: 0002 ; inline
: XMP_ITER_JUSTCHILDREN HEX: 0100 ; inline
: XMP_ITER_JUSTLEAFNODES HEX: 0200 ; inline
: XMP_ITER_JUSTLEAFNAME HEX: 0400 ; inline
: XMP_ITER_INCLUDEALIASES HEX: 0800 ; inline
: XMP_ITER_OMITQUALIFIERS HEX: 1000 ; inline
: XMP_ITER_SKIPSUBTREE HEX: 0001 ; inline
: XMP_ITER_SKIPSIBLINGS HEX: 0002 ; inline
: XMP_PROP_VALUE_IS_URI HEX: 00000002 ; inline
: XMP_PROP_HAS_QUALIFIERS HEX: 00000010 ; inline
: XMP_PROP_IS_QUALIFIER HEX: 00000020 ; inline
: XMP_PROP_HAS_LANG HEX: 00000040 ; inline
: XMP_PROP_HAS_TYPE HEX: 00000080 ; inline
: XMP_PROP_VALUE_IS_STRUCT HEX: 00000100 ; inline
: XMP_PROP_VALUE_IS_ARRAY HEX: 00000200 ; inline
: XMP_PROP_ARRAY_IS_UNORDERED XMP_PROP_VALUE_IS_ARRAY ; inline
: XMP_PROP_ARRAY_IS_ORDERED HEX: 00000400 ; inline
: XMP_PROP_ARRAY_IS_ALT HEX: 00000800 ; inline
: XMP_PROP_ARRAY_IS_ALTTEXT HEX: 00001000 ; inline
: XMP_PROP_IS_ALIAS HEX: 00010000 ; inline
: XMP_PROP_HAS_ALIASES HEX: 00020000 ; inline
: XMP_PROP_IS_INTERNAL HEX: 00040000 ; inline
: XMP_PROP_IS_STABLE HEX: 00100000 ; inline
: XMP_PROP_IS_DERIVED HEX: 00200000 ; inline
: XMP_PROP_ARRAY_FORM_MASK XMP_PROP_VALUE_IS_ARRAY XMP_PROP_ARRAY_IS_ORDERED bitor XMP_PROP_ARRAY_IS_ALT bitor XMP_PROP_ARRAY_IS_ALTTEXT bitor ; inline
: XMP_PROP_COMPOSITE_MASK XMP_PROP_VALUE_IS_STRUCT XMP_PROP_ARRAY_FORM_MASK bitor ; inline
: XMP_IMPL_RESERVED_MASK HEX: 70000000 ; inline
: XMP_SERIAL_OMITPACKETWRAPPER HEX: 0010 ; inline
: XMP_SERIAL_READONLYPACKET HEX: 0020 ; inline
: XMP_SERIAL_USECOMPACTFORMAT HEX: 0040 ; inline
: XMP_SERIAL_INCLUDETHUMBNAILPAD HEX: 0100 ; inline
: XMP_SERIAL_EXACTPACKETLENGTH HEX: 0200 ; inline
: XMP_SERIAL_WRITEALIASCOMMENTS HEX: 0400 ; inline
: XMP_SERIAL_OMITALLFORMATTING HEX: 0800 ; inline
: _XMP_LITTLEENDIAN_BIT HEX: 0001 ; inline
: _XMP_UTF16_BIT HEX: 0002 ; inline
: _XMP_UTF32_BIT HEX: 0004 ; inline
: XMP_SERIAL_ENCODINGMASK HEX: 0007 ; inline
: XMP_SERIAL_ENCODEUTF8 0 ; inline
: XMP_SERIAL_ENCODEUTF16BIG _XMP_UTF16_BIT ; inline
: XMP_SERIAL_ENCODEUTF16LITTLE _XMP_UTF16_BIT _XMP_LITTLEENDIAN_BIT bitor ; inline
: XMP_SERIAL_ENCODEUTF32BIG _XMP_UTF32_BIT ; inline
: XMP_SERIAL_ENCODEUTF32LITTLE _XMP_UTF32_BIT _XMP_LITTLEENDIAN_BIT bitor ; inline
: XMP_TZ_WEST -1 ; inline
: XMP_TZ_UTC 0 ; inline
: XMP_TZ_EAST 1 ; inline
: XMP_SCHEMA_NODE HEX: 80000000 ; inline
C-STRUCT: _XmpDateTime
{ "int32_t" "year" }
{ "int32_t" "month" }
{ "int32_t" "day" }
{ "int32_t" "hour" }
{ "int32_t" "minute" }
{ "int32_t" "second" }
{ "int32_t" "tzSign" }
{ "int32_t" "tzHour" }
{ "int32_t" "tzMinute" }
{ "int32_t" "nanoSecond" }
;
:: XMP_SET_OPTION var opt bitor ;
:: XMP_CLEAR_OPTION var opt bitnot bitand ;
:: XMP_TEST_OPTION_SET var opt bitand 0 = not ;
:: XMP_TEST_OPTION_CLEAR var opt bitand 0 = ;
:: XMP_IS_PROP_SIMPLE opt XMP_PROP_COMPOSITE_MASK bitand 0 = ;
:: XMP_IS_PROP_STRUCT opt XMP_PROP_VALUE_IS_STRUCT bitand 0 = not ;
:: XMP_IS_PROP_ARRAY opt XMP_PROP_VALUE_IS_ARRAY bitand 0 = not ;
:: XMP_IS_ARRAY_UNORDERED opt XMP_PROP_ARRAY_IS_ORDERED bitand 0 = ;
:: XMP_IS_ARRAY_ORDERED opt XMP_PROP_ARRAY_IS_ORDERED bitand 0 = not ;
:: XMP_IS_ARRAY_ALT opt XMP_PROP_ARRAY_IS_ALT bitand 0 = not ;
:: XMP_IS_ARRAY_ALTTEXT opt XMP_PROP_ARRAY_IS_ALTTEXT bitand 0 = not ;
:: XMP_HAS_PROP_QUALIFIERS opt XMP_PROP_HAS_QUALIFIERS bitand 0 = not ;
:: XMP_IS_PROP_QUALIFIER opt XMP_PROP_IS_QUALIFIER bitand 0 = not ;
:: XMP_HAS_PROP_LANG opt XMP_PROP_HAS_LANG bitand 0 = not ;
:: XMP_IS_NODE_SCHEMA opt XMP_SCHEMA_NODE bitand 0 = not ;
:: XMP_IS_PROP_ALIAS opt XMP_PROP_IS_ALIAS bitand 0 = not ;
FUNCTION: bool xmp_init ;
FUNCTION: void xmp_terminate ;
FUNCTION: int xmp_get_error ;
FUNCTION: XmpFilePtr xmp_files_new ;
FUNCTION: XmpFilePtr xmp_files_open_new ;
FUNCTION: bool xmp_files_open ;
FUNCTION: bool xmp_files_close ;
FUNCTION: XmpPtr xmp_files_get_new_xmp ;
FUNCTION: bool xmp_files_get_xmp ;
FUNCTION: bool xmp_files_can_put_xmp ;
FUNCTION: bool xmp_files_put_xmp ;
FUNCTION: bool xmp_files_free ;
FUNCTION: bool xmp_register_namespace ;
FUNCTION: XmpPtr xmp_new_empty ;
FUNCTION: XmpPtr xmp_new ;
FUNCTION: XmpPtr xmp_copy ;
FUNCTION: bool xmp_free ;
FUNCTION: bool xmp_parse ;
FUNCTION: bool xmp_serialize ;
FUNCTION: bool xmp_serialize_and_format ;
FUNCTION: bool xmp_get_property ;
FUNCTION: bool xmp_get_property_date ;
FUNCTION: bool xmp_get_property_float ;
FUNCTION: bool xmp_get_property_bool ;
FUNCTION: bool xmp_get_property_int32 ;
FUNCTION: bool xmp_get_property_int64 ;
FUNCTION: bool xmp_get_array_item ;
FUNCTION: bool xmp_set_property ;
FUNCTION: bool xmp_set_property_date ;
FUNCTION: bool xmp_set_property_float ;
FUNCTION: bool xmp_set_property_bool ;
FUNCTION: bool xmp_set_property_int32 ;
FUNCTION: bool xmp_set_property_int64 ;
FUNCTION: bool xmp_set_array_item ;
FUNCTION: bool xmp_append_array_item ;
FUNCTION: bool xmp_delete_property ;
FUNCTION: bool xmp_has_property ;
FUNCTION: bool xmp_get_localized_text ;
FUNCTION: bool xmp_set_localized_text ;
FUNCTION: bool xmp_delete_localized_text ;
FUNCTION: XmpStringPtr xmp_string_new ;
FUNCTION: void xmp_string_free ;
FUNCTION: bool xmp_iterator_free ;
FUNCTION: bool xmp_iterator_next ;
FUNCTION: bool xmp_iterator_skip ;
Author: | maali |
Mode: | shellscript |
Date: | Wed, 11 Feb 2009 00:43:27 |
Plain Text |
mkdir -p tmp
cd tmp
echo Creating header.fact
cat <<EOFACT > header.fact
! bindings for xmp library exempi
! 2009feb10 maali@socialdynamics.ca
USING: accessors alien alien.syntax
combinators kernel system math locals ;
IN: libexempi.ffi
<< "exempi" {
{ [ os winnt? ] [ "libexempi.dll" ] }
{ [ os macosx? ] [ "libexempi.dylib" ] }
{ [ os unix? ] [ "libexempi.so" ] }
} cond "cdecl" add-library >>
LIBRARY: exempi
EOFACT
echo Creating typedefs.fact
(
echo '! typedefs.fact'
echo '! typedefs.fact - custom'
echo TYPEDEF: uint uint32_t
echo TYPEDEF: int int32_t
echo TYPEDEF: longlong int64_t
echo TYPEDEF: ulonglong uint64_t
echo '! typedefs.fact - structs'
grep 'typedef struct .*;' /usr/include/exempi-2.0/exempi/xmp.h | sed 's/typedef /TYPEDEF:/; s/struct//; s/_.*\*/void* /; s/;//'
echo '! typedefs.fact - enums'
perl -n0e 'while (m/(typedef enum.*{[^}]*}[ ]*([A-Za-z0-9_]+);)/gm) {print "TYPEDEF: uint ".$2."\n" ; } ' "/usr/include/exempi-2.0/exempi/xmp.h"
echo
) > typedefs.fact
echo Creating consts.fact
(
echo '! consts.fact'
grep '^[[:space:]]*_*XMP.*=.*' "/usr/include/exempi-2.0/exempi/xmp.h" | sed -e 's|/\*.*\*/||; s|/\*.*$||; s/=/ ( -- n ) /; s/0x/HEX: /; s/,.*$// ; s/^[[:space:]]*\(_*XMP\)/: \1/ ; s/$/ ;/; s/0x// ; s/;/; inline/; s/\+1/1/ ; s/| \([_A-Z]*\)/ \1 bitor/g; ' | sed -e 's/\( [0-9a-fA-F]\+\)U\?L/ \1/g' | grep X | perl -pe 's/\t//g'
echo '! consts.fact - custom'
echo ': XMP_SCHEMA_NODE ( -- n ) HEX: 80000000 ; inline'
echo
) > consts.fact
echo Creating structs.fact
(
echo '! structs.fact'
perl -n0e 'while (m/(typedef struct.*{[^}]*})/gm) {print $1."\n" ; } ' "/usr/include/exempi-2.0/exempi/xmp.h" | sed -e 's=/\*.*\*/==; s/;//; s/typedef \+struct/C-STRUCT:/; s/{// ; s/}/;/; s/^[ \t]\+\(\b[A-Za-z0-9_]\+\b\) \(\b[A-Za-z0-9_]\+\b\)/ { "\1" "\2" } /g ; '
echo
) > structs.fact
echo Creating defines.fact
(
echo '! defines.fact'
grep '#define.*(' "/usr/include/exempi-2.0/exempi/xmp.h" | sed -e 's/.*#define/:: /' | sed -e 's/(\([^()]*opt)\)/ ( \1/; s/,/ /; s/opt)/opt -- x )/; s/$/ ;/; s/(\([^ ]\)/\1/g ; s/(\([^ ]\)/\1/g ; s/(\([^ ]\)/\1/g ; s/\([^ ]\))/\1/g ; s/\([^ ]\))/\1/g ; s/\([^ ]\))/\1/g ; s/\([A-Za-z0-9_]\+\) & \([A-Za-z0-9_]\+\)/\1 \2 bitand/g; s/!= \([0-9A-Za-z_]\+\)/\1 = not/; s/== \([0-9A-Za-z_]\+\)/\1 = /; s/|= \([0-9A-Za-z_]\+\)/\1 bitor/ ; s/~\([0-9A-Za-z_]\+\)/\1 bitnot/ ; s/ &= \(.*\) ;/ \1 bitand ;/'
echo
) > defines.fact
echo Creating funcs.fact
(
echo '! funcs.fact'
perl -n0e 'while(m/^[ ]*((bool|int|void|XmpFilePtr|XmpStringPtr|XmpPtr) [^(\n]*\([^)]*\)[^;]*;)/xsgm) {print $1."\n" ; } ' "/usr/include/exempi-2.0/exempi/xmp.h" | perl -n0e 's/\n//sgm ; s/;/;\n/g ; print ' | perl -pe 's/\t+/ /g; s/ +/ /g;' | perl -pe 's/\b([a-zA-Z0-9_]+)[ ]*\*/\1* /g' | perl -pe 's/const//g' | perl -pe 's/(.?)\((.?)/\1 ( \2/g; s/(.?)\)(.?)/\1 ) \2/g; ' | perl -pe 's/^/FUNCTION: / ; s/ +/ /g'
echo
) > funcs.fact
echo Catting into ffi.factor
cat header.fact typedefs.fact consts.fact structs.fact defines.fact funcs.fact > ffi.factor
cp ffi.factor ..
cd ..
Author: | maali |
Mode: | factor |
Date: | Wed, 11 Feb 2009 00:47:16 |
Plain Text |
USE: libexempi.ffi
xmp_init
"034.jpg" XMP_OPEN_FORUPDATE xmp_files_open_new "f" set
"f" get xmp_files_get_new_xmp "xmp" set
xmp_string_new "s" set
"sdi" "sdi" f xmp_register_namespace
"xmp" get "sdi" "license"
"http://creativeuncommons.org/licenses/by-sa/2.5/"
XMP_PROP_VALUE_IS_URI
xmp_set_property
"f" get "xmp" get xmp_files_put_xmp
"f" get XMP_CLOSE_SAFEUPDATE xmp_files_close
"xmp" get xmp_free
xmp_terminate
New Annotation