28# include <sys/utsname.h>
34static int print_os_version ();
39 return print_os_version ();
44static unsigned length (
const char *
s)
55static int compare (
const char *
a,
const char *
b)
57 for (; *
a && *
a == *
b; ++
a, ++
b);
62static char* capitalize (
char *
str)
64 static const char upper[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
65 static const char lower[] =
"abcdefghijklmnopqrstuvwxyz0123456789";
67 for (
char *
s =
str; *
s; ++
s) {
68 for (
unsigned i = 0; ; ++
i) {
90#define ISDIGIT(x) ((x) >= '0' && (x) <= '9')
96static void print_linux_release ()
98 static const char*
const files[] = {
100 "/etc/debian_release",
102 "/etc/fedora-release",
104 "/etc/gentoo-release",
108 "/etc/redhat-release",
110 "/etc/slackware-release",
112 "/etc/mandrake-release",
114 "/etc/mandriva-release",
116 "/etc/mepis-release",
122 "/etc/turbolinux-release",
124 "/etc/UnitedLinux-release",
128 "/etc/yellowdog-release",
137 for (
unsigned i = 0; files [
i]; ++
i) {
138 fp = fopen (files [
i],
"r");
144 char buffer [1024] =
"(unknown release)";
149 buffer [length (
s) - 1] =
'\0';
153 printf (
"#define _RWSTD_LINUX_RELEASE \"%s\"\n",
buffer);
157static int print_os_version ()
161 if (0 > uname (&uts))
164 printf (
"#define _RWSTD_OS_%s\n", capitalize (uts.sysname));
166 printf (
"#define _RWSTD_OS_SYSNAME \"%s\"\n", uts.sysname);
167 printf (
"#define _RWSTD_OS_RELEASE \"%s\"\n", uts.release);
168 printf (
"#define _RWSTD_OS_VERSION \"%s\"\n", uts.version);
173#if !defined (SYS_NMLN)
187 const char *major =
"MAJOR";
188 const char *minor =
"MINOR";
190 if (!
compare (
"AIX", uts.sysname)) {
195 printf (
"#define _RWSTD_OS_%s %lu\n", major,
num);
201 printf (
"#define _RWSTD_OS_%s %lu\n", minor,
num);
207 printf (
"#define _RWSTD_OS_MICRO %lu\n",
num);
209 if (0 ==
compare (
"LINUX", uts.sysname)) {
212 print_linux_release ();
222static int print_os_version ()
224 OSVERSIONINFO osinfo;
225 osinfo.dwOSVersionInfoSize =
sizeof osinfo;
227 const BOOL success = GetVersionEx (&osinfo);
229 printf (
"#define _RWSTD_OS_WINDOWS\n");
230 printf (
"#define _RWSTD_OS_SYSNAME \"WINDOWS\"\n");
235 printf (
"#define _RWSTD_OS_MAJOR %lu\n", osinfo.dwMajorVersion);
236 printf (
"#define _RWSTD_OS_MINOR %lu\n", osinfo.dwMinorVersion);
237 printf (
"#define _RWSTD_OS_MICRO %lu /* build number */\n",
238 osinfo.dwBuildNumber);
240 const char *flavor = 0;
242 if (4 == osinfo.dwMajorVersion) {
243 switch (osinfo.dwMinorVersion) {
245 if (VER_PLATFORM_WIN32_NT == osinfo.dwPlatformId)
251 case 10: flavor =
"98";
break;
252 case 90: flavor =
"ME";
break;
255 else if (5 == osinfo.dwMajorVersion) {
256 switch (osinfo.dwMinorVersion) {
257 case 0: flavor =
"2000";
break;
258 case 1: flavor =
"XP";
break;
259 case 2: flavor =
"2003";
break;
264 printf (
"#define _RWSTD_OS_RELEASE \"Windows %s\"\n", flavor);
265 printf (
"#define _RWSTD_OS_WINDOWS_%s\n", flavor);
268 printf (
"#define _RWSTD_OS_RELEASE \"\"\n");
271 printf (
"#define _RWSTD_OS_VERSION \"%s\"\n", osinfo.szCSDVersion);
IMPORT_C SInt32 printf(const Char *,...)