windows-nt/Source/XPSP1/NT/base/mvdm/wow16/regedit/utils1.c
2020-09-26 16:20:57 +08:00

94 lines
1.7 KiB
C

#include <windows.h>
#include <commdlg.h>
#include <shellapi.h>
#ifndef DBCS
#define AnsiNext(x) ((x)+1)
#endif
#define BLOCKLEN 100
PSTR NEAR PASCAL GetAppName(HANDLE hCommand)
{
static char szApp[17];
PSTR pLast, pCommand, pDot;
char cSave;
for(pCommand=LocalLock(hCommand); *pCommand==' ';
pCommand=AnsiNext(pCommand))
/* skip spaces */ ;
for(pDot=pLast=pCommand; ; pCommand=AnsiNext(pCommand)) {
switch(*pCommand) {
case ':':
case '\\':
pLast = pCommand + 1;
break;
case '.':
pDot = pCommand;
break;
case '\0':
case ' ':
case '/':
goto FoundEnd;
}
}
FoundEnd:
/* If there was a dot in the name or the name was too long */
if(pDot > pLast)
pCommand = pDot;
if(pCommand-pLast > 8)
pCommand = pLast+8;
cSave = *pCommand;
*pCommand = '\0';
lstrcpy(szApp, pLast);
*pCommand = cSave;
AnsiUpper(szApp);
pLast = AnsiNext(szApp);
AnsiLower(pLast);
LocalUnlock(hCommand);
return(szApp);
}
HANDLE NEAR cdecl ConstructPath(PSTR pHead, ...)
{
HANDLE hBuf = NULL;
PSTR *ppName, pBuf, pTemp;
WORD wLen;
if(!pHead)
goto Error1;
for(ppName=&pHead, wLen=0; *ppName; ++ppName)
wLen += lstrlen(*ppName) + 1;
if(!(hBuf=LocalAlloc(LMEM_MOVEABLE, wLen)))
goto Error1;
if(!(pBuf=LocalLock(hBuf)))
goto Error2;
for(ppName=&pHead, wLen=0, pTemp=pBuf; *ppName; ++ppName) {
lstrcpy(pTemp, *ppName);
pTemp += lstrlen(pTemp);
*pTemp++ = '\\';
}
*(pTemp-1) = '\0';
LocalUnlock(hBuf);
goto Error1;
Error2:
LocalFree(hBuf);
hBuf = NULL;
Error1:
return(hBuf);
}