|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13184 (0x3380)
Types: TextFile
Names: »SCANF.C«
└─⟦4dd5d59b6⟧ Bits:30003303 Mix C version 2.1 og debugger til RC703
└─⟦this⟧ »SCANF.C«
└─⟦b6190e06c⟧ Bits:30003304 Mix C version 2.1 til RC703
└─⟦b6190e06c⟧ Bits:30005327 Mix C version 2.1 til RC703
└─⟦this⟧ »SCANF.C«
#include "stdio"
scanf(fs) /* standard routine */
char *fs;
æ
int getc();
int ungetc();
return _input(stdin, &fs, getc, ungetc);
å
fscanf(fp, fs) /* standard routine */
char *fp, *fs;
æ
int getc();
int ungetc();
return _input(fp, &fs, getc, ungetc);
å
sscanf(s,fs) /* standard routine */
char *s, *fs;
æ
int _mread();
int _mungetc();
return _input(&s, &fs, _mread, _mungetc);
å
_input(fp, parms, read, ungetc) /* input routine for */
/* scanf, sscanf, fscanf */
char *fp; /* pointer to input */
char **parms; /* pointer to addr of parameters */
int (*read)(); /* character read function */
int (*ungetc)(); /* character unget function */
æ
union æ /* buffer for numeric & string storage */
int integer;
char stringÆ81Å;
å buffer;
char *format; /* format string pointer */
char c; /* format string character */
char **ptr; /* pointer to pointer */
int base; /* number base */
int value; /* binary value of digit */
int pflag; /* real precision flag */
int asflag; /* assignment supression flag */
int sflag; /* sign flag */
int ch; /* input character */
int temp; /* temporary storage */
int i; /* loop counter */
int count; /* character count */
int width; /* maximum field width */
int status; /* status returned from the read */
int valid; /* valid real number format */
int (*acc)(); /* pointer to accumulate function */
int (*neg)(); /* pointer to negate function */
int (*asn)(); /* pointer to assign function */
int _digit(); /* decode digit function */
int _dint(); /* decode integer function */
int _dlong(); /* decode long function */
int _negint(); /* negate integer function */
int _neglong(); /* negate long function */
int _aint(); /* assign integer function */
int _along(); /* assign long function */
int _atoi(); /* convert string to integer */
int isspace(); /* whitespace function */
int isdigit(); /* digit function */
STRING *stods(); /* convert string to dynamic string */
format = *parms--; /* format points to format string */
count = 0; /* number of parameters read */
while (c = *format++) æ
if (isspace(c)) continue; /* skip white space */
if (c != '%') æ
while (isspace(ch = (*read)(fp)));
if (ch == c) continue;
else return (ch == EOF) ? EOF : count;
å
pflag = sflag = asflag = 0;
if ((*format) == '*') æ /* check for assignment suppression */
++asflag;
++format;
å
acc = _dint;
neg = _negint;
asn = _aint;
width = isdigit(*format) ? _atoi(&format) : -1;
if (toupper(*format) == 'L') æ /* check for double precision */
++pflag;
++format;
acc = _dlong;
neg = _neglong;
asn = _along;
å
c = *format++;
switch (toupper(c)) æ
case 'H': /* signed decimal */
pflag++;
case 'D':
case 'U':
base = 10;
goto decode;
case 'O': /* unsigned octal */
base = 8;
goto decode;
case 'X': /* unsigned hexadecimal */
base = 16;
decode:
for (i=0; i<5; ++i) buffer.stringÆiÅ = 'Ø0';
while ((ch=(*read)(fp))==' ' øø ch == 'Øt'
øø ch == 'Øn');
if (ch == EOF) return EOF;
if (width && (ch == '+' øø ch == '-')) æ
if (ch == '-') ++sflag;
ch = (*read)(fp);
--width;
å
if (width && base == 16 && ch == '0') æ
temp = (*read)(fp);
--width;
if (toupper(temp) == 'X' && width) æ
ch = (*read)(fp);
--width;
å
else æ
(*ungetc)(temp, fp);
++width;
å
å
if ((value = _digit(ch, base)) == -1) return count;
while (width && (value != -1)) æ
(*acc)(&buffer.integer, value, base);
ch = (*read)(fp);
--width;
value = _digit(ch,base);
å
(*ungetc)(ch, fp);
if (sflag) (*neg)(&buffer.integer);
if (!asflag) æ
(*asn)(&buffer.integer, *parms, pflag);
++count;
--parms;
å
break;
case 'S': /* string */
while ((ch=(*read)(fp))==' ' øø ch == 'Øt'
øø ch == 'Øn');
if (ch == EOF) return EOF;
while (width && ch != ' ' && ch != 'Øt'
&& ch != 'Øn' && ch != EOF) æ
if (!asflag) *(*parms)++ = ch;
ch = (*read)(fp);
--width;
å
(*ungetc)(ch, fp);
if (!asflag) æ
*(*parms) = 'Ø0';
++count;
--parms;
å
break;
case 'C': /* character */
if ((ch = (*read)(fp)) == EOF) return EOF;
else
if (!asflag) æ
*(*parms) = ch;
++count;
--parms;
å
break;
case 'E':
case 'F': /* floating point */
while ((ch=(*read)(fp))==' ' øø ch == 'Øt'
øø ch == 'Øn');
if (ch == EOF) return EOF;
i = 0;
valid = 0;
if (width && (ch == '+' øø ch == '-')) æ
buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
å
while (width && ch >= '0' && ch <= '9') æ
buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
++valid;
å
if (width && ch == '.') æ
buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
while (width && ch >= '0' && ch <= '9') æ
buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
++valid;
å
å
if (width && (ch == 'E' øø ch == 'e' øø ch == 'D')) æ
if (!valid) return count;
valid = 0;
buffer.stringÆi++Å = 'E';
ch = (*read)(fp);
--width;
if (width && (ch == '+' øø ch == '-')) æ
buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
å
while (width && isdigit(ch)) æ
buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
++valid;
å
å
(*ungetc)(ch, fp);
if (!valid) return count;
buffer.stringÆiÅ = 'Ø0';
if (!asflag) æ
_dreal(buffer.string, *parms, pflag);
++count;
--parms;
å
break;
case 'Y': /* dynamic string */
while ((ch=(*read)(fp))==' ' øø ch == 'Øt'
øø ch == 'Øn');
if (ch == EOF) return EOF;
i = 0;
while (width && ch != ' ' && ch != 'Øt'
&& ch != 'Øn' && ch != EOF) æ
if (i < 80) buffer.stringÆi++Å = ch;
ch = (*read)(fp);
--width;
å
buffer.stringÆiÅ = 'Ø0';
(*ungetc)(ch,fp);
if (!asflag) æ
ptr = *parms;
*ptr = stods(buffer.string);
++count;
--parms;
å
break;
default :
return count;
å
å
return count;
å
_negint(iptr) /* negate integer */
int *iptr; /* pointer to integer */
æ
*iptr = -*iptr;
å
_aint(iptr1, iptr2, pflag) /* assign integer */
int *iptr1; /* pointer to fp */
int *iptr2; /* pointer to destination */
int pflag; /* short integer flag */
æ
short *sptr;
if (pflag) æ
sptr = iptr2;
*sptr = *iptr1;
å
else *iptr2 = *iptr1;
å
_neglong(lptr) /* negate long */
long *lptr; /* pointer to long integer */
æ
*lptr = -*lptr;
å
_along(lptr1, lptr2) /* assign long */
long *lptr1; /* pointer to fp */
long *lptr2; /* pointer to destination */
æ
*lptr2 = *lptr1;
å
_digit(ch, base) /* decode ch to binary */
int ch; /* character to decode */
int base; /* number base */
æ
if (ch >= '0' && ch <= '9') ch -= 48;
else
if (isalpha(ch = toupper(ch))) ch -= 55;
else
return -1;
if (ch < base) return ch;
else return -1;
å
_dint(iptr, digit, base) /* decode an integer */
int *iptr; /* pointer to integer */
int digit; /* digit to add to integer */
int base; /* number base */
æ
*iptr = *iptr * base + digit;
å
_dlong(lptr, digit, base) /* decode a long */
long *lptr; /* pointer to long */
int digit; /* digit to add to long */
int base; /* number base */
æ
*lptr = *lptr * base + digit;
å
_dreal(s, fptr, pflag) /* decode a real */
char *s; /* pointer to decode string */
float *fptr; /* pointer to float */
int pflag; /* precision flag */
æ
double atof(); /* string to double function */
double *dptr; /* pointer to double */
if (pflag) æ
dptr = fptr;
*dptr = atof(s);
å
else
*fptr = (float) atof(s);
å
_mread(s) /* read character from string */
char **s; /* pointer to string */
æ
if (*(*s) != 'Ø0') return *(*s)++;
else return EOF;
å
_mungetc(c,s) /* unget character to string */
int c; /* dumy parameter */
char **s; /* pointer to string pointer */
æ
--(*s);
return c;
å
«eof»