From: Angel P. <ang...@ya...> - 2010-10-01 09:59:56
|
Hi, I would like to use c-string as out parameter. According to the documentation, it should use :alloca the function is: void test(char** buff){ char *output = "asdfasdflsadkjfdsa;l"; char* szRes = (char*)malloc(100000); strcpy(szRes,output); szRes[strlen(output)]=0; *buff = szRes; } ffi code is: (def-call-out test (:name "test") (:arguments (buff (c-ptr c-string) :out :alloca)) (:return-type nil)) and the question is: Should I take care of freeing of the memory or clisp will free it? Regards, AngelP |
From: Sam S. <sd...@gn...> - 2010-10-04 14:45:58
|
Angel Popov wrote: > Hi, > I would like to use c-string as out parameter. > According to the documentation, it should use :alloca > the function is: > > void test(char** buff){ > char *output = "asdfasdflsadkjfdsa;l"; > char* szRes = (char*)malloc(100000); > strcpy(szRes,output); > szRes[strlen(output)]=0; > *buff = szRes; > } > > ffi code is: > > (def-call-out test (:name "test") > (:arguments (buff (c-ptr c-string) :out :alloca)) > (:return-type nil)) > > and the question is: > > Should I take care of freeing of the memory or clisp will free it? you need :MALLOC-FREE instead of :ALLOCA for that. http://clisp.sourceforge.net/impnotes/dffi.html#allocation |
From: Angel P. <ang...@ya...> - 2010-10-05 09:30:12
|
Thanks, That looks to be the right option, but with malloc-free clisp just crashes. With alloc works but It looks memory is not feed. Regards, AngelP void test(char**buff){ char *output = "asdfasdflsadkjfdsa;l"; char* szRes = (char*)malloc(100000); strcpy(szRes,output); szRes[strlen(output)]=0; *buff = szRes; } [1]> (use-package :ffi) T [2]> (ffi:def-call-out test (:name "test") (:arguments (buff (c-ptr c-string) :out :malloc-free)) (:return-type nil) (:library "../../Debug/libFUnit.so")) WARNING: (DEF-CALL-OUT TEST (:NAME "test") (:ARGUMENTS (BUFF (C-PTR C-STRING) :OUT :MALLOC-FREE)) (:RETURN-TYPE NIL) (:LIBRARY "../../Debug/libFUnit.so")) : No :LANGUAGE argument and no DEFAULT-FOREIGN-LANGUAGE form in this compilation unit; :STDC assumed now and for the rest of this unit TEST [3]> (test) *** - handle_fault error2 ! address = 0x0 not in [0x334f42000,0x335180238) ! SIGSEGV cannot be cured. Fault address = 0x0. GC count: 4 Space collected by GC: 2823536 Run time: 0 203319 Real time: 22 143440 GC time: 0 16665 Permanently allocated: 164640 bytes. Currently in use: 4211136 bytes. Free space: 833402 bytes. Process inferior-lisp segmentation fault ________________________________ From: Sam Steingold <sd...@gn...> To: Angel Popov <ang...@ya...> Cc: cli...@li... Sent: Monday, October 4, 2010 17:45:49 Subject: Re: ffi:c-string as out parameter Angel Popov wrote: > Hi, > I would like to use c-string as out parameter. > According to the documentation, it should use :alloca > the function is: > void test(char** buff){ > char *output = "asdfasdflsadkjfdsa;l"; > char* szRes = (char*)malloc(100000); > strcpy(szRes,output); > szRes[strlen(output)]=0; > *buff = szRes; > } > > ffi code is: > > (def-call-out test (:name "test") > (:arguments (buff (c-ptr c-string) :out :alloca)) > (:return-type nil)) > > and the question is: > > Should I take care of freeing of the memory or clisp will free it? you need :MALLOC-FREE instead of :ALLOCA for that. http://clisp.sourceforge.net/impnotes/dffi.html#allocation |