wineconsole backend selection
Eric Pouech
eric.pouech at wanadoo.fr
Fri Feb 28 13:43:21 CST 2003
when using wineconsole, the new --backend=(curses|user) command line
option lets the user pick up his/her preferred backend
A+
--
Eric Pouech
-------------- next part --------------
Name: wc_selbe
ChangeLog:
- added ability to use --backend=(curses|user) as wineconsole parameter
- rewrote wineconsole command line option parsing
License: X11
GenDate: 2003/02/28 19:41:50 UTC
ModifiedFiles: programs/wineconsole/wineconsole.c
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/wineconsole.c,v
retrieving revision 1.21
diff -u -u -r1.21 wineconsole.c
--- programs/wineconsole/wineconsole.c 26 Feb 2003 04:37:15 -0000 1.21
+++ programs/wineconsole/wineconsole.c 28 Feb 2003 19:38:48 -0000
@@ -661,16 +661,54 @@
return done;
}
+struct wc_init {
+ LPCSTR ptr;
+ enum {from_event, from_process_name} mode;
+ BOOL (*backend)(struct inner_data*);
+ HANDLE event;
+};
+
/******************************************************************
- * WINECON_HasEvent
+ * WINECON_ParseOptions
*
*
*/
-static BOOL WINECON_HasEvent(LPCSTR ptr, unsigned* evt)
+static BOOL WINECON_ParseOptions(const char* lpCmdLine, struct wc_init* wci)
{
- while (*ptr == ' ' || *ptr == '\t') ptr++;
- if (strncmp(ptr, "--use-event=", 12)) return FALSE;
- return sscanf(ptr + 12, "%d", evt) == 1;
+ memset(wci, 0, sizeof(*wci));
+ wci->ptr = lpCmdLine;
+ wci->mode = from_process_name;
+ wci->backend = WCCURSES_InitBackend;
+
+ for (;;)
+ {
+ while (*wci->ptr == ' ' || *wci->ptr == '\t') wci->ptr++;
+ if (wci->ptr[0] != '-') break;
+ if (strncmp(wci->ptr, "--use-event=", 12) == 0)
+ {
+ char* end;
+ wci->event = (HANDLE)strtol(wci->ptr + 12, &end, 10);
+ if (end == wci->ptr + 12) return FALSE;
+ wci->mode = from_event;
+ wci->ptr = end;
+ }
+ else if (strncmp(wci->ptr, "--backend=", 10) == 0)
+ {
+ if (strncmp(wci->ptr + 10, "user", 4) == 0)
+ {
+ wci->backend = WCUSER_InitBackend;
+ wci->ptr += 14;
+ }
+ else if (strncmp(wci->ptr + 10, "curses", 6) == 0)
+ {
+ wci->ptr += 16;
+ }
+ else
+ return FALSE;
+ }
+ }
+
+ return TRUE;
}
/******************************************************************
@@ -680,52 +718,48 @@
* wineconsole --use-event=<int> used when a new console is created (AllocConsole)
* wineconsole <pgm> <arguments> used to start the program <pgm> from the command line in
* a freshly created console
+ * --backend=(curses|user) can also be used to select the desired backend
*/
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdShow)
{
struct inner_data* data;
int ret = 1;
- unsigned evt;
+ struct wc_init wci;
- /* case of wineconsole <evt>, signal process that created us that we're up and running */
- if (WINECON_HasEvent(lpCmdLine, &evt))
+ if (!WINECON_ParseOptions(lpCmdLine, &wci))
{
- if (!(data = WINECON_Init(hInst, 0, NULL, WCUSER_InitBackend))) return 0;
- ret = SetEvent((HANDLE)evt);
- if (!ret)
- {
- WINE_ERR("SetEvent failed.\n");
- goto cleanup;
- }
+ WINE_ERR("Wrong command line options\n");
+ return 0;
}
- else
+
+ switch (wci.mode)
{
- LPWSTR wcmdLine = GetCommandLine() /* we're unicode... */;
- LPWSTR src, dst;
- WCHAR buffer[256];
-
- /* remove wineconsole from commandline...
- * we could have several ' ' in process command line... so try first space...
- */
- /* FIXME:
- * the correct way would be to check the existence of the left part of ptr
- * (to be a file)
- */
- /* FIXME: could also add an option to choose another backend if needed */
- while (*wcmdLine && *wcmdLine++ != ' ');
-
- /* FIXME: see above */
- src = wcmdLine; dst = buffer;
- while (*src && *src != ' ') *dst++ = *src++;
- *dst = 0;
-
- if (!(data = WINECON_Init(hInst, GetCurrentProcessId(), buffer, WCCURSES_InitBackend))) return 0;
- ret = WINECON_Spawn(data, wcmdLine);
- if (!ret)
- {
- WINE_MESSAGE("wineconsole: spawning client program failed. Invalid/missing command line arguments ?\n");
- goto cleanup;
- }
+ case from_event:
+ /* case of wineconsole <evt>, signal process that created us that we're up and running */
+ if (!(data = WINECON_Init(hInst, 0, NULL, wci.backend))) return 0;
+ ret = SetEvent(wci.event);
+ if (!ret) WINE_ERR("SetEvent failed.\n");
+ break;
+ case from_process_name:
+ {
+ const char* src;
+ LPWSTR dst;
+ WCHAR buffer[256];
+
+ src = wci.ptr; dst = buffer;
+ while (*src && *src != ' ' && (dst - buffer < sizeof(buffer) / sizeof(WCHAR) - 1))
+ *dst++ = *src++;
+ *dst = 0;
+
+ if (!(data = WINECON_Init(hInst, GetCurrentProcessId(), buffer, wci.backend)))
+ return 0;
+ ret = WINECON_Spawn(data, buffer);
+ if (!ret)
+ WINE_MESSAGE("wineconsole: spawning client program failed (%s), invalid/missing command line arguments ?\n", wine_dbgstr_w(buffer));
+ }
+ break;
+ default:
+ return 0;
}
if (ret)
@@ -734,7 +768,6 @@
ret = data->fnMainLoop(data);
}
-cleanup:
WINECON_Delete(data);
return ret;
More information about the wine-patches
mailing list