]> granicus.if.org Git - graphviz/commitdiff
lneato: Windows: correct argument interpretation with respect to unicode
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Sun, 16 Jan 2022 09:52:23 +0000 (10:52 +0100)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Mon, 17 Jan 2022 16:37:35 +0000 (17:37 +0100)
Change from WinMain to wWinMain to handle unicode correctly and avoid
the flakiness of the test_tools test.

Fixes https://gitlab.com/graphviz/graphviz/-/issues/1934.

The culprit was probably this warning which now is removed:

C:\GitLab-Runner\builds\magjac\graphviz\cmd\lneato\mswin32\lneato.c(46,40): warning C4133: 'function': incompatible types - from 'LPSTR' to 'LPCWSTR' [C:\GitLab-Runner\builds\magjac\graphviz\cmd\lneato\lneato.vcxproj]

LPSTR is a char* and LPCWSTR is a const wchar_t*. The former points to
an array of 8-bit characters, while the latter points to an array of
16-bit characters. See
https://docs.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings.

In order for the argument interpretation to work correctly after this
change, another change was necessary. The type of the argv variable is
LPWSTR which is a wchar_t* so we must use wcscmp and wide-character
literal string to get a correct 16-bit unicode character comparison.

Removes this warning:

C:\GitLab-Runner\builds\magjac\graphviz\cmd\lneato\mswin32\lneato.c(47,36): warning C4133: 'function': incompatible types - from 'LPWSTR' to 'const char *' [C:\GitLab-Runner\builds\magjac\graphviz\cmd\lneato\lneato.vcxproj]

Although not necessary, this commit also renames the lpCmdLine
argument to pCmdLine in order to match the naming in the wWinMain
signature.

This commit also removes the expectation that lneato should fail at
least one time out of 100 in the test_tools test. The actual
workaround for the flakiness will be removed in the next commit in
this series.

cmd/lneato/mswin32/lneato.c
rtest/test_tools.py

index 7d1c48b8c35081f0bf9ad2b2141cfb735b13ac86..25f0e046b3faee3c33ef545125e4f0281b75a246 100644 (file)
@@ -24,8 +24,8 @@ static char *shellpath;
 static char *buildpath (char *);
 static void panic (char *, int, char *, char *, ...);
 
-int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
-        LPSTR lpCmdLine, int nCmdShow) {
+int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+        PWSTR pCmdLine, int nCmdShow) {
     HANDLE handle;
     char cmd[256];
     char *path;
@@ -43,18 +43,18 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
         if (!(path = buildpath ("lefty")))
             exit (1);
     }
-    argv = CommandLineToArgvW(lpCmdLine, &argc);
-    if (argc == 1 && strcmp(argv[0], "-?") == 0) {
+    argv = CommandLineToArgvW(pCmdLine, &argc);
+    if (argc == 1 && wcscmp(argv[0], L"-?") == 0) {
         fprintf(stderr, "usage: lneato [-V] [-lm (sync|async)] [-el (0|1)] <filename>\n");
         exit(0);
     }
-    if (lpCmdLine[0] == 0)
+    if (pCmdLine[0] == 0)
         snprintf(cmd, sizeof(cmd), "%s -e \"load('dotty.lefty');"
                  "dotty.protogt.lserver='neato';dotty.simple(null);\"", path);
     else
         snprintf(cmd, sizeof(cmd), "%s -e \"load('dotty.lefty');"
                  "dotty.protogt.lserver='neato';dotty.simple('%Ns');\"", path,
-                 lpCmdLine);
+                 pCmdLine);
 
     handle = WinExec (cmd, SW_SHOW);
     exit (0);
index b3d431263440c9596abb28ef021d6390d67a32a4..1cfcca858465eaa63d6aed2af12c4f477a2830e7 100644 (file)
@@ -110,7 +110,6 @@ def test_tools(tool):
         else:
           has_fail = True
     assert has_pass, "could not find passing execution"
-    assert has_fail, "could not find failing execution (#1934 fixed?)"
 
   assert ret == 0, f"`{tool} -?` failed. Output was: {output}"