/*//=============================================================== << SAFE STRING MACROS >> PRGM : B4nFter, milkji FILE : SAFESTRINGMACROS.HPP DESC : System Base ¶óÀ̺귯¸® Àü¹ÝÀûÀ¸·Î »ç¿ëµÇ´Â ¾ÈÀü¹®ÀÚ¿­ CRTÇÔ¼ö °ü·Ã ¸ÅÅ©·ÎµéÀ» ¸ð¾Æ³õÀº Çì´õÆÄÀÏ INIT BUILT DATE : 2007. 03. 21 LAST BUILT DATE : 2007. 05. 17 Copyright¨Ï 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved. *///=============================================================== #pragma once /////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// // P.S.> SYSBASEBASE.H ¿¡ ÀÇÇØ ÂüÁ¶µÊ (µû¶ó¼­ º» Çì´õ´Â WINDOWS.H µî ±âº»Çì´õ Á¦¿Ü½ÃÅ´) /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// // ¹®ÀÚ¿­ ¹«°á¼º º¸Áõ ¸ÅÅ©·ÎÇÔ¼ö #if defined(_DEBUG) #define CHECK_STRINGA(pMSG, pSZ) BASE_ASSERT((NULL != pMSG) && ('\0' != pMSG[0]) && (0 < pSZ), "Invalid string!"); #define CHECK_STRINGW(pMSG, pSZ) BASE_ASSERT((NULL != pMSG) && (L'\0' != pMSG[0]) && (0 < pSZ), "Invalid string!"); //#define CHECK_STRINGA(pMSG, pSZ) BASE_ASSERT(!::IsBadStringPtrA(pMSG, pSZ) && ('\0' != pMSG[0]) && (::strlen(pMSG) <= (size_t)pSZ), "Invalid string!"); //#define CHECK_STRINGW(pMSG, pSZ) BASE_ASSERT(!::IsBadStringPtrW(pMSG, pSZ) && (L'\0' != pMSG[0]) && (::wcslen(pMSG) <= (size_t)pSZ), "Invalid string!"); #else // #if defined(_DEBUG) #define CHECK_STRINGA(pMSG, pSZ) #define CHECK_STRINGW(pMSG, pSZ) #endif // #if defined(_DEBUG) #define MAKE_STRINGA(pSTR) (pSTR[COUNT_OF(pSTR)-1] = '\0') #define MAKE_STRINGW(pSTR) (pSTR[COUNT_OF(pSTR)-1] = L'\0') #if defined(_UNICODE) #define CHECK_STRING CHECK_STRINGW #define MAKE_STRING(pSTR) MAKE_STRINGW(pSTR) #else // #if defined(_UNICODE) #define CHECK_STRING CHECK_STRINGA #define MAKE_STRING(pSTR) MAKE_STRINGA(pSTR) #endif // #if defined(_UNICODE) // ¾ÈÀü¹®ÀÚ¿­ CRTÇÔ¼ö °ü·Ã ¸ÅÅ©·ÎÇÔ¼ö #if defined(_DEBUG) #if (_MSC_VER >= 1400) // VS.NET 2005 ÀÌ»ó #define STRCPYA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::strcpy_s(pDEST, pDESTSZ, pSTR), "Invalid!") #define STRCPYW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::wcscpy_s(pDEST, pDESTSZ, pSTR), "Invalid!") #define STRNCPYA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::strncpy_s(pDEST, pDESTSZ, pSTR, pDESTSZ), "Invalid!") #define STRNCPYW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::wcsncpy_s(pDEST, pDESTSZ, pSTR, pDESTSZ), "Invalid!") #define STRCATA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::strcat_s(pDEST, pDESTSZ, pSTR), "Invalid!") #define STRCATW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::wcscat_s(pDEST, pDESTSZ, pSTR), "Invalid!") #define STRNCATA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::strncat_s(pDEST, pDESTSZ, pSTR, pDESTSZ), "Invalid!") #define STRNCATW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(0 == ::wcsncat_s(pDEST, pDESTSZ, pSTR, pDESTSZ), "Invalid!") #define STRUPA(pSTR, pSTRSZ) BASE_ASSERT(0 == ::_strupr_s(pSTR, pSTRSZ), "Invalid!"); #define STRUPW(pSTR, pSTRSZ) BASE_ASSERT(0 == ::_wcsupr_s(pSTR, pSTRSZ), "Invalid!"); #define STRLWA(pSTR, pSTRSZ) BASE_ASSERT(0 == ::_strlwr_s(pSTR, pSTRSZ), "Invalid!"); #define STRLWW(pSTR, pSTRSZ) BASE_ASSERT(0 == ::_wcslwr_s(pSTR, pSTRSZ), "Invalid!"); #define SPRINTFA ::sprintf_s #define SPRINTFW ::swprintf_s #define SNPRINTFA ::_snprintf_s #define SNPRINTFW ::_snwprintf_s #define VSNPRINTFA(pDEST, pDESTSZ, pFMT, pARG) ::_vsnprintf_s(pDEST, pDESTSZ, pDESTSZ-1, pFMT, pARG) #define VSNPRINTFW(pDEST, pDESTSZ, pFMT, pARG) ::_vsnwprintf_s(pDEST, pDESTSZ, pDESTSZ-1, pFMT, pARG) // #define VSNPRINTFA(pDEST, pDESTSZ, pFMT, pARG) BASE_ASSERT(0 < ::_vsnprintf_s(pDEST, pDESTSZ, pDESTSZ-1, pFMT, pARG), "Invalid!") // #define VSNPRINTFW(pDEST, pDESTSZ, pFMT, pARG) BASE_ASSERT(0 < ::_vsnwprintf_s(pDEST, pDESTSZ, pDESTSZ-1, pFMT, pARG), "Invalid!") #define SSCANFA ::sscanf #define SSCANFW ::swscanf #else #define STRCPYA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCopyA(pDEST, pDESTSZ, pSTR)), "Insufficient destination") #define STRCPYW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCopyW(pDEST, pDESTSZ, pSTR)), "Insufficient destination") #define STRNCPYA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCopyNA(pDEST, pDESTSZ, pSTR, pDESTSZ)), "Insufficient destination") #define STRNCPYW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCopyNW(pDEST, pDESTSZ, pSTR, pDESTSZ)), "Insufficient destination") #define STRCATA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCatA(pDEST, pDESTSZ, pSTR)), "Insufficient destination") #define STRCATW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCatW(pDEST, pDESTSZ, pSTR)), "Insufficient destination") #define STRNCATA(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCatNA(pDEST, pDESTSZ, pSTR, pDESTSZ)), "Insufficient destination") #define STRNCATW(pDEST, pSTR, pDESTSZ) BASE_ASSERT(SUCCEEDED(::StringCchCatNW(pDEST, pDESTSZ, pSTR, pDESTSZ)), "Insufficient destination") #define STRUPA(pSTR, pSTRSZ) ::_strupr(pSTR) #define STRUPW(pSTR, pSTRSZ) ::_wcsupr(pSTR) #define STRLWA(pSTR, pSTRSZ) ::_strlwr(pSTR) #define STRLWW(pSTR, pSTRSZ) ::_wcslwr(pSTR) #define SPRINTFA ::sprintf #define SPRINTFW ::swprintf #define SNPRINTFA ::StringCchPrintfA #define SNPRINTFW ::StringCchPrintfW #define VSNPRINTFA(pDEST, pDESTSZ, pFMT, pARG) BASE_ASSERT(SUCCEEDED(::StringCchVPrintfA(pDEST, pDESTSZ, pFMT, pARG)), "Insufficient destination") #define VSNPRINTFW(pDEST, pDESTSZ, pFMT, pARG) BASE_ASSERT(SUCCEEDED(::StringCchVPrintfW(pDEST, pDESTSZ, pFMT, pARG)), "Insufficient destination") #define SSCANFA ::sscanf #define SSCANFW ::swscanf #endif #define STRLENA(pSTR, pSTRSZ) CDebugSet::StrLenA(pSTR, pSTRSZ) #define STRLENW(pSTR, pSTRSZ) CDebugSet::StrLenW(pSTR, pSTRSZ) #define FOPENA(pPATH, pMODE) CDebugSet::FOpenA(pPATH, pMODE) #define FOPENW(pPATH, pMODE) CDebugSet::FOpenW(pPATH, pMODE) #define SPLITPATHA(pPATH, pDRV, pDRVSZ, pDIR, pDIRSZ, pFNM, pFNMSZ, pEXT, pEXTSZ) ::_splitpath_s(pPATH, pDRV, pDRVSZ, pDIR, pDIRSZ, pFNM, pFNMSZ, pEXT, pEXTSZ) #define SPLITPATHW(pPATH, pDRV, pDRVSZ, pDIR, pDIRSZ, pFNM, pFNMSZ, pEXT, pEXTSZ) ::_wsplitpath_s(pPATH, pDRV, pDRVSZ, pDIR, pDIRSZ, pFNM, pFNMSZ, pEXT, pEXTSZ) #else // _DEBUG #define STRCPYA(pDEST, pSTR, pDESTSZ) ::strcpy(pDEST, pSTR) #define STRCPYW(pDEST, pSTR, pDESTSZ) ::wcscpy(pDEST, pSTR) #define STRNCPYA(pDEST, pSTR, pDESTSZ) ::strncpy(pDEST, pSTR, pDESTSZ);pDEST[pDESTSZ-1]='\0'; #define STRNCPYW(pDEST, pSTR, pDESTSZ) ::wcsncpy(pDEST, pSTR, pDESTSZ);pDEST[pDESTSZ-1]=L'\0'; #define STRCATA(pDEST, pSTR, pDESTSZ) ::strcat(pDEST, pSTR) #define STRCATW(pDEST, pSTR, pDESTSZ) ::wcscat(pDEST, pSTR) #define STRNCATA(pDEST, pSTR, pDESTSZ) ::strncat(pDEST, pSTR, pDESTSZ);pDEST[pDESTSZ-1]='\0'; #define STRNCATW(pDEST, pSTR, pDESTSZ) ::wcsncat(pDEST, pSTR, pDESTSZ);pDEST[pDESTSZ-1]=L'\0'; #define STRUPA(pSTR, pSTRSZ) ::_strupr(pSTR) #define STRUPW(pSTR, pSTRSZ) ::_wcsupr(pSTR) #define STRLWA(pSTR, pSTRSZ) ::_strlwr(pSTR) #define STRLWW(pSTR, pSTRSZ) ::_wcslwr(pSTR) // Warn : null termination ÀÌ ¾ÈµÊ #define SPRINTFA ::sprintf #define SPRINTFW ::swprintf #define SNPRINTFA ::_snprintf #define SNPRINTFW ::_snwprintf #define VSNPRINTFA(pDEST,pDESTSZ,pFMT,pARG) ::_vsnprintf(pDEST, pDESTSZ, pFMT, pARG);pDEST[pDESTSZ-1]='\0'; #define VSNPRINTFW(pDEST,pDESTSZ,pFMT,pARG) ::_vsnwprintf(pDEST, pDESTSZ, pFMT, pARG);pDEST[pDESTSZ-1]=L'\0'; #define SSCANFA ::sscanf #define SSCANFW ::swscanf #define STRLENA(pSTR, pSTRSZ) ::strlen(pSTR) #define STRLENW(pSTR, pSTRSZ) ::wcslen(pSTR) #define FOPENA(pPATH, pMODE) ::fopen(pPATH, pMODE) #define FOPENW(pPATH, pMODE) ::_wfopen(pPATH, pMODE) #define SPLITPATHA(pPATH, pDRV, pDRVSZ, pDIR, pDIRSZ, pFNM, pFNMSZ, pEXT, pEXTSZ) ::_splitpath(pPATH, pDRV, pDIR, pFNM, pEXT) #define SPLITPATHW(pPATH, pDRV, pDRVSZ, pDIR, pDIRSZ, pFNM, pFNMSZ, pEXT, pEXTSZ) ::_wsplitpath(pPATH, pDRV, pDIR, pFNM, pEXT) #endif // _DEBUG #if defined(_UNICODE) #define STRCPY STRCPYW #define STRNCPY STRNCPYW #define STRCAT STRCATW #define STRNCAT STRNCATW #define STRUP STRUPW #define STRLW STRLWW #define SPRINTF SPRINTFW #define SNPRINTF SNPRINTFW #define VSNPRINTF VSNPRINTFW #define SSCANF SSCANFW #define STRLEN STRLENW #define FOPEN FOPENW #define SPLITPATH SPLITPATHW #else // _UNICODE #define STRCPY STRCPYA #define STRNCPY STRNCPYA #define STRCAT STRCATA #define STRNCAT STRNCATA #define STRUP STRUPA #define STRLW STRLWA #define SPRINTF SPRINTFA #define SNPRINTF SNPRINTFA #define VSNPRINTF VSNPRINTFA #define SSCANF SSCANFA #define STRLEN STRLENA #define FOPEN FOPENA #define SPLITPATH SPLITPATHA #endif // _UNICODE