/* * OleStdCopyTargetDevice() * * Purpose: * duplicate a TARGETDEVICE struct. this function allocates memory for * the copy. the caller MUST free the allocated copy when done with it * using the standard allocator returned from CoGetMalloc. * (OleStdFree can be used to free the copy). * * Parameters: * ptdSrc pointer to source TARGETDEVICE * * Return Value: * pointer to allocated copy of ptdSrc * if ptdSrc==NULL then retuns NULL is returned. * if ptdSrc!=NULL and memory allocation fails, then NULL is returned */ STDAPI_(DVTARGETDEVICE FAR*) OleStdCopyTargetDevice(DVTARGETDEVICE FAR* ptdSrc) { DVTARGETDEVICE FAR* ptdDest; if (ptdSrc == NULL) { return NULL; } ptdDest = (DVTARGETDEVICE FAR*)OleStdMalloc(ptdSrc->tdSize); if (ptdDest != NULL) memcpy(ptdDest, ptdSrc, (size_t)ptdSrc->tdSize); return ptdDest; }
static void WINAPI Abbreviate(HDC hdc, int nWidth, LPTSTR lpch, int nMaxChars) { /* string is too long to fit; chop it */ /* set up new prefix & determine remaining space in control */ LPTSTR lpszFileName = NULL; LPTSTR lpszCur = CharNext(CharNext(lpch)); lpszCur = FindChar(lpszCur, TEXT('\\')); // algorithm will insert \... so allocate extra 4 LPTSTR lpszNew = (LPTSTR)OleStdMalloc((lstrlen(lpch)+5) * sizeof(TCHAR)); if (lpszNew == NULL) return; if (lpszCur != NULL) // at least one backslash { *lpszNew = (TCHAR)0; *lpszCur = (TCHAR)0; lstrcpy(lpszNew, lpch); *lpszCur = TEXT('\\'); // lpszNew now contains c: or \\servername lstrcat(lpszNew, TEXT("\\...")); // lpszNew now contains c:\... or \\servername\... LPTSTR lpszEnd = lpszNew; while (*lpszEnd != (TCHAR)0) lpszEnd = CharNext(lpszEnd); // lpszEnd is now at the end of c:\... or \\servername\... // move down directories until it fits or no more directories while (lpszCur != NULL) { *lpszEnd = (TCHAR)0; lstrcat(lpszEnd, lpszCur); if (GetTextWSize(hdc, lpszNew) <= nWidth && lstrlen(lpszNew) < nMaxChars) { lstrcpyn(lpch, lpszNew, nMaxChars); OleStdFree(lpszNew); return; } lpszCur = CharNext(lpszCur); // advance past backslash lpszCur = FindChar(lpszCur, TEXT('\\')); } // try just ...filename and then shortening filename lpszFileName = FindReverseChar(lpch, TEXT('\\')); } else lpszFileName = lpch; while (*lpszFileName != (TCHAR)0) { lstrcpy(lpszNew, TEXT("...")); lstrcat(lpszNew, lpszFileName); if (GetTextWSize(hdc, lpszNew) <= nWidth && lstrlen(lpszNew) < nMaxChars) { lstrcpyn(lpch, lpszNew, nMaxChars); OleStdFree(lpszNew); return; } lpszFileName = CharNext(lpszFileName); } OleStdFree(lpszNew); // not even a single character fit *lpch = (TCHAR)0; }