|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 1632 (0x660)
Types: TextFile
Notes: UNIX file
Names: »min.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »libmp/min.c«
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include "mprec.h"
/*
* Ibase is an int which contains the input base used by min.
* It should be between 2 and 16. Regardless of ibase, the
* legal digits are 0 - 9 and A - F.
*/
int ibase = 10;
/*
* Min reads in a number in base ibase from stdin and sets "a"
* to that number. Note that a leading minus sign is allowed as
* are leading blanks.
*/
void
min(a)
register mint *a;
{
register int ch;
register char mifl; /* leading minus flag */
char cval;
mint c = {1, &cval};
assert(2 <= ibase && ibase <= 16);
/* throw away old value, and set to zero */
mcopy(mzero, a);
/* skip leading blanks */
do {
ch = getchar();
} while (isascii(ch) && isspace(ch));
/* check for leading minus */
mifl = ch == '-';
if (mifl)
do {
ch = getchar();
} while (isascii(ch) && isspace(ch));
/* scan thru actual number, building result in a */
while (okdigit(ch)) {
cval = valdigit(ch);
smult(a, ibase, a);
madd(a, &c, a);
ch = getchar();
}
ungetc(ch, stdin);
/* adjust sign of a */
if (mifl)
mneg(a, a);
}
/*
* Okdigit returns true iff "ch" is a valid digit. This means
* iff it is a normal digit or one of the letters 'A' thru 'F'.
*/
static
okdigit(ch)
register int ch;
{
return (isascii(ch) && isdigit(ch) || 'A'<=ch && ch<='F');
}
/*
* Valdigit returns the numerical value for the character "ch"
* when it is interpreted as a digit. Note that valdigit assumes
* that "ch" has already been successfully tested by okdigit.
*/
static
valdigit(ch)
register int ch;
{
return (isdigit(ch) ? ch+0-'0' : ch+0xA-'A');
}