ba237a9d91
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;
|
|
}
|
|
|