home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap21 / StrProg / StrLib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  4.1 KB  |  159 lines

  1. /*------------------------------------------------
  2.    STRLIB.C -- Library module for STRPROG program
  3.                (c) Charles Petzold, 1998
  4.   ------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <wchar.h>       // for wide-character string functions
  8. #include "strlib.h"
  9.  
  10.      // shared memory section (requires /SECTION:shared,RWS in link options)
  11.  
  12. #pragma data_seg ("shared")
  13. int   iTotal = 0 ;
  14. WCHAR szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { '\0' } ;
  15. #pragma data_seg ()
  16.  
  17. #pragma comment(linker,"/SECTION:shared,RWS")
  18.  
  19. int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
  20. {
  21.      return TRUE ;
  22. }
  23.  
  24. EXPORT BOOL CALLBACK AddStringA (PCSTR pStringIn)
  25. {
  26.      BOOL  bReturn ;
  27.      int   iLength ;
  28.      PWSTR pWideStr ;
  29.  
  30.           // Convert string to Unicode and call AddStringW
  31.  
  32.      iLength = MultiByteToWideChar (CP_ACP, 0, pStringIn, -1, NULL, 0) ;
  33.      pWideStr = malloc (iLength) ;
  34.      MultiByteToWideChar (CP_ACP, 0, pStringIn, -1, pWideStr, iLength) ;
  35.      bReturn = AddStringW (pWideStr) ;
  36.      free (pWideStr) ;
  37.  
  38.      return bReturn ;
  39. }
  40.  
  41. EXPORT BOOL CALLBACK AddStringW (PCWSTR pStringIn)
  42. {
  43.      PWSTR pString ;
  44.      int   i, iLength ;
  45.      
  46.      if (iTotal == MAX_STRINGS - 1)
  47.           return FALSE ;
  48.      
  49.      if ((iLength = wcslen (pStringIn)) == 0)
  50.           return FALSE ;
  51.  
  52.           // Allocate memory for storing string, copy it, convert to upper case
  53.  
  54.      pString = malloc (sizeof (WCHAR) * (1 + iLength)) ;
  55.      wcscpy (pString, pStringIn) ;
  56.      _wcsupr (pString) ;
  57.  
  58.           // Alphabetize the strings
  59.      
  60.      for (i = iTotal ; i > 0 ; i--)
  61.      {
  62.           if (wcscmp (pString, szStrings[i - 1]) >= 0)
  63.                break ;
  64.           
  65.           wcscpy (szStrings[i], szStrings[i - 1]) ;
  66.      }
  67.      wcscpy (szStrings[i], pString) ;
  68.      iTotal++ ;
  69.  
  70.      free (pString) ;
  71.      return TRUE ;
  72. }
  73.  
  74. EXPORT BOOL CALLBACK DeleteStringA (PCSTR pStringIn)
  75. {
  76.      BOOL  bReturn ;
  77.      int   iLength ;
  78.      PWSTR pWideStr ;
  79.  
  80.           // Convert string to Unicode and call DeleteStringW
  81.  
  82.      iLength = MultiByteToWideChar (CP_ACP, 0, pStringIn, -1, NULL, 0) ;
  83.      pWideStr = malloc (iLength) ;
  84.      MultiByteToWideChar (CP_ACP, 0, pStringIn, -1, pWideStr, iLength) ;
  85.      bReturn = DeleteStringW (pWideStr) ;
  86.      free (pWideStr) ;
  87.  
  88.      return bReturn ;
  89. }
  90.  
  91. EXPORT BOOL CALLBACK DeleteStringW (PCWSTR pStringIn)
  92. {
  93.      int i, j ;
  94.      
  95.      if (0 == wcslen (pStringIn))
  96.           return FALSE ;
  97.      
  98.      for (i = 0 ; i < iTotal ; i++)
  99.      {
  100.           if (_wcsicmp (szStrings[i], pStringIn) == 0)
  101.                break ;
  102.      }
  103.           // If given string not in list, return without taking action
  104.      
  105.      if (i == iTotal)
  106.           return FALSE ;
  107.      
  108.           // Else adjust list downward
  109.      
  110.      for (j = i ; j < iTotal ; j++)
  111.           wcscpy (szStrings[j], szStrings[j + 1]) ;
  112.      
  113.      szStrings[iTotal--][0] = '\0' ;
  114.      return TRUE ;
  115. }
  116.  
  117. EXPORT int CALLBACK GetStringsA (GETSTRCB pfnGetStrCallBack, PVOID pParam)
  118. {
  119.      BOOL bReturn ;
  120.      int  i, iLength ;
  121.      PSTR pAnsiStr ;
  122.  
  123.      for (i = 0 ; i < iTotal ; i++)
  124.      {
  125.                // Convert string from Unicode
  126.  
  127.           iLength = WideCharToMultiByte (CP_ACP, 0, szStrings[i], -1, NULL, 0,
  128.                                          NULL, NULL) ;
  129.           pAnsiStr = malloc (iLength) ;
  130.           WideCharToMultiByte (CP_ACP, 0, szStrings[i], -1, pAnsiStr, iLength,
  131.                                           NULL, NULL) ;
  132.  
  133.                // Call callback function
  134.  
  135.           bReturn = pfnGetStrCallBack (pAnsiStr, pParam) ;
  136.           
  137.           if (bReturn == FALSE)
  138.                return i + 1 ;
  139.  
  140.           free (pAnsiStr) ;
  141.      }
  142.      return iTotal ;
  143. }
  144.  
  145. EXPORT int CALLBACK GetStringsW (GETSTRCB pfnGetStrCallBack, PVOID pParam)
  146. {
  147.      BOOL bReturn ;
  148.      int  i ;
  149.      
  150.      for (i = 0 ; i < iTotal ; i++)
  151.      {
  152.           bReturn = pfnGetStrCallBack (szStrings[i], pParam) ;
  153.           
  154.           if (bReturn == FALSE)
  155.                return i + 1 ;
  156.      }
  157.      return iTotal ;
  158. }
  159.