Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunti i sorgenti per Greenleaf Math Library (gfm.dll) git-svn-id: svn://10.65.10.50/trunk@10079 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			379 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* void	_ConvDecimalToAsciiFormatted( s, x, fmt)
 | |
|  *
 | |
|  * ARGUMENT
 | |
|  *   DEC	*x;
 | |
|  *   char	*s;
 | |
|  *   char	*fmt
 | |
|  *
 | |
|  * DESCRIPTION
 | |
|  *	Converts a DEC structure to an ascii string.  The format of the
 | |
|  *   output depends upon fmt, similar to the printf format string.  However,
 | |
|  *   the fmt must correspond to	0 or 1 DEC outputs.
 | |
|  *	This routine is	called by StringPrintDecimal for each DEC.
 | |
|  *
 | |
|  * SIDE	EFFECTS
 | |
|  *	None.
 | |
|  *
 | |
|  * RETURNS
 | |
|  *	None.
 | |
|  *
 | |
|  * POSSIBLE ERROR CODES
 | |
|  *
 | |
|  *	GM_NULLPOINTER
 | |
|  *	GM_INVALIDID
 | |
|  *	GM_CNVRW
 | |
|  *
 | |
|  * AUTHOR
 | |
|  *   Jared Levy		Feb 1, 1987
 | |
|  *   Copyright (C) 1987-1990 Greenleaf Software	Inc.  All rights reserved.
 | |
|  *
 | |
|  * MODIFICATIONS
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include "gmsystem.h"
 | |
| 
 | |
| void	_ConvDecimalToAsciiFormatted( s, x, fmt	)
 | |
| DEC	*x;
 | |
| char	*s;
 | |
| char	*fmt;
 | |
