/* 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 #include #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='1' && sNum[i]<='9') wfIsZero=FALSE; } if (wfZeroBlC && wfIsZero) { for (i=0;idc.id : wPrec) + 1; if (t==1&&!wfFlagNumber) t--; for (i=wTotLen;iwTotLen)) 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