[squeak-dev] Windows CogVM stdOut?
Eliot Miranda
eliot.miranda at gmail.com
Fri Aug 17 22:21:39 UTC 2012
Hi DOug,
On Fri, Aug 17, 2012 at 1:57 PM, Douglas McPherson <djm1329 at san.rr.com>wrote:
> I'm using FFI to call an external C function which performs a printf. On
> the Mac such output conveniently displays in Console.app. Anyone know how I
> can see these printfs on Windows ? I tried starting the image with Cog's
> CroquetConsole.exe but nothing gets displayed in the console. Ideas?
>
> Thanks,
> Doug
>
phhh... mingw :(. The VM can write to stdout, but does so not using
printf. here's how it works, all code in
platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c.
When the CVM is asked for the stdin/out/err handles it does this for each
handle:
DWORD mode;
...
files[0].sessionID = thisSession;
files[0].file = GetStdHandle(STD_INPUT_HANDLE); // & STD_OUTPUT_HANDLE
& 1 & STD_ERROR_HANDLE & 2
files[0].fileSize = 0;
files[0].writable = false;
files[0].lastOp = 0; /* unused on win32 */
files[0].isStdioStream = GetConsoleMode(files[0].file, &mode) != 0;
i.e. isStdioStream == GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode)
!= 0;
Then when it wants to write it does
if (f->isStdioStream)
WriteConsole(FILE_HANDLE(f), (LPVOID) (byteArrayIndex + startIndex),
count, &dwReallyWritten, NULL);
else
WriteFile(FILE_HANDLE(f), (LPVOID) (byteArrayIndex + startIndex),
count, &dwReallyWritten, NULL);
and to read it does
if (f->isStdioStream)
ReadConsole(FILE_HANDLE(f), (LPVOID) (byteArrayIndex+startIndex), count,
&dwReallyRead, NULL);
else
ReadFile(FILE_HANDLE(f), (LPVOID) (byteArrayIndex+startIndex), count,
&dwReallyRead, NULL);
Now this doesn't really help you with printf, but if you can link your
external C code you can redefine printf to invoke the above writing code.
Hence adapted from platforms/win32/vm/sqWin32Intel.c, do something like:
int __cdecl
printf(const char *fmt, ...)
{ va_list al;
int result;
va_start(al, fmt);
wvsprintf(consoleBuffer, fmt, al);
// and then adapt the above to write to the console:
if (f->isStdioStream)
WriteConsole(FILE_HANDLE(f), consoleBuffer, strlen(consoleBuffer),
&dwReallyWritten, NULL);
else
WriteFile(FILE_HANDLE(f), consoleBuffer, strlen(consoleBuffer),
&dwReallyWritten, NULL);
result = vfprintf(stdout, fmt, al);
va_end(al);
return result;
}
--
HTH,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20120817/1856a79a/attachment.htm
More information about the Squeak-dev
mailing list
|