Files correlati :gfm.dll Ricompilazione Demo : [ ] Commento :riportate sulla 2.1 le correzioni sulla gfm.dll della 2.0 git-svn-id: svn://10.65.10.50/trunk@11815 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			334 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			334 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* int	_ScanfAux(wOpt,	sBuffer, sFmt, arg,)
 | 
						|
 *
 | 
						|
 * ARGUMENT
 | 
						|
 *	int	wOpt;
 | 
						|
 *	char	*sFmt, *sBuffer;
 | 
						|
 *	(?)	arg;
 | 
						|
 *
 | 
						|
 * DESCRIPTION
 | 
						|
 *	Auxiliary function called by ScanDecimal, StringScanDecimal,
 | 
						|
 *  and	FileScanDecimal, which does all	the work.  According to	the format
 | 
						|
 *  string sFmt, the arguments are read	and stored in the appropriate
 | 
						|
 *  locations, with DEC's read as strings and then converted to	DEC's.
 | 
						|
 *	wOpt tells the source of input:	1 for stdio, 2 for a string,
 | 
						|
 *  and	3 for a	file.  sBuffer is the source string for	StringScanDecimal,
 | 
						|
 *  while sBuffer is a (char *)	cast of	the file pointer for file input.
 | 
						|
 *
 | 
						|
 * SIDE	EFFECTS
 | 
						|
 *	Each argument is set to	the correct value.
 | 
						|
 *
 | 
						|
 * RETURNS
 | 
						|
 *	The number of fields scanned, the return from scanf/fscanf/sscanf.
 | 
						|
 *
 | 
						|
 * POSSIBLE ERRORS
 | 
						|
 *	GM_NULLPOINTER
 | 
						|
 *	GM_NULLSTRING
 | 
						|
 *	GM_INVALIDID
 | 
						|
 *	GM_CNVRW
 | 
						|
 *	GM_CNVRE
 | 
						|
 *	GM_NAN
 | 
						|
 *	GM_EOF
 | 
						|
 *
 | 
						|
 * AUTHOR
 | 
						|
 *  Jared Levy
 | 
						|
 *   Copyright (C) 1987-1990 Greenleaf Software	Inc.  All rights reserved.
 | 
						|
 *
 | 
						|
 * MODIFICATIONS
 | 
						|
 *
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <malloc.h>
 | 
						|
#include "gm.h"
 | 
						|
#include "gmsystem.h"
 | 
						|
 | 
						|
int _ScanfAux(int wOpt,char *	sBuffer, char * sFmt, ELLIPSES)
 | 
						|
{
 | 
						|
	char	sNewFmt[256], cType, *pStrArr[21], *pTemp;
 | 
						|
	int	*pInVal, pOutVal[21];
 | 
						|
	int	wInArg,	wOutArg, i, j, wPrec=-1, wPrecArr[21], wNumD=0,wTot=0;
 | 
						|
	int	wValid;
 | 
						|
	mbool	wfStar,	wfFlagR=FALSE, wfFlagT=FALSE, wfRoundArr[21];
 | 
						|
	mbool	wfRegChar, wfDecChar;
 | 
						|
#ifndef	LATTICE
 | 
						|
#ifndef	_LDATA
 | 
						|
	mbool	wfFar;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
	DEC	*pDecArr[21], *pRes, *pDec;
 | 
						|
#ifdef _LDATA
 | 
						|
	long	*pLong;
 | 
						|
	int	*pLow;
 | 
						|
#endif
 | 
						|
 | 
						|
	if (wOpt>1 && !sBuffer)	 {
 | 
						|
		_MacErr(GM_NULLSTRING);
 | 
						|
		return(0);
 | 
						|
	}
 | 
						|
 | 
						|
/* create new variable list */
 | 
						|
	pInVal = (int *) &sFmt;
 | 
						|
	wInArg = sizeof(char *)	/ sizeof(int);
 | 
						|
	wOutArg	= 0;
 | 
						|
 | 
						|
	j=0;
 | 
						|
	i=0;
 | 
						|
/* trace through format	string */
 | 
						|
	while (sFmt[i]!='\0')  {
 | 
						|
		sNewFmt[j]=sFmt[i];		/* copy	character */
 | 
						|
		i++;
 | 
						|
		j++;
 | 
						|
		if (sFmt[i-1]=='%')  {		/* copy	specification */
 | 
						|
#ifndef	LATTICE
 | 
						|
#ifndef	_LDATA
 | 
						|
			wfFar=FALSE;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
			if (sFmt[i]=='*')  {		/* star	prefix */
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
				wfStar=TRUE;
 | 
						|
			}
 | 
						|
			else
 | 
						|
				wfStar=FALSE;
 | 
						|
 | 
						|
			while (sFmt[i]>='0'&&sFmt[i]<='9')  {  /* width	*/
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
			}
 | 
						|
			if (sFmt[i]=='.')  {	/* precision for DEC */
 | 
						|
				i++;
 | 
						|
				wPrec=0;
 | 
						|
				while (sFmt[i]>='0'&&sFmt[i]<='9')  {
 | 
						|
					wPrec=wPrec*10+sFmt[i]-'0';
 | 
						|
					i++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
#ifndef	LATTICE
 | 
						|
			if (sFmt[i]=='F')  {		/* far pointers	*/
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
#ifndef	_LDATA
 | 
						|
				wfFar=TRUE;
 | 
						|
#endif
 | 
						|
			}
 | 
						|
			else if	(sFmt[i]=='N')	{	/* near	pointers */
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
			}
 | 
						|
#endif
 | 
						|
			if (sFmt[i]=='l')  {		/* long	types */
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
			}
 | 
						|
#ifndef	LATTICE
 | 
						|
			else if	(sFmt[i]=='h')	{	/* short types */
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
			}
 | 
						|
#endif
 | 
						|
			while (sFmt[i]==cGMFmtRnd || sFmt[i]==cGMFmtTrunc) {
 | 
						|
				if (sFmt[i]==cGMFmtRnd)
 | 
						|
					wfFlagR=TRUE;
 | 
						|
				if (sFmt[i]==cGMFmtTrunc)
 | 
						|
					wfFlagT=TRUE;
 | 
						|
				i++;
 | 
						|
			}
 | 
						|
 | 
						|
			cType=sFmt[i];			/* find	type */
 | 
						|
			wfRegChar = (cType=='d'||cType=='o'||cType=='x'||
 | 
						|
#ifdef TURBOC
 | 
						|
			cType=='F'||
 | 
						|
#else
 | 
						|
			cType=='g'||
 | 
						|
#endif
 | 
						|
			cType=='u'||cType=='n'||
 | 
						|
#ifndef	LATTICE
 | 
						|
			cType=='D'||cType=='O'||cType=='X'||cType=='i'||
 | 
						|
			cType=='I'||cType=='U'||cType=='E'||cType=='p'||
 | 
						|
			cType=='['||
 | 
						|
#endif
 | 
						|
#ifdef _MSC
 | 
						|
			cType=='G'||
 | 
						|
#endif
 | 
						|
			cType=='f'||cType=='e'||cType=='c'||cType=='s');
 | 
						|
 | 
						|
			wfDecChar = (cType==cGMFmt||cType==cGMFmtComma||
 | 
						|
				     cType==cGMFmtSci||cType==cGMFmtSciE||
 | 
						|
				     cType==cGMFmtEng||cType==cGMFmtEngE);
 | 
						|
 | 
						|
			if (wfRegChar)	{	/* regular C type */
 | 
						|
				/* copy	format string */
 | 
						|
				if (cType=='[')
 | 
						|
					while (sFmt[i]!=']'&&sFmt[i]!='\0') {
 | 
						|
						sNewFmt[j]=sFmt[i];
 | 
						|
						i++;
 | 
						|
						j++;
 | 
						|
					}
 | 
						|
				else {
 | 
						|
					sNewFmt[j]=cType;
 | 
						|
					i++;
 | 
						|
					j++;
 | 
						|
				}
 | 
						|
 | 
						|
				/* copy	pointer	*/
 | 
						|
				if (!wfStar)  {
 | 
						|
					pOutVal[wOutArg]=pInVal[wInArg];
 | 
						|
					wOutArg++;
 | 
						|
					wInArg++;
 | 
						|
#ifndef	LATTICE
 | 
						|
#ifndef	_LDATA
 | 
						|
					if (wfFar)  {
 | 
						|
					pOutVal[wOutArg]=pInVal[wInArg];
 | 
						|
						wInArg++;
 | 
						|
						wOutArg++;
 | 
						|
					}
 | 
						|
#else
 | 
						|
					pOutVal[wOutArg]=pInVal[wInArg];
 | 
						|
					wInArg++;
 | 
						|
					wOutArg++;
 | 
						|
#endif
 | 
						|
 | 
						|
#else
 | 
						|
#ifdef _LDATA
 | 
						|
					pOutVal[wOutArg]=pInVal[wInArg];
 | 
						|
					wInArg++;
 | 
						|
					wOutArg++;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
/* n's and *'s don't count towards total values	*/
 | 
						|
					if (cType!='n')
 | 
						|
						wTot++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if (wfDecChar)	{	/* DEC type */
 | 
						|
				sNewFmt[j]='8';	/* limit string	length to */
 | 
						|
				j++;		/*  80 characters (buffer) */
 | 
						|
				sNewFmt[j]='0';
 | 
						|
				j++;
 | 
						|
				sNewFmt[j]='s';	/* put s in format string */
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
 | 
						|
				if (!wfStar)  {
 | 
						|
					/* store DEC pointer */
 | 
						|
#ifdef _LDATA
 | 
						|
					pLong =	(long *) &pInVal[wInArg];
 | 
						|
					pDec = (DEC *) *pLong;
 | 
						|
#else
 | 
						|
					pDec = (DEC *) pInVal[wInArg];
 | 
						|
#endif
 | 
						|
					pDecArr[wNumD]=pDec;
 | 
						|
 | 
						|
					/* create & store string pointer */
 | 
						|
					wInArg++;
 | 
						|
					pTemp=calloc(81,sizeof(char));
 | 
						|
					pStrArr[wNumD]=pTemp;
 | 
						|
					pTemp[0]='\0';
 | 
						|
#ifdef _LDATA
 | 
						|
					pLow=(int *) &pTemp;
 | 
						|
					pOutVal[wOutArg]=*pLow;
 | 
						|
					wOutArg++;
 | 
						|
					pOutVal[wOutArg]=*(pLow+1);
 | 
						|
					wInArg++;
 | 
						|
#else
 | 
						|
					pOutVal[wOutArg]=(int) pStrArr[wNumD];
 | 
						|
#endif
 | 
						|
					wOutArg++;
 | 
						|
 | 
						|
				/* store other information */
 | 
						|
					wPrecArr[wNumD]=wPrec;
 | 
						|
					wfRoundArr[wNumD]=wfFlagR || !wfFlagT;
 | 
						|
					wNumD++;
 | 
						|
					wTot++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if (!wfRegChar && !wfDecChar)  {	/* neither */
 | 
						|
				sNewFmt[j]=sFmt[i];
 | 
						|
				i++;
 | 
						|
				j++;
 | 
						|
			}
 | 
						|
 | 
						|
			wPrec=-1;		/* reset flags */
 | 
						|
			wfFlagR=FALSE;
 | 
						|
			wfFlagT=FALSE;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	sNewFmt[j]='\0';
 | 
						|
 | 
						|
/* scan	input */
 | 
						|
 | 
						|
/* stdio input */
 | 
						|
	if (wOpt==1)
 | 
						|
	i=scanf(sNewFmt,
 | 
						|
		pOutVal[0], pOutVal[1],	pOutVal[2], pOutVal[3],	pOutVal[4],
 | 
						|
		pOutVal[5], pOutVal[6],	pOutVal[7], pOutVal[8],	pOutVal[9]
 | 
						|
	,pOutVal[10], pOutVal[11], pOutVal[12],	pOutVal[13], pOutVal[14],
 | 
						|
	 pOutVal[15], pOutVal[16], pOutVal[17],	pOutVal[18], pOutVal[19]
 | 
						|
		);
 | 
						|
 | 
						|
/* string input	*/
 | 
						|
	if (wOpt==2)
 | 
						|
	i=sscanf(sBuffer, sNewFmt,
 | 
						|
		pOutVal[0], pOutVal[1],	pOutVal[2], pOutVal[3],	pOutVal[4],
 | 
						|
		pOutVal[5], pOutVal[6],	pOutVal[7], pOutVal[8],	pOutVal[9]
 | 
						|
	,pOutVal[10], pOutVal[11], pOutVal[12],	pOutVal[13], pOutVal[14],
 | 
						|
	 pOutVal[15], pOutVal[16], pOutVal[17],	pOutVal[18], pOutVal[19]
 | 
						|
		);
 | 
						|
 | 
						|
/* file	input */
 | 
						|
	if (wOpt==3)
 | 
						|
	i=fscanf((FILE *) sBuffer, sNewFmt,
 | 
						|
		pOutVal[0], pOutVal[1],	pOutVal[2], pOutVal[3],	pOutVal[4],
 | 
						|
		pOutVal[5], pOutVal[6],	pOutVal[7], pOutVal[8],	pOutVal[9]
 | 
						|
	,pOutVal[10], pOutVal[11], pOutVal[12],	pOutVal[13], pOutVal[14],
 | 
						|
	 pOutVal[15], pOutVal[16], pOutVal[17],	pOutVal[18], pOutVal[19]
 | 
						|
		);
 | 
						|
 | 
						|
	wValid=i;
 | 
						|
 | 
						|
/* convert DEC's from ascii & store */
 | 
						|
	for (j=0;j<wNumD;j++)  {
 | 
						|
		if (!pDecArr[j])
 | 
						|
			{_MacErr(GM_NULLPOINTER);}
 | 
						|
		else if	(pStrArr[j][0]!='\0')  {
 | 
						|
/* use appropriate rounding & precision	specs */
 | 
						|
			wfGMRound=wfRoundArr[j];
 | 
						|
			wPrec=wPrecArr[j];
 | 
						|
/* convert with	appropriate routine */
 | 
						|
			if (wPrec==-1)
 | 
						|
				pRes = ConvAsciiToDecimal(pDecArr[j],
 | 
						|
					pStrArr[j]);
 | 
						|
			else
 | 
						|
				pRes = ConvAsciiToDecimalRound(
 | 
						|
					pDecArr[j], pStrArr[j],	wPrec);
 | 
						|
/* if pRes is null, don't count	as valid input */
 | 
						|
			if (!pRes && i!=EOF)
 | 
						|
				wValid--;
 | 
						|
		}
 | 
						|
/* free	allocated string memory	*/
 | 
						|
#ifdef	LATTICE
 | 
						|
		free(pStrArr[j]);
 | 
						|
#else
 | 
						|
		free(pStrArr[j]);
 | 
						|
#endif
 | 
						|
	}
 | 
						|
 | 
						|
	wfGMRound=TRUE;
 | 
						|
	if (i<wTot)
 | 
						|
		_MacErr(GM_EOF);
 | 
						|
 | 
						|
	return(wValid);
 | 
						|
}
 |