OS X Externals

Thierry Arbellot thierry.arbellot at wanadoo.fr
Wed Oct 13 11:23:48 EDT 2004


You can return binary data in argument:

for example

in transcript

	local thebinaryData

	theExternalCommand "theBinaryData"

in C program

{
	int				retvalue;
	MCstring	rdata;

// put here your process

	rdata.sptr = pointerToBinaryData;
	rdata.length = sizeOfbinaryData;
	SetVariableEx(args[0],"",&rdata,&retvalue);
}

On Wednesday, Oct 13, 2004, at 16:49 Europe/Paris, Frank D. Engel, Jr. 
wrote:

> Aha!  Got it built and working.  It had something to do with the 
> prefix header, whatever that is.
>
> However, I now have a slightly different question.  Since one of these 
> functions returns a string with binary image data, that string may 
> contain null bytes -- not a problem for Rev, but as far as I can tell, 
> the return value from an external function call is null-terminated.  
> How can I return a string value from an external function and include 
> embedded null characters in the string?
>
> Thank you!
>
> On Oct 13, 2004, at 9:22 AM, Frank D. Engel, Jr. wrote:
>
>> I don't mind copying it when built; it should not need to be redone 
>> too often after I have it working; there are two functions which I 
>> translated to C from Transcript in order to improve performance (they 
>> are quite slow under Transcript, since they need to look at each byte 
>> in the text of an image).
>>
>> Toward the beginning of the C source code, I placed this line:
>>
>> char Xname[] = "PostgreSQL BLOB encoding functions external v0.0";
>>
>> (I previously posted the Transcript versions of the functions)
>>
>> At the end of external.c, I placed this code:
>>
>> Xternal Xtable[] = {
>>     {"dbblob", XFUNCTION, 0, dbBLOB, dbabort},
>> 	{"dbunblob", XFUNCTION, 0, dbUNBLOB, dbabort},
>> 	{"", XNONE, 0, NULL, NULL}
>> };
>>
>>
>> Note that the 'dbabort' function simply contains an fprintf function 
>> call (outputs to stderr).
>>
>> What else would be needed to get this working?  I created an Xcode 
>> project using the "Carbon Bundle" template, and did simple changes to 
>> get the project to build with the following files listed when the 
>> project icon is selected in the left-hand pane:
>>
>> bytea-funcs.bundle (the target)
>> Carbon.framework (from OS X)
>> external.c (my code)
>> InfoPList.strings (provided by Xcode, then modified)
>> XCmdGlue.c (from the SDK)
>> XCmdGlue.h (from the SDK)
>> XCmdName.h (from the SDK)
>>
>> I also have XCmdFunc.c (from the SDK) copied into the project 
>> directory.
>>
>> Toward the end of XCmdGlue.c, there was a line:
>>
>> #include "XCmdFunc.c"
>>
>> I commented that line out because I could not get the project to 
>> build otherwise.  After commenting out that line, the project now 
>> builds without errors or warnings, but does not work.  Could this be 
>> related to the problem, and if so, how can I get the project to build 
>> with the line uncommented?  My own code does not call any of the 
>> functions provided by the engine; I tried to keep it as simple as I 
>> could.
>>
>> On Oct 13, 2004, at 9:04 AM, Thierry Arbellot wrote:
>>
>>> OK
>>>
>>> If you don't want to copy the bundle every-time you rebuild it, use 
>>> the full path to the folder where XCode build the bundle.
>>> And each time you rebuild the bundle, you should close the stack, 
>>> remove it from memory then reopen it.
>>>
>>> Another thing to check: have you add the 2 functions in the Xtable 
>>> array declared in the external.c source file ?
>>>
>>> On Wednesday, Oct 13, 2004, at 14:40 Europe/Paris, Frank D. Engel, 
>>> Jr. wrote:
>>>
>>>> No, just the name.  However, I have now tried using the EnhancedQT 
>>>> external, just to see how that one worked (place it where in order 
>>>> for it to work), and placing it in the Rev folder causes it to 
>>>> work, even w/o the full path in "the externals of this stack", and 
>>>> the externalFunctions does return a list of functions.
>>>>
>>>> I placed my external in the same place, but have an empty list of 
>>>> externalFunctions.  Apparently something is wrong, either in my C 
>>>> source code, or in the build process.
>>>>
>>>> On Oct 13, 2004, at 5:10 AM, Thierry Arbellot wrote:
>>>>
>>>>>
>>>>> On Tuesday, Oct 12, 2004, at 23:44 Europe/Paris, Frank D. Engel, 
>>>>> Jr. wrote:
>>>>>
>>>>>> I am trying to build an external for OS X (which I will 
>>>>>> eventually need to get working under Windows as well).  There 
>>>>>> should be no outside dependencies from the external itself, other 
>>>>>> than the standard libc.  The external contains two functions.
>>>>>>
>>>>>> I tried various things, and finally ended up with a .bundle file, 
>>>>>> courtesy of XCode.  I tried several different placements of the 
>>>>>> file, and have the name of the bundle in the externals property 
>>>>>> of my main stack, but using 'answer the externalFunctions of this 
>>>>>> stack' from the msgbox always results in an empty message box 
>>>>>> (just the ever-present OK button).
>>>>>>
>>>>>> I cannot tell if Rev is not finding my external, if my external 
>>>>>> was not built correctly (found but considered corrupt and 
>>>>>> silently ignored), or if it is somehow being considered an 
>>>>>> 'empty' external (a valid external with no functions).
>>>>>>
>>>>>> Could anyone help me to debug this problem?  Thank you!
>>>>>>
>>>>>> -----------------------------------------------------------
>>>>>> Frank D. Engel, Jr.  <fde101 at fjrhome.net>
>>>>>>
>>>>>
>>>>> Frank,
>>>>>
>>>>> Have you set the full path to the bundle in the externals property 
>>>>> of the main stack ?
>>>>>
>>>>> Thierry
>>>>>



More information about the use-livecode mailing list