📄 utils.cpp
字号:
return WD_NOT_IMPLEMENTED;
#endif
#endif
}
void DLLCALLCONV OsMutexClose(HANDLE hOsMutex)
{
#if defined(__KERNEL__)
#else
#if defined(WIN32)
if (hOsMutex)
CloseHandle(hOsMutex);
#elif defined(LINUX)
pthread_mutex_t *linux_mutex = (pthread_mutex_t *)hOsMutex;
pthread_mutex_destroy(linux_mutex);
free(linux_mutex);
#endif
#endif
}
DWORD DLLCALLCONV OsMutexLock(HANDLE hOsMutex)
{
#if defined(__KERNEL__)
return WD_NOT_IMPLEMENTED;
#else
#if defined(WIN32)
WaitForSingleObject(hOsMutex, INFINITE);
#elif defined(LINUX)
pthread_mutex_t *linux_mutex = (pthread_mutex_t *)hOsMutex;
pthread_mutex_lock(linux_mutex);
#endif
return WD_STATUS_SUCCESS;
#endif
}
DWORD DLLCALLCONV OsMutexUnlock(HANDLE hOsMutex)
{
#if defined(__KERNEL__)
return WD_NOT_IMPLEMENTED;
#else
#if defined(WIN32)
ReleaseMutex(hOsMutex);
#elif defined(LINUX)
pthread_mutex_t *linux_mutex = (pthread_mutex_t*)hOsMutex;
pthread_mutex_unlock(linux_mutex);
#endif
return WD_STATUS_SUCCESS;
#endif
}
// the function modifies sPath
void replace_slashes(char *sPath, BOOL dos_to_unix)
{
int i;
for (i=0; sPath[i]; i++)
{
if (dos_to_unix && sPath[i]=='\\')
sPath[i] = '/';
else if (!dos_to_unix && sPath[i]=='/')
sPath[i] = '\\';
}
}
void DLLCALLCONV SleepWrapper(DWORD dwMicroSecs)
{
HANDLE hWD;
WD_SLEEP slp;
hWD = WD_Open();
if (hWD==INVALID_HANDLE_VALUE)
return;
BZERO(slp);
slp.dwMicroSeconds = dwMicroSecs;
slp.dwOptions = SLEEP_NON_BUSY;
WD_Sleep(hWD, &slp);
WD_Close(hWD);
}
#endif // !defined(WIN16)
OS_TYPE get_os_type(void)
{
#if defined(WIN32)
#if defined(__KERNEL__)
return OS_NOT_SET;
#else
static OS_TYPE os_type = OS_NOT_SET;
OSVERSIONINFO lVerInfo;
if (os_type)
return os_type;
lVerInfo.dwOSVersionInfoSize = sizeof (lVerInfo);
if (!GetVersionEx (&lVerInfo))
os_type = OS_CAN_NOT_DETECT;
else if (lVerInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
if (lVerInfo.dwMajorVersion<=4)
os_type = OS_WIN_NT_4;
else if (lVerInfo.dwMajorVersion == 5)
os_type = OS_WIN_NT_5;
else
os_type = OS_WIN_NT_6;
}
else if (lVerInfo.dwPlatformId!=VER_PLATFORM_WIN32_WINDOWS)
os_type = OS_CAN_NOT_DETECT;
else if ((lVerInfo.dwMajorVersion > 4) || ((lVerInfo.dwMajorVersion == 4)
&& (lVerInfo.dwMinorVersion > 0)))
{
os_type = OS_WIN_98;
}
else
os_type = OS_WIN_95;
return os_type;
#endif
#elif defined(LINUX)
return OS_LINUX;
#elif defined(SOLARIS)
return OS_SOLARIS;
#elif defined(WIN16)
return OS_WIN_98;
#else
return OS_CAN_NOT_DETECT;
#endif
}
#ifdef WIN32
void DLLCALLCONV FreeDllPtr (void **ptr) // For backward compatability, no longer used
{
free(*ptr);
}
#endif
#if !defined(WIN16)
#if !defined(__KERNEL__)
void DLLCALLCONV vPrintDbgMessage(DWORD dwLevel, DWORD dwSection,
const char *format, va_list ap)
{
WD_DEBUG_ADD add;
HANDLE hWD;
hWD = WD_Open();
if (hWD==INVALID_HANDLE_VALUE)
return;
BZERO(add);
add.dwLevel = dwLevel;
add.dwSection = dwSection;
vsnprintf(add.pcBuffer, 255, format, ap);
WD_DebugAdd(hWD, &add);
WD_Close(hWD);
}
void DLLCALLCONV PrintDbgMessage(DWORD dwLevel, DWORD dwSection,
const char *format, ...)
{
va_list ap;
va_start(ap, format);
vPrintDbgMessage(dwLevel,dwSection,format,ap);
va_end(ap);
}
int DLLCALLCONV GetPageSize(void)
{
#if defined(UNIX)
return sysconf(_SC_PAGESIZE);
#elif defined(WIN32)
SYSTEM_INFO si;
GetSystemInfo(&si);
return si.dwPageSize;
#else
#error not implemented
#endif
}
DWORD DLLCALLCONV GetPageCount(void *pBuf, DWORD dwSize)
{
DWORD dwPageSize = GetPageSize();
DWORD dwMask = ~(dwPageSize - 1);
return (((unsigned long)pBuf & ~dwMask) + dwSize + ~dwMask) / dwPageSize;
}
BOOL DLLCALLCONV UtilGetFileSize(const PCHAR sFileName, DWORD *dwFileSize,
PCHAR sErrString)
{
char err_msg[1024];
PCHAR pc_err = sErrString ? sErrString : &err_msg[0];
#if defined (WIN32) // Windows and Windows CE
HANDLE fh;
#if defined(WINCE)
WCHAR swFileName[MAX_PATH];
swprintf(swFileName, L"%s", sFileName);
fh = CreateFile(swFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
#else
fh = CreateFile(sFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
#endif
if (fh == INVALID_HANDLE_VALUE)
{
DWORD dwLastError;
LPTSTR lpMsgBuf;
dwLastError = GetLastError();
sprintf(pc_err, "Failed opening %s for reading.\n"
"Last error: 0x%lx", sFileName, dwLastError);
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf, 0, NULL))
{
sprintf(pc_err, "%s - %s", pc_err, lpMsgBuf); // ('\n' is already included in lpMsgBuf)
LocalFree(lpMsgBuf);
}
else
sprintf(pc_err, "%s\n", pc_err);
return FALSE;
}
*dwFileSize = GetFileSize(fh, NULL);
if (!CloseHandle(fh))
{
sprintf(pc_err, "Failed closing file handle to %s (0x%x)\n", sFileName, fh);
return FALSE;
}
return (*dwFileSize != INVALID_FILE_SIZE);
#elif defined (UNIX)
struct stat file_stat;
if (stat(sFileName, &file_stat))
{
sprintf(pc_err, "Failed retrieving %s file information", sFileName);
return FALSE;
}
*dwFileSize = (DWORD)file_stat.st_size;
return TRUE;
#else
sprintf(pc_err, "UtilGetFileSize: not implemented for this OS\n");
return FALSE;
#endif
}
DWORD DLLCALLCONV UtilGetStringFromUser(PCHAR pcString, DWORD dwSizeStr,
const CHAR *pcInputText, const CHAR *pcDefaultString)
{
DWORD dwStrLen;
if (!pcString || (dwSizeStr <= 1))
return WD_INVALID_PARAMETER;
pcString[0] = '\0';
printf("%s", pcInputText);
if (pcDefaultString && strcmp(pcDefaultString, ""))
printf(" (Default: %s)", pcDefaultString);
printf(":\n > ");
fgets(pcString, dwSizeStr, stdin);
dwStrLen = (DWORD)strlen(pcString);
if (dwStrLen > 1)
{
if (pcString[dwStrLen - 1] == '\n') // remove '\n' (may be missing if dwSizeStr < size of input string)
pcString[dwStrLen - 1] = '\0';
}
else if (pcDefaultString)
strcpy(pcString, pcDefaultString);
else // user did not provide any input and no default string exists
return WD_OPERATION_FAILED;
return WD_STATUS_SUCCESS;
}
DWORD DLLCALLCONV UtilGetFileName(PCHAR pcFileName, DWORD dwFileNameSize,
const CHAR *pcDefaultFileName)
{
return UtilGetStringFromUser(pcFileName, dwFileNameSize,
"Please enter the file name", pcDefaultFileName);
}
void DLLCALLCONV UtilClrScr(void)
{
#if defined(UNIX)
system("clear");
#elif defined(WIN32) && !defined(WINCE)
#if defined(BCPP)
clrscr();
#else
system("cls");
#endif
#else
// not implemented ...
#endif
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -