Files correlati : gfm.dll Ricompilazione Demo : [ ] Commento : Modifiche per la compilazione Linux git-svn-id: svn://10.65.10.50/trunk@11079 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			301 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* int	StringPrintDecimal(buffer, fmt,	arg,)
 | 
						|
 *
 | 
						|
 * ARGUMENT
 | 
						|
 *	char	*fmt, *buffer;
 | 
						|
 *	(?)	arg;
 | 
						|
 *
 | 
						|
 * DESCRIPTION
 | 
						|
 *	Prints out arguments, which may	include	DEC structures,
 | 
						|
 *   into a string in formatted	form, according
 | 
						|
 *   to	the format string fmt.	The function converts the DEC's	to strings
 | 
						|
 *   and calls printf.
 | 
						|
 *
 | 
						|
 * SIDE	EFFECTS
 | 
						|
 *	None.
 | 
						|
 *
 | 
						|
 * RETURNS
 | 
						|
 *	The number of characters printed, the return from sprintf.
 | 
						|
 *
 | 
						|
 * POSSIBLE ERRORS
 | 
						|
 *	GM_NULLPOINTER
 | 
						|
 *	GM_NULLSTRING
 | 
						|
 *	GM_INVALIDID
 | 
						|
 *	GM_CNVRW
 | 
						|
 *
 | 
						|
 * AUTHOR
 | 
						|
 *  Jared Levy
 | 
						|
 *   Copyright (C) 1987-1990 Greenleaf Software	Inc.  All rights reserved.
 | 
						|
 *
 | 
						|
 * MODIFICATIONS
 | 
						|
 *
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include "gmsystem.h"
 | 
						|
 | 
						|
static int _StackSize(char, char);
 | 
						|
 | 
						|
int StringPrintDecimal(char * buffer, char * fmt, ELLIPSES)
 | 
						|
{
 | 
						|
	char	newfmt[256], lastcode, thiscode;
 | 
						|
	int	*inval,	outval[21];
 | 
						|
	SHORT	i,j,k,l, inarg,	outarg,	wNumStar, wStack;
 | 
						|
	mbool	wfRegChar, wfDecChar, wfOld3Color;
 | 
						|
	DEC	*pDec;
 | 
						|
#ifdef _LDATA
 | 
						|
	long	*pLong;
 | 
						|
#endif
 | 
						|
 | 
						|
	_MacStart(GM_DSPRINTF);
 | 
						|
 | 
						|
	wfOld3Color = wfGM3Color;
 | 
						|
 | 
						|
	if (!fmt || !buffer)  {
 | 
						|
		if (buffer)
 | 
						|
			buffer[0]='\0';
 | 
						|
		wfGM3Color = FALSE;
 | 
						|
		_MacErr(GM_NULLSTRING);
 | 
						|
		wfGM3Color = wfOld3Color;
 | 
						|
		_MacRet(0);
 | 
						|
	}
 | 
						|
 | 
						|
	inval =	(int *)	&fmt;
 | 
						|
/* int casting guarantees 16 bit word size regardless of model */
 | 
						|
	inarg =	sizeof(char *) / sizeof(int);
 | 
						|
	outarg = 0;
 | 
						|
 | 
						|
/* trace through format	string */
 | 
						|
	i=0;
 | 
						|
	j=0;
 | 
						|
 | 
						|
	if (wfGM3Color)	 {
 | 
						|
		newfmt[j]=cGMCodeNon;
 | 
						|
		lastcode=cGMCodeNon;
 | 
						|
		j++;
 | 
						|
	}
 | 
						|
 | 
						|
	while (fmt[i]!='\0')  {
 | 
						|
		if (fmt[i]!='%')  {
 | 
						|
			if (wfGM3Color && (lastcode!=cGMCodeNon))  {
 | 
						|
				newfmt[j]=cGMCodeNon;
 | 
						|
				lastcode=cGMCodeNon;
 | 
						|
				j++;
 | 
						|
			}
 | 
						|
			newfmt[j]=fmt[i];		/* copy	element	*/
 | 
						|
			j++;
 | 
						|
			i++;
 | 
						|
		}
 | 
						|
 | 
						|
		else  {
 | 
						|
			/* check for specification */
 | 
						|
			wfRegChar=FALSE;
 | 
						|
			wfDecChar=FALSE;
 | 
						|
			wNumStar=0;
 | 
						|
			k=i;
 | 
						|
			do {
 | 
						|
				k++;
 | 
						|
				if (fmt[k]=='d'||fmt[k]=='u'||
 | 
						|
				    fmt[k]=='o'||fmt[k]=='x'||
 | 
						|
				    fmt[k]=='f'||fmt[k]=='e'||
 | 
						|
				    fmt[k]=='g'||fmt[k]=='c'||
 | 
						|
				    fmt[k]=='X'||fmt[k]=='E'||
 | 
						|
				    fmt[k]=='p'||fmt[k]=='G'||
 | 
						|
#ifdef LATTICE
 | 
						|
				    fmt[k]=='P'||
 | 
						|
#else
 | 
						|
				    fmt[k]=='i'||fmt[k]=='n'||
 | 
						|
#endif
 | 
						|
				    fmt[k]=='s')
 | 
						|
					    wfRegChar =	TRUE;
 | 
						|
 | 
						|
				if (fmt[k]==cGMFmt   ||fmt[k]==cGMFmtComma||
 | 
						|
				    fmt[k]==cGMFmtSci||fmt[k]==cGMFmtSciE ||
 | 
						|
				    fmt[k]==cGMFmtEng||fmt[k]==cGMFmtEngE)
 | 
						|
					    wfDecChar =	TRUE;
 | 
						|
 | 
						|
				if (fmt[k]=='*')
 | 
						|
					wNumStar++;
 | 
						|
 | 
						|
			} while	(fmt[k]!='\0'&&!wfRegChar&&
 | 
						|
				!wfDecChar&&fmt[k]!='%');
 | 
						|
 | 
						|
			if (wfRegChar)	{	/* regular C type */
 | 
						|
				/* copy	arguments into output list */
 | 
						|
				/* find	size of	argument */
 | 
						|
				wStack = _StackSize(fmt[k],fmt[k-1]);
 | 
						|
				/* each	* requires an additional argument */
 | 
						|
				for (l=0;l<wNumStar+wStack;l++)	 {
 | 
						|
					outval[outarg]=inval[inarg];
 | 
						|
					outarg++;
 | 
						|
					inarg++;
 | 
						|
				}
 | 
						|
 | 
						|
				if (wfGM3Color && (lastcode!=cGMCodeNon))  {
 | 
						|
					newfmt[j]=cGMCodeNon;
 | 
						|
					lastcode=cGMCodeNon;
 | 
						|
					j++;
 | 
						|
				}
 | 
						|
 | 
						|
				/* copy	format string */
 | 
						|
				while (i<=k)  {
 | 
						|
					newfmt[j]=fmt[i];
 | 
						|
					i++;
 | 
						|
					j++;
 | 
						|
				}
 | 
						|
			}  /*  regular C type */
 | 
						|
 | 
						|
			if (wfDecChar)	{	/* DEC type */
 | 
						|
				/* retrieve starred values */
 | 
						|
				if (wNumStar > 0)  {
 | 
						|
					wGMStar= inval[inarg];
 | 
						|
					inarg++;
 | 
						|
				}
 | 
						|
				if (wNumStar > 1)  {
 | 
						|
					wGMStar2= inval[inarg];
 | 
						|
					inarg++;
 | 
						|
				}
 | 
						|
 | 
						|
				/* find	DEC pointer */
 | 
						|
#ifdef _LDATA
 | 
						|
				pLong =	(long *) &inval[inarg];
 | 
						|
				pDec = (DEC *) *pLong;
 | 
						|
#else
 | 
						|
				pDec = (DEC *) inval[inarg];
 | 
						|
#endif
 | 
						|
 | 
						|
				if (wfGM3Color)	 {
 | 
						|
					if (!pDec || _MacBad(pDec))
 | 
						|
						thiscode = cGMCodeNon;
 | 
						|
					else if	(_MacIsDecN(pDec))
 | 
						|
						thiscode = cGMCodeNeg;
 | 
						|
					else
 | 
						|
						thiscode = cGMCodePos;
 | 
						|
					if (lastcode!=thiscode)	 {
 | 
						|
						newfmt[j]=thiscode;
 | 
						|
						lastcode=thiscode;
 | 
						|
						j++;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				/* convert to formatted	ascii */
 | 
						|
				wfGM3Color = FALSE;
 | 
						|
				_ConvDecimalToAsciiFormatted(&newfmt[j],
 | 
						|
					pDec, &fmt[i]);
 | 
						|
/*
 | 
						|
 * Lattice C 6.0 says I	should remove this line	since it is redundant.
 | 
						|
 * It looks to me like they are	right.
 | 
						|
 *
 | 
						|
 *				wfOld3Color = wfGM3Color; */
 | 
						|
				i = k+1;
 | 
						|
				j = strlen(newfmt);
 | 
						|
 | 
						|
				/* advance arg list once for small data,
 | 
						|
					twice for large	*/
 | 
						|
				inarg++;
 | 
						|
#ifdef _LDATA
 | 
						|
#ifndef M_I386
 | 
						|
				inarg++;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
			}  /* if (wfDecChar) */
 | 
						|
 | 
						|
			if (!wfRegChar && !wfDecChar)  {  /* neither */
 | 
						|
				if (wfGM3Color && (lastcode!=cGMCodeNon))  {
 | 
						|
					newfmt[j]=cGMCodeNon;
 | 
						|
					lastcode=cGMCodeNon;
 | 
						|
					j++;
 | 
						|
				}
 | 
						|
 | 
						|
				newfmt[j]=fmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
				if (fmt[i]!='\0')  {
 | 
						|
					newfmt[j]=fmt[i];
 | 
						|
					i++;
 | 
						|
					j++;
 | 
						|
				}
 | 
						|
			}  /* neither */
 | 
						|
 | 
						|
		} /* fmt[i]=='%' */
 | 
						|
	} /* while */
 | 
						|
 | 
						|
	newfmt[j]='\0';
 | 
						|
 | 
						|
/* print the output */
 | 
						|
	i=sprintf(buffer, newfmt,
 | 
						|
		outval[0], outval[1], outval[2], outval[3], outval[4],
 | 
						|
		outval[5], outval[6], outval[7], outval[8], outval[9]
 | 
						|
		,outval[10], outval[11], outval[12], outval[13], outval[14],
 | 
						|
		 outval[15], outval[16], outval[17], outval[18], outval[19]
 | 
						|
		);
 | 
						|
	_MacRet(i);
 | 
						|
}
 | 
						|
 | 
						|
/* finds number	of 16-bit words	on stack representing data element */
 | 
						|
static int	_StackSize(cType, cPrec)
 | 
						|
char	cType;
 | 
						|
char cPrec;
 | 
						|
{
 | 
						|
	int	w,x;
 | 
						|
 | 
						|
	switch (cType)	{
 | 
						|
		case 'c':  {
 | 
						|
			w = sizeof(char);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
 | 
						|
#ifndef	LATTICE
 | 
						|
	case 'i':
 | 
						|
#endif
 | 
						|
		case 'd': case 'o': case 'u': case 'x':	case 'X': {
 | 
						|
			if (cPrec=='l')
 | 
						|
				w = sizeof(long);
 | 
						|
			else
 | 
						|
				w = sizeof(int);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
 | 
						|
		case 'f': case 'e': case 'g': case 'E':	case 'G':  {
 | 
						|
			if (cPrec=='l')
 | 
						|
				w = sizeof(double);
 | 
						|
				/* usual arithmetic conversion */
 | 
						|
			else
 | 
						|
#ifdef _MSC
 | 
						|
			if (cPrec=='L')
 | 
						|
				w = sizeof(long	/*double*/);
 | 
						|
			else
 | 
						|
#endif
 | 
						|
				w = sizeof(double);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
 | 
						|
#ifdef LATTICE
 | 
						|
		case 'P':
 | 
						|
#else
 | 
						|
		case 'n':
 | 
						|
#endif
 | 
						|
		case 's': case 'p': {
 | 
						|
#ifndef	LATTICE
 | 
						|
#ifndef	M_I386
 | 
						|
#ifndef WIN32
 | 
						|
#ifndef __GNUC__
 | 
						|
			if (cPrec=='F')
 | 
						|
				w = sizeof(char	far *);
 | 
						|
			else if	(cPrec=='N')
 | 
						|
				w = sizeof(char	near *);
 | 
						|
			else
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
				w = sizeof(char	*);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	} /* switch */
 | 
						|
 | 
						|
	x = sizeof(int);
 | 
						|
	return((w+x-1)/x);	/* rounds up to	an integer */
 | 
						|
}
 |