|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T n
Length: 4701 (0x125d)
Types: TextFile
Names: »number.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/number.c«
/* Copyright 1981 Gary Perlman */
/*BUG allows . as integer because . not followed by trailing zeros */
/*
number: report if a string is a UNIX formatted number
notes:
a number in UNIX is one that can be converted from
a string to an integer or real with no loss of information
due to bad format
all numbers can be surrounded by whitespace
an integer has an optional minus sign, followed by digits
as a special case, a decimal point and trailing zeros are allowed
a real number has an optional minus sign followed by digits
if a string has a decimal point, followed by zeros, it is real, not int
value:
3 if string is a scientific notation number
2 if string is a real number (as seen by atof)
1 if string is an integer [-] 0-9+ [.0*]
0 for non-numbers
compilation flags:
-DNUMBER includes test main program
$Compile: cc -DNUMBER -O -o %F %f
deficiencies:
does not check to see if significant digits will be ignored
author:
Gary Perlman
date:
Wed May 22 13:30:40 EDT 1985
Sun Sep 1 14:53:51 EDT 1985 (modified test module)
Mon Jan 20 12:57:50 EST 1986 (allowed .0* in INT's)
Tue Jun 10 15:53:54 EDT 1986 (return 3 for exp notation)
*/
\f
#include <ctype.h>
#ifndef lint
static char sccsfid[] = "@(#) number.c 5.4 (|stat) 6/10/86";
#endif
#define IS_NOT 0 /* not a number */
#define IS_INT 1 /* an integer */
#define IS_REAL 2 /* a real number */
#define IS_EXP 3 /* exponential notation */
typedef int Boole;
#define TRUE 1
#define FALSE 0
#define EOS '\0' /* end of string */
/*LINTLIBRARY*/
number (string)
char *string; /* the string to be tested */
{
int answer = IS_INT; /* start by assuming it is an integer */
Boole before = FALSE; /* anything before the decimal? */
Boole after = FALSE; /* anything after the decimal? */
char *ptr;
while (isspace (*string)) /* skip over blank space */
string++;
if (*string == EOS) /* empty string not allowed */
return (IS_NOT);
if (*string == '+' || *string == '-') /* old atoi didn't allow '+' */
{
string++;
if (!isdigit (*string) && *string != '.')
return (IS_NOT);
}
if (isdigit (*string)) /* note that there was a digit before . */
{
before = TRUE;
while (isdigit (*string))
string++;
}
if (*string == '.') /* found a decimal point, parse for real */
{
string++;
ptr = string; /* going to check for trailing zeros for int */
while (*ptr == '0')
ptr++;
while (isspace (*ptr))
ptr++;
if (*ptr == EOS) /* number ended with .0*, so integer */
return (IS_INT);
answer = IS_REAL;
if (isdigit (*string)) /* note that there was a digit after . */
{
after = TRUE;
while (isdigit (*string))
string++;
}
}
if (!before && !after) /* must be digit somewhere */
return (IS_NOT);
if (*string == 'E' || *string == 'e') /* exponent */
{
answer = IS_EXP;
string++;
if (*string == '+' || *string == '-') /* optional sign */
string++;
if (!isdigit (*string)) /* missing exponent */
return (IS_NOT);
while (isdigit (*string))
string++;
}
while (isspace (*string)) /* skip optional spaces */
string++;
/* should now have exhausted the input string */
return (*string == EOS ? answer : IS_NOT);
}
\f
#ifdef NUMBER
#include <stdio.h>
/*
exits with status = the number of args not numerical
Shell Example:
if number -i $*
then
echo processing $*
else
echo $0: arguments must be integers
fi
Options:
-i arguments must be integer
-n arguments must be non-negative
*/
int NoNegative; /* do the values have to be non-negative? */
int Integer; /* do the values have to be integers? */
static
int
initial (argc, argv) char **argv;
{
extern char *optarg;
extern int optind;
int errcnt = 0;
int C;
char *optstring = "in";
char *usage = "[-in] string ...";
while ((C = getopt (argc, argv, optstring)) != EOF)
switch (C)
{
case 'i':
Integer = 1;
break;
case 'n':
NoNegative = 1;
break;
default:
errcnt++;
break;
}
if (errcnt)
{
fprintf (stderr, "Usage: %s %s\n", argv[0], usage);
exit (1);
}
return (optind);
}
\f
main (argc, argv) char **argv;
{
int status = 0;
int arg = initial (argc, argv);
char *string;
while (arg < argc)
{
string = argv[arg++];
if (NoNegative && *string == '-')
status++;
else switch (number (string))
{
case IS_NOT:
status++;
break;
case IS_REAL:
if (Integer)
status++;
break;
case IS_INT:
break;
default: /* CAN'T HAPPEN */
break;
}
}
exit (status);
}
#endif