home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP19 / STRLIB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-01  |  2.9 KB  |  123 lines

  1. /*------------------------------------------------
  2.    STRLIB.C -- Library module for STRPROG program
  3.                (c) Charles Petzold,  1996
  4.   ------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "strlib.h"
  8.  
  9. #pragma data_seg ("shared")
  10.  
  11. PSTR pszStrings[MAX_STRINGS] = { NULL } ;
  12. int  iTotal = 0 ;
  13.  
  14. #pragma data_seg ()
  15.  
  16. int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
  17.      {
  18.      int i ;
  19.  
  20.      switch (fdwReason)
  21.           {
  22.           // Nothing to do when process (or thread) begins
  23.  
  24.           case DLL_PROCESS_ATTACH :
  25.           case DLL_THREAD_ATTACH :
  26.           case DLL_THREAD_DETACH :
  27.                break ;
  28.  
  29.           // When process terminates, free any remaining blocks
  30.  
  31.           case DLL_PROCESS_DETACH :
  32.                for (i = 0 ; i < iTotal ; i++)
  33.                     UnmapViewOfFile (pszStrings[i]) ;
  34.                break ;
  35.           }
  36.  
  37.      return TRUE ;
  38.      }
  39.  
  40. EXPORT BOOL CALLBACK AddString (PSTR pStringIn)
  41.      {
  42.      HANDLE hString ;
  43.      PSTR   pString ;
  44.      int    i, iLength, iCompare ;
  45.  
  46.      if (iTotal == MAX_STRINGS - 1)
  47.           return FALSE ;
  48.  
  49.      iLength = strlen (pStringIn) ;
  50.      if (iLength == 0)
  51.           return FALSE ;
  52.  
  53.      hString = CreateFileMapping ((HANDLE) -1, NULL, PAGE_READWRITE,
  54.                                   0, 1 + iLength, NULL) ;
  55.      if (hString == NULL)
  56.           return FALSE ;
  57.  
  58.      pString = (PSTR) MapViewOfFile (hString, FILE_MAP_WRITE, 0, 0, 0) ;
  59.      strcpy (pString, pStringIn) ;
  60.      AnsiUpper (pString) ;
  61.  
  62.      for (i = iTotal ; i > 0 ; i--)
  63.           {
  64.           iCompare = strcmpi (pStringIn, pszStrings[i - 1]) ;
  65.  
  66.           if (iCompare >= 0)
  67.                break ;
  68.  
  69.           pszStrings[i] = pszStrings[i - 1] ;
  70.           }
  71.  
  72.      pszStrings[i] = pString ;
  73.  
  74.      iTotal++ ;
  75.      return TRUE ;
  76.      }
  77.  
  78. EXPORT BOOL CALLBACK DeleteString (PSTR pStringIn)
  79.      {
  80.      int i, j, iCompare ;
  81.  
  82.      if (0 == strlen (pStringIn))
  83.           return FALSE ;
  84.  
  85.      for (i = 0 ; i < iTotal ; i++)
  86.           {
  87.           iCompare = lstrcmpi (pszStrings[i], pStringIn) ;
  88.  
  89.           if (iCompare == 0)
  90.                break ;
  91.           }
  92.  
  93.      // If given string not in list, return without taking action
  94.  
  95.      if (i == iTotal)
  96.           return FALSE ;
  97.  
  98.      // Else free memory occupied by the string and adjust list downward
  99.  
  100.      UnmapViewOfFile (pszStrings[i]) ;
  101.  
  102.      for (j = i ; j < iTotal ; j++)
  103.           pszStrings[j] = pszStrings[j + 1] ;
  104.  
  105.      pszStrings[iTotal--] = NULL ;    // Destroy unused pointer
  106.      return TRUE ;
  107.      }
  108.  
  109. EXPORT int CALLBACK GetStrings (PSTRCB pfnGetStrCallBack, PVOID pParam)
  110.      {
  111.      BOOL bReturn ;
  112.      int  i ;
  113.  
  114.      for (i = 0 ; i < iTotal ; i++)
  115.           {
  116.           bReturn = pfnGetStrCallBack (pszStrings[i], pParam) ;
  117.  
  118.           if (bReturn == FALSE)
  119.                return i + 1 ;
  120.           }
  121.      return iTotal ;
  122.      }
  123.