#define UNICODE 1 #include "shellprv.h" #pragma hdrstop /* * StrEndN - Find the end of a string, but no more than n bytes * Assumes lpStart points to start of null terminated string * nBufSize is the maximum length * returns ptr to just after the last byte to be included */ LPWSTR StrEndNW(LPCWSTR lpStart, int nBufSize) { LPCWSTR lpEnd; for (lpEnd = lpStart + nBufSize; *lpStart && lpStart < lpEnd; lpStart = CharNext(lpStart)) { /* just getting to the end of the string */ continue; } if (lpStart > lpEnd) { /* We can only get here if the last wchar before lpEnd was a lead byte */ lpStart -= 2; } return((LPWSTR)lpStart); } LPSTR StrEndNA(LPCSTR lpStart, int nBufSize) { LPCSTR lpEnd; for (lpEnd = lpStart + nBufSize; *lpStart && lpStart < lpEnd; lpStart = CharNextA(lpStart)) { /* just getting to the end of the string */ continue; } if (lpStart > lpEnd) { // We can only get here if the last byte before lpEnd was a lead byte lpStart -= 2; } return (LPSTR)lpStart; } /* * StrCpyN - Copy up to N chars, don't end in LeadByte char * * Assumes lpDest points to buffer of nBufSize bytes (including NULL) * lpSource points to string to be copied. * returns Number of bytes copied, NOT including NULL */ int Shell32_StrCpyNW(LPWSTR lpDest, LPWSTR lpSource, int nBufSize) { LPWSTR lpEnd; WCHAR cHold; if (nBufSize < 0) return(nBufSize); lpEnd = StrEndNW(lpSource, nBufSize); cHold = *lpEnd; *lpEnd = WCHAR_NULL; lstrcpy(lpDest, lpSource); *lpEnd = cHold; return (int)(lpEnd - lpSource); } int Shell32_StrCpyNA(LPSTR lpDest, LPSTR lpSource, int nBufSize) { LPSTR lpEnd; CHAR cHold; if (nBufSize < 0) return(nBufSize); lpEnd = StrEndNA(lpSource, nBufSize); cHold = *lpEnd; *lpEnd = '\0'; lstrcpyA(lpDest, lpSource); *lpEnd = cHold; return (int)(lpEnd - lpSource); } /* * StrNCmp - Compare n characters * * returns See lstrcmp return values. */ int StrNCmpW(LPWSTR lpStr1, LPWSTR lpStr2, int nChar) { WCHAR cHold1, cHold2; int i; LPWSTR lpsz1 = lpStr1, lpsz2 = lpStr2; for (i = 0; i < nChar; i++) { /* If we hit the end of either string before the given number * of bytes, just return the comparison */ if (!*lpsz1 || !*lpsz2) return(wcscmp(lpStr1, lpStr2)); lpsz1 = CharNextW(lpsz1); lpsz2 = CharNextW(lpsz2); } cHold1 = *lpsz1; cHold2 = *lpsz2; *lpsz1 = *lpsz2 = WCHAR_NULL; i = wcscmp(lpStr1, lpStr2); *lpsz1 = cHold1; *lpsz2 = cHold2; return(i); } int StrNCmpA(LPSTR lpStr1, LPSTR lpStr2, int nChar) { CHAR cHold1, cHold2; int i; LPSTR lpsz1 = lpStr1, lpsz2 = lpStr2; for (i = 0; i < nChar; i++) { /* If we hit the end of either string before the given number * of bytes, just return the comparison */ if (!*lpsz1 || !*lpsz2) return(lstrcmpA(lpStr1, lpStr2)); lpsz1 = CharNextA(lpsz1); lpsz2 = CharNextA(lpsz2); } cHold1 = *lpsz1; cHold2 = *lpsz2; *lpsz1 = *lpsz2 = '\0'; i = lstrcmpA(lpStr1, lpStr2); *lpsz1 = cHold1; *lpsz2 = cHold2; return i; } /* * StrNCmpI - Compare n characters, case insensitive * * returns See lstrcmpi return values. */ int StrNCmpIW(LPWSTR lpStr1, LPWSTR lpStr2, int nChar) { WCHAR cHold1, cHold2; int i; LPWSTR lpsz1 = lpStr1, lpsz2 = lpStr2; for (i = 0; i < nChar; i++) { /* If we hit the end of either string before the given number * of bytes, just return the comparison */ if (!*lpsz1 || !*lpsz2) return(lstrcmpi(lpStr1, lpStr2)); lpsz1 = CharNext(lpsz1); lpsz2 = CharNext(lpsz2); } cHold1 = *lpsz1; cHold2 = *lpsz2; *lpsz1 = *lpsz2 = WCHAR_NULL; i = _wcsicmp(lpStr1, lpStr2); *lpsz1 = cHold1; *lpsz2 = cHold2; return i; } int StrNCmpIA(LPSTR lpStr1, LPSTR lpStr2, int nChar) { CHAR cHold1, cHold2; int i; LPSTR lpsz1 = lpStr1, lpsz2 = lpStr2; for (i = 0; i < nChar; i++) { /* If we hit the end of either string before the given number * of bytes, just return the comparison */ if (!*lpsz1 || !*lpsz2) return(lstrcmpiA(lpStr1, lpStr2)); lpsz1 = CharNextA(lpsz1); lpsz2 = CharNextA(lpsz2); } cHold1 = *lpsz1; cHold2 = *lpsz2; *lpsz1 = *lpsz2 = '\0'; i = lstrcmpiA(lpStr1, lpStr2); *lpsz1 = cHold1; *lpsz2 = cHold2; return i; } /* * StrNCpy - Copy n characters * * returns Actual number of characters copied */ int StrNCpyW(LPWSTR lpDest, LPWSTR lpSource, int nChar) { WCHAR cHold; int i; LPWSTR lpch = lpSource; if (nChar < 0) return(nChar); for (i = 0; i < nChar; i++) { if (!*lpch) break; lpch = CharNext(lpch); } cHold = *lpch; *lpch = WCHAR_NULL; wcscpy(lpDest, lpSource); *lpch = cHold; return i; } int StrNCpyA(LPSTR lpDest, LPSTR lpSource,int nChar) { CHAR cHold; int i; LPSTR lpch = lpSource; if (nChar < 0) return(nChar); for (i = 0; i < nChar; i++) { if (!*lpch) break; lpch = CharNextA(lpch); } cHold = *lpch; *lpch = '\0'; lstrcpyA(lpDest, lpSource); *lpch = cHold; return i; } /* * StrRStr - Search for last occurrence of a substring * * Assumes lpSource points to the null terminated source string * lpLast points to where to search from in the source string * lpLast is not included in the search * lpSrch points to string to search for * returns last occurrence of string if successful; NULL otherwise */ LPWSTR StrRStrW(LPWSTR lpSource, LPWSTR lpLast, LPWSTR lpSrch) { int iLen; iLen = lstrlen(lpSrch); if (!lpLast) { lpLast = lpSource + lstrlen(lpSource); } do { /* Return NULL if we hit the exact beginning of the string */ if (lpLast == lpSource) return(NULL); --lpLast; /* Break if we hit the beginning of the string */ if (!lpLast) break; /* Break if we found the string, and its first byte is not a tail byte */ if (!StrCmpNW(lpLast, lpSrch, iLen) && (lpLast==StrEndNW(lpSource, (int)(lpLast-lpSource)))) break; } while (1); return lpLast; } LPSTR StrRStrA(LPSTR lpSource, LPSTR lpLast, LPSTR lpSrch) { int iLen; iLen = lstrlenA(lpSrch); if (!lpLast) { lpLast = lpSource + lstrlenA(lpSource); } do { /* Return NULL if we hit the exact beginning of the string */ if (lpLast == lpSource) return(NULL); --lpLast; /* Break if we hit the beginning of the string */ if (!lpLast) break; /* Break if we found the string, and its first byte is not a tail byte */ if (!StrCmpNA(lpLast, lpSrch, iLen) &&(lpLast==StrEndNA(lpSource, (int)(lpLast-lpSource)))) { break; } } while (1); return lpLast; }