X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/7db9353c5306c7ae009224de8c382ff9418584fc..HEAD:/arithmetic/arithmetic.c diff --git a/arithmetic/arithmetic.c b/arithmetic/arithmetic.c index 3150717e..743948e6 100644 --- a/arithmetic/arithmetic.c +++ b/arithmetic/arithmetic.c @@ -1,4 +1,4 @@ -/* $NetBSD: arithmetic.c,v 1.10 1998/02/03 05:33:32 perry Exp $ */ +/* $NetBSD: arithmetic.c,v 1.27 2012/06/19 05:46:08 dholland Exp $ */ /* * Copyright (c) 1989, 1993 @@ -15,11 +15,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -38,15 +34,15 @@ #include #ifndef lint -__COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\ - The Regents of the University of California. All rights reserved.\n"); +__COPYRIGHT("@(#) Copyright (c) 1989, 1993\ + The Regents of the University of California. All rights reserved."); #endif /* not lint */ #ifndef lint #if 0 static char sccsid[] = "@(#)arithmetic.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: arithmetic.c,v 1.10 1998/02/03 05:33:32 perry Exp $"); +__RCSID("$NetBSD: arithmetic.c,v 1.27 2012/06/19 05:46:08 dholland Exp $"); #endif #endif /* not lint */ @@ -88,22 +84,21 @@ __RCSID("$NetBSD: arithmetic.c,v 1.10 1998/02/03 05:33:32 perry Exp $"); #include #include -int getrandom __P((int, int, int)); -void intr __P((int)); -int main __P((int, char *[])); -int opnum __P((int)); -void penalise __P((int, int, int)); -int problem __P((void)); -void showstats __P((void)); -void usage __P((void)); - -char keylist[] = "+-x/"; -char defaultkeys[] = "+-"; -char *keys = defaultkeys; -int nkeys = sizeof(defaultkeys) - 1; -int rangemax = 10; -int nright, nwrong; -time_t qtime; +static int getrandom(int, int, int); +static void intr(int) __dead; +static int opnum(int); +static void penalise(int, int, int); +static int problem(void); +static void showstats(int); +static void usage(void) __dead; + +static const char keylist[] = "+-x/"; +static const char defaultkeys[] = "+-"; +static const char *keys = defaultkeys; +static int nkeys = sizeof(defaultkeys) - 1; +static int rangemax = 10; +static int nright, nwrong; +static time_t qtime; #define NQUESTS 20 /* @@ -114,18 +109,17 @@ time_t qtime; * so far are printed. */ int -main(argc, argv) - int argc; - char **argv; +main(int argc, char **argv) { - extern char *optarg; - extern int optind; int ch, cnt; + /* Revoke setgid privileges */ + setgid(getgid()); + while ((ch = getopt(argc, argv, "r:o:")) != -1) switch(ch) { case 'o': { - char *p; + const char *p; for (p = keys = optarg; *p; ++p) if (!strchr(keylist, *p)) @@ -145,7 +139,7 @@ main(argc, argv) usage(); /* Seed the random-number generator. */ - srandom((int)time((time_t *)NULL)); + srandom((int)time(NULL)); (void)signal(SIGINT, intr); @@ -154,23 +148,22 @@ main(argc, argv) for (cnt = NQUESTS; cnt--;) if (problem() == EOF) exit(0); - showstats(); + showstats(0); } /* NOTREACHED */ } /* Handle interrupt character. Print score and exit. */ -void -intr(dummy) - int dummy; +static void +intr(int dummy __unused) { - showstats(); + showstats(1); exit(0); } /* Print score. Original `arithmetic' had a delay after printing it. */ -void -showstats() +static void +showstats(int bool_sigint) { if (nright + nwrong > 0) { (void)printf("\n\nRights %d; Wrongs %d; Score %d%%", @@ -179,6 +172,10 @@ showstats() (void)printf("\nTotal time %ld seconds; %.1f seconds per problem\n\n", (long)qtime, (float)qtime / nright); } + if(!bool_sigint) { + (void)printf("Press RETURN to continue...\n"); + while(!getchar()) ; + } (void)printf("\n"); } @@ -190,8 +187,8 @@ showstats() * answer causes the numbers in the problem to be penalised, so that they are * more likely to appear in subsequent problems. */ -int -problem() +static int +problem(void) { char *p; time_t start, finish; @@ -244,8 +241,8 @@ retry: (void)printf("\n"); return(EOF); } - for (p = line; *p && isspace(*p); ++p); - if (!isdigit(*p)) { + for (p = line; *p && isspace((unsigned char)*p); ++p); + if (!isdigit((unsigned char)*p)) { (void)printf("Please type a number.\n"); continue; } @@ -290,8 +287,8 @@ retry: * penalties themselves. */ -int penalty[sizeof(keylist) - 1][2]; -struct penalty { +static int penalty[sizeof(keylist) - 1][2]; +static struct penalty { int value, penalty; /* Penalised value and its penalty. */ struct penalty *next; } *penlist[sizeof(keylist) - 1][2]; @@ -303,14 +300,13 @@ struct penalty { * operand number `operand' (0 or 1). If we run out of memory, we just * forget about the penalty (how likely is this, anyway?). */ -void -penalise(value, op, operand) - int value, op, operand; +static void +penalise(int value, int op, int operand) { struct penalty *p; op = opnum(op); - if ((p = (struct penalty *)malloc((u_int)sizeof(*p))) == NULL) + if ((p = malloc(sizeof(*p))) == NULL) return; p->next = penlist[op][operand]; penlist[op][operand] = p; @@ -324,9 +320,8 @@ penalise(value, op, operand) * as a value, or represents a position in the penalty list. If the latter, * we find the corresponding value and return that, decreasing its penalty. */ -int -getrandom(maxval, op, operand) - int maxval, op, operand; +static int +getrandom(int maxval, int op, int operand) { int value; struct penalty **pp, *p; @@ -369,9 +364,8 @@ getrandom(maxval, op, operand) } /* Return an index for the character op, which is one of [+-x/]. */ -int -opnum(op) - int op; +static int +opnum(int op) { char *p; @@ -382,12 +376,10 @@ opnum(op) } /* Print usage message and quit. */ -void -usage() +static void +usage(void) { - extern char *__progname; /* from crt0.o */ - - (void)fprintf(stderr, "usage: %s [-o +-x/] [-r range]\n", - __progname); + (void)fprintf(stderr, "Usage: %s [-o +-x/] [-r range]\n", + getprogname()); exit(1); }