From caf4972e7f7d2562fe4a9977cf20d38bbf0e320f Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Wed, 16 Oct 2002 11:56:43 +0000 Subject: [PATCH] r3060: *** empty log message *** --- NEWS | 2 +- debian/changelog | 6 +++++ doc/html.tar.gz | Bin 21450 -> 21470 bytes examples/c-test-fns.lisp | 4 ++-- src/aggregates.lisp | 26 ++++++++++----------- src/functions.lisp | 12 +++++----- src/libraries.lisp | 10 ++++++-- src/objects.lisp | 30 ++++++++++++------------ src/primitives.lisp | 18 +++++++-------- src/strings.lisp | 48 +++++++++++++++++++++++++++------------ tests/c-test-fns.lisp | 4 ++-- uffi.asd | 6 ++--- 12 files changed, 98 insertions(+), 68 deletions(-) diff --git a/NEWS b/NEWS index 15937b3..3a8dcca 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,3 @@ -UFFI now passes all tests with SBCL & OpenMCL in Debian. +UFFI now passes all tests with SCL, SBCL, & OpenMCL in Debian. UFFI now uses ASDF system definition files. diff --git a/debian/changelog b/debian/changelog index 17800a0..94951a2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cl-uffi (1.1.0-1) unstable; urgency=low + + * Add SCL support. + + -- Kevin M. Rosenberg Tue, 15 Oct 2002 11:22:35 -0600 + cl-uffi (1.0.1-1) unstable; urgency=low * Add SBCL to documentation diff --git a/doc/html.tar.gz b/doc/html.tar.gz index 13d12938e30a5228a4a95bc077018962332a9255..1643e396fc3aa0261061ab765e817172cf228879 100644 GIT binary patch literal 21470 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

