⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zprintf.c

📁 打印解析处理函数, 含有浮点数处理, 无需浮点协处理器
💻 C
📖 第 1 页 / 共 5 页
字号:
					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 + -