home *** CD-ROM | disk | FTP | other *** search
- // utils.cpp
- //
- // Created 01/18/99
- //
- // (C) Copyright 1995 - 1999 Microsoft Corporation. All rights reserved.
- //
-
- #include "project.hpp"
- #pragma hdrstop
-
- #include "utils.hpp"
-
-
- BOOL matchone (PSTR *ppattern, PSTR s)
- {
- PSTR p = *ppattern;
-
- while (*s != '\0' && *s == *p)
- {
- s++;
- p++;
- }
-
- // Something mismatched - if it's a '*', accept anything remaining,
- // and leave the ptr at the '*' so that subsequent matches are also consumed.
- if (*p == '*')
- {
- *ppattern = p;
- return TRUE;
- }
-
- // At the end of both? Leave ptr at the separator so that subsequent
- // matches will fail.
- if (*s == '\0' && (*p == ',' || *p == '\0'))
- {
- *ppattern = p;
- return TRUE;
- }
-
- // Mismatch. Advance past the end of this pattern.
- while (*p != '\0' && *p != ',')
- p++;
- if (*p == ',')
- p++;
-
- *ppattern = p;
-
- return FALSE;
- }
-
- BOOL match (PSTR pattern, PSTR s)
- {
- while (*pattern != '\0')
- {
- if (matchone(&pattern, s))
- return TRUE;
- }
-
- return FALSE;
- }
-
-
- PCSTR StringForExecutionModel (JAVA_EXECUTION_MODEL exec)
- {
- switch (exec)
- {
- case JVM_EXECUTION_JIT_COMPILED:
- return "j";
- case JVM_EXECUTION_NATIVE:
- return "n";
- case JVM_EXECUTION_INTERPRETED:
- return "i";
- case JVM_EXECUTION_FAST_INTERPRETED:
- return "f";
- case JVM_EXECUTION_COM:
- return "c";
- }
- return "?";
- }
-
-
- BOOL GrowPtrArray (PVOID **ppArray, ULONG *pCount, ULONG nNeeded)
- {
- PVOID *pNewArray = new(PVOID[*pCount+nNeeded]);
- if (!pNewArray)
- return FALSE;
-
- if (*ppArray)
- {
- CopyMemory(pNewArray, *ppArray, *pCount * sizeof(PVOID));
-
- delete(*ppArray);
- }
-
- *ppArray = pNewArray;
- *pCount = *pCount + nNeeded;
- return TRUE;
- }
-
-
- __declspec(naked)
- VOID __stdcall InterlockedAdd (__int64 *pqwDest, __int64 qwAdd)
- {
- #ifdef _X86_
- __asm
- {
- mov eax, [esp+4]
- mov ecx, [esp+8]
- lock add [eax], ecx
- mov edx, [esp+12]
- lock adc [eax], edx
- ret 12
- }
- #endif
- }
-
-
- BOOL Utf8ToAnsi (PCSTR pcszUtf8, PSTR *ppszAnsi)
- {
- *ppszAnsi = NULL;
-
- ULONG nChars = 0;
- PCSTR p = pcszUtf8;
- BOOL fCanUseAsAnsi = TRUE;
-
- for (;;)
- {
- CHAR ch = *p++;
-
- if (ch == '\0')
- break;
-
- nChars++;
-
- if (ch & 0x80)
- {
- fCanUseAsAnsi = FALSE;
-
- p++;
-
- if (0xe0 == (ch & 0xe0))
- p++;
- }
- }
-
- if (fCanUseAsAnsi)
- return TRUE;
-
- PWSTR pwsz = new WCHAR[nChars+1];
- if (!pwsz)
- return FALSE;
-
- p = pcszUtf8;
- WCHAR *pw = pwsz;
-
- for (;;)
- {
- CHAR ch = *p++;
-
- if (ch == '\0')
- break;
-
- if (!(ch & 0x80))
- {
- *pw = (WCHAR)ch;
- }
- else if (0xc0 == (ch & 0xe0))
- {
- CHAR ch2 = *p++;
-
- *pw = ( (((WCHAR)(ch & 0x1f)) << 6)
- | (((WCHAR)(ch2 & 0x3f)) ));
- }
- else
- {
- CHAR ch2 = *p++;
- CHAR ch3 = *p++;
-
- *pw = ( (((WCHAR)(ch & 0x0f)) << 12)
- | (((WCHAR)(ch2 & 0x3f)) << 6)
- | (((WCHAR)(ch3 & 0x3f)) ));
- }
-
- pw++;
- }
-
- BOOL result = FALSE;
-
- int cbAnsi = WideCharToMultiByte(CP_ACP, 0, pwsz, nChars, NULL, 0, NULL, NULL);
- if (cbAnsi >= 0)
- {
- PSTR pszAnsi = new CHAR[cbAnsi+1];
- if (pszAnsi)
- {
- if (WideCharToMultiByte(CP_ACP, 0, pwsz, nChars, pszAnsi, cbAnsi, NULL, NULL) >= 0)
- {
- pszAnsi[cbAnsi] = '\0';
- *ppszAnsi = pszAnsi;
- result = TRUE;
- }
-
- if (!result)
- delete pszAnsi;
- }
- }
-
- delete pwsz;
- return result;
- }
-
-