campo-sirio/gfm/dtoaf.c
alex ba237a9d91 Patch level : no patch
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
2002-02-26 12:19:02 +00:00

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