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