Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

OS.d

Go to the documentation of this file.
00001 /*******************************************************************************
00002 
00003         @file OS.d
00004         
00005         Copyright (c) 2004 Kris Bell
00006         
00007         This software is provided 'as-is', without any express or implied
00008         warranty. In no event will the authors be held liable for damages
00009         of any kind arising from the use of this software.
00010         
00011         Permission is hereby granted to anyone to use this software for any 
00012         purpose, including commercial applications, and to alter it and/or 
00013         redistribute it freely, subject to the following restrictions:
00014         
00015         1. The origin of this software must not be misrepresented; you must 
00016            not claim that you wrote the original software. If you use this 
00017            software in a product, an acknowledgment within documentation of 
00018            said product would be appreciated but is not required.
00019 
00020         2. Altered source versions must be plainly marked as such, and must 
00021            not be misrepresented as being the original software.
00022 
00023         3. This notice may not be removed or altered from any distribution
00024            of the source.
00025 
00026         4. Derivative works are permitted, but they must carry this notice
00027            in full and credit the original source.
00028 
00029 
00030                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00031 
00032         
00033         @version        Initial version; November 2005
00034 
00035         @author         Kris
00036 
00037 
00038 *******************************************************************************/
00039 
00040 module mango.sys.OS;
00041 
00042 version (Ares)
00043         {
00044         version (Win32)
00045                  public import sys.windows.c.windows;  
00046 
00047         version (linux)
00048                 {
00049                 public import sys.linux.c.linux;
00050                 alias sys.linux.c.linux posix;
00051                 }
00052 
00053         version (darwin)
00054                 {
00055                 public import sys.darwin.c.darwin;
00056                 alias sys.darwin.c.darwin posix;
00057                 }
00058         }
00059 else
00060         {
00061         version (Win32)
00062                  public import std.c.windows.windows;  
00063 
00064         version (linux)
00065                 {
00066                 public import std.c.linux.linux;
00067                 alias std.c.linux.linux posix;
00068                 }
00069 
00070         version (darwin)
00071                 {
00072                 public import std.c.darwin.darwin;
00073                 alias std.c.darwin.darwin posix;
00074                 }
00075         }
00076 
00077 /*******************************************************************************
00078 
00079         Stuff for sysError(), kindly provided by Regan Heath. 
00080 
00081 *******************************************************************************/
00082 
00083 version (Win32)
00084         {
00085         static uint FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
00086         static uint FORMAT_MESSAGE_IGNORE_INSERTS  = 0x00000200;
00087         static uint FORMAT_MESSAGE_FROM_STRING     = 0x00000400;
00088         static uint FORMAT_MESSAGE_FROM_HMODULE    = 0x00000800;
00089         static uint FORMAT_MESSAGE_FROM_SYSTEM     = 0x00001000;
00090         static uint FORMAT_MESSAGE_ARGUMENT_ARRAY  = 0x00002000;
00091         static uint FORMAT_MESSAGE_MAX_WIDTH_MASK  = 0x000000FF;
00092 
00093         DWORD MAKELANGID(WORD p, WORD s)  { return (((cast(WORD)s) << 10) | cast(WORD)p); }
00094         //WORD PRIMARYLANGID(WORD lgid)    { return cast(WORD) (cast(WORD)lgid & 0x3ff); }
00095         //WORD SUBLANGID(WORD lgid)        { return cast(WORD) (cast(WORD)lgid >> 10); }
00096 
00097         alias HGLOBAL HLOCAL;
00098 
00099         static WORD LANG_NEUTRAL = 0x00;
00100         static WORD SUBLANG_DEFAULT = 0x01;
00101 
00102         extern (Windows) 
00103                {
00104                DWORD FormatMessageA (DWORD dwFlags,
00105                                      LPCVOID lpSource,
00106                                      DWORD dwMessageId,
00107                                      DWORD dwLanguageId,
00108                                      LPTSTR lpBuffer,
00109                                      DWORD nSize,
00110                                      LPCVOID args
00111                                      );
00112 
00113                HLOCAL LocalFree(HLOCAL hMem);
00114                }
00115         }
00116 else
00117 version (Posix)
00118         {
00119         extern (C) char *strerror (int);
00120         extern (C) int strlen (char *);
00121         extern (C) int getErrno ();
00122         extern (C) void usleep(uint);
00123         }
00124 else
00125    static assert(0);
00126 
00127 /*******************************************************************************
00128 
00129         Some system-specific functionality that doesn't belong anywhere 
00130         else. This needs some further thought and refinement.
00131 
00132 *******************************************************************************/
00133 
00134 struct OS
00135 {       
00136         /***********************************************************************
00137         
00138         ***********************************************************************/
00139 
00140         final static char[] error ()
00141         {
00142                 version (Win32)
00143                          return error (GetLastError);
00144                      else
00145                         return error (getErrno);
00146         }
00147 
00148         /***********************************************************************
00149         
00150         ***********************************************************************/
00151 
00152         final static char[] error (uint errcode)
00153         {
00154                 char[] text;
00155 
00156                 version (Win32)
00157                         {
00158                         DWORD  r;
00159                         LPVOID lpMsgBuf;                        
00160 
00161                         r = FormatMessageA ( 
00162                                 FORMAT_MESSAGE_ALLOCATE_BUFFER | 
00163                                 FORMAT_MESSAGE_FROM_SYSTEM | 
00164                                 FORMAT_MESSAGE_IGNORE_INSERTS,
00165                                 null,
00166                                 errcode,
00167                                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
00168                                 cast(LPTSTR)&lpMsgBuf,
00169                                 0,
00170                                 null);
00171 
00172                         /* Remove \r\n from error string */
00173                         if (r >= 2) r-= 2;
00174                         text = (cast(char *)lpMsgBuf)[0..r].dup;
00175                         LocalFree(cast(HLOCAL)lpMsgBuf);
00176                         }
00177                      else
00178                         {
00179                         uint  r;
00180                         char* pemsg;
00181 
00182                         pemsg = strerror(errcode);
00183                         r = strlen(pemsg);
00184 
00185                         /* Remove \r\n from error string */
00186                         if (pemsg[r-1] == '\n') r--;
00187                         if (pemsg[r-1] == '\r') r--;
00188                         text = pemsg[0..r].dup;
00189                         }
00190                 
00191                 return text;
00192         }
00193 }
00194 
00195 

Generated on Sat Dec 24 17:28:33 2005 for Mango by  doxygen 1.4.0