UTIL.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File:       util.c
  6.  *  Content:    miscellaneous functions
  7.  *
  8.  *
  9.  ***************************************************************************/
  10. #include "util.h"
  11. /*
  12.  * Globals
  13.  */
  14. static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-',
  15.                                 8, 9, '-', 10, 11, 12, 13, 14, 15 };
  16. static const WCHAR wszDigits[] = L"0123456789ABCDEF";
  17. /*
  18.  * StringFromGUID
  19.  * 
  20.  * Converts a GUID into a wide string
  21.  */
  22. int StringFromGUID(LPGUID lpguid, LPWSTR lpwsz)
  23. {
  24.     int i;
  25.     const BYTE * pBytes = (const BYTE *) lpguid;
  26.     *lpwsz++ = L'{';
  27.     for (i = 0; i < sizeof(GuidMap); i++)
  28.     {
  29.         if (GuidMap[i] == '-')
  30.         {
  31.             *lpwsz++ = L'-';
  32.         }
  33.         else
  34.         {
  35.             *lpwsz++ = wszDigits[ (pBytes[GuidMap[i]] & 0xF0) >> 4 ];
  36.             *lpwsz++ = wszDigits[ (pBytes[GuidMap[i]] & 0x0F) ];
  37.         }
  38.     }
  39.     *lpwsz++ = L'}';
  40.     *lpwsz   = L'';
  41.     return GUIDSTR_MAX;
  42. }
  43. /*
  44.  * IsEqualGuid
  45.  *
  46.  * Determines if two guids are equal
  47.  */
  48. BOOL  IsEqualGuid(GUID *lpguid1, GUID *lpguid2)
  49. {
  50.    return (
  51.       ((PLONG) lpguid1)[0] == ((PLONG) lpguid2)[0] &&
  52.       ((PLONG) lpguid1)[1] == ((PLONG) lpguid2)[1] &&
  53.       ((PLONG) lpguid1)[2] == ((PLONG) lpguid2)[2] &&
  54.       ((PLONG) lpguid1)[3] == ((PLONG) lpguid2)[3]);
  55. }
  56. // convert a hex char to an int - used by str to guid conversion
  57. // we wrote our own, since the ole one is slow, and requires ole32.dll
  58. // we use ansi strings here, since guids won't get internationalized
  59. int GetDigit(LPSTR lpstr)
  60. {
  61. char ch = *lpstr;
  62.     
  63.     if (ch >= '0' && ch <= '9')
  64.         return(ch - '0');
  65.     if (ch >= 'a' && ch <= 'f')
  66.         return(ch - 'a' + 10);
  67.     if (ch >= 'A' && ch <= 'F')
  68.         return(ch - 'A' + 10);
  69.     return(0);
  70. }
  71. // walk the string, writing pairs of bytes into the byte stream (guid)
  72. // we need to write the bytes into the byte stream from right to left
  73. // or left to right as indicated by fRightToLeft
  74. void ConvertField(LPBYTE lpByte,LPSTR * ppStr,int iFieldSize,BOOL fRightToLeft)
  75. {
  76. int i;
  77. for (i=0;i<iFieldSize ;i++ )
  78. {
  79. // don't barf on the field separators
  80. if ('-' == **ppStr) (*ppStr)++; 
  81. if (fRightToLeft == TRUE)
  82. {
  83. // work from right to left within the byte stream
  84. *(lpByte + iFieldSize - (i+1)) = 16*GetDigit(*ppStr) + GetDigit((*ppStr)+1);
  85. else 
  86. {
  87. // work from  left to right within the byte stream
  88. *(lpByte + i) = 16*GetDigit(*ppStr) + GetDigit((*ppStr)+1);
  89. }
  90. *ppStr+=2; // get next two digit pair
  91. }
  92. } // ConvertField
  93. // convert the passed in string to a real GUID
  94. // walk the guid, setting each byte in the guid to the two digit hex pair in the
  95. // passed string
  96. HRESULT GUIDFromString(LPWSTR lpWStr, GUID * pGuid)
  97. {
  98. BYTE * lpByte; // byte index into guid
  99. int iFieldSize; // size of current field we're converting
  100. // since its a guid, we can do a "brute force" conversion
  101. char lpTemp[GUID_STRING_SIZE];
  102. char *lpStr = lpTemp;
  103. WideToAnsi(lpStr,lpWStr,GUID_STRING_SIZE);
  104. // make sure we have a {xxxx-...} type guid
  105. if ('{' !=  *lpStr) return E_FAIL;
  106. lpStr++;
  107. lpByte = (BYTE *)pGuid;
  108. // data 1
  109. iFieldSize = sizeof(unsigned long);
  110. ConvertField(lpByte,&lpStr,iFieldSize,TRUE);
  111. lpByte += iFieldSize;
  112. // data 2
  113. iFieldSize = sizeof(unsigned short);
  114. ConvertField(lpByte,&lpStr,iFieldSize,TRUE);
  115. lpByte += iFieldSize;
  116. // data 3
  117. iFieldSize = sizeof(unsigned short);
  118. ConvertField(lpByte,&lpStr,iFieldSize,TRUE);
  119. lpByte += iFieldSize;
  120. // data 4
  121. iFieldSize = 8*sizeof(unsigned char);
  122. ConvertField(lpByte,&lpStr,iFieldSize,FALSE);
  123. lpByte += iFieldSize;
  124. // make sure we ended in the right place
  125. if ('}' != *lpStr) 
  126. {
  127. memset(pGuid,0,sizeof(GUID));
  128. return E_FAIL;
  129. }
  130. return S_OK;
  131. }// GUIDFromString
  132. /*
  133.  ** WideToAnsi
  134.  *
  135.  *  CALLED BY: everywhere
  136.  *
  137.  *  PARAMETERS: lpStr - destination string
  138.  * lpWStr - string to convert
  139.  * cchStr - size of dest buffer
  140.  *
  141.  *  DESCRIPTION:
  142.  * converts unicode lpWStr to ansi lpStr.
  143.  * fills in unconvertable chars w/ DPLAY_DEFAULT_CHAR "-"
  144.  *
  145.  *
  146.  *  RETURNS:  if cchStr is 0, returns the size required to hold the string
  147.  * otherwise, returns the number of chars converted
  148.  *
  149.  */
  150. int WideToAnsi(LPSTR lpStr,LPWSTR lpWStr,int cchStr)
  151. {
  152. int rval;
  153. BOOL bDefault;
  154. // use the default code page (CP_ACP)
  155. // -1 indicates WStr must be null terminated
  156. rval = WideCharToMultiByte(CP_ACP,0,lpWStr,-1,lpStr,cchStr,"-",&bDefault);
  157. return rval;
  158. } // WideToAnsi
  159. /*
  160.  ** AnsiToWide
  161.  *
  162.  *  CALLED BY: everywhere
  163.  *
  164.  *  PARAMETERS: lpWStr - dest string
  165.  * lpStr  - string to convert
  166.  * cchWstr - size of dest buffer
  167.  *
  168.  *  DESCRIPTION: converts Ansi lpStr to Unicode lpWstr
  169.  *
  170.  *
  171.  *  RETURNS:  if cchStr is 0, returns the size required to hold the string
  172.  * otherwise, returns the number of chars converted
  173.  *
  174.  */
  175. int AnsiToWide(LPWSTR lpWStr,LPSTR lpStr,int cchWStr)
  176. {
  177. int rval;
  178. rval =  MultiByteToWideChar(CP_ACP,0,lpStr,-1,lpWStr,cchWStr);
  179. return rval;
  180. }  // AnsiToWide
  181. /* 
  182.  * randInt
  183.  *
  184.  * returns a random integer in the specified range
  185.  */
  186. int randInt( int low, int high )
  187. {
  188.     int range = high - low;
  189.     int num = rand() % range;
  190.     return( num + low );
  191. }
  192. /*
  193.  * randDouble
  194.  *
  195.  * returns a random double in the specified range
  196.  */
  197. double randDouble( double low, double high )
  198. {
  199.     double range = high - low;
  200.     double num = range * (double)rand()/(double)RAND_MAX;
  201.     return( num + low );
  202. }