bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/5] Assume GetVersionEx info is available, try to use only one c


From: Paolo Bonzini
Subject: [PATCH 3/5] Assume GetVersionEx info is available, try to use only one call.
Date: Thu, 1 Oct 2009 14:15:09 +0200

This is actually a better way to organize the checks: first try
to get extended information, else fall back to OSVERSIONINFOA.

Given this, I can assert that Windows can provide version
information and proceed with the big reindentation.

* lib/uname.c: Check for OSVERSIONINFOEXA and fall back to
OSVERSIONINFOA.  After that, assume version info is available
(big reindentation).
---
 ChangeLog   |    7 +++
 lib/uname.c |  161 +++++++++++++++++++++++++++--------------------------------
 2 files changed, 81 insertions(+), 87 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1ab1255..e0819f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2009-10-01  Paolo Bonzini  <address@hidden>
 
+       Assume GetVersionEx info is available, try to use only one call.
+       * lib/uname.c: Check for OSVERSIONINFOEXA and fall back to
+       OSVERSIONINFOA.  After that, assume version info is available
+       (big reindentation).
+
+2009-10-01  Paolo Bonzini  <address@hidden>
+
        Use only one OSVERSIONINFOEXA struct, use ANSI version.
        * lib/uname.c: Use GetVersionExA, move API calls to the beginning.
 
diff --git a/lib/uname.c b/lib/uname.c
index d92e972..52519a6 100644
--- a/lib/uname.c
+++ b/lib/uname.c
@@ -24,6 +24,7 @@
 
 #include <stdio.h>
 #include <unistd.h>
+#include <assert.h>
 #include <windows.h>
 #include <assert.h>
 
@@ -45,40 +46,39 @@ uname (struct utsname *buf)
 
   /* Determine major-major Windows version.  OSVERSIONINFOEXA starts 
      with the same fields as OSVERSIONINFOA, request those first.  */
-  version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOA);
+  version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXA);
   have_version = GetVersionExA ((OSVERSIONINFOA *) &version);
-  if (have_version)
+  if (!have_version)
     {
-      if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-       {
-         /* Windows NT or newer.  */
-         super_version = "NT";
+      memset (&version, 0, sizeof (version));
+      version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOA);
+      have_version = GetVersionExA ((OSVERSIONINFOA *) &version);
+      assert (have_version);
+    }
 
-         version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXA);
-         have_version = GetVersionExA ((OSVERSIONINFOA *) &version);
-         assert (have_version);
-       }
-      else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
+  if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+    {
+      /* Windows NT or newer.  */
+      super_version = "NT";
+    }
+  else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
+    {
+      /* Windows 95/98/ME.  */
+      switch (version.dwMinorVersion)
        {
-         /* Windows 95/98/ME.  */
-         switch (version.dwMinorVersion)
-           {
-           case 0:
-             super_version = "95";
-             break;
-           case 10:
-             super_version = "98";
-             break;
-           case 90:
-             super_version = "ME";
-             break;
-           default:
-             super_version = "";
-             break;
-           }
-       }
-      else
-       super_version = "";
+       case 0:
+         super_version = "95";
+         break;
+       case 10:
+         super_version = "98";
+         break;
+       case 90:
+         super_version = "ME";
+         break;
+       default:
+         super_version = "";
+         break;
+       }
     }
   else
     super_version = "";
@@ -90,17 +90,11 @@ uname (struct utsname *buf)
      For example,
        $ ./uname.exe -s      => MINGW32_NT-5.1
    */
-  if (have_version)
-    sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version,
-            (unsigned int) version.dwMajorVersion,
-            (unsigned int) version.dwMinorVersion);
-  else
-    strcpy (buf->sysname, "MINGW32");
+  sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version,
+          (unsigned int) version.dwMajorVersion,
+          (unsigned int) version.dwMinorVersion);
 #else
-  if (have_version)
-    sprintf (buf->sysname, "Windows%s", super_version);
-  else
-    strcpy (buf->sysname, "Windows");
+  sprintf (buf->sysname, "Windows%s", super_version);
 #endif
 
   /* Fill in release, version.  */
@@ -108,63 +102,56 @@ uname (struct utsname *buf)
        $ ./uname.exe -r      => 1.0.11(0.46/3/2)
        $ ./uname.exe -v      => 2008-08-25 23:40
      There is no point in imitating this behaviour.  */
-  if (have_version)
+  if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
     {
-      if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+      /* Windows NT or newer.  */
+      if (version.dwMajorVersion <= 4)
+       sprintf (buf->release, "Windows NT %u.%u",
+                (unsigned int) version.dwMajorVersion,
+                (unsigned int) version.dwMinorVersion);
+      else if (version.dwMajorVersion == 5)
+       switch (version.dwMinorVersion)
+         {
+         case 0:
+           strcpy (buf->release, "Windows 2000");
+           break;
+         case 1:
+           strcpy (buf->release, "Windows XP");
+           break;
+         case 2:
+           strcpy (buf->release, "Windows Server 2003");
+           break;
+         default:
+           strcpy (buf->release, "Windows");
+           break;
+         }
+      else if (version.dwMajorVersion == 6)
        {
-         /* Windows NT or newer.  */
-         if (version.dwMajorVersion <= 4)
-           sprintf (buf->release, "Windows NT %u.%u",
-                    (unsigned int) version.dwMajorVersion,
-                    (unsigned int) version.dwMinorVersion);
-         else if (version.dwMajorVersion == 5)
-           switch (version.dwMinorVersion)
-             {
-             case 0:
-               strcpy (buf->release, "Windows 2000");
-               break;
+         if (version.wProductType != VER_NT_WORKSTATION)
+           strcpy (buf->release, "Windows Server 2008");
+         else
+           switch (version.dwMinorVersion)
+             {
+             case 0:
+               strcpy (buf->release, "Windows Vista");
+               break;
              case 1:
-               strcpy (buf->release, "Windows XP");
-               break;
-             case 2:
-               strcpy (buf->release, "Windows Server 2003");
-               break;
-             default:
-               strcpy (buf->release, "Windows");
-               break;
+             default: /* versions not yet known */
+               strcpy (buf->release, "Windows 7");
+               break;
              }
-         else if (version.dwMajorVersion == 6)
-           {
-             if (version.wProductType != VER_NT_WORKSTATION)
-               strcpy (buf->release, "Windows Server 2008");
-             else
-               switch (version.dwMinorVersion)
-                 {
-                 case 0:
-                   strcpy (buf->release, "Windows Vista");
-                   break;
-                 case 1:
-                 default: /* versions not yet known */
-                   strcpy (buf->release, "Windows 7");
-                   break;
-                 }
-           }
-         else
-           strcpy (buf->release, "Windows");
        }
       else
-       {
-         /* Windows 95/98/ME.  */
-         sprintf (buf->release, "Windows %s", super_version);
-       }
-      strcpy (buf->version, version.szCSDVersion);
+       strcpy (buf->release, "Windows");
     }
   else
     {
-      strcpy (buf->release, "Windows");
-      strcpy (buf->version, "");
+      /* Windows 95/98/ME.  */
+      sprintf (buf->release, "Windows %s", super_version);
     }
 
+  strcpy (buf->version, version.szCSDVersion);
+
   /* Fill in machine.  */
   {
     SYSTEM_INFO info;
@@ -172,7 +159,7 @@ uname (struct utsname *buf)
     GetSystemInfo (&info);
     /* Check for Windows NT, since the info.wProcessorLevel is
        garbage on Windows 95. */
-    if (have_version && version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+    if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
       {
        /* Windows NT or newer.  */
        switch (info.wProcessorArchitecture)
-- 
1.6.2.5






reply via email to

[Prev in Thread] Current Thread [Next in Thread]