📄 w32start.h
字号:
for (i = dData1, j = 1; i >= 10; i /= 10, j++);
if (dPrecision != -1) j = max (j, dPrecision);
k = (fPrefix || fMinus ? j+1 : j);
n = max (k, dWidth);
wPrefix = (k == j ? 0 : (fMinus ? '-' : (dData1 ? '+' : ' ')));
if (pwBuffer != NULL)
{
pwBuffer1 = pwBuffer + dOffset;
wData = (fZero ? '0' : wFill);
if (fRight)
{
for (i = n; i > k; i--) pwBuffer1 [i-1] = wData;
k = 0;
}
else
{
for (i = 0; i < n - j; i++) pwBuffer1 [i] = wData;
i = n;
k = (fZero ? 0 : n - k);
}
while (j--)
{
pwBuffer1 [--i] = (WORD) (dData1 % 10) + '0';
dData1 /= 10;
}
if (wPrefix)
{
pwBuffer1 [k] = wPrefix;
}
}
if (pwBuffer != NULL) pwBuffer [dOffset+n] = 0;
return n;
}
// -----------------------------------------------------------------
DWORD WINAPI FormatHexW (PWORD pwBuffer,
DWORD dOffset,
DWORD dData,
DWORD dWidth,
DWORD dPrecision,
WORD wFill,
BOOL fRight,
BOOL fZero,
BOOL fPrefix,
BOOL fLower)
{
PWORD pwBuffer1;
WORD wData;
DWORD dData1, i, j, k;
DWORD n = 0;
dData1 = dData;
for (i = dData1, j = 1; i >= 0x10; i >>= 4, j++);
if (dPrecision != -1) j = max (j, dPrecision);
k = (fPrefix ? j+2 : j);
n = max (k, (fPrefix ? dWidth+2 : dWidth));
if (pwBuffer != NULL)
{
pwBuffer1 = pwBuffer + dOffset;
wData = (fZero ? '0' : wFill);
if (fRight)
{
for (i = n; i > k; i--) pwBuffer1 [i-1] = wData;
k = 0;
}
else
{
for (i = 0; i < n - j; i++) pwBuffer1 [i] = wData;
i = n;
k = (fZero ? 0 : n - k);
}
wData = (fLower ? 'a' : 'A');
while (j--)
{
if ((pwBuffer1 [--i] = (WORD) (dData1 & 0xF)) < 10)
{
pwBuffer1 [i] += '0';
}
else
{
pwBuffer1 [i] -= 10;
pwBuffer1 [i] += wData;
}
dData1 >>= 4;
}
if (fPrefix)
{
pwBuffer1 [k ] = '0';
pwBuffer1 [k+1] = (fLower ? 'x' : 'X');
}
}
if (pwBuffer != NULL) pwBuffer [dOffset+n] = 0;
return n;
}
// -----------------------------------------------------------------
DWORD WINAPI FormatSingleW (PWORD pwBuffer,
DWORD dOffset,
PWORD pwFormat,
PDWORD pdFormat,
PVOID *ppData,
WORD wFill,
BOOL fUnicode)
{
PVOID pData, pText;
WORD wData, wFill1;
BOOL fAnsi, fShort, fSigned, fLower, fRight, fZero, fPrefix;
BOOL fPrecision, fDone, fSkip;
DWORD dPrecision, dWidth, dData, dFormat, dNumber;
DWORD n = 0;
pData = (ppData != NULL ? *ppData : NULL);
dFormat = (pdFormat != NULL ? *pdFormat : 0);
if (pwFormat != NULL)
{
fAnsi = !fUnicode;
fShort = FALSE;
fSigned = FALSE;
fLower = FALSE;
fRight = FALSE;
fZero = FALSE;
fPrefix = FALSE;
wData = '%';
wFill1 = wFill;
dWidth = 0;
dPrecision = -1;
fPrecision = FALSE;
fDone = FALSE;
while ((!fDone) && pwFormat [dFormat])
{
fSkip = TRUE;
switch (pwFormat [dFormat])
{
// operand size
case 'l':
{
fShort = fAnsi = FALSE;
break;
}
case 'h':
{
fShort = fAnsi = TRUE;
break;
}
// strings
case 'S':
{
fAnsi = fUnicode;
}
case 's':
{
pText = (pData != NULL
? *(PVOID *) pData
: NULL);
if (fAnsi)
{
n = FormatAnsiW
(pwBuffer, dOffset,
pText, -1,
dWidth, dPrecision, wFill1,
fRight, fZero);
}
else
{
n = FormatUnicodeW
(pwBuffer, dOffset,
pText, -1,
dWidth, dPrecision, wFill1,
fRight, fZero);
}
if (pData != NULL)
{
pData = (PBYTE) pData + sizeof (PVOID);
}
fDone = TRUE;
break;
}
// characters
case 'C':
{
fAnsi = fUnicode;
}
case 'c':
{
wData = (pData != NULL
? (fAnsi
? *(PBYTE) pData
: *(PWORD) pData)
: ' ');
if (pData != NULL)
{
pData = (PBYTE) pData + sizeof (DWORD);
}
}
case '%':
{
n = FormatUnicodeW (pwBuffer, dOffset,
&wData, 1,
dWidth, dPrecision, wFill1,
fRight, fZero);
fDone = TRUE;
break;
}
// decimal numbers
case 'd':
case 'i':
{
fSigned = TRUE;
}
case 'u':
{
dData = (pData != NULL
? (fSigned
? (fShort
? *(PSHORT) pData
: *(PLONG ) pData)
: (fShort
? *(PWORD ) pData
: *(PDWORD) pData))
: 0);
n = FormatDecimalW (pwBuffer, dOffset, dData,
dWidth, dPrecision, wFill1,
fRight, fZero, fPrefix,
fSigned);
if (pData != NULL)
{
pData = (PBYTE) pData + sizeof (DWORD);
}
fDone = TRUE;
break;
}
// hex numbers
case 'x':
{
fLower = TRUE;
}
case 'X':
{
dData = (pData != NULL
? (fShort
? *(PWORD ) pData
: *(PDWORD) pData)
: 0);
n = FormatHexW (pwBuffer, dOffset, dData,
dWidth, dPrecision, wFill1,
fRight, fZero, fPrefix,
fLower);
if (pData != NULL)
{
pData = (PBYTE) pData + sizeof (DWORD);
}
fDone = TRUE;
break;
}
// output styles
case '+':
{
if (pwFormat [dFormat+1])
{
wFill1 = pwFormat [++dFormat];
}
break;
}
case '-':
{
fRight = TRUE;
break;
}
case '0':
{
fZero = TRUE;
break;
}
case '#':
{
fPrefix = TRUE;
break;
}
// output width
default:
{
if (fPrecision = (pwFormat [dFormat] == '.'))
{
dFormat++;
dPrecision = 0;
fSkip = FALSE;
}
if ((pwFormat [dFormat] >= '0') &&
(pwFormat [dFormat] <= '9'))
{
dNumber = 0;
while ((pwFormat [dFormat] >= '0') &&
(pwFormat [dFormat] <= '9'))
{
dNumber *= 10;
dNumber += (pwFormat [dFormat++] - '0');
}
if (fPrecision)
{
dPrecision = dNumber;
}
else
{
dWidth = dNumber;
}
fSkip = FALSE;
}
break;
}
}
if (fSkip) dFormat++;
}
}
if (pwBuffer != NULL) pwBuffer [dOffset+n] = 0;
if (pdFormat != NULL) *pdFormat = dFormat;
if (ppData != NULL) *ppData = pData;
return n;
}
// -----------------------------------------------------------------
DWORD WINAPI FormatMultiW (PWORD pwBuffer,
DWORD dOffset,
PWORD pwFormat,
PVOID pArguments,
WORD wFill,
BOOL fUnicode)
{
PVOID pData;
DWORD i, j;
DWORD n = 0;
if (pwFormat != NULL)
{
if ((pData = pArguments) != NULL)
{
for (i = 0; pwFormat [i]; i = j)
{
for (j = i; pwFormat [j] && (pwFormat [j] != '%');
j++);
n += FormatUnicodeW (pwBuffer, dOffset+n,
pwFormat+i, j-i,
0, -1, wFill,
TRUE, FALSE);
if (pwFormat [j] == '%')
{
j++;
n += FormatSingleW (pwBuffer, dOffset+n,
pwFormat, &j, &pData,
wFill, fUnicode);
}
}
}
else
{
n = FormatUnicodeW (pwBuffer, dOffset,
pwFormat, -1,
0, -1, wFill,
TRUE, FALSE);
}
}
if (pwBuffer != NULL) pwBuffer [dOffset+n] = 0;
return n;
}
// =================================================================
// vprintf() ROUTINES (UNICODE)
// =================================================================
DWORD WINAPI vsprintfW (PWORD pwBuffer,
PWORD pwFormat,
PVOID pArguments)
{
return FormatMultiW (pwBuffer, 0, pwFormat, pArguments,
gwFill, TRUE);
}
// -----------------------------------------------------------------
INT WINAPI vmprintfW (HWND hWnd,
UINT uiType,
PWORD pwCaption,
PWORD pwFormat,
PVOID pArguments)
{
PWORD pwBuffer;
DWORD dBuffer;
INT iId = IDABORT;
dBuffer = vsprintfW (NULL, pwFormat, pArguments);
if ((pwBuffer = ALLOC_UNICODE (dBuffer+1))
!= NULL)
{
vsprintfW (pwBuffer, pwFormat, pArguments);
iId = MessageBoxW (hWnd, pwBuffer,
(pwCaption != NULL
? pwCaption
: SW(MAIN_CAPTION)),
uiType);
LocalFree (pwBuffer);
}
return iId;
}
// -----------------------------------------------------------------
DWORD WINAPI vfprintfW (HANDLE hFile,
PWORD pwFormat,
PVOID pArguments)
{
PWORD pwBuffer;
PBYTE pbBuffer;
DWORD dBuffer, n1, n2;
DWORD n = 0;
dBuffer = vsprintfW (NULL, pwFormat, pArguments);
if ((pwBuffer = ALLOC_UNICODE (dBuffer+1))
!= NULL)
{
vsprintfW (pwBuffer, pwFormat, pArguments);
if ((pbBuffer = ConvertUnicodeToAnsi (pwBuffer, NULL))
!= NULL)
{
while (dBuffer > n)
{
n1 = min (dBuffer-n, WRITE_FILE_BLOCK);
n2 = 0;
if (WriteFile (hFile, pbBuffer+n, n1, &n2, NULL)
&& n2)
{
n += n2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -