home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 39 / IOPROG_39.ISO / SOFT / sdkjava40.exe / data1.cab / fg_Samples / Samples / Profiler / jviewprf / utils.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-04  |  4.0 KB  |  211 lines

  1. // utils.cpp
  2. //
  3. // Created 01/18/99
  4. //
  5. // (C) Copyright 1995 - 1999 Microsoft Corporation.  All rights reserved.
  6. //
  7.  
  8. #include "project.hpp"
  9. #pragma hdrstop
  10.  
  11. #include "utils.hpp"
  12.  
  13.  
  14. BOOL matchone (PSTR *ppattern, PSTR s)
  15. {
  16.     PSTR p = *ppattern;
  17.  
  18.     while (*s != '\0' && *s == *p)
  19.     {
  20.         s++;
  21.         p++;
  22.     }
  23.  
  24.     // Something mismatched - if it's a '*', accept anything remaining,
  25.     // and leave the ptr at the '*' so that subsequent matches are also consumed.
  26.     if (*p == '*')
  27.     {
  28.         *ppattern = p;
  29.         return TRUE;
  30.     }
  31.  
  32.     // At the end of both?  Leave ptr at the separator so that subsequent
  33.     // matches will fail.
  34.     if (*s == '\0' && (*p == ',' || *p == '\0'))
  35.     {
  36.         *ppattern = p;
  37.         return TRUE;
  38.     }
  39.  
  40.     // Mismatch.  Advance past the end of this pattern.
  41.     while (*p != '\0' && *p != ',')
  42.         p++;
  43.     if (*p == ',')
  44.         p++;
  45.  
  46.     *ppattern = p;
  47.  
  48.     return FALSE;
  49. }
  50.  
  51. BOOL match (PSTR pattern, PSTR s)
  52. {
  53.     while (*pattern != '\0')
  54.     {
  55.         if (matchone(&pattern, s))
  56.             return TRUE;
  57.     }
  58.  
  59.     return FALSE;
  60. }
  61.  
  62.  
  63. PCSTR StringForExecutionModel (JAVA_EXECUTION_MODEL exec)
  64. {
  65.     switch (exec)
  66.     {
  67.     case JVM_EXECUTION_JIT_COMPILED:
  68.         return "j";
  69.     case JVM_EXECUTION_NATIVE:
  70.         return "n";
  71.     case JVM_EXECUTION_INTERPRETED:
  72.         return "i";
  73.     case JVM_EXECUTION_FAST_INTERPRETED:
  74.         return "f";
  75.     case JVM_EXECUTION_COM:
  76.         return "c";
  77.     }
  78.     return "?";
  79. }
  80.  
  81.  
  82. BOOL GrowPtrArray (PVOID **ppArray, ULONG *pCount, ULONG nNeeded)
  83. {
  84.     PVOID *pNewArray = new(PVOID[*pCount+nNeeded]);
  85.     if (!pNewArray)
  86.         return FALSE;
  87.  
  88.     if (*ppArray)
  89.     {
  90.         CopyMemory(pNewArray, *ppArray, *pCount * sizeof(PVOID));
  91.  
  92.         delete(*ppArray);
  93.     }
  94.  
  95.     *ppArray = pNewArray;
  96.     *pCount = *pCount + nNeeded;
  97.     return TRUE;
  98. }
  99.  
  100.  
  101. __declspec(naked)
  102. VOID __stdcall InterlockedAdd (__int64 *pqwDest, __int64 qwAdd)
  103. {
  104. #ifdef _X86_
  105.     __asm
  106.     {
  107.         mov     eax, [esp+4]
  108.         mov     ecx, [esp+8]
  109.         lock add [eax], ecx
  110.         mov     edx, [esp+12]
  111.         lock adc [eax], edx
  112.         ret     12
  113.     }
  114. #endif
  115. }
  116.  
  117.  
  118. BOOL Utf8ToAnsi (PCSTR pcszUtf8, PSTR *ppszAnsi)
  119. {
  120.     *ppszAnsi = NULL;
  121.  
  122.     ULONG nChars = 0;
  123.     PCSTR p = pcszUtf8;
  124.     BOOL fCanUseAsAnsi = TRUE;
  125.  
  126.     for (;;)
  127.     {
  128.         CHAR ch = *p++;
  129.  
  130.         if (ch == '\0')
  131.             break;
  132.         
  133.         nChars++;
  134.  
  135.         if (ch & 0x80)
  136.         {
  137.             fCanUseAsAnsi = FALSE;
  138.  
  139.             p++;
  140.  
  141.             if (0xe0 == (ch & 0xe0))
  142.                 p++;
  143.         }
  144.     }
  145.  
  146.     if (fCanUseAsAnsi)
  147.         return TRUE;
  148.     
  149.     PWSTR pwsz = new WCHAR[nChars+1];
  150.     if (!pwsz)
  151.         return FALSE;
  152.  
  153.     p = pcszUtf8;
  154.     WCHAR *pw = pwsz;
  155.  
  156.     for (;;)
  157.     {
  158.         CHAR ch = *p++;
  159.  
  160.         if (ch == '\0')
  161.             break;
  162.  
  163.         if (!(ch & 0x80))
  164.         {
  165.             *pw = (WCHAR)ch;
  166.         }
  167.         else if (0xc0 == (ch & 0xe0))
  168.         {
  169.             CHAR ch2 = *p++;
  170.  
  171.             *pw = (  (((WCHAR)(ch  & 0x1f)) << 6)
  172.                    | (((WCHAR)(ch2 & 0x3f))     ));
  173.         }
  174.         else
  175.         {
  176.             CHAR ch2 = *p++;
  177.             CHAR ch3 = *p++;
  178.  
  179.             *pw = (  (((WCHAR)(ch  & 0x0f)) << 12)
  180.                    | (((WCHAR)(ch2 & 0x3f)) <<  6)
  181.                    | (((WCHAR)(ch3 & 0x3f))      ));
  182.         }
  183.  
  184.         pw++;
  185.     }
  186.  
  187.     BOOL result = FALSE;
  188.  
  189.     int cbAnsi = WideCharToMultiByte(CP_ACP, 0, pwsz, nChars, NULL, 0, NULL, NULL);
  190.     if (cbAnsi >= 0)
  191.     {
  192.         PSTR pszAnsi = new CHAR[cbAnsi+1];
  193.         if (pszAnsi)
  194.         {
  195.             if (WideCharToMultiByte(CP_ACP, 0, pwsz, nChars, pszAnsi, cbAnsi, NULL, NULL) >= 0)
  196.             {
  197.                 pszAnsi[cbAnsi] = '\0';
  198.                 *ppszAnsi = pszAnsi;
  199.                 result = TRUE;
  200.             }
  201.  
  202.             if (!result)
  203.                 delete pszAnsi;
  204.         }
  205.     }
  206.  
  207.     delete pwsz;
  208.     return result;
  209. }
  210.  
  211.