winetest: run with -mwindows

Jakob Eriksson jakov at vmlinux.org
Wed Mar 24 13:54:58 CST 2004


Hmm... what is the problem with GUI and command line interface.
I don't think there should be any particalur problems, what happens?



Ferenc Wagner wrote:

>Okay, it wasn't true, actually.  So, this patch solves the
>immediate problem, but is not the full solution.  How do you
>write a program which has both GUI and CUI?  Is there any
>way to use standard IO in a program compiled with -mwindows
>but run from a console?
>
>ChangeLog: 
>  Don't expect stdout be usable after exchanging file
>  descriptors under it.
>
>Index: main.c
>===================================================================
>RCS file: /home/wine/wine/programs/winetest/main.c,v
>retrieving revision 1.7
>diff -u -r1.7 main.c
>--- main.c	20 Mar 2004 19:21:39 -0000	1.7
>+++ main.c	24 Mar 2004 13:30:26 -0000
>@@ -337,8 +337,6 @@
>     SetErrorMode (SEM_FAILCRITICALERRORS);
> 
>     if (!(wineloader = getenv("WINELOADER"))) wineloader = "wine";
>-    if (setvbuf (stdout, NULL, _IONBF, 0))
>-        report (R_FATAL, "Can't unbuffer output.");
> 
>     tempdir = tempnam (0, "wct");
>     if (!tempdir)
>Index: util.c
>===================================================================
>RCS file: /home/wine/wine/programs/winetest/util.c,v
>retrieving revision 1.4
>diff -u -r1.4 util.c
>--- util.c	19 Mar 2004 19:15:23 -0000	1.4
>+++ util.c	24 Mar 2004 13:30:26 -0000
>@@ -19,6 +19,7 @@
>  *
>  */
> #include <windows.h>
>+#include <unistd.h>
> #include <errno.h>
> 
> #include "winetest.h"
>@@ -39,26 +40,14 @@
>     return p;
> }
> 
>-void xprintf (const char *fmt, ...)
>-{
>-    va_list ap;
>-
>-    va_start (ap, fmt);
>-    if (vprintf (fmt, ap) < 0)
>-        report (R_FATAL, "Can't write logs: %d", errno);
>-    va_end (ap);
>-}
>-
>-char *vstrmake (size_t *lenp, va_list ap)
>+char *vstrfmtmake (size_t *lenp, const char *fmt, va_list ap)
> {
>-    char *fmt;
>     size_t size = 1000;
>     char *p, *q;
>     int n;
> 
>     p = malloc (size);
>     if (!p) return NULL;
>-    fmt = va_arg (ap, char*);
>     while (1) {
>         n = vsnprintf (p, size, fmt, ap);
>         if (n < 0) size *= 2;   /* Windows */
>@@ -75,6 +64,14 @@
>     return p;
> }
> 
>+char *vstrmake (size_t *lenp, va_list ap)
>+{
>+    const char *fmt;
>+
>+    fmt = va_arg (ap, const char*);
>+    return vstrfmtmake (lenp, fmt, ap);
>+}
>+
> char *strmake (size_t *lenp, ...)
> {
>     va_list ap;
>@@ -85,6 +82,26 @@
>     if (!p) report (R_FATAL, "Out of memory.");
>     va_end (ap);
>     return p;
>+}
>+
>+void xprintf (const char *fmt, ...)
>+{
>+    va_list ap;
>+    size_t size;
>+    ssize_t written;
>+    char *buffer, *head;
>+
>+    va_start (ap, fmt);
>+    buffer = vstrfmtmake (&size, fmt, ap);
>+    head = buffer;
>+    va_end (ap);
>+    while ((written = write (1, head, size)) != size) {
>+        if (written == -1)
>+            report (R_FATAL, "Can't write logs: %d", errno);
>+        head += written;
>+        size -= written;
>+    }
>+    free (buffer);
> }
> 
> char *
>
>  
>




More information about the wine-devel mailing list