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

📄 zprintf.c

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