[squeak-dev] Re: Linux and ttyUSB0

David T. Lewis lewis at mail.msen.com
Sun Jan 4 23:46:56 UTC 2009


On Sun, Jan 04, 2009 at 11:54:22PM +0100, S??verin Lemaignan wrote:
> 
> For each of them, I need to get the port name. I did like that
> (copy-pasted from another plugin):
> 
>         int spName;
>         char * spNameIndex;
> 
> 
>         spName = interpreterProxy->stackValue(0);
>         interpreterProxy->success(interpreterProxy->isBytes(spName));
>         spNameIndex = interpreterProxy->firstIndexableField(spName);
> 
> But I probably do something wrong since if I call the primitive
> "primSerialPortOpenByName" with "/dev/ttyACM0" as port name from
> Squeak, the plugin code in sqUnixSerial.c receives a different string
> ("/dev/ttyACM0_??????@???w@???w"), thus failing to open the serial port.
> 
> Does someone knows how to correctly transmit a string argument to a plugin?
> 

S??verin,

The trick here is that C expects strings to be null-terminated, and the Squeak
string that you pass to the primitive does not have the trailing null.

In general, you will want to copy the Squeak string contents into a freshly
allocated char[] array of size one greater than the string length. There
are a number of ways you can do this, but to give some examples you can
look in OSProcessPlugin (available on SqueakSource in project OSProcessPlugin).
The methods #transientCStringFromString: and #cStringFromString: provide
two ways to do the conversion. As an example, here is a primitive from
UnixOSProcessPlugin after it has been converted from Slang to C:

/*	Call chdir(2) to change current working directory to the specified path string. Answer
	nil for success, or errno on failure. */

EXPORT(sqInt) primitiveChdir(void) {
    extern int errno;
    char * path;
    sqInt aString;
    sqInt len;
    char *cString;
    char *stringPtr;
    sqInt newString;

	/* begin transientCStringFromString: */
	aString = interpreterProxy->stackObjectValue(0);
	len = interpreterProxy->sizeOfSTArrayFromCPrimitive(interpreterProxy->arrayValueOf(aString));
	interpreterProxy->pushRemappableOop(aString);
	newString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), len + 1);
	stringPtr = interpreterProxy->arrayValueOf(interpreterProxy->popRemappableOop());
	cString = interpreterProxy->arrayValueOf(newString);
	(char *)strncpy(cString, stringPtr, len);
	cString[len] = 0;
	path = cString;
	if (chdir(path)) {
		interpreterProxy->pop(2);
		interpreterProxy->push(interpreterProxy->nilObject());
	} else {
		interpreterProxy->pop(2);
		interpreterProxy->pushInteger(errno);
	}
}


> And by the way, happy new year to everybody!

And to you as well!

- Dave




More information about the Squeak-dev mailing list