00001
00019 #ifndef COIL_OS_H
00020 #define COIL_OS_H
00021
00022
00023 #ifdef WINVER
00024 #undef WINVER
00025 #endif
00026 #define WINVER 0x0500
00027
00028 #ifdef _WIN32_WINNT
00029 #undef _WIN32_WINNT
00030 #endif
00031 #define _WIN32_WINNT 0x0500
00032
00033 #include <windows.h>
00034 #include <string.h>
00035 #include <stdio.h>
00036 #include <process.h>
00037 #include <stdlib.h>
00038 #include <winbase.h>
00039
00040 extern "C"
00041 {
00042 extern char *optarg;
00043 };
00044
00045 namespace coil
00046 {
00047
00048 #define COIL_UTSNAME_LENGTH 65
00049 struct utsname
00050 {
00051 char sysname[COIL_UTSNAME_LENGTH];
00052 char nodename[COIL_UTSNAME_LENGTH];
00053 char release[COIL_UTSNAME_LENGTH];
00054 char version[COIL_UTSNAME_LENGTH];
00055 char machine[COIL_UTSNAME_LENGTH];
00056 };
00057
00081 inline int uname(utsname* name)
00082 {
00083 if (name == NULL) return 0;
00084 int ret(0);
00085
00086
00087 ::strcpy(name->sysname, "Win32");
00088
00089
00090 OSVERSIONINFO version_info;
00091 version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
00092 if (::GetVersionEx(&version_info) == false)
00093 ret = -1;
00094
00095 const char *os;
00096 if (version_info.dwPlatformId == VER_PLATFORM_WIN32_NT)
00097 {
00098 os = "Windows NT %d.%d";
00099 }
00100 else
00101 {
00102 os = "Windows CE %d.%d";
00103 }
00104
00105 sprintf(name->release, os,
00106 (int) version_info.dwMajorVersion,
00107 (int) version_info.dwMinorVersion);
00108
00109 sprintf(name->version, "Build %d %s",
00110 (int) version_info.dwBuildNumber,
00111 version_info.szCSDVersion);
00112
00113
00114 SYSTEM_INFO sys_info;
00115 GetSystemInfo(&sys_info);
00116 WORD arch = sys_info.wProcessorArchitecture;
00117 char cputype[COIL_UTSNAME_LENGTH/2];
00118 char subtype[COIL_UTSNAME_LENGTH/2];
00119
00120 switch (arch)
00121 {
00122 case PROCESSOR_ARCHITECTURE_INTEL:
00123 strcpy(cputype, "Intel");
00124 if (sys_info.wProcessorLevel == 3)
00125 strcpy(subtype, "80386");
00126 else if (sys_info.wProcessorLevel == 4)
00127 strcpy(subtype, "80486");
00128 else if (sys_info.wProcessorLevel == 5)
00129 strcpy(subtype, "Pentium");
00130 else if (sys_info.wProcessorLevel == 6)
00131 strcpy(subtype, "Pentium Pro");
00132 else if (sys_info.wProcessorLevel == 7)
00133 strcpy(subtype, "Pentium II");
00134 else
00135 strcpy(subtype, "Pentium Family");
00136 break;
00137 default:
00138 strcpy(cputype, "Unknown");
00139 strcpy(subtype, "Unknown");
00140 }
00141 sprintf(name->machine, "%s %s", cputype, subtype);
00142
00143
00144 DWORD len = COIL_UTSNAME_LENGTH;
00145 if (GetComputerNameExA(ComputerNameDnsHostname,
00146 name->nodename,
00147 &len) == false)
00148 ret = -1;
00149 return ret;
00150 }
00151
00171 typedef int pid_t;
00172 inline pid_t getpid()
00173 {
00174 return ::_getpid();
00175 }
00176
00196 inline pid_t getppid()
00197 {
00198 return 0;
00199 }
00200
00224 inline char* getenv(const char* name)
00225 {
00226 return ::getenv(name);
00227 }
00228
00229 static int opterr = 1,
00230 optind = 1,
00231 optopt,
00232 optreset;
00233 static char *optarg;
00234
00235 #define BADCH (int)'?'
00236 #define BADARG (int)':'
00237 #define EMSG ""
00238
00258 static int getopt(int nargc, char * const *nargv, const char *ostr)
00259 {
00260 static char *place = EMSG;
00261 const char *oli;
00262 char *p;
00263
00264 if (optreset || !*place) {
00265 optreset = 0;
00266
00267 if (optind >= nargc)
00268 {
00269 place = EMSG;
00270 return(-1);
00271 }
00272 for(;;)
00273 {
00274
00275 if (optind >= nargc)
00276 {
00277 place = EMSG;
00278 return(-1);
00279 }
00280 place = nargv[optind];
00281
00282 if (*place != '-')
00283 {
00284
00285
00286 optind++;
00287
00288 }
00289 else
00290 {
00291 break;
00292 }
00293 }
00294 if (place[1] && *++place == '-') {
00295 ++optind;
00296 place = EMSG;
00297 return(-1);
00298 }
00299 }
00300 if ((optopt = (int)*place++) == (int)':' ||
00301 !(oli = strchr(ostr, optopt))) {
00302
00303
00304
00305
00306 if (optopt == (int)'-')
00307 return(-1);
00308 if (!*place)
00309 ++optind;
00310 if (opterr && *ostr != ':') {
00311 if (!(p = strrchr(*nargv, '/')))
00312 p = *nargv;
00313 else
00314 ++p;
00315 fprintf(stderr, "%s: illegal option -- %c\n",
00316 p, optopt);
00317 }
00318 return(BADCH);
00319 }
00320 if (*++oli != ':') {
00321 optarg = NULL;
00322 if (!*place)
00323 ++optind;
00324 }
00325 else {
00326 if (*place)
00327 optarg = place;
00328 else if (nargc <= ++optind) {
00329 place = EMSG;
00330 if (!(p = strrchr(*nargv, '/')))
00331 p = *nargv;
00332 else
00333 ++p;
00334 if (*ostr == ':')
00335 return(BADARG);
00336 if (opterr)
00337 fprintf(stderr,
00338 "%s: option requires an argument -- %c\n",
00339 p, optopt);
00340 return(BADCH);
00341 }
00342 else
00343 optarg = nargv[optind];
00344 place = EMSG;
00345 ++optind;
00346 }
00347 return(optopt);
00348 }
00349
00363 class GetOpt
00364 {
00365 public:
00385 GetOpt(int argc, char* const argv[], const char* opt, int flag)
00386 : m_argc(argc), m_argv(argv), m_opt(opt), m_flag(flag), optind(1), opterr(1), optopt(0)
00387
00388 {
00389 this->optarg = coil::optarg;
00390 coil::optind = 1;
00391 }
00392
00408 ~GetOpt()
00409 {
00410 coil::optind = 1;
00411 }
00412
00432 int operator()()
00433 {
00434 coil::opterr = opterr;
00435 coil::optind = optind;
00436
00437 int result = getopt(m_argc, m_argv, m_opt);
00438
00439 optarg = coil::optarg;
00440 optind = coil::optind;
00441 optopt = coil::optopt;
00442
00443 return result;
00444 }
00445
00446 char* optarg;
00447 int optind;
00448 int opterr;
00449 int optopt;
00450
00451
00452 private:
00453 int m_argc;
00454 char* const * m_argv;
00455 const char* m_opt;
00456 int m_flag;
00457
00458 };
00459
00460 };
00461
00462 #endif // COIL_OS_H