IxbH_<~sNX+{g!*22 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 JxF!H_0|4aY8btsA literal 21450 zcmV)fK&8JQiwFSUZmK;31MEF*ciK3!{ThCS4!h58_dJ0>c*||mo=XTxI7@&7q`Ujk z*aCcOEY>zjv%mh%=*4f?4kRT>vv5vJuqDlCG#br}Mx(j6u#VpC_ERcVOO09$zDwms ztrY%NpLbZ`xLR*iDvfuga=BDLen)EWp5e1{JWvk!q4?pF9y5JvZ44QNwriuspfOd*!$0?=bbN65T8#~*PHEL8Gj!&qvbgMgXU!$UtX0X zk7M)f{*Fy?pEyT`cFCYr6QnqaL=e2UpEeXOtJ?c6!voR(Uo5 zdwnngGeEE61HBnv;V4G%t1J9|N9HHjMKWYAwI|e>K?9X&zncKN+et*bKfJ^?;qevK z9FJTvcWHW>Mc9<|=pDJH-%OpIo(%)M!wsLG58ET`-sxcd*}>^}98jX!>B6&LeyW!~ zLPrGaEHu;d*atp=|JP9+DB9G6q6trVkD-ak0*aa5`tm8+y&|4^%ZIBpO=ZlwKfNq!cP z;NOL5QS$S-=Fty{b$*WEAxZ2%i1w%3 zzHD}T{c)$YHp#30Ea%V%;XiIr_I5ks(RfbD?j^xe)4ysnO71k57}PaqHZ_Q58@U4l zpF79&JZh84eL}B`SVj_&Bdste{4=1=!gRT8H(fGwG~0uwJw}j}hr}>l&oL(}k0Q7u z=8y$5%;`Px=1|;V`f5RKFDKes*#>ps4J975>Y}8;AD6uwase|67Z+Y!^AKFu)T!;# z!_eANmJIh%yycIwl{?d$6PuBa zeXBVpbc~Fsjs@I9@eUiYnJj(bFxxA%7=R;V`pttv&||-mGZ=yJ+oG)2Zwzi-E2G|!_Bng;{lOg;|!iMsu12xD{D8>|R667Bj8&m# zT;0okmWrT|ph3}ck@%(cT3way*q)#VFm9yEc?6kw&7VL}*G>@H%2|TAi$n7(e5+R! zD4fQ?=O8N5OE-MPMyutLIVcc2i={<<+2y8JE|+{FoO40FL5KWG*rRf(0d@NzXl_k< z_b?z{r(EGgHyNx1CXJwX#Ni!r(BZ%F<#BjC%9Tnmd<<5C#lo~_q{qBygK49p>T`rD zH5}In(Z~o`)ts98W1Bq5Zz94136@H`XuH+p{B|;G({}6G?Y6FOl5vfXQfSO;B{f7B z%%Q+tq(AvT5CC8*EI}6dq()iO)OG4+acZrq8tX4Tb7B62!`)&AB{weqDOQ>dxK}pB zdtIwD4UX9*~u!J3B%yZ4I;vryyHh~Gqj^ct9{V7xWTgr8?p$Oh|17LHRW0?b}nRzaU@ zPGPCwgdQb;7*p3n09ZiNQFR0`BxGu~`n}P(*+ZM5chl_(OOf1a)`}K0Mkz8()nlKX znzI?K*r20sHB8iAEy8re-FmUnY z$>2pZD~F~4pHZ*iTFfg5T1y0?PZN+BQqX7VEk}cwAybDfkY}M5swCRxkeAE^^~G6( zEuTLCU6$G&J`!1T9PK`iz}kz#euUY4X&dA1Q7j4$*`oaNwWonj2^9Q zWVBFE_=C(Is2R^o#xP%-a$mwTu2J;`qgd=VnQ5A3F&(C+FP0dusv1gpozR1(Ea@U$ zOfDXED#l)QNj9BKt|=I)DM%!|N*i1q<6_vb>-LsGmwN6 zm?;3$&^$ok9>;Fw3b(-;q8U?2&bfkS7@%6Y3Z>ZN2e6T)1d)^o$eOZiVj}b~YudUG zwoh#rs(Gv(5DJ$&`2vAtR2SM;THwk_Z1~n*B%s-HDC!W}!5?NNt<$A-n^LYasnWW4H%iJrVBB1)AT1k4B zG~S{Z*Hk6ud|BrvgKROGvI>C5(m)4qvH^!+NzFeKFkh)+Aj8j6mMyhvDe0RHgfBrc zAmL{jHVl{)7BtT%lJNkT$SA3GC1W6?MY74N78glbV8^WoHXEb00$UDq6u}g1)|8_t zE-9}wbtiYJfz}jNRpL0T&DN+HU#$nekCiR__~aLDvHS?#oH&|eZft^0W&McxDxW2; zvFJ7sTCA#>VzXLIGkm&O94%k}PI{LBtqaA%yrf!5fe89_D#WCBNmEtMq8LOnHLVOK zy%`!Etz17Y2i{ze+m@wm=* zjc%^5o5R080SE2fi^Am z8z2nvzjM_>rShM=Ldc?1FQ5A&e|c<~SKI}Q^LeydHK?XjT&Xv$7=p+5dE@mGb|9Lq zR(mx1y$u9GUg^g^|GixNUmz`Z9P)S7$FMLN@|P5KsN(;E5YxSjA)O^cB^NovhPWFvR!*mXXTZ z!t@eRi-1weid!zFt+*5Bd2A70+e3^HUfl;`oxBaN?g4<4Qu^8)fQZ)$qZM12*YOJC z7&g*5{PjCqsY?pJlN`$fR3p)9)tZV{^JM@p!o$-{m-v1!GQ$zU2r}I}T|t@z5qV-M#W%Bn0E|T1xoDW%6Kp!J|EqC$A^pEvuZHyhy3qg2d;S0A^#2%p{b)u&`q`lr ztv?7dy|~&R#1!vV?f3b0UG1;=N4;87BP|z6 zR0{Aa-z~uV#|^xWc-uqt7`0pDa`eof|0qo96W_p6Jyr%5$+ocMDUqE|zC+x>mxqM7 zkrEhCMCWm}QQcnR#W&2Sd~XgT+akfMjI;`tX3tjGrp^{isEC|msogeV96fMm>`kcb zj}SqxM`7PmQf*12=pMy$sL^3b^6%Uj;rhQC)|b)$>!r%^n*Se6g1!F#V)}nfAAbEN zz|CM&4}ON(uyM_Z?U1TpPOI-=L!>I+PckhU&$FYjq4Ha= zDCIZ2^7{HO|FmzZb01M3qv|FBc91HkMi$hYGZDD1^iLU}mZ)&bdV$)BK5duEX2j`P zHpTPrc)9IatF+A-769S6=$wGRUf6Ki`7>y==by%o{3Ef%2NQ~-!jhJ z;o^XxOy+TaxuxcKrq1Pjs}O{g1q!@Bl)InfAhG7S4T0y)IK#NBiA(u`8nrv3S*CYS zCe*v5Fs>oKN~THi8L+;SXCJ`YdjM?=T2**@zq*9oLD_r2^&8)0@h!8329_C~?Y3RZ zKT5HhPR-CJ5r&Y;ws4qTb%a*72Nhg@DNCPz5mU_{>2u&9i!E^|?&b`4tDb?3z>a~@ z$&)Lzf~gG;EK5y-6^KQ^Ue_$^9^}U@m1o}ZD2Y!Y%&tH+eXd9csvEd zAFP9rhlUQ`_-EM!7kRTu>BkU7Gs8V31ST?7&qnu z?OBhyo=8y_GEkOa=71r*aK$0hopY4t&<`;iH=4n3H2w<(fMvQ~!9_X8514--U=-Q9 z>F7AEHq4wBr1BxR_2Mysd3jDJre%IZTg$J+H=qJq_Ktx4$G890RCp2l zzfr4{;_<)L>i+!S3)=s_koY$k``c{br(RYNOLCfD%Y?f30K5qgK;sA6{12t!eH9)6 zSY?z8Kna+5P%&2HIdrd%*B(V$YN(ci?8Z=q>-PuGvGE+uo}U&POE80WDBksHQ3T1+ z13XK2kK(C7uwAYDL;THb>;BXm>CADc?g2mI$xzG6NsIzt-rBDEL1thsV&E;-YnpMH)f8^kc6C8kMKAv(edDGt&j zTjvr}Y4Sn|X)A+visbs9%we1`<0O~W;;g$IJoMaQVmI653X+ycY3^y;av(;|GqL*;aAfl1LAQr@RtRS;EZ~Z_jBa z&VQ@%ei8pqtyC?q`G3l_z5nMW^FOV#{*QJDJUtX6#fh`&H7NPDD^&K!!{3N^Cvi*Y z<IImM@Y=q6auiFVBL~Rk*)UU zIL^MgVB7Eh??2)Fe>o3c#{R36D(n0I`}qGCwEwmcBtK4sz($+&nOViQsvof})3wC> znohZo6nGP90up_w-!W7m+5CE5~(6qRoNNnI}p*G}Jx#cnyFYOX% zWfwpkP~2U@YimSe-OzR>uOBO=QUtsAu16PqTRn6OnYysb701GjZD5;cqD zV&&i-@uAp*SN#^-@R1=>X^@fdf-3_S|7IAU`wR*lXlp$d}n(L z^;zw|>WkTbqioD z%K@YJgbXu9?mQX9iov%sa8fiETuKV|%E~=_hG5~4Ni7K_EvfCurMW@h@8+gHCkC^B z^<=g$BtpnGi{~(VIJI{4L^~iyX zJC4ad+#MZpgTYM45OG6z3pD$l4;s1P~mV7ql%N$Qz3<=!b&SLtETq2BHF!=_$!aG#&>Wp)7q*!wQ6gKAqr7VM=@mXk?wZRSt zn~V91w{Z!-C7+ell_wu!D~{{Oi6eoFA}XIh3bBA#L$VXHtTDe5zDfifTp@Uqdsyi= zjh{l`?mX2Sx>jbbCGsnXbjv8%+5&*`6GT9Z=uo`%$d&Dt^w;A! z+*V)Tl1f_!lDrmwV%WIedk{DG|M}eXBJm&9dSl)HSKIslUNrwhWFq}&q5s=OTcmjE z)Y7l2sNY$hIw;s4wtM@_pnoiHUG)_P{YTkt$6mP*-$t#&6F=%d64Q?}WYD~9M;&?m zF-GVYNmPKu-E@QI5VY*^u)hYbmIQ87pW#V8At{6m2MHs@9c3y2WM+zN@PR*u`O+h5 zuWAzvols6aeloa7S}O0kM z_KD>dMJ={76O7_^C!XuJ4YxbF83eeXB+BM(iPRw}JIY}G`_x+tmtqw+krJ(@fuwCN zwZ2uX=Xp0`FWu>oe?J&=)56*6B01>bWd)E<+#%!Okxu{ZBAp`pV9t?BHAC2i?S3H8 zJH;*d{2v+PouB`Q{ULAvt@WGu@B2LehlKI%X#3Mt>xsU?SzqPCzM*}?g9F4PoCf?i zd)hD!C7{#K9}P%&Gay0Cx9uGy1d>(-K#2GNf4KVCdHm!4iXE|oErLJYqn5!d=n8*8 zKlgP_pq2XRR)^yO{Kg8)b&$I!XGnZx`~>PJnJNr5=<^@9clStkM2$L&H0m?XhQ(A} zfr5aQ&?W)qWSY%RNOc-|=;7-AW_)=Cqfcb|Ct%(c@-UWTe2`{5yrdHX(9`Q`k>-z` zr}dKBr_Yq%KpPMWWft=Y{%!nl4UGc5NAz?av>l-}R2w}6)0T%C%}(ndNEKtn-7F{e z0_`nJmQjv$lT6Ns^a{99iB$lQ%nv_gfW`v{N+UWVs;(xs)jP;R2GZz<0t@v~1TZp8 zry7;U4>lHNZ*0u^1%+KA_SW%~t&n$ADo3W0A0M|th1~pP6 z<~%>-c7TuR;|h&}c#yXY?iD$@f3w;`qW@!Jupj$>RgK4g*VG38?=$`vzdGKU3NTH3 zm!R~UqTR~VEie2kyVfZG4hz@I+2vX&0Hb2JCnX^II22I=UW1bYw~b^~1olD^sNkKr zJ`W+TpmY+Y7h8Hm++yo#VJO%Tjw!pS>otzX&cf)rCyKRRPVg_-Y1;SseS9`HSVyQY z78K25WB*olu@AzRNG zfj6vqieq?d$HK;uepgOKk(?zJuPtJK+KIH_3%we&L5a2@@>;8`#!NPzk#!W{St1}(`Ll-Lya*>*gB2-G2IL6I&+3-tR`ph(mkzF}Igc*DZQ`OPX&;KKF; zXqVEiNO{{dY`(Ddpo^pc1z!Xn42w&i;%4?5eYySehW#zei^d-BD6O$XtAG3D=7v6n z)YMxE@Xb;|J)+9uR43 zi%8bDXpmC$&|NR1lp<&IoFm5BgzU-;C0M)={~r_Q-P-@)-y{5AU+Xvg-=6J% zLc73QiujRgk&_tVF~{36-Y|R;X(ygs8nd87F$)sv&uT#(3eL;BFcAu!b$v6TU?<6J zD%3mI5=@0yfjN;yIR-<$^HHe=L!o^(o6!()@%>I;u73P#Y`~BoGd|l`5oz6CO|6J9 zLT8@m6NuBo!XPsI6gRy|sTseRP_-4ZDTJAea_#w(hKlpZv`~*85->VS^mBA47N;{jzNYOQz_WcPG6v9=$LRu zIL&KIq-nisjFhw>SxRH1RQQ-uFS4cRX(o5TRFPFsF`Fgfm~UmX6sJ44=VyHU9~h1YUBU2XZ+7e+PA_1WVHa25CI`oL0hI!XyE?=Sr5t80DGqa;+m{oFaRI# z9}#d60Nid{$bBgPxxar_f9Ijt^i=@) zqc|T7064dz8I>m5pjK*w3IgY$n#cV|Ff@6^c-Y?xv4+J~S#CPiwxPq!5hCUg6v;;3 z(L2P>rGpJyl#B3RqUU|@osi#80l+&P<#yiLa-c^Qx#Vc0#w90@a{jHL-hvw3DDfo}!1(FOF`mG@ zG}?%MPiyf1!Qua8W_te-LVT&K9Q=cAYv=OU@k8gHok%15NOs6S8c863sJwD*aJQxd z&U&TM0nyDjl?fnzJU+Bl{^xh^hP@x7?>v5axJ5GZg}r0C9jIk1?%-_a+yU3q7>Exh zAI&}U#VNoRh(?F23Vn(ehHfeIh5p3c32>6mIc^0}YG)R|vgm_;H=EvltgIY^xj>+m zLtCy3M=-%+!0!o32hh?dt_SZEo`faKnc}$$*QHQs8XSN^%nM+ZIYNlH+yS z8~QTjRhb%G!ikg;n3qa0NR-^j&j$3n=UdS(I1`3XvP^Z(KhMuZFn5(Bk{`wEcy>4` z0Q9%5Pue8ofO3RI5j`E+d?0X&!zxoyQQxDAy5xEGllpw`7;1>`Ng~6ORy4VcAkb)j zrl+s=GcY}v6v;n}>Zlq{r{C)~oX)DulU9vFuH-zB6(Dp3HUf1abvSI)5IgmV|H5Q) zFZmw^knA;<|8>~#Kl|f<;>+}{#ed0WhmqjTVOZ;Bm;i#mo9Hix#or|ASZd+L5lG#h zg1_{8g)%@u^q1Hsk~R8Ezc)yW{t}c;V!wbBJeYesCXRnOSI~(VFzgZ?g%H?{1d2Ho z@+!7OtFS<=nD*KUtup@@NJ+)_~|$K_eav zghh=P+zjH_g3a)C1>PdT8#33-;5c75y`EA#L({qIj{)-V=tpiOPC__>gF-MgP2(u7 z*GJnyjs7KZU33@KEmA{5kJc6lTBs-ZLShe?g#><*Yxy@6-e8NbO1+Hk^L~7C4p>~l zzpDTTWIt}8XW0JVpX}Yo{~U~ZvHTx{#{YlM_WyK|ydC9#2EBU%V9fP)3@wr~LR)eW zYZU&6;_ojcZ)<@RBM1Lo*!f@Ge)$x(?vjXTf7e(+Xm#7^u(*EP1OVuBUKTYA007StrE+v)bF22rC?-|AFkOuM@RP*u zpJryf(x=blf{C}vDMC>bqvZ#jupK0v>~-(eRt%!>Mz4ORL1YmmRUmF64l&69uZ=Uw zx0u)d)Lvs8`1)+3`rvc|v*0C)eK*jFw@hp5kb0HLCh;wmgG1*bH1}+V9%b+@b_iku07jXrM?6heG=<$PV@g!BGSJE|Y+u%(#Tw9e@bpY{O9Hs+txB^hdlT<*$Z5X`>Rxp-MI*$85*JG$^y#JiUwpd{}(+uAW6OX_9?1>jvJJbG>PXdAYPiJ?H3 zTdkl42F~|$VW{xGo}zXkAOZgA{$n^&M=}2&ZPf68`{n<9iT+j?z%;853H=vUakdlGp$!dq zKz=`B<=Eb-K%p9b7j)p~$A>SMk+7d^1IbPao~a3xAStdi6NZu~!Lwnhl%T)qW+MeL z8;H=kr^JY@BDmvReH$cTcp@vH09i;wnjb0~8|V{a7;~A#sfO5(#6p^o(&qMJVZRcF z!t`9FqL?CsZa**66O6Ai_5(d)a0|VB(ai-O9^IvOGA+{z`h|HPGh)#Kv$qN|pg^J| zK&4a0eJTi~BROk@>b>^9cl|0;QmwegV$KMV+ziN|yBz~U+DsA-hy8F+(~gy}s|@j% znS=tD2ySB{1>62$P_K4{Pg!UKS0ddn6a{6V=HnS60-AT2)r$Cpf!gp1SxtA|3a3!~ z5L3WgCS(j$7eaxznyipi!1!M<-n+#A!+tFO$FSGL|JWn`j|t$n!~vw)@}%(q^t;?n zG*520fCJ(JWc+u1*np^IdewZuFISJ9&o_6E9Y5v-l+JG|nR$UhPsR&Gi`>q$pd3PA z&>NIS2*h^bR8qj6{5Jtj7>VVL3c^RpECMOCol^*?&q-iDLrKb@{A$Z8C-u^Qv))NoycF%{fS z5b^BE2RjF&!n8qjT?2K1Bbt5>zxYi;f5I4cV0H_E`(Zb0;ETLnA8Hjr`QfmE@~d(V z7c~U)1go6Olf^6ve#W+FF!gqISTi+(So zy9SeI+$>M$X$ISm@)?OEnhzfL2PNhynQT0RyTs=$DIlR-4&&UZT=NdeK&^<181x$| zVpZl>wN7M2p^tA-8X^kx>qA6@f)h6sM6K|DR6KVZ|6!!6ect~=9W?lVulPT_RKF$X zk9>9;2?iiI2zpx_P`$zZ2ju*bqGYIr%||$xfAz5cfdT&j@Q1dO>`;GjCWZQbd08?X zlmzLAy%HgPcz;a=^903VoQH#F0u-&mh+~OkQ63++7-g|WHx>&U5~uilg^fRe%J)Hmn1wiU4R5aS5ii!^ z=albBEyv2y56W-=@iB)(r8gK7-s5QH*iR}6f_Y?E?%FX3nF0UPr+|OciYK-ugcLcN zJ4US4>kt9*?$2?N#iosRYK1cDcPnBx`dY(mtV;Uu*N4-{dp^ibXYi&Sbs;k7!Mvd{ zlJLJT9o5v4YX70}_8-0eKx^>-{_uaWYHE)Dg*F_?rWXowk?d4U2 z^52v}hlKmzJH}5G!75;X^t8xinL929{?nny@tV3H|AHU?RgGLmm#%+1Rs1c6=L`_c zLpbH};VxEH2+yK-?p_S%#WY@N3Frh$039tD=YT{LVR|Oc8lihQVJjQN*@=SH#-PxK zWPKZEIPc=DjxCbhRROdxJ8gx5B0n^bcb8Fo{B!H4N1Pu4;mu1Mm1#jYe-7~JW9CWy zNpc&HLX;pG(&%d}$~FHsI`-VJ z9pg6IEYUqdyB-X0&GNwp$wg+mr(@>`8b<;NW2~V*Nf2)r%LAd$W{%;ytV!JEl-AIv z$RIHluDCvO*pI4te~Mfb)b$~-(MT&_2=ZAy!kdEnuJCho;p@sQFcO)`(uqKEl&fRz zDJJA_4cd_2UTV7|YAwB0XU9v=2R0C?7)IeOl+pm1=b>W zBv^0DD6k{Wk7@^YDd}E5%)5tYU2LDgIwi3}SGt1)j^J&@0C)-HRuS_RZt&xNK#^$* zRg7tZNbSn?oO%nHKy2zE8J~f#5N3IFtK~-n$v#$oZP|MQ9N+|f;FX1KJ#9T~X%d(e z(>EMu*I(78nf;t)3)GT*$AQGT{%rC62$8q>3_8vRW#qTjCpf(=vD29-7c+Z}&IQNE zEx9R>J_(F!zFT-dqIvu7$@{U$mT`7gm50!IMbTVF=S?)1EG8&#h4k6-M3r;UqE;)# zY-xnUy_GGEP!H75L2sY`kqP&1?0*KMc>LGFsEPlwNB&2=(hr^c+0Fz=LJtWP*6lPk zcS8>y2tAZpRkU};NN#dbHDmPg;Y!993Adr_OwqY4evF{pa%@@3A&kztTyD|QgjrxxKKSr_m4})Q^@&DK({u7Jb zq2s?|ntTcF6IleeQ!R-bX_Ko zhooDvm5FK1s)<9o0}F+$lP74MW4P-DjtqHFae;xZ>7w zJ$+Uth6l0*+X~d}nbXjS6`&!8+BW71YfE`Dyl30>UBfNmWKe`|$GSRd&Bp3+^A7ajxqrVNuUMWY@PN-^HHum%(fgL^D&vF9~9Me+% zK_8?cUm<`mAM_PJjvh1|2Tf)>RLjw^GS|%oTFz}8w6(x4IviF-`wY)3qJ2iahW1&N ze7LL+<+JS>H0L17jTq{}_lSK-E3&h|{Eu`Bb`$?o8+LjA2mRadKl|fQ(N>oeazW9%7cZ@vSXW}eKRjH5YRn4^S~pD!uMMx1Mz z)c;!wBI(V{Mh{xHrTb>0?yu|KN*URaOX4H)(c?u^I;-ZPs8iHRMOT5 zU>myW`wXZp*$dw%bjm54(GT3l?f9AuWT2g=$4o}G`jz0f&2;|xi1Uu$MNyEMEzWN%Y#GxxvUFlj!~+qo)|&Af5(&e@o>ZM*ZBpL*Tgb`fN_0Ly->s=H-R(qtRA&2_&m2s(U3* zY)Vp~hEkeFmZ*YXCeabqZjiQ=_zcJ%l_w;HXF@qiRo|Q;_t2cFRS`00{fY>gvr$9H ztV%pr)Q5}N`uLG^1jTj&b)jP0@%V7L3pO>A)f9Pqk{12)+YViO5@V`tn51j|d zuC~v>0Z^4nJ1tFEgZ~dEd1#`lp;qWWny9X7?0jR`f|Yyd>`!q64hb6+ z%c|Z^&cog?K?lMFWmI(Roe`4A;ZFG=um|}?%m(>ePi8Ji?P`MzWDqU5Dk{h~r!S8Q zQoH?bB~(zby;np8p$fL;f%?O5o(GDKqSWoAR2FD(UK185vYzsC2q^(3cS8a(x!9Hh zIv*BifQF;W7@$$NDh6nzH4M-v~@O6wR^tv&>(4UJIq~&_eTjk%wX2SE#fqk=%Vx(O^lK#d)TQ5nwq_scS*U;HDx1?rDl zSkwjcM~9*T{I$gY0(sqK{0}we|I;68P5h5N;{VvHJ#_G&-%>*Y{C~jDPKjcOz4Jqa z0N`#mG{8a802xUCdXNA@F|3>l2(tj4dv*xs_nYh_fU3$!fM}Uf2H??fy-*MkoHQ{N zx8N8HB~k%uuRJOswqaKhB-C`VU~fqUs9N2kgmT$50@A05oknbo1lS*a#TJHcDf5N? zR4Q2SXA1*5R#uKNGa=4}fU zQonXJ1MORU6mt%tOc`Dm;4VJMHUR!$@xMs)cY^=>+KBi67-S~*NDh2I7)kKGxa=s- zA1hOIAoq03OGh%aB$>|tk`|O3GYoqfFuI$nV7r4rFx#!=`oNdmOFrj-2^D#D0W0*I+n|$T=l?)Ln0VChTbKfjRsDM6*%%6Lrc2$mtS z#=V9bK@5YjI90$yIpT+TqPS}a{_ZN5pT1n)oV36(68s*iAcGmMYeYl%V>4KQIL3T# zPEEAdH;Su&H2?^$(O{X(d9t;#T^A1~dcVy=y0-&7bgEoiP?P8Au6N>BK>OCx7q9vT zm1N+c{b*ia3}tC7ZD&Ie*0ZrpfJKjYmr=zeLXVHI$AT0f80mqs6JtuI8hp&Qkbe^0 z!&1-Lx0A=*5dOpCcw@RN+DF`cdF7rht2(%oTydx_Qu#EoV(j?LRT;h}sO%%U&1MA) zB7(NbmEgqYTqWUaf=Yfitr>L3GF}&`cx>c6OQ|L@OHog8;Y3CsNgmdyq=H*~?ukuq zQS5=7(;RJ}q&2Z53(>YnZVOs6rcb(xyV9p*bC9<|q*Xs;R%6RkOMSSFZ4Wm&M=??L znP+^6kmm2Wc%QF?+rao=I=(xy|LtoW{vUSxYJ>mxhyNu4_;$2^NlLf`_8{A9LVh4P z7`0OlQ;iz%K&Sx;uAa;tcS`~=4fZwhj9y=c&?mjVpkn0X4fm(h*Pb5qf|g<3*XpVg$#Vp&US6!8}DvBP`*FU1+040i;s#@X%@Y` zuA0sLHUW}}HM|jFqN-$wQf0fIV$VIpBB1*98U40$?5W|pxWs2eaSV68@Lb}+%fJ>R zds;XQoI?}-MREUq&b|+-G7;`|&nhwz?x|{HBD~uAD_KA6S?pt)bI_uC>|)w=@o;aY zUKf#nji&u@^#2kW-&y=Gb;#j=^m~KbF3;y8Ie^FJxgc%6yFWOQ)N5cjj2pf=% zq~1F@Akeh!iWYdhlaT`9eI`34&{GE~lt55!Aw^|Lgg}q;Q7(fJi0sU%bU-mSU|I?t z(CZC$O$Tfb*VFUzZO1qir319HZRvnkRI~z9lo%mkWP4O`pY8Qx1~%xhx6Bk!skfv8 z9M$TlSeQ%4q2I5J8sHq0OQZ%kzvPA*DC3h^AEuz_mo?|;B`Ak$Ll|(2yrBx}jsIhk zyHorB!C=_s@PA+HYYqP2AO7do?>B?|^C9ecWB6}0Xz<_u@E<4L2ao@Yim{}p4QZCan0CjTNr8TWNk^E;sor42#SOY_;~klh2HKYL=E6KqUVcL)ss2vBihSWn)wf`cX@F=qRRY~ruXjJdvE;J}Gq>|OfK+VadrhGbwZ$V048X#z3F(5KJE zXtyL$iVbQwnHu&zKrLmx!r95V;G3bQKT_%Z9fBNq&e}L>g}M!~^~q2n^iReB52)$5 zS<(p<9E%zSpU{S*OcbBbJw@1190D{Jj8AD@>Q9e=*OzQ&7lf@a&<1ffRr^L3+c zWvtLhtBMsG4I5TyRo1DgmT@C?#t8|GQtB8(qG5#U8~>qv_9s35gEr*te@0!kiT_ZK z_z&M6`%{iJkAxeN#5QhciHzLvLWdYCBJFgrcbX_UTK5ivM6OXl@WaBFRIFjfjo&yB431v3Ki^lY%0J&%oBZ=z*j~I9>Y#)V?lv(cgz&sJ zJc2YiNW&r&#{WqIw}bePqh2ikLx0q7@c;hszkHE>OQ9eN8gEFD|3^PF+;`}FG;wst zG(xTG54#P@Kh)3=wa54&`Kuh!k8f`7&=g)t@Vs>I$&Tjxsw`=|r0`-{#Y#f)ecqUT z3luNkxYIGb`L_`mb*wEHy>86*is}2D#r!TXJsO2%^9npp%s>Lm2XQkBoLEc?K|Lfs zMNA(A<6eQq!)e&$VW~S`iS-9fbp}~EQSssuE?5gYVBz57?;Ua*%ImW^ea6{V*B0ux zX@UD5&8t}|@zKv_|Bz|Fh*BQV%1FS>T~Ho_%A98UgQ}cn`h&)4rm$hbTOmAhpFWC* z6R9`35yA-YAr5dtW%LHd|H1fIf-zI@f4|@3_5Zy=uZjP$NBkd>!*|+QR1Ry-0K@?O zb{cmHm=AmPvXa8r(xCjq)$Qd~gXP~0md{Md?;XjA3eD-apsP0!$1!fdLFN! z`|&UMd4%c1m(iu)u1}SO&md0%Jl^1lbP4C$6WsD`RTT&FO|k0Q4iSK|!a=HI8~_!t|3jPe`ynxa&sTqyy=o z*1LFk!4;UsiJWYF?^USm-Jkyj`oDL7c8Cw_hWQLr)7SNCWjLLw?i!#Lgnv7xs57K^U8rD}DsCBboEJ)-;*CTy_ zC;UDaQC@-+Ce0e2E65s81xT6UWf|(W#I5?8dR3pGL7bUH*M=uBGS_}oJ5T>=;1K?- zqC%=zvWhZDVQ317YLc$MBP^bHn>`LSm!BcDEuoJO>i^M$@$a?i5Fvw!c(t9c?r|=q zs%Xu}+8r8pUVczxK#h#!01_p4E50BG@WZf<*;xHwo(p@DdR0^ zEzJK&M|>CjkJ{~x1|0u07!4c#XOH}kMAW`99w@7lSHc2`6fW&lMNPv39S94QtY+Ce z8I+(ZteOnExf_4*jlXZMe|{K)V3Q-9c<0GZ4h>WpIV37MyRtP*6n*sBnVct8wLF$c zvO}i_@iP%>08qh`MecgFvN3Hzi^C_NoDuxi)2ZP`DS+G53?lyfio=@c*{y|XeT{H9f?iBE%H^jomp8}7V*LqLP=fXUNlIWt za~=`RS1|0Sxi=<83-%DyVp`{X4e2z{9B?mzo&CfxEM*y_lkru)I^(#%z=L z=YkGX8^4kCplJCi-ygN7ZNgWvPsn2-YHE-r7b=aeFa#NR;?f7$d``w#0Fh+gH4 z-^c4)DdQ*JYjQAtLs<$~QOWt79ZF&ShUKM!mF&xzY{Xn;W;zJ3*cg`)UFXa(UyRPe z@Q{GH*ytlS=LdAtc7)$(un+4pH-~vyh$DhH1G;H3o@fGwU19Qzlc3xjR%nh&X&@_a zQ%>u`@={LwphSg9AW(p1w3C>K|~K+ zImj8%OC-1N+CiT!Z?RFFwS`+6rIL$<G3zz`Uu0ip<`I>RCe%uF5`l*C+^V-s5@BVN0+k zs|`OGM$8Q_SYiBEU)J^!|79>z2eJ4s-G=|$Bmc)OytfwerKsgy4&v@Fb*P;u5qIPJ z`>Wdz*Z5hy^2G-1TxHraD@YC5Vmx@S{c^N{7V@llpEPP$_>{N ze5c-#7J#YP2m95+n)b@&j*e`+UEvww_Ripq2#gI4iGR8eV&RAn{DEQIF1w6p5TS-Y z?6qPU*bYjWvHAhsR=?a=`t+;*WRQ%arspcJ#-!yB{AAY$)8|{D5qpDx)<@Mtgi#POa`-XpGuv3D5>I>KQJNvA^039>6R~sBxRo>n4 z=MNuQqcPpHVPodM-pcs;3H8x5t?6PtBQa%Run}P9JO29mdg|J1XKJ9W>&ZB^4DbEQ zu_08b`+hoI=vHhbD90ikk4tpzHW&~#_@@dC3>Y1<$#41eSeUE6zPSRCC58vo(q>`0 zE6M=jDTEgGm8WGTmXa z>5!usmGNz>4>->K3CuZc35F@V2wb#7+>7yFFr0gd|2gb-WB5;N@Lz-f^4oo++E^r@ z#vJcP;NdR|+jT<-^GO{J5_5Ub<6VOb-%9XLF%??^5R?O_Z2)3O04oNFnX!xJtFHw3 z@SdGW$8$I?u>&Tk-oOOFByYfO0pM5vxEPt}1miqtLxKiXKZN{O1~CeTaJl?nxQ z(9HOjLSV;CP2HG1GXfrH9On9zoq?kwartm}`^P7UlLQk?z0c_}?B|%7Aae#CTZ+kw zB^kgkJ5zhPLXwS*<|qN#O0o7kw8LE?q22r8P9WR6J+&3(QIi&BV>uL@|4eIU{I#$1 zU$58I`1tQychH>w_IUmi9mJ|X3r1K~v>(F9!#CUM50VaWKi}Q`N5zLXQbqJ*Tp+(q z`2E1}c=x9;d}R1l^DF)G`0L#R*FN8X{y#wYl~1S2gY6pD#Bd-Tuf`dRpt^6ah0VTu z_=OT#=#=Yt%CEM&GSLSC^y#<8tMbYC%beQ(L|1XDi0F=wmYX4jfoD9u5l9jwy3lq$i-`I6m<4P<-O3` ztMz1IqOTDN=Z?z7Wq!8j-mC7Qzra-om;56w1*hn>Y=o6C*=~8tXM;GHpOAYv2o~e; zKRUMMbuMjS;vbE_JoFGKGFTx$qZtU_WiV*$8yOKVDcmQK6;Sm;;?EVhlZj?LNfWbJ z7*CF^T;8zazH^MHA4$l0qPsw!A}Vj5qt6V;Kn>mgh(zXZG{#e@pyi2?mbKRZ)Gd9n zaf{ab$(*9k2NE4p^zY~}ZNDZrB2qtj%`YXf8FvtGOF`HfNt5l6H&+fiZ%tV)0}x*l z$30$|3yUHA7p)sTZ#oe9eFZZ8Vkpn{00lUGUwULbIO|K|19`*O!`=jYQXJjse(kK#b|*LW9BQm8SjI@s(N-aU zdgM3kGl`Cc=Hoh=?jgadwCfMT2fR^d=#c*swvg>Yz{xwb(SY?_dPVph96UlE zz+T946V?yh?{Kpho)1;ig6Xr-mtct_>)qO3v_RRcu=jC;G;pDd4w~|rCj2N`pF^x(n z6`(<%6?V7s%%%A^O!p0jF^Iwi{;%OAqwu#d!RXwyaDc)~d%47i8+V1hz(ZL-W6g}T zv!@M%<%hbAH}yy26Q8N6QyU07%L_M`T@y6*9Ya$2li_vTh3$37SkneXuL>IRV4(A?@q(LypCP8`NM_MnI44o|npZZ~ZN%!P z*HdbzPvx&423dC;eZw~(b|Y~TSp9gF;@2?ZfYl?b*I^X|HTsvtby2QKw@3{MJz85_ z?qz%-u?K9$<0rY6$Cli0;T1RP`x_(q*kxI1u|&2uew7s@xh?3ym_7-SZHQGHj1iuD z)+JiBB)c;LsggzrZi#X`qo-VDX)H-R7~LZgfoZcy1m>VE6FZ?TfMq3Z5!@2A<#$J4 zkx;F)ewa(aSRetyfirZ}o*5QZ22n*cOnqWMkVz=wi~cbyLeXa5QA{`Sd@L ztRCS_L490EW!yZ{fSD}47!*gp6KoqZ-B#!`ouR$(+LO4o^j4*9C5rJUX;YW_SEGXu zC*1VKZU~xriIWuaUs};gC3$|s)o@29|7yai$^XO^I5P>(Z6q`kKOR4bZvG(JcKx$x zdShsD@!{dWE0NENst!j!&L?rCvOrRjD6#_w0oD&zis+tbzR6?wq)J-}t$mk=W2^?AV$@NP3l87f0D=ohh;e@v;3;eWK5uesKSk5=l$}v pD2**#^V9q^Kh00`)BH3)%}?{w{4_t!&o}w={{bJ@tc3t@0{{xs9kT!c diff --git a/examples/c-test-fns.lisp b/examples/c-test-fns.lisp index c21b39c..435fdd6 100644 --- a/examples/c-test-fns.lisp +++ b/examples/c-test-fns.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Mar 2002 ;;;; -;;;; $Id: c-test-fns.lisp,v 1.1 2002/09/30 10:02:36 kevin Exp $ +;;;; $Id: c-test-fns.lisp,v 1.2 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -68,7 +68,7 @@ (half-double-vector +double-vec-length+ vec) vec)) -#+cmu +#+(or cmu scl) (defun t3 () (let ((vec (make-array +double-vec-length+ :element-type 'double-float))) (dotimes (i +double-vec-length+) diff --git a/src/aggregates.lisp b/src/aggregates.lisp index a233d1d..848b735 100644 --- a/src/aggregates.lisp +++ b/src/aggregates.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: aggregates.lisp,v 1.3 2002/10/14 04:15:02 kevin Exp $ +;;;; $Id: aggregates.lisp,v 1.4 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -44,7 +44,7 @@ of the enum-name name, separator-string, and field-name" (setf cmds (append '(progn) #+allegro `((ff:def-foreign-type ,enum-name :int)) #+lispworks `((fli:define-c-typedef ,enum-name :int)) - #+cmu `((alien:def-alien-type ,enum-name alien:signed)) + #+(or cmu scl) `((alien:def-alien-type ,enum-name alien:signed)) #+sbcl `((sb-alien:define-alien-type ,enum-name sb-alien:signed)) #+(and mcl (not openmcl)) `((def-mcl-type ,enum-name :integer)) #+openmcl `((ccl::def-foreign-type ,enum-name :int)) @@ -59,7 +59,7 @@ of the enum-name name, separator-string, and field-name" #+lispworks `(fli:define-c-typedef ,name-array (:c-array ,(convert-from-uffi-type type :array))) - #+cmu + #+(or cmu scl) `(alien:def-alien-type ,name-array (* ,(convert-from-uffi-type type :array))) #+sbcl @@ -78,10 +78,10 @@ of the enum-name name, separator-string, and field-name" (type (cadr field)) (def (append (list field-name) (if (eq type :pointer-self) - #+cmu `((* (alien:struct ,name))) + #+(or cmu scl) `((* (alien:struct ,name))) #+sbcl `((* (sb-alien:struct ,name))) #+mcl `((:* (:struct ,name))) - #-(or cmu sbcl mcl) `((* ,name)) + #-(or cmu sbcl scl mcl) `((* ,name)) `(,(convert-from-uffi-type type :struct)))))) (if variant (push (list def) processed) @@ -90,7 +90,7 @@ of the enum-name name, separator-string, and field-name" (defmacro def-struct (name &rest fields) - #+cmu + #+(or cmu scl) `(alien:def-alien-type ,name (alien:struct ,name ,@(process-struct-fields name fields))) #+sbcl `(sb-alien:define-alien-type ,name (sb-alien:struct ,name ,@(process-struct-fields name fields))) @@ -108,12 +108,12 @@ of the enum-name name, separator-string, and field-name" (defmacro get-slot-value (obj type slot) - #+(or lispworks cmu sbcl) (declare (ignore type)) + #+(or lispworks cmu sbcl scl) (declare (ignore type)) #+allegro `(ff:fslot-value-typed ,type :c ,obj ,slot) #+lispworks `(fli:foreign-slot-value ,obj ,slot) - #+cmu + #+(or cmu scl) `(alien:slot ,obj ,slot) #+sbcl `(sb-alien:slot ,obj ,slot) @@ -130,12 +130,12 @@ of the enum-name name, separator-string, and field-name" (defmacro get-slot-pointer (obj type slot) - #+(or lispworks cmu sbcl) (declare (ignore type)) + #+(or lispworks cmu sbcl scl) (declare (ignore type)) #+allegro `(ff:fslot-value-typed ,type :c ,obj ,slot) #+lispworks `(fli:foreign-slot-pointer ,obj ,slot) - #+cmu + #+(or cmu scl) `(alien:slot ,obj ,slot) #+sbcl `(sb-alien:slot ,obj ,slot) @@ -159,8 +159,8 @@ of the enum-name name, separator-string, and field-name" (defmacro deref-array (obj type i) "Returns a field from a row" - #+(or lispworks cmu sbcl) (declare (ignore type)) - #+cmu `(alien:deref ,obj ,i) + #+(or lispworks cmu sbcl scl) (declare (ignore type)) + #+(or cmu scl) `(alien:deref ,obj ,i) #+sbcl `(sb-alien:deref ,obj ,i) #+lispworks `(fli:dereference ,obj :index ,i) #+allegro `(ff:fslot-value-typed (quote ,(convert-from-uffi-type type :type)) :c ,obj ,i) @@ -193,7 +193,7 @@ of the enum-name name, separator-string, and field-name" `(ff:def-foreign-type ,name (:union ,@(process-struct-fields name fields))) #+lispworks `(fli:define-c-union ,name ,@(process-struct-fields name fields)) - #+cmu + #+(or cmu scl) `(alien:def-alien-type ,name (alien:union ,name ,@(process-struct-fields name fields))) #+sbcl `(sb-alien:define-alien-type ,name (sb-alien:union ,name ,@(process-struct-fields name fields))) diff --git a/src/functions.lisp b/src/functions.lisp index ad8aca4..f23ec8f 100644 --- a/src/functions.lisp +++ b/src/functions.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: functions.lisp,v 1.4 2002/10/14 03:07:41 kevin Exp $ +;;;; $Id: functions.lisp,v 1.5 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -21,12 +21,12 @@ (defun process-function-args (args) (if (null args) - #+(or lispworks cmu sbcl cormanlisp (and mcl (not openmcl))) nil + #+(or lispworks cmu sbcl scl cormanlisp (and mcl (not openmcl))) nil #+allegro '(:void) #+mcl (values nil nil) ;; args not null - #+(or lispworks allegro cmu sbcl (and mcl (not openmcl)) cormanlisp) + #+(or lispworks allegro cmu sbcl scl (and mcl (not openmcl)) cormanlisp) (let (processed) (dolist (arg args) (push (process-one-function-arg arg) processed)) @@ -49,7 +49,7 @@ (defun process-one-function-arg (arg) (let ((name (car arg)) (type (convert-from-uffi-type (cadr arg) :routine))) - #+(or cmu sbcl) + #+(or cmu sbcl scl) (list name type :in) #+(or allegro lispworks (and mcl (not openmcl))) (if (and (listp type) (listp (car type))) @@ -66,7 +66,7 @@ ;; name is either a string representing foreign name, or a list ;; of foreign-name as a string and lisp name as a symbol (defmacro def-function (names args &key module returning) - #+(or cmu sbcl allegro mcl cormanlisp) (declare (ignore module)) + #+(or cmu sbcl scl allegro mcl cormanlisp) (declare (ignore module)) (let* ((result-type (convert-from-uffi-type returning :return)) (function-args (process-function-args args)) @@ -80,7 +80,7 @@ :returning ,(allegro-convert-return-type result-type) :call-direct t :strings-convert nil) - #+cmu + #+(or cmu scl) `(alien:def-alien-routine (,foreign-name ,lisp-name) ,result-type ,@function-args) diff --git a/src/libraries.lisp b/src/libraries.lisp index 65b64b3..c259dc8 100644 --- a/src/libraries.lisp +++ b/src/libraries.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: libraries.lisp,v 1.3 2002/10/14 03:07:41 kevin Exp $ +;;;; $Id: libraries.lisp,v 1.4 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -74,7 +74,7 @@ library type if type is not specified." (defun load-foreign-library (filename &key module supporting-libraries force-load) #+(or allegro lispworks openmcl) (declare (ignore module supporting-libraries)) - #+(or cmu sbcl) (declare (ignore module)) + #+(or cmu scl sbcl) (declare (ignore module)) (when (and filename (probe-file filename)) (if (pathnamep filename) ;; ensure filename is a string to check if @@ -92,6 +92,12 @@ library type if type is not specified." :libraries (convert-supporting-libraries-to-string supporting-libraries)))) + #+scl + (let ((type (pathname-type (parse-namestring filename)))) + (alien:load-foreign filename + :libraries + (convert-supporting-libraries-to-string + supporting-libraries))) #+sbcl (sb-alien:load-foreign filename :libraries diff --git a/src/objects.lisp b/src/objects.lisp index 19cb002..c7fa563 100644 --- a/src/objects.lisp +++ b/src/objects.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: objects.lisp,v 1.3 2002/10/14 07:08:49 kevin Exp $ +;;;; $Id: objects.lisp,v 1.4 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -22,7 +22,7 @@ (defun size-of-foreign-type (type) #+lispworks (fli:size-of type) #+allegro (ff:sizeof-fobject type) - #+cmu (ash (eval `(alien:alien-size ,type)) -3) ;; convert from bits to bytes + #+(or cmu scl) (ash (eval `(alien:alien-size ,type)) -3) ;; convert from bits to bytes #+sbcl (ash (eval `(sb-alien:alien-size ,type)) -3) ;; convert from bits to bytes #+clisp (values (ffi:size-of type)) #+(and mcl (not openmcl)) @@ -39,7 +39,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." (if (eq size :unspecified) (progn - #+cmu + #+(or cmu scl) `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation)) #+sbcl `(sb-alien:make-alien ,(convert-from-uffi-type (eval type) :allocation)) @@ -51,7 +51,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." `(new-ptr ,(size-of-foreign-type (convert-from-uffi-type type :allocation))) ) (progn - #+cmu + #+(or cmu scl) `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size) #+sbcl `(sb-alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size) @@ -64,7 +64,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." ))) (defmacro free-foreign-object (obj) - #+cmu + #+(or cmu scl) `(alien:free-alien ,obj) #+sbcl `(sb-alien:free-alien ,obj) @@ -79,14 +79,14 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." (defmacro null-pointer-p (obj) #+lispworks `(fli:null-pointer-p ,obj) #+allegro `(zerop ,obj) - #+cmu `(alien:null-alien ,obj) + #+(or cmu scl) `(alien:null-alien ,obj) #+sbcl `(sb-alien:null-alien ,obj) #+mcl `(ccl:%null-ptr-p ,obj) ) (defmacro make-null-pointer (type) #+(or allegro mcl) (declare (ignore type)) - #+cmu `(alien:sap-alien (system:int-sap 0) (* ,(convert-from-uffi-type (eval type) :type))) + #+(or cmu scl) `(alien:sap-alien (system:int-sap 0) (* ,(convert-from-uffi-type (eval type) :type))) #+sbcl `(sb-alien:sap-alien (sb-sys:int-sap 0) (* ,(convert-from-uffi-type (eval type) :type))) #+lispworks `(fli:make-pointer :address 0 :type (quote ,(convert-from-uffi-type (eval type) :type))) #+allegro 0 @@ -94,7 +94,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." ) (defmacro char-array-to-pointer (obj) - #+cmu `(alien:cast ,obj (* (alien:unsigned 8))) + #+(or cmu scl) `(alien:cast ,obj (* (alien:unsigned 8))) #+sbcl `(sb-alien:cast ,obj (* (sb-alien:unsigned 8))) #+lispworks `(fli:make-pointer :type '(:unsigned :char) :address (fli:pointer-address ,obj)) @@ -104,8 +104,8 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." (defmacro deref-pointer (ptr type) "Returns a object pointed" - #+(or cmu sbcl lispworks) (declare (ignore type)) - #+cmu `(alien:deref ,ptr) + #+(or cmu sbcl lispworks scl) (declare (ignore type)) + #+(or cmu scl) `(alien:deref ,ptr) #+sbcl `(sb-alien:deref ,ptr) #+lispworks `(fli:dereference ,ptr) #+allegro `(ff:fslot-value-typed ,(convert-from-uffi-type type :deref) :c ,ptr) @@ -123,7 +123,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." (defmacro ensure-char-character (obj) obj) -#+(or allegro cmu sbcl openmcl) +#+(or allegro cmu sbcl scl openmcl) (defmacro ensure-char-character (obj) `(code-char ,obj)) @@ -131,12 +131,12 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." (defmacro ensure-char-integer (obj) `(char-code ,obj)) -#+(or allegro cmu sbcl openmcl) +#+(or allegro cmu sbcl scl openmcl) (defmacro ensure-char-integer (obj) obj) (defmacro pointer-address (obj) - #+cmu + #+(or cmu scl) `(system:sap-int (alien:alien-sap ,obj)) #+sbcl `(sb-sys:sap-int (sb-alien:alien-sap ,obj)) @@ -151,12 +151,12 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." ;; TYPE is evaluated. #-mcl (defmacro with-foreign-object ((var type) &rest body) - #-(or cmu sbcl lispworks) ; default version + #-(or cmu sbcl lispworks scl) ; default version `(let ((,var (allocate-foreign-object ,type))) (unwind-protect (progn ,@body) (free-foreign-object ,var))) - #+cmu + #+(or cmu scl) (let ((obj (gensym))) `(alien:with-alien ((,obj ,(convert-from-uffi-type (eval type) :allocate))) (let ((,var (alien:addr ,obj))) diff --git a/src/primitives.lisp b/src/primitives.lisp index 1b210fd..dc91044 100644 --- a/src/primitives.lisp +++ b/src/primitives.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: primitives.lisp,v 1.4 2002/10/14 04:15:02 kevin Exp $ +;;;; $Id: primitives.lisp,v 1.5 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -56,7 +56,7 @@ supports takes advantage of this optimization." #+(or lispworks allegro mcl cormanlisp) (declare (ignore type)) #+(or lispworks allegro mcl cormanlisp) `(deftype ,name () t) - #+cmu + #+(or cmu scl) `(deftype ,name () '(alien:alien ,(convert-from-uffi-type type :declare))) #+sbcl `(deftype ,name () '(sb-alien:alien ,(convert-from-uffi-type type :declare))) @@ -69,7 +69,7 @@ supports takes advantage of this optimization." (defmacro def-foreign-type (name type) #+lispworks `(fli:define-c-typedef ,name ,(convert-from-uffi-type type :type)) #+allegro `(ff:def-foreign-type ,name ,(convert-from-uffi-type type :type)) - #+cmu `(alien:def-alien-type ,name ,(convert-from-uffi-type type :type)) + #+(or cmu scl) `(alien:def-alien-type ,name ,(convert-from-uffi-type type :type)) #+sbcl `(sb-alien:define-alien-type ,name ,(convert-from-uffi-type type :type)) #+cormanlisp `(ct:defctype ,name ,(convert-from-uffi-type type :type)) #+mcl @@ -84,13 +84,13 @@ supports takes advantage of this optimization." (eval-when (:compile-toplevel :load-toplevel :execute) (defvar +type-conversion-hash+ (make-hash-table :size 20)) - #+(or cmu sbcl) (defvar *cmu-def-type-hash* (make-hash-table :size 20)) + #+(or cmu sbcl scl) (defvar *cmu-def-type-hash* (make-hash-table :size 20)) ) -#+(or cmu sbcl) +#+(or cmu sbcl scl) (defparameter *cmu-sbcl-def-type-list* nil) -#+cmu +#+(or cmu scl) (defparameter *cmu-sbcl-def-type-list* '((:char . (alien:signed 8)) (:unsigned-char . (alien:unsigned 8)) @@ -125,7 +125,7 @@ supports takes advantage of this optimization." (defparameter *type-conversion-list* nil) -#+cmu +#+(or cmu scl) (setq *type-conversion-list* '((* . *) (:void . c-call:void) (:short . c-call:short) @@ -223,7 +223,7 @@ supports takes advantage of this optimization." (dolist (type *type-conversion-list*) (setf (gethash (car type) +type-conversion-hash+) (cdr type))) -#+(or cmu sbcl) +#+(or cmu sbcl scl) (dolist (type *cmu-sbcl-def-type-list*) (setf (gethash (car type) *cmu-def-type-hash*) (cdr type))) @@ -242,7 +242,7 @@ supports takes advantage of this optimization." ((and (or (eq context :routine) (eq context :return)) (eq type :cstring)) (setq type '((* :char) integer))) - #+(or cmu sbcl) + #+(or cmu sbcl scl) ((eq context :type) (let ((cmu-type (gethash type *cmu-def-type-hash*))) (if cmu-type diff --git a/src/strings.lisp b/src/strings.lisp index 63847cc..02ae84b 100644 --- a/src/strings.lisp +++ b/src/strings.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: strings.lisp,v 1.3 2002/10/14 03:07:41 kevin Exp $ +;;;; $Id: strings.lisp,v 1.4 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -21,20 +21,16 @@ (defvar +null-cstring-pointer+ - #+cmu nil - #+sbcl nil + #+(or cmu sbcl scl) nil #+allegro 0 #+lispworks (fli:make-pointer :address 0 :type '(:unsigned :char)) #+mcl (ccl:%null-ptr) - #-(or cmu allegro lispworks mcl) nil ) (defmacro convert-from-cstring (obj) "Converts a string from a c-call. Same as convert-from-foreign-string, except that LW/CMU automatically converts strings from c-calls." - #+cmu obj - #+sbcl obj - #+lispworks obj + #+(or cmu sbcl lispworks scl) obj #+allegro (let ((stored (gensym))) `(let ((,stored ,obj)) @@ -50,9 +46,7 @@ that LW/CMU automatically converts strings from c-calls." ) (defmacro convert-to-cstring (obj) - #+cmu obj - #+sbcl obj - #+lispworks obj + #+(or cmu sbcl scl lispworks) obj #+allegro `(if (null ,obj) 0 @@ -66,7 +60,7 @@ that LW/CMU automatically converts strings from c-calls." ) (defmacro free-cstring (obj) - #+(or cmu sbcl lispworks) (declare (ignore obj)) + #+(or cmu sbcl scl lispworks) (declare (ignore obj)) #+allegro `(unless (zerop obj) (ff:free-fobject ,obj)) @@ -76,7 +70,7 @@ that LW/CMU automatically converts strings from c-calls." ) (defmacro with-cstring ((cstring lisp-string) &body body) - #+(or cmu sbcl lispworks) + #+(or cmu sbcl scl lispworks) `(let ((,cstring ,lisp-string)) ,@body) #+allegro (let ((acl-native (gensym))) @@ -109,7 +103,7 @@ that LW/CMU automatically converts strings from c-calls." `(if (null ,obj) 0 (values (excl:string-to-native ,obj))) - #+cmu + #+(or cmu scl) (let ((size (gensym)) (storage (gensym)) (i (gensym))) @@ -173,7 +167,7 @@ that LW/CMU automatically converts strings from c-calls." ,@(if length (list :length length) (values)) :null-terminated-p ,null-terminated-p :external-format '(:latin-1 :eol-style :lf))) - #+cmu + #+(or cmu scl) `(if (null-pointer-p ,obj) nil (cmucl-naturalize-cstring (alien:alien-sap ,obj) @@ -196,7 +190,7 @@ that LW/CMU automatically converts strings from c-calls." (defmacro allocate-foreign-string (size &key (unsigned t)) - #+cmu + #+(or cmu scl) (let ((array-def (gensym))) `(let ((,array-def (list 'alien:array 'c-call:char ,size))) (eval `(alien:cast (alien:make-alien ,,array-def) @@ -259,6 +253,30 @@ that LW/CMU automatically converts strings from c-calls." (* length vm:byte-bits)) result))) +#+scl +;; kernel:copy-from-system-area doesn't work like it does on CMUCL or SBCL, +;; so have to iteratively copy from sap +(defun cmucl-naturalize-cstring (sap &key length (null-terminated-p t)) + (declare (type system:system-area-pointer sap)) + (locally + (declare (optimize (speed 3) (safety 0))) + (let ((null-terminated-length + (when null-terminated-p + (loop + for offset of-type fixnum upfrom 0 + until (zerop (system:sap-ref-8 sap offset)) + finally (return offset))))) + (if length + (if (and null-terminated-length + (> (the fixnum length) (the fixnum null-terminated-length))) + (setq length null-terminated-length)) + (setq length null-terminated-length))) + (let ((result (make-string length))) + (dotimes (i length) + (declare (type fixnum i)) + (setf (char result i) (code-char (system:sap-ref-8 sap i)))) + result))) + #+sbcl (defun sbcl-naturalize-cstring (sap &key length (null-terminated-p t)) (declare (type sb-sys:system-area-pointer sap)) diff --git a/tests/c-test-fns.lisp b/tests/c-test-fns.lisp index c21b39c..435fdd6 100644 --- a/tests/c-test-fns.lisp +++ b/tests/c-test-fns.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Mar 2002 ;;;; -;;;; $Id: c-test-fns.lisp,v 1.1 2002/09/30 10:02:36 kevin Exp $ +;;;; $Id: c-test-fns.lisp,v 1.2 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -68,7 +68,7 @@ (half-double-vector +double-vec-length+ vec) vec)) -#+cmu +#+(or cmu scl) (defun t3 () (let ((vec (make-array +double-vec-length+ :element-type 'double-float))) (dotimes (i +double-vec-length+) diff --git a/uffi.asd b/uffi.asd index 1076b82..c31fafb 100644 --- a/uffi.asd +++ b/uffi.asd @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Aug 2002 ;;;; -;;;; $Id: uffi.asd,v 1.19 2002/10/14 03:07:41 kevin Exp $ +;;;; $Id: uffi.asd,v 1.20 2002/10/16 11:56:43 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -19,7 +19,7 @@ (declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0))) (in-package :asdf) -#+(or allegro lispworks cmu mcl cormanlisp sbcl) +#+(or allegro lispworks cmu mcl cormanlisp sbcl scl) (defsystem uffi :name "cl-uffi" :author "Kevin M. Rosenberg " @@ -50,7 +50,7 @@ ((:file "uffi-corman"))) )) -#+(or allegro lispworks cmu mcl cormanlisp sbcl) +#+(or allegro lispworks cmu mcl cormanlisp sbcl scl) (when (ignore-errors (find-class 'load-compiled-op)) (defmethod perform :after ((op load-compiled-op) (c (eql (find-system :uffi)))) (pushnew :uffi cl:*features*))) -- 2.34.1