| {
 | |
| 	int	wFStart, wOut=0, wWidth=0, wPrec=-1, wTotLen, i, t;
 | |
| 	int	wFlag=0, wJust=0;
 | |
| /*
 | |
|  * Lattice C 6.0 moaned	about my initialization	of wfTemp, said	it
 | |
|  * was redundant, so I took it out.
 | |
|  */
 | |
| 	mbool	wfTemp /*=TRUE*/, wfZeroBlC=FALSE, wfZeroBlS=FALSE;
 | |
| 	mbool	wfAddLeft, wfAddRight, wfIsNeg=FALSE, wfIsZero;
 | |
| 	mbool	wfWidthStar=FALSE, wfFlagR=FALSE, wfFlagT=FALSE;
 | |
| 	char	cType, sNum[30], cAddLeft, sR[2], *sAddRight=sR;
 | |
| 	DEC	dCopy, *pCopy=&dCopy;
 | |
| 
 | |
| 	sAddRight[0]='\0';
 | |
| 	wFStart=0;
 | |
| 
 | |
| /* trace through format	specification, storing parameters */
 | |
| 
 | |
| 	/* set flags */
 | |
| 	wfTemp=TRUE;
 | |
| 	while (wfTemp)	{
 | |
| 		wFStart++;
 | |
| 		cType =	fmt[wFStart];
 | |
| 		if (cType=='-')
 | |
| 			wJust =	3;
 | |
| 		else if	(cType==cGMFmtDlr)
 | |
| 			wJust=(wJust > 2) ? wJust : 2;
 | |
| 		else if	(cType=='#')
 | |
| 			wfFlagNumber=TRUE;
 | |
| 		else if	(cType==' ')
 | |
| 			wFlag =	(wFlag > 1) ? wFlag : 1;
 | |
| 		else if	(cType=='+')
 | |
| 			wFlag =	(wFlag > 2) ? wFlag : 2;
 | |
| 		else if	(cType==cGMFmtNegRgt2)
 | |
| 			wFlag =	(wFlag > 3) ? wFlag : 3;
 | |
| 		else if	(cType==cGMFmtNegRgt1)
 | |
| 			wFlag =	(wFlag > 4) ? wFlag : 4;
 | |
| 		else if	(cType==cGMFmtNegBrkt)
 | |
| 			wFlag =	(wFlag > 5) ? wFlag : 5;
 | |
| 		else if	(cType==cGMFmtNegPar)
 | |
| 			wFlag =	(wFlag > 6) ? wFlag : 6;
 | |
| 		else if	(cType==cGMFmtZeroBlC)
 | |
| 			wfZeroBlC=TRUE;
 | |
| 		else if	(cType==cGMFmtZeroBlS)
 | |
| 			wfZeroBlS=TRUE;
 | |
| 		else wfTemp=FALSE;
 | |
| 	}
 | |
| 
 | |
| 	/* determine width */
 | |
| 	if (fmt[wFStart]=='0')	{
 | |
| 		wJust =	(wJust > 1) ? wJust : 1;
 | |
| 		wFStart++;
 | |
| 	}
 | |
| 	while (fmt[wFStart]>='0'&&fmt[wFStart]<='9')  {
 | |
| 		wWidth=wWidth*10+fmt[wFStart]-(int) '0';
 | |
| 		wFStart++;
 | |
| 	}
 | |
| 
 | |
| 	if (fmt[wFStart]=='*') {
 | |
| 		wWidth = wGMStar;
 | |
| 		wfWidthStar=TRUE;
 | |
| 		wFStart++;
 | |
| 	}
 | |
| 
 | |
| 	/* determine precision */
 | |
| 	if (fmt[wFStart]=='.')	{
 | |
| 		wFStart++;
 | |
| 		wPrec=0;
 | |
| 		while (fmt[wFStart]>='0'&&fmt[wFStart]<='9') {
 | |
| 			wPrec=wPrec*10+fmt[wFStart]-(int) '0';
 | |
| 			wFStart++;
 | |
| 		}
 | |
| 		if (fmt[wFStart]=='*')	{
 | |
| 			wPrec =	wfWidthStar?wGMStar2:wGMStar;
 | |
| 			wFStart++;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/* ignore F, N,	h, l, L	*/
 | |
| 	while (fmt[wFStart]=='F' || fmt[wFStart]=='N' ||
 | |
| 		fmt[wFStart]=='L' || fmt[wFStart]=='h' ||
 | |
| 		fmt[wFStart]=='l')
 | |
| 			wFStart++;
 | |
| 
 | |
| /* rounding & truncation flags */
 | |
| 	while (fmt[wFStart]==cGMFmtRnd || fmt[wFStart]==cGMFmtTrunc) {
 | |
| 		if (fmt[wFStart]==cGMFmtRnd)
 | |
| 			wfFlagR=TRUE;
 | |
| 		if (fmt[wFStart]==cGMFmtTrunc)
 | |
| 			wfFlagT=TRUE;
 | |
| 		wFStart++;
 | |
| 	}
 | |
| 
 | |
| 	cType=fmt[wFStart];
 | |
| 
 | |
| /* bad character ==> print rest	of format */
 | |
| 	wfTemp=FALSE;
 | |
| 	while (!(cType==cGMFmt || cType==cGMFmtComma ||	cType==cGMFmtSci ||
 | |
| 		cType==cGMFmtSciE || cType==cGMFmtEng || cType==cGMFmtEngE)) {
 | |
| 		s[wOut]=fmt[wFStart];
 | |
| 		wOut++;
 | |
| 		wFStart++;
 | |
| 		cType=fmt[wFStart];
 | |
| 		wfTemp=TRUE;
 | |
| 	}
 | |
| 	if (wfTemp)  {
 | |
| 		s[wOut]=fmt[wFStart];
 | |
| 		wOut++;
 | |
| 		s[wOut]='\0';
 | |
| 		/* return global flags to default values */
 | |
| 		wfFlagNumber=FALSE;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (!x || _MacBad(x))  {
 | |
| 		if (wJust!=3)
 | |
| 			for (i=6;i<wWidth;i++)	{
 | |
| 				s[wOut]=' ';
 | |
| 				wOut++;
 | |
| 			}
 | |
| 		s[wOut]='(';
 | |
| 		s[wOut+1]='n';
 | |
| 		s[wOut+2]='u';
 | |
| 		s[wOut+3]='l';
 | |
| 		s[wOut+4]='l';
 | |
| 		s[wOut+5]=')';
 | |
| 		wOut+=6;
 | |
| 		if (wJust==3)
 | |
| 			for (i=6;i<wWidth;i++)	{
 | |
| 				s[wOut]=' ';
 | |
| 				wOut++;
 | |
| 			}
 | |
| 		s[wOut]='\0';
 | |
| 
 | |
| 		/* return global flags to default values */
 | |
| 		wfFlagNumber=FALSE;
 | |
| 		if (!x)
 | |
| 			_MacErr(GM_NULLPOINTER);
 | |
| 		else
 | |
| 			_MacErr(GM_INIT);
 | |
| 		return;
 | |
| 		}
 | |
| 
 | |
| 	wfGMRound = wfFlagR || !wfFlagT;
 | |
| 	if (cType==cGMFmtSciE || cType==cGMFmtEngE)
 | |
| 		cGMSymExp = 'E';
 | |
| 
 | |
| /* take	absolute value of source, necessary for	left padding of	zeroes */
 | |
| 	_MacDCopy(pCopy, x);
 | |
| 	if (_MacIsDecN(pCopy))	{
 | |
| 		_MacDChgs(pCopy);
 | |
| 		wfIsNeg=TRUE;
 | |
| 	}
 | |
| 
 | |
| /* convert number using	proper function	*/
 | |
| 	if (cType==cGMFmt)  {
 | |
| 		if (wPrec==-1)
 | |
| 			ConvDecimalToAscii(sNum, pCopy);
 | |
| 		else
 | |
| 			ConvDecimalToAsciiRound(sNum, pCopy, wPrec);
 | |
| 		}
 | |
| 
 | |
| 	if (cType==cGMFmtComma)	 {
 | |
| 		if (wPrec==-1)
 | |
| 			ConvDecimalToAsciiComma(sNum, pCopy);
 | |
| 		else
 | |
| 			ConvDecimalToAsciiCommaRound(sNum, pCopy, wPrec);
 | |
| 		}
 | |
| 
 | |
| 	if (cType==cGMFmtSci ||	cType==cGMFmtSciE)
 | |
| 		ConvDecimalToScientific	(sNum, pCopy, wPrec);
 | |
| 
 | |
| 	if (cType==cGMFmtEng ||	cType==cGMFmtEngE)
 | |
| 		ConvDecimalToEngineering(sNum, pCopy, wPrec);
 | |
| 
 | |
| 	wfGMRound=TRUE;
 | |
| 	cGMSymExp='e';
 | |
| 
 | |
| /* check if number is zero */
 | |
| 	wfIsZero=_MacIsDecZ(x);
 | |
| /* check if number was rounded to zero */
 | |
| 	if (wPrec!=-1 && (wFlag==5 || wFlag==6 || wfZeroBlC || wfZeroBlS)
 | |
| 		&& cType!=cGMFmtSci && cType!=cGMFmtSciE
 | |
| 		&& cType!=cGMFmtEng && cType!=cGMFmtEngE)  {
 | |
| 			wfIsZero=TRUE;
 | |
| 			for (i=0;wfIsZero&&sNum[i]!='\0';i++)
 | |
| 				if (sNum[i]>='1' && sNum[i]<='9')
 | |
| 					wfIsZero=FALSE;
 | |
| 			}
 | |
| 
 | |
| 	if (wfZeroBlC && wfIsZero) {
 | |
| 		for (i=0;i<wWidth;i++)	{
 | |
| 			s[wOut]=cGMFmtZero;
 | |
| 			wOut++;
 | |
| 		}
 | |
| 		s[wOut]='\0';
 | |
| 		/* return global flags to default values */
 | |
| 		wfFlagNumber=FALSE;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (wfZeroBlS && wfIsZero) {
 | |
| 		wTotLen=strlen(sGMFmtZeroStr);
 | |
| 		if (wJust!=3)
 | |
| 			for (i=wTotLen;i<wWidth;i++)  {
 | |
| 				s[wOut]=' ';
 | |
| 				wOut++;
 | |
| 			}
 | |
| 		for (i=0;sGMFmtZeroStr[i]!='\0';i++)  {
 | |
| 			s[wOut]=sGMFmtZeroStr[i];
 | |
| 			wOut++;
 | |
| 		}
 | |
| 		if (wJust==3)
 | |
| 			for (i=wTotLen;i<wWidth;i++)  {
 | |
| 				s[wOut]=' ';
 | |
| 				wOut++;
 | |
| 			}
 | |
| 		s[wOut]='\0';
 | |
| 		/* return global flags to default values */
 | |
| 		wfFlagNumber=FALSE;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| /* determine character to add on left and string to add	on right (if any) */
 | |
| 	wfAddLeft=TRUE;
 | |
| 	wfAddRight=FALSE;
 | |
| 	switch (wFlag) {
 | |
| 		case 0:	 {
 | |
| 			wfAddLeft=wfIsNeg;
 | |
| 			cAddLeft='-';
 | |
| 			break;
 | |
| 		}
 | |
| 		case 1:	 {
 | |
| 			cAddLeft=(wfIsNeg) ? (char) '-'	: (char) ' ';
 | |
| 			break;
 | |
| 		}
 | |
| 		case 2:	 {
 | |
| 			cAddLeft=(wfIsNeg) ? (char) '-'	: (char) '+';
 | |
| 			break;
 | |
| 		}
 | |
| 		case 3:	 {
 | |
| 			wfAddLeft =FALSE;
 | |
| 			wfAddRight=TRUE;
 | |
| 			sAddRight=(wfIsZero) ? sGMFmt2Zero :
 | |
| 				((wfIsNeg) ? sGMFmt2Neg	: sGMFmt2Pos);
 | |
| 			break;
 | |
| 			}
 | |
| 		case 4:	 {
 | |
| 			wfAddLeft =FALSE;
 | |
| 			wfAddRight=TRUE;
 | |
| 			sAddRight=(wfIsZero) ? sGMFmt1Zero :
 | |
| 				((wfIsNeg) ? sGMFmt1Neg	: sGMFmt1Pos);
 | |
| 			break;
 | |
| 			}
 | |
| 		case 5:	 {
 | |
| 			cAddLeft=(wfIsNeg) ? cGMFmtSurrL : ' ';
 | |
| 			wfAddRight=TRUE;
 | |
| 			sAddRight[0]=(wfIsNeg) ? cGMFmtSurrR : ' ';
 | |
| 			sAddRight[1]='\0';
 | |
| 			break;
 | |
| 		}
 | |
| 		case 6:	 {
 | |
| 			cAddLeft=(wfIsNeg) ? (char) '('	: (char) ' ';
 | |
| 			wfAddRight=TRUE;
 | |
| 			sAddRight[0]=(wfIsNeg) ? (char)	')' : (char) ' ';
 | |
| 			sAddRight[1]='\0';
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| /* add prefixed	character & spaces/zeroes to justify */
 | |
| 	wTotLen	= strlen(sNum) + (wfAddLeft ? 1	: 0) +
 | |
| 		(wfAddRight ? strlen(sAddRight)	: 0);
 | |
| 
 | |
| /* add spaces on left if right justified */
 | |
| 	if (wJust==0)
 | |
| 		for(i=wTotLen;i<wWidth;i++)  {
 | |
| 			s[wOut]=' ';
 | |
| 			wOut++;
 | |
| 		}
 | |
| 
 | |
| /* add sign on left */
 | |
| 	if (wfAddLeft)	{
 | |
| 		s[wOut]=cAddLeft;
 | |
| 		wOut++;
 | |
| 	}
 | |
| 
 | |
| /* add $'s on left */
 | |
| 	if (wJust==2)
 | |
| 		for (i=wTotLen;i<wWidth;i++)  {
 | |
| 			s[wOut]='$';
 | |
| 			wOut++;
 | |
| 		}
 | |
| 
 | |
| /* add zeroes on left */
 | |
| 	if (wJust==1)  {
 | |
| 		t = ((wPrec==-1) ? x->dc.id : wPrec) + 1;
 | |
| 		if (t==1&&!wfFlagNumber)
 | |
| 			t--;
 | |
| 		for (i=wTotLen;i<wWidth;i++)  {
 | |
| 			if ((cType==cGMFmtComma) &&
 | |
| 	   ((wWidth+wTotLen-((wfAddLeft?1:0)+t+i+strlen(sAddRight)))%4)==0 &&
 | |
| 			(i>wTotLen))
 | |
| 				s[wOut]=',';
 | |
| 			else
 | |
| 				s[wOut]	= '0';
 | |
| 			wOut++;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| /* copy	number */
 | |
| 	for (i=0;sNum[i]!='\0';i++)  {
 | |
| 		s[wOut]=sNum[i];
 | |
| 		wOut++;
 | |
| 	}
 | |
| 
 | |
| /* copy	symbols	on right */
 | |
| 	if (wfAddRight)
 | |
| 		for (i=0;sAddRight[i]!='\0';i++)  {
 | |
| 			s[wOut]=sAddRight[i];
 | |
| 			wOut++;
 | |
| 		}
 | |
| 
 | |
| /* pad spaces on right */
 | |
| 	if (wJust==3)
 | |
| 		for (i=wTotLen;i<wWidth;i++)  {
 | |
| 			s[wOut]=' ';
 | |
| 			wOut++;
 | |
| 		}
 | |
| 
 | |
| 	/* return global flags to default values */
 | |
| 	wfFlagNumber=FALSE;
 | |
| 
 | |
| 	s[wOut]='\0';
 | |
| 	return;
 | |
| }
 | |
| 
 |