[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