]> git.donarmstrong.com Git - lilypond.git/blobdiff - guile18/libguile/win32-uname.c
Import guile-1.8 as multiple upstream tarball component
[lilypond.git] / guile18 / libguile / win32-uname.c
diff --git a/guile18/libguile/win32-uname.c b/guile18/libguile/win32-uname.c
new file mode 100644 (file)
index 0000000..d4d737f
--- /dev/null
@@ -0,0 +1,145 @@
+/* Copyright (C) 2001, 2006, 2008 Free Software Foundation, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libguile/__scm.h"
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "win32-uname.h"
+
+/*
+ * Get name and information about current kernel.
+ */
+int
+uname (struct utsname *uts)
+{
+  enum { WinNT, Win95, Win98, WinUnknown };
+  OSVERSIONINFO osver;
+  SYSTEM_INFO sysinfo;
+  DWORD sLength;
+  DWORD os = WinUnknown;
+
+  memset (uts, 0, sizeof (*uts));
+
+  osver.dwOSVersionInfoSize = sizeof (osver);
+  GetVersionEx (&osver);
+  GetSystemInfo (&sysinfo);
+
+  switch (osver.dwPlatformId)
+    {
+    case VER_PLATFORM_WIN32_NT: /* NT, Windows 2000 or Windows XP */
+      if (osver.dwMajorVersion == 4)
+        strcpy (uts->sysname, "Windows NT4x"); /* NT4x */
+      else if (osver.dwMajorVersion <= 3)
+        strcpy (uts->sysname, "Windows NT3x"); /* NT3x */
+      else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion < 1)
+        strcpy (uts->sysname, "Windows 2000"); /* 2k */
+      else if (osver.dwMajorVersion >= 5)
+        strcpy (uts->sysname, "Windows XP");   /* XP */
+      os = WinNT;
+      break;
+
+    case VER_PLATFORM_WIN32_WINDOWS: /* Win95, Win98 or WinME */
+      if ((osver.dwMajorVersion > 4) || 
+          ((osver.dwMajorVersion == 4) && (osver.dwMinorVersion > 0)))
+        {
+         if (osver.dwMinorVersion >= 90)
+           strcpy (uts->sysname, "Windows ME"); /* ME */
+         else
+           strcpy (uts->sysname, "Windows 98"); /* 98 */
+          os = Win98;
+        }
+      else
+        {
+          strcpy (uts->sysname, "Windows 95"); /* 95 */
+          os = Win95;
+        }
+      break;
+
+    case VER_PLATFORM_WIN32s: /* Windows 3.x */
+      strcpy (uts->sysname, "Windows");
+      break;
+    }
+
+  sprintf (uts->version, "%ld.%02ld", 
+           osver.dwMajorVersion, osver.dwMinorVersion);
+
+  if (osver.szCSDVersion[0] != '\0' &&
+      (strlen (osver.szCSDVersion) + strlen (uts->version) + 1) < 
+      sizeof (uts->version))
+    {
+      strcat (uts->version, " ");
+      strcat (uts->version, osver.szCSDVersion);
+    }
+
+  sprintf (uts->release, "build %ld", osver.dwBuildNumber & 0xFFFF);
+
+  switch (sysinfo.wProcessorArchitecture)
+    {
+    case PROCESSOR_ARCHITECTURE_PPC:
+      strcpy (uts->machine, "ppc");
+      break;
+    case PROCESSOR_ARCHITECTURE_ALPHA:
+      strcpy (uts->machine, "alpha");
+      break;
+    case PROCESSOR_ARCHITECTURE_MIPS:
+      strcpy (uts->machine, "mips");
+      break;
+    case PROCESSOR_ARCHITECTURE_INTEL:
+      /* 
+       * dwProcessorType is only valid in Win95 and Win98 and WinME
+       * wProcessorLevel is only valid in WinNT 
+       */
+      switch (os)
+        {
+        case Win95:
+        case Win98:
+          switch (sysinfo.dwProcessorType)
+            {
+            case PROCESSOR_INTEL_386:
+            case PROCESSOR_INTEL_486:
+            case PROCESSOR_INTEL_PENTIUM:
+              sprintf (uts->machine, "i%ld", sysinfo.dwProcessorType);
+              break;
+            default:
+              strcpy (uts->machine, "i386");
+              break;
+          }
+          break;
+        case WinNT:
+          sprintf (uts->machine, "i%d86", sysinfo.wProcessorLevel);
+          break;
+        default:
+          strcpy (uts->machine, "unknown");
+          break;
+      }
+      break;
+    default:
+      strcpy (uts->machine, "unknown");
+      break;
+  }
+  
+  sLength = sizeof (uts->nodename) - 1;
+  GetComputerName (uts->nodename, &sLength);
+  return 0;
+}