home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / mfc / src / apphelp.cpp < prev    next >
C/C++ Source or Header  |  1998-06-16  |  3KB  |  125 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. #include "stdafx.h"
  12.  
  13. #ifdef AFX_CORE3_SEG
  14. #pragma code_seg(AFX_CORE3_SEG)
  15. #endif
  16.  
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21.  
  22. /////////////////////////////////////////////////////////////////////////////
  23. // Help and other support
  24.  
  25. // Strings in format ".....%1 .... %2 ...." etc.
  26.  
  27. void AFXAPI AfxFormatStrings(CString& rString, UINT nIDS,
  28.         LPCTSTR const* rglpsz, int nString)
  29. {
  30.     TCHAR szFormat[256];
  31.     if (!AfxLoadString(nIDS, szFormat) != 0)
  32.     {
  33.         TRACE1("Error: failed to load AfxFormatString string 0x%04x.\n", nIDS);
  34.         ASSERT(FALSE);
  35.         return;
  36.     }
  37.     AfxFormatStrings(rString, szFormat, rglpsz, nString);
  38. }
  39.  
  40. void AFXAPI AfxFormatStrings(CString& rString, LPCTSTR lpszFormat,
  41.         LPCTSTR const* rglpsz, int nString)
  42. {
  43.     // determine length of destination string
  44.     int nTotalLen = 0;
  45.     LPCTSTR pchSrc = lpszFormat;
  46.     while (*pchSrc != '\0')
  47.     {
  48.         if (pchSrc[0] == '%' &&
  49.              ( (pchSrc[1] >= '0' && pchSrc[1] <= '9') ||
  50.                 (pchSrc[1] >= 'A' && pchSrc[1] <= 'Z')) )
  51.         {
  52.             // %A comes after %9 -- we'll need it someday
  53.             int i;
  54.             if (pchSrc[1] > '9')
  55.                 i = 9 + (pchSrc[1] - 'A');
  56.             else
  57.                 i = pchSrc[1] - '1';
  58.             pchSrc += 2;
  59.             if (i >= nString)
  60.                 ++nTotalLen;
  61.             else if (rglpsz[i] != NULL)
  62.                 nTotalLen += lstrlen(rglpsz[i]);
  63.         }
  64.         else
  65.         {
  66.             if (_istlead(*pchSrc))
  67.                 ++nTotalLen, ++pchSrc;
  68.             ++pchSrc;
  69.             ++nTotalLen;
  70.         }
  71.     }
  72.  
  73.     pchSrc = lpszFormat;
  74.     LPTSTR pchDest = rString.GetBuffer(nTotalLen);
  75.     while (*pchSrc != '\0')
  76.     {
  77.         if (pchSrc[0] == '%' &&
  78.              ( (pchSrc[1] >= '0' && pchSrc[1] <= '9') ||
  79.                 (pchSrc[1] >= 'A' && pchSrc[1] <= 'Z')) )
  80.         {
  81.             // %A comes after %9 -- we'll need it someday
  82.             int i;
  83.             if (pchSrc[1] > '9')
  84.                 i = 9 + (pchSrc[1] - 'A');
  85.             else
  86.                 i = pchSrc[1] - '1';
  87.             pchSrc += 2;
  88.             if (i >= nString)
  89.             {
  90.                 TRACE1("Error: illegal string index requested %d.\n", i);
  91.                 *pchDest++ = '?';
  92.             }
  93.             else if (rglpsz[i] != NULL)
  94.             {
  95.                 lstrcpy(pchDest, rglpsz[i]);
  96.                 pchDest += lstrlen(pchDest);
  97.             }
  98.         }
  99.         else
  100.         {
  101.             if (_istlead(*pchSrc))
  102.                 *pchDest++ = *pchSrc++; // copy first of 2 bytes
  103.             *pchDest++ = *pchSrc++;
  104.         }
  105.     }
  106.     rString.ReleaseBuffer((int)((LPCTSTR)pchDest - (LPCTSTR)rString));
  107.         // ReleaseBuffer will assert if we went too far
  108. }
  109.  
  110. void AFXAPI AfxFormatString1(CString& rString, UINT nIDS, LPCTSTR lpsz1)
  111. {
  112.     AfxFormatStrings(rString, nIDS, &lpsz1, 1);
  113. }
  114.  
  115. void AFXAPI AfxFormatString2(CString& rString, UINT nIDS, LPCTSTR lpsz1,
  116.         LPCTSTR lpsz2)
  117. {
  118.     LPCTSTR rglpsz[2];
  119.     rglpsz[0] = lpsz1;
  120.     rglpsz[1] = lpsz2;
  121.     AfxFormatStrings(rString, nIDS, rglpsz, 2);
  122. }
  123.  
  124. /////////////////////////////////////////////////////////////////////////////
  125.