📄 errormsg.c
字号:
break;
case 'n':
ADD_TO_T('\r');
ADD_TO_T('\n');
f++;
break;
case '0':
eos = TRUE;
f++;
break;
default:
ADD_TO_T(*f++);
break;
}
} else {
ch = *f;
f++;
if (ch == '\r') {
if (*f == '\n')
f++;
if(width)
ADD_TO_T(' ');
else
{
ADD_TO_T('\r');
ADD_TO_T('\n');
}
} else {
if (ch == '\n')
{
if(width)
ADD_TO_T(' ');
else
{
ADD_TO_T('\r');
ADD_TO_T('\n');
}
}
else
ADD_TO_T(ch);
}
}
}
}
*t='\0';
}
talloced = strlen(target)+1;
if (nSize && talloced<nSize) {
target = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize);
}
TRACE("-- %s\n",debugstr_a(target));
if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) {
*((LPVOID*)lpBuffer) = (LPVOID)LocalAlloc(LMEM_ZEROINIT,max(nSize, talloced));
memcpy(*(LPSTR*)lpBuffer,target,talloced);
} else {
lstrcpynA(lpBuffer,target,nSize);
}
HeapFree(GetProcessHeap(),0,target);
HeapFree(GetProcessHeap(),0,from);
TRACE("-- returning %d\n", (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? strlen(*(LPSTR*)lpBuffer):strlen(lpBuffer));
return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ?
strlen(*(LPSTR*)lpBuffer):
strlen(lpBuffer);
#else
return 0;
#endif /* __i386__ */
}
#undef ADD_TO_T
/***********************************************************************
* FormatMessageW (KERNEL32.@)
*
* @implemented
*/
DWORD WINAPI FormatMessageW(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPWSTR lpBuffer,
DWORD nSize,
va_list* _args )
{
HMODULE kernel32_handle = GetModuleHandleW(kernel32W);
LPDWORD args=(LPDWORD)_args;
#if defined(__i386__) || defined(__sparc__)
/* This implementation is completely dependent on the format of the va_list on x86 CPUs */
LPWSTR target,t;
DWORD talloced,len;
LPWSTR from,f;
DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK;
BOOL eos = FALSE;
WCHAR ch;
TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n",
dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args);
if ((dwFlags & FORMAT_MESSAGE_FROM_STRING)
&&((dwFlags & FORMAT_MESSAGE_FROM_SYSTEM)
|| (dwFlags & FORMAT_MESSAGE_FROM_HMODULE))) return 0;
if (width && width != FORMAT_MESSAGE_MAX_WIDTH_MASK)
FIXME("line wrapping not supported.\n");
from = NULL;
if (dwFlags & FORMAT_MESSAGE_FROM_STRING) {
from = HeapAlloc( GetProcessHeap(), 0, (strlenW((LPCWSTR)lpSource) + 1) *
sizeof(WCHAR) );
if(from == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
strcpyW( from, (LPCWSTR)lpSource );
}
else {
from = NULL;
if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE)
from = load_messageW( (HMODULE)lpSource, dwMessageId, dwLanguageId );
if (!from && (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM))
from = load_messageW( kernel32_handle, dwMessageId, dwLanguageId );
if (!from)
{
SetLastError (ERROR_RESOURCE_LANG_NOT_FOUND);
return 0;
}
}
target = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 100 * sizeof(WCHAR) );
if(target == NULL)
{
HeapFree(GetProcessHeap(),0,from);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
t = target;
talloced= 100;
#define ADD_TO_T(c) do {\
*t++=c;\
if (t-target == talloced) {\
target = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2*sizeof(WCHAR));\
t = target+talloced;\
talloced*=2;\
} \
} while (0)
if (from) {
f=from;
if (dwFlags & FORMAT_MESSAGE_IGNORE_INSERTS) {
while (*f && !eos)
ADD_TO_T(*f++);
}
else {
while (*f && !eos) {
if (*f=='%') {
int insertnr;
WCHAR *fmtstr,*sprintfbuf,*x,*lastf;
DWORD *argliststart;
fmtstr = NULL;
lastf = f;
f++;
if (!*f) {
ADD_TO_T('%');
continue;
}
switch (*f) {
case '1':case '2':case '3':case '4':case '5':
case '6':case '7':case '8':case '9':
insertnr=*f-'0';
switch (f[1]) {
case '0':case '1':case '2':case '3':
case '4':case '5':case '6':case '7':
case '8':case '9':
f++;
insertnr=insertnr*10+*f-'0';
f++;
break;
default:
f++;
break;
}
if (*f=='!') {
f++;
if (NULL!=(x=strchrW(f,'!'))) {
*x='\0';
fmtstr=HeapAlloc( GetProcessHeap(), 0,(strlenW(f)+2)*sizeof(WCHAR));
if(fmtstr == NULL)
{
HeapFree(GetProcessHeap(),0,from);
HeapFree(GetProcessHeap(),0,target);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
sprintfW(fmtstr,PCNTFMTWSTR,f);
f=x+1;
} else {
fmtstr=HeapAlloc(GetProcessHeap(),0,(strlenW(f)+2)*sizeof(WCHAR));
if(fmtstr == NULL)
{
HeapFree(GetProcessHeap(),0,from);
HeapFree(GetProcessHeap(),0,target);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
sprintfW(fmtstr,PCNTFMTWSTR,f);
f+=strlenW(f); /*at \0*/
}
} else {
if(!args) break;
fmtstr = HeapAlloc( GetProcessHeap(),0,3*sizeof(WCHAR));
if(fmtstr == NULL)
{
HeapFree(GetProcessHeap(),0,from);
HeapFree(GetProcessHeap(),0,target);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
strcpyW( fmtstr, FMTWSTR );
}
if (args) {
if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY)
argliststart=args+insertnr-1;
else
argliststart=(*(DWORD**)args)+insertnr-1;
len = 0;
sprintfbuf = NULL;
do {
if (sprintfbuf) {
HeapFree(GetProcessHeap(),0,sprintfbuf);
}
len += 256;
sprintfbuf=HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
/* CMF - This makes a BIG assumption about va_list */
} while (0 > _vsnwprintf(sprintfbuf, len, fmtstr, (va_list) argliststart));
x=sprintfbuf;
while (*x) {
ADD_TO_T(*x++);
}
HeapFree(GetProcessHeap(),0,sprintfbuf);
} else {
/* NULL args - copy formatstr
* (probably wrong)
*/
while ((lastf<f)&&(*lastf)) {
ADD_TO_T(*lastf++);
}
}
HeapFree(GetProcessHeap(),0,fmtstr);
break;
case 'n':
ADD_TO_T('\r');
ADD_TO_T('\n');
f++;
break;
case '0':
eos = TRUE;
f++;
break;
default:
ADD_TO_T(*f++);
break;
}
} else {
ch = *f;
f++;
if (ch == '\r') {
if (*f == '\n')
f++;
if(width)
ADD_TO_T(' ');
else
{
ADD_TO_T('\r');
ADD_TO_T('\n');
}
} else {
if (ch == '\n')
{
if(width)
ADD_TO_T(' ');
else
{
ADD_TO_T('\r');
ADD_TO_T('\n');
}
}
else
ADD_TO_T(ch);
}
}
}
}
*t='\0';
}
talloced = strlenW(target)+1;
if (nSize && talloced<nSize)
target = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize*sizeof(WCHAR));
if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) {
/* nSize is the MINIMUM size */
DWORD len = strlenW(target) + 1;
*((LPVOID*)lpBuffer) = (LPVOID)LocalAlloc(LMEM_ZEROINIT,len*sizeof(WCHAR));
strcpyW(*(LPWSTR*)lpBuffer, target);
}
else lstrcpynW(lpBuffer, target, nSize);
HeapFree(GetProcessHeap(),0,target);
HeapFree(GetProcessHeap(),0,from);
TRACE("ret=%s\n", wine_dbgstr_w((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ?
*(LPWSTR*)lpBuffer : lpBuffer));
return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ?
strlenW(*(LPWSTR*)lpBuffer):
strlenW(lpBuffer);
#else
return 0;
#endif /* __i386__ */
}
#undef ADD_TO_T
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -