📄 zprintf.c
字号:
/* Description : 按照打印格式符从相应的地址中取出字符串并打印 */
/* Input : pbOutLoc - 打印字符输出地址 */
/* : wBufLen - 打印缓存长度 */
/* : pbFmt - 打印格式控制结构 */
/* : ppbDataAddr - 可供取数的内存地址指针 */
/* : wDataLen - 数据长度 */
/* Output : none */
/* Return : 打印的字符个数 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-21 17:31 */
/* Note : */
/*--------------------------------------------------------------------------*/
static ULONG OutPutString(BYTE *pbOutLoc,
WORD wBufLen, PrnFormatGlb_T *ptFmt, BYTE **ppbDataAddr, WORD wDataLen)
{
BYTE *pbReadData, sPromtStr[3] = "";
BYTE *pbOutBeg;
BYTE *pbOutEnd;
DWORD dwTempVal;
/*----------------------------------------------------------------------*/
/* 按照格式符调整取得的数据 */
/*----------------------------------------------------------------------*/
ptFmt->lPrecision = 0;
/*----------------------------------------------------------------------*/
/* 字符串在参数表中 */
/*----------------------------------------------------------------------*/
if (ptFmt->bTakeDataDecl)
{
pbReadData = *ppbDataAddr;
}
/*----------------------------------------------------------------------*/
/* 字符串在参数表指针指向的位置 */
/*----------------------------------------------------------------------*/
else
{
*ppbDataAddr = TakeDataByFormat(ptFmt, *ppbDataAddr, wDataLen);
pbReadData = (BYTE *)ptFmt->dwReadVal;
}
pbOutBeg = pbOutEnd = pbReadData;
while (*pbOutEnd != '\0') pbOutEnd++;
if ((ptFmt->bTakeDataDecl & 2) != 0)
{
*ppbDataAddr += ptFmt->wTakeBytes;
}
else if (ptFmt->bTakeDataDecl)
{
*ppbDataAddr = pbOutEnd + 1;
}
/*----------------------------------------------------------------------*/
/* 检验输出字符宽度并进行输出 */
/*----------------------------------------------------------------------*/
dwTempVal = OutPutWidthCheck(
pbOutLoc, wBufLen, pbOutBeg, pbOutEnd, ptFmt, sPromtStr, 0);
return dwTempVal;
}
/*--------------------------------------------------------------------------*/
/* Function name : zeroQword() */
/* Description : 判断QWORD是否为0 */
/* Input : qwVal - 待判断QWORD */
/* Output : 无 */
/* Return : 是或不是 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-24 12:12上午 */
/* Note : */
/*--------------------------------------------------------------------------*/
static LONG zeroQword(QWORD qwVal)
{
if (qwVal.dwH == 0 && qwVal.dwL == 0)
{
return 1;
}
return 0;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordCmp() */
/* Description : 判断QWORD的大小 */
/* Input : qwVal1 - 第一个四字长操作数 */
/* : qwVal2 - 第二个四字长操作数 */
/* Output : 无 */
/* Return : 1 - 操作数1大于操作数2; */
/* : 0 - 操作数1等于操作数2; */
/* : -1 - 操作数1小于操作数2. */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-9-30 11:18 */
/* Note : */
/*--------------------------------------------------------------------------*/
static LONG QwordCmp(QWORD qwVal1, QWORD qwVal2)
{
if (qwVal1.dwH > qwVal2.dwH ||
(qwVal1.dwH == qwVal2.dwH && qwVal1.dwL > qwVal2.dwL))
{
return 1;
}
else if (qwVal1.dwH == qwVal2.dwH && qwVal1.dwL == qwVal2.dwL)
{
return 0;
}
else /* if (qwVal1.dwH < qwVal2.dwH ||
(qwVal1.dwH == qwVal2.dwH && qwVal1.dwL < qwVal2.dwL)) */
{
return -1;
}
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordBitsNum() */
/* Description : QWORD所含的有效比特位个数 */
/* Input : qwVal - 待计算QWORD */
/* Output : 无 */
/* Return : 有效比特位个数 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-25 14:32 */
/* Note : */
/*--------------------------------------------------------------------------*/
static LONG QwordBitsNum(QWORD qwVal)
{
LONG lRet = 0;
if (zeroQword(qwVal))
{
return lRet;
}
if (qwVal.dwH != 0) for (/* */; lRet < 32; lRet++)
{
if ((qwVal.dwH & (0x80000000 >> lRet)) != 0)
{
return 64 - lRet;
}
}
for (lRet = 0; lRet < 32; lRet++)
{
if ((qwVal.dwL & (0x80000000 >> lRet)) != 0)
{
return 32 - lRet;
}
}
return 32 - lRet;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordNumBitsSet() */
/* Description : 将一个QWORD数据的诸多位设为1 */
/* Input : lBitsNum - 设为1的比特位个数 */
/* Output : 无 */
/* Return : QWORD数值 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-25 14:51 */
/* Note : */
/*--------------------------------------------------------------------------*/
QWORD QwordNumBitsSet(LONG lBitsNum)
{
QWORD qwRet = {0, 0};
if (lBitsNum == 0)
{
return qwRet;
}
if (lBitsNum < 32)
{
qwRet.dwL = (1 << lBitsNum) - 1;
return qwRet;
}
qwRet.dwL = 0xffffffff;
if (lBitsNum < 64)
{
qwRet.dwH = (1 << (lBitsNum - 32)) - 1;
return qwRet;
}
qwRet.dwH = 0xffffffff;
return qwRet;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordRightShift() */
/* Description : 将一个QWORD数据右移数位 */
/* : qwVal - QWORD操作数 */
/* Input : lShiftBits - 右移的位数 */
/* Output : 无 */
/* Return : QWORD数值 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-9-30 13:48 */
/* Note : */
/*--------------------------------------------------------------------------*/
static QWORD QwordRightShift(QWORD qwVal, LONG lShiftBits)
{
QWORD qwRet = {0, 0};
QWORD QwordLeftShift(QWORD qwVal, LONG lShiftBits);
if (lShiftBits == 0)
{
return (qwRet = qwVal);
}
else if (lShiftBits < 0)
{
return QwordLeftShift(qwVal, -lShiftBits);
}
if (lShiftBits >= 64)
{
return qwRet;
}
if (lShiftBits >= 32)
{
qwRet.dwL = qwVal.dwH >> (lShiftBits - 32);
return qwRet;
}
qwRet.dwH = (qwVal.dwH >> lShiftBits);
qwRet.dwL = (qwVal.dwL >> lShiftBits) +
((qwVal.dwH & ((1 << (lShiftBits)) - 1)) << (32 - lShiftBits));
return qwRet;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordLeftShift() */
/* Description : 将一个QWORD数据左移数位 */
/* : qwVal - QWORD操作数 */
/* Input : lShiftBits - 左移的位数 */
/* Output : 无 */
/* Return : QWORD数值 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-9-30 14:02 */
/* Note : */
/*--------------------------------------------------------------------------*/
static QWORD QwordLeftShift(QWORD qwVal, LONG lShiftBits)
{
QWORD qwRet = {0, 0};
if (lShiftBits == 0)
{
return (qwRet = qwVal);
}
else if (lShiftBits < 0)
{
return QwordRightShift(qwVal, -lShiftBits);
}
if (lShiftBits >= 64)
{
return qwRet;
}
if (lShiftBits >= 32)
{
qwRet.dwH = qwVal.dwL << (lShiftBits - 32);
return qwRet;
}
qwRet.dwL = (qwVal.dwL << lShiftBits);
qwRet.dwH = (qwVal.dwH << lShiftBits) + (qwVal.dwL >> (32 - lShiftBits));
return qwRet;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordPlus() */
/* Description : 两个四字长的数据相加 */
/* Input : qwVal1 - 第一个四字长操作数 */
/* : qwVal2 - 第二个四字长操作数 */
/* Output : 无 */
/* Return : 两个四字长操作数的和 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-23 10:34下午 */
/* Note : */
/*--------------------------------------------------------------------------*/
static QWORD QwordPlus(QWORD qwVal1, QWORD qwVal2)
{
QWORD qwRet = {0, 0};
qwRet.dwL = qwVal1.dwL + qwVal2.dwL;
qwRet.dwH = qwVal1.dwH + qwVal2.dwH;
/*----------------------------------------------------------------------*/
/* 数据溢出校正 */
/*----------------------------------------------------------------------*/
qwRet.dwH += (qwVal1.dwL != 0 && ~qwVal1.dwL + 1 < qwVal2.dwL) ? 1 : 0;
return qwRet;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordMinus() */
/* Description : 两个四字长的数据相减 */
/* Input : qwVal1 - 第一个四字长操作数 */
/* : qwVal2 - 第二个四字长操作数 */
/* Output : 无 */
/* Return : 两个四字长操作数的差 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-23 11:58下午 */
/* Note : */
/*--------------------------------------------------------------------------*/
static QWORD QwordMinus(QWORD qwVal1, QWORD qwVal2)
{
QWORD qwRet = {0, 0};
qwRet.dwL = qwVal1.dwL - qwVal2.dwL;
qwRet.dwH = qwVal1.dwH - qwVal2.dwH;
/*----------------------------------------------------------------------*/
/* 数据溢出校正 */
/*----------------------------------------------------------------------*/
qwRet.dwH -= (qwVal1.dwL < qwVal2.dwL) ? 1 : 0;
return qwRet;
}
/*--------------------------------------------------------------------------*/
/* Function name : QwordMulti() */
/* Description : 四字长的数据相乘 */
/* Input : qwVal1 - 第一个四字长操作数 */
/* : qwVal2 - 第二个四字长操作数 */
/* Output : 无 */
/* Return : 两个四字长操作数的积 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-9-30 10:24 */
/* Note : */
/*--------------------------------------------------------------------------*/
static QWORD QwordMulti(QWORD qwVal1, QWORD qwVal2)
{
DWORD dwOverVal, dwTemp1, dwTemp2;
QWORD qwRet = {0, 0};
qwRet.dwL = qwVal1.dwL * qwVal2.dwL;
qwRet.dwH = qwVal1.dwH * qwVal2.dwL + qwVal1.dwL * qwVal2.dwH;
/*----------------------------------------------------------------------*/
/* 低阶数据溢出校正 */
/*----------------------------------------------------------------------*/
dwTemp1 = (qwVal1.dwL >> 16) * (qwVal2.dwL & 0xffff);
dwTemp2 = (qwVal1.dwL & 0xffff) * (qwVal2.dwL >> 16);
dwOverVal = (dwTemp1 + dwTemp2) >> 16;
dwOverVal += (dwTemp1 != 0 && ~dwTemp1 + 1 < dwTemp2) ? 1 : 0;
dwOverVal += (qwVal1.dwL >> 16) * (qwVal2.dwL >> 16);
qwRet.dwH += dwOverVal;
re
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -