3d88151f4d
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);
|
|
}
|