📄 zprintf.c
字号:
ptFmt->wTakeBits = (WORD)(-lFmtVal), ptFmt->bBitBigEndian = 0;
}
else
{
ptFmt->wTakeBits = (WORD)lFmtVal;
}
ptFmt->wTakeBits = min(ptFmt->wTakeBits, 0x1000);
}
continue;
}
else if (0 /* isPermitSpace(pbRead[0]) */)
{
pbRead++; continue;
}
break;
}
/*----------------------------------------------------------------------*/
/* 如果未声明取多少字节而又声明按位取操作数,则根据需求进行校验 */
/*----------------------------------------------------------------------*/
if (ptFmt->bBitTake)
{
if (!bTakeBitsDecl)
{
ptFmt->wTakeBits = 8;
}
if (!bTakeBytesDecl && ptFmt->bRemainBits < ptFmt->wTakeBits)
{
ptFmt->bRemainBits = 0;
ptFmt->dwRemainVal = 0;
ptFmt->wTakeBytes = (ptFmt->wTakeBits + 7) / 8;
}
else if (!bTakeBytesDecl)
{
ptFmt->wTakeBytes = 0;
}
}
return pbRead;
}
/*--------------------------------------------------------------------------*/
/* Function name : TakeDataByFormat() */
/* Description : 按照格式控制符从内存地址中取数据 */
/* Input : ptFmt - 控制格式结构地址 */
/* : pbDataAddr - 取数开始位置 */
/* : wDataLen - 有限的数据长度 */
/* Output : 无 */
/* Return : 下一个取数地址指针 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-21 12:15上午 */
/* Note : */
/*--------------------------------------------------------------------------*/
static BYTE *TakeDataByFormat(PrnFormatGlb_T *ptFmt, BYTE *pbDataAddr, WORD wDataLen)
{
int i;
WORD wTakeBytes = ptFmt->wTakeBytes;
WORD wTakeBits = ptFmt->wTakeBits, wReadBits;
BYTE *pbData = pbDataAddr, bReadChar;
DWORD dwReadVal = 0;
/*----------------------------------------------------------------------*/
/* 不按位取数,清空按位取数的保留值,取数溢出时只保留低位有效值 */
/*----------------------------------------------------------------------*/
if (!ptFmt->bBitTake)
{
ptFmt->dwRemainVal = 0;
ptFmt->bRemainBits = 0;
for (i = 0; i < ptFmt->wTakeBytes && i < wDataLen; i++)
{
if (ptFmt->bBigEndian)
{
dwReadVal = (dwReadVal << 8) + *pbData++;
}
else
{
dwReadVal += ((*pbData++) << (i * 8));
}
}
ptFmt->dwReadVal = dwReadVal;
return pbData;
}
/*----------------------------------------------------------------------*/
/* 检验要取的比特数的有效性 */
/*----------------------------------------------------------------------*/
if (wTakeBits > wTakeBytes * 8 + ptFmt->bRemainBits)
{
wTakeBits = wTakeBytes * 8 + ptFmt->bRemainBits;
}
else if (ptFmt->bRemainBits >= wTakeBits)
{
ptFmt->bRemainBits -= wTakeBits;
if (ptFmt->bBigEndian)
{
dwReadVal = ptFmt->dwRemainVal >> ptFmt->bRemainBits;
if (ptFmt->bRemainBits < 32)
{
ptFmt->dwRemainVal &= (1 << (ptFmt->bRemainBits)) - 1;
}
}
else
{
if (wTakeBits < 32)
{
dwReadVal = ptFmt->dwRemainVal & ((1 << wTakeBits) - 1);
}
else
{
dwReadVal = ptFmt->dwRemainVal;
}
ptFmt->dwRemainVal >>= wTakeBits;
}
ptFmt->dwReadVal = dwReadVal;
return pbData;
}
dwReadVal = ptFmt->dwRemainVal, wReadBits = (WORD)ptFmt->bRemainBits;
ptFmt->dwRemainVal = 0, ptFmt->bRemainBits = 0;
/*----------------------------------------------------------------------*/
/* 进行取数操作,边取数边取比特数 */
/*----------------------------------------------------------------------*/
for (i = 0; i < wTakeBytes && i < wDataLen; i++)
{
bReadChar = *pbData++;
if (!ptFmt->bBitBigEndian)
{
bReadChar = (BYTE)tranBits((DWORD)bReadChar, 8);
}
if (ptFmt->bBigEndian)
{
if (wReadBits + 8 <= wTakeBits)
{
wReadBits += 8;
dwReadVal = (dwReadVal << 8) + bReadChar;
}
else if (wReadBits < wTakeBits)
{
dwReadVal = (dwReadVal << (wTakeBits - wReadBits)) +
(bReadChar >> (8 - (wTakeBits - wReadBits)));
ptFmt->bRemainBits = 8 - (wTakeBits - wReadBits);
ptFmt->dwRemainVal = bReadChar & ((1 << (ptFmt->bRemainBits)) - 1);
wReadBits = wTakeBits;
}
else /* if (wReadBits >= wTakeBits) */
{
ptFmt->dwRemainVal = (ptFmt->dwRemainVal << 8) + bReadChar;
ptFmt->bRemainBits += 8;
}
}
else
{
if (wReadBits + 8 <= wTakeBits)
{
wReadBits += 8;
dwReadVal += (bReadChar << ptFmt->bRemainBits);
}
else if (wReadBits < wTakeBits)
{
dwReadVal += ((bReadChar &
((1 << (wTakeBits - wReadBits)) - 1)) << ptFmt->bRemainBits);
ptFmt->bRemainBits = 8 - (wTakeBits - wReadBits);
ptFmt->dwRemainVal = bReadChar >> (wTakeBits - wReadBits);
wReadBits = wTakeBits;
}
else /* if (wReadBits >= wTakeBits) */
{
ptFmt->dwRemainVal += (bReadChar << ptFmt->bRemainBits);
ptFmt->bRemainBits += 8;
}
}
}
ptFmt->dwReadVal = dwReadVal;
/*
if (!ptFmt->bBitBigEndian)
{
ptFmt->dwReadVal = tranBits(dwReadVal, wTakeBits);
}
*/
return pbData;
}
/*--------------------------------------------------------------------------*/
/* Function name : TakeFloatDataByFormat() */
/* Description : 按照格式控制符从内存地址中取浮点数据 */
/* Input : ptFmt - 控制格式结构地址 */
/* : pbDataAddr - 取数开始位置 */
/* : wDataLen - 有限的数据长度 */
/* Output : ptBinF - 二进制浮点数据 */
/* Return : 下一个取数地址指针 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2003-5-25 13:03 */
/* Note : 尾数都是整数形式,小数通过负指数体现 */
/*--------------------------------------------------------------------------*/
BYTE *TakeFloatDataByFormat(
PrnFormatGlb_T *ptFmt, BYTE *pbDataAddr, WORD wDataLen, PFLOAT *ptBinF)
{
BYTE *pbData = pbDataAddr;
/*----------------------------------------------------------------------*/
/* 按双精度或者单精度数据定义取数,二进制尾数上的最高有效'1'往往被省略 */
/*----------------------------------------------------------------------*/
if (ptFmt->wTakeBytes <= 4)
{
ptBinF->bMantisBits = FloatMantisBits_M;
ptFmt->bBitTake = 0;
ptFmt->wTakeBytes = 4;
pbData = TakeDataByFormat(ptFmt, pbData, wDataLen);
ptBinF->bNegtive = (ptFmt->dwReadVal >> 31) ? 1 : 0;
ptBinF->lPower = (LONG)
((ptFmt->dwReadVal >> FloatMantisBits_M) & ((1 << FloatPowerBits_M) - 1));
ptBinF->qwMantis.dwH = 0;
ptBinF->qwMantis.dwL = (DWORD)
(ptFmt->dwReadVal & ((1 << FloatMantisBits_M) - 1));
if (MostSigBitHiden_M && ptBinF->lPower != 0)
{
ptBinF->qwMantis.dwL |= 1 << FloatMantisBits_M;
}
ptBinF->lPower -= FloatMantisBits_M + FloatZeroShift_M;
}
else
{
ptBinF->bMantisBits = DoubleMantisBits_M;
ptFmt->bBitTake = 0;
ptFmt->wTakeBytes = 4;
pbData = TakeDataByFormat(ptFmt, pbData, wDataLen);
if (ptFmt->bBigEndian)
{
ptBinF->bNegtive = (ptFmt->dwReadVal >> 31) ? 1 : 0;
ptBinF->lPower = (LONG)
((ptFmt->dwReadVal >> (DoubleMantisBits_M - 32)) &
((1 << DoublePowerBits_M) - 1));
ptBinF->qwMantis.dwH= (DWORD)
(ptFmt->dwReadVal & ((1 << (DoubleMantisBits_M - 32)) - 1));
}
else
{
ptBinF->qwMantis.dwL = ptFmt->dwReadVal;
}
pbData = TakeDataByFormat(ptFmt, pbData, wDataLen);
if (ptFmt->bBigEndian)
{
ptBinF->qwMantis.dwL = ptFmt->dwReadVal;
}
else
{
ptBinF->bNegtive = (ptFmt->dwReadVal >> 31) ? 1 : 0;
ptBinF->lPower = (LONG)
((ptFmt->dwReadVal >> (DoubleMantisBits_M - 32)) &
((1 << DoublePowerBits_M) - 1));
ptBinF->qwMantis.dwH= (DWORD)
(ptFmt->dwReadVal & ((1 << (DoubleMantisBits_M - 32)) - 1));
}
ptFmt->wTakeBytes = 8;
if (MostSigBitHiden_M && ptBinF->lPower != 0)
{
ptBinF->qwMantis.dwH |= 1 << (DoubleMantisBits_M - 32);
}
ptBinF->lPower -= DoubleMantisBits_M + DoubleZeroShift_M;
}
return pbData;
}
/*--------------------------------------------------------------------------*/
/* Function name : ParsePercentFormat() */
/* Description : 处理百分号'%'格式控制符 */
/* Input : pbReadFmt - 当前的格式控制符位置指针 */
/* : ppbData - 参数列表指针 */
/* Output : ptFmt - 打印格式控制结构 */
/* : ppbData - 参数列表指针 */
/* Return : 下一个打印格式控制符的位置 */
/* Global Var : 无 */
/* Author/Date : R.Z.Tian/2002-01-16 */
/* Note : */
/*--------------------------------------------------------------------------*/
static char *ParsePercentFormat(char *pbReadFmt, PrnFormatGlb_T *ptFmt, BYTE **ppbData)
{
BYTE bDataTypeDecl = 0;
BYTE bParseStep = 0;
char *pbRead = pbReadFmt, *pbRead1;
BYTE *pbData = *ppbData, *pbData1;
LONG lFmtVal;
/*----------------------------------------------------------------------*/
/* 初始化打印描述结构 */
/*----------------------------------------------------------------------*/
ptFmt->lWidth = PrnWidthDft_M;
ptFmt->lPrecision = PrnWidthDft_M;
ptFmt->bType = 'd';
ptFmt->bSubType = '\0';
ptFmt->bMod = 'l';
ptFmt->bTakeDataDecl= 0;
ptFmt->bPreChar = ' ';
ptFmt->bRight = 1;
ptFmt->bAlter = 0;
ptFmt->bPlus = 0;
ptFmt->dwReadVal = 0;
/*----------------------------------------------------------------------*/
/* '%'后的格式说明,有两类,一类是取数的,一类是打印串,要区别对待 */
/*----------------------------------------------------------------------*/
while (pbRead[0] != '\0' && pbRead - pbReadFmt < 32 &&
(isDigit(pbRead[0]) || pbRead[0] == '*' ||
pbRead[0] == '.' || pbRead[0] == '-' /* || isPermitSpace(pbRead[0]) */))
{
pbRead++;
}
/*----------------------------------------------------------------------*/
/* 含有取数说明时,按其格式至数据表中取操作数,否则按默认值取数 */
/*----------------------------------------------------------------------*/
if (pbRead[0] == 'a')
{
pbRead1 = GetTakeDataFormat(pbReadFmt, ptFmt, ppbData);
}
else
{
ptFmt->bBigEndian = isBigEndian() ? 1 : 0;
ptFmt->wTakeBytes = PrnTakeDataBytesDft_M;
ptFmt->bBitTake = 0;
ptFmt->bBitBigEndian= 1;
ptFmt->wTakeBits = 0,
ptFmt->bRemainBits = 0;
ptFmt->dwRemainVal = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -