⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.cpp

📁 采用windriver提供的API开发的D12应用程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -