$NetBSD: patch-ab,v 1.4 2014/09/23 22:21:43 jperkin Exp $

- use standard headers
- don't declare own strchr, getenv, time, tgetent
- use random, not lrand48
- work around broken definition of COLOR_PAIR on netbsd <= 3.x
- don't use implicit int
- use ctype.h correctly
- avoid nasal demons by passing a matching callback function to tputs
- fix an uninitialized variable bug caught by gcc

--- greed.c.orig	2002-07-30 22:03:43.000000000 +0000
+++ greed.c
@@ -47,38 +47,38 @@
 
 static char *version = "Greed v" RELEASE;
 
-#ifdef MSDOS
-#define NOTBSD
-#endif
 #include <ctype.h>
-#include <curses.h>
 #include <signal.h>
-#ifndef MSDOS
-#include <pwd.h>
-#endif
-#ifdef NOTBSD
 #include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#ifdef MSDOS
+#include <sys/types.h>
+#include <io.h>
 #else
-#include <sys/file.h>
+#include <pwd.h>
+#ifndef __sun
+#include <termcap.h>
+#endif
+#include <unistd.h>
 #endif
+
+#include <curses.h>
 #ifdef A_COLOR
 #include <ctype.h>
 #endif
-#ifdef MSDOS
-#include <sys/types.h>
 
-#include <io.h>
-#include <stdlib.h>
+#ifdef MSDOS
+#define NOTBSD
 #endif
 
 #ifdef NOTBSD
 #ifndef crmode
 #define crmode cbreak
 #endif
-#ifndef MSDOS
-#define random lrand48			/* use high quality random routines */
-#define srandom srand48
-#else
+#ifdef MSDOS
 #define random rand
 #define srandom srand
 #define ESC 27
@@ -105,22 +105,21 @@ struct score {				/* changing stuff in t
 int allmoves = 0, score = 1, grid[22][79], y, x, havebotmsg = 0;
 char *cmdname;
 WINDOW *helpwin = NULL;
-#ifndef MSDOS
-extern long random();
-#endif
-void topscores();
 
 #ifdef MSDOS
 char scorepath [_MAX_PATH];
 #endif
 
+void topscores(int);
+int othermove(int, int);
+
 /* botmsg() writes "msg" at the middle of the bottom line of the screen. *
  * Boolean "backcur" specifies whether to put cursor back on the grid or *
  * leave it on the bottom line (e.g. for questions).                     */
 
 void botmsg(msg, backcur)
 register char *msg;
-register backcur;
+register int backcur;
 {
 	mvaddstr(23, 40, msg);
 	clrtoeol();
@@ -134,7 +133,7 @@ register backcur;
  * current score) and quits; otherwise, simply returns to the game.         */
 
 void quit() {
-	register ch;
+	register int ch;
 #ifdef NOTBSD
 	void (*osig)() = signal(SIGINT, SIG_IGN);	/* save old signal */
 #else
@@ -195,16 +194,14 @@ void showscore() {
 
 void showmoves();
 
-main(argc, argv)
+int main(argc, argv)
 int argc;
 char *argv[];
 {
-	register val = 1;
-	extern long time();
+	register int val = 1;
 	int attribs[9];
 #ifdef A_COLOR
 	char *colors;
-	extern char *getenv(), *strchr();
 #endif
 
 	cmdname = argv[0];			/* save the command name */
@@ -274,10 +271,10 @@ char *argv[];
 				if (strchr(cnames, *cp) != (char *) NULL)
 					if (*cp != ' ') {
 						init_pair(cp-colors+1,
-							strchr(cnames, tolower(*cp))-cnames,
+							strchr(cnames, tolower((unsigned char)*cp))-cnames,
 							COLOR_BLACK);
-						attribs[cp-colors]=COLOR_PAIR(cp-colors+1);
-						if (isupper(*cp))
+						attribs[cp-colors]=COLOR_PAIR((cp-colors+1));
+						if (isupper((unsigned char)*cp))
 							attribs[cp-colors] |= A_BOLD;
 					}
 			if (*cp == ':')
@@ -292,7 +289,7 @@ char *argv[];
 		for (x=0; x < 79; x++)		/* print numbers out */
 #ifdef A_COLOR
 			if (has_colors()) {
-				register newval = rnd(9);
+				register int newval = rnd(9);
 
 				attron(attribs[newval - 1]);
 				mvaddch(y, x, (grid[y][x] = newval) + '0');
@@ -331,11 +328,11 @@ char *argv[];
 /* tunnel() does the main game work.  Returns 1 if everything's okay, 0 if *
  * user "died", and -1 if user specified and confirmed 'q' (fast quit).    */
 
-tunnel(cmd, attribs)
+int tunnel(cmd, attribs)
 register chtype cmd;
 int * attribs;
 {
-	register dy, dx, distance;
+	register int dy, dx, distance;
 	void help();
 
 	switch (cmd) {				/* process user command */
@@ -396,7 +393,7 @@ int * attribs;
 		grid[y+dy][x+dx] : 0;
 
 	{
-		register j = y, i = x, d = distance;
+		register int j = y, i = x, d = distance;
 
 		do {				/* process move for validity */
 			j += dy;
@@ -450,10 +447,10 @@ int * attribs;
  * direction variables that tell othermove() they are already no good, and to *
  * not process them.  I don't know if this is efficient, but it works!        */
 
-othermove(bady, badx)
-register bady, badx;
+int othermove(bady, badx)
+register int bady, badx;
 {
-	register dy = -1, dx;
+	register int dy = -1, dx;
 
 	for (; dy <= 1; dy++)
 		for (dx = -1; dx <= 1; dx++)
@@ -462,7 +459,7 @@ register bady, badx;
 					/* don't do 0,0 or bad coordinates */
 				continue;
 			else {
-				register j=y, i=x, d=grid[y+dy][x+dx];
+				register int j=y, i=x, d=grid[y+dy][x+dx];
 
 				if (!d) continue;
 				do {		/* "walk" the path, checking */
@@ -481,15 +478,15 @@ register bady, badx;
 /* moves instead.  "on" tells showmoves() whether to add or remove moves.     */
 
 void showmoves(on, attribs)
-register on;
+register int on;
 int * attribs;
 {
-	register dy = -1, dx;
+	register int dy = -1, dx;
 
 	for (; dy <= 1; dy++) {
 		if (y+dy < 0 || y+dy >= 22) continue;
 		for (dx = -1; dx <= 1; dx++) {
-			register j=y, i=x, d=grid[y+dy][x+dx];
+			register int j=y, i=x, d=grid[y+dy][x+dx];
 
 			if (!d) continue;
 			do {
@@ -499,7 +496,7 @@ int * attribs;
 				    || i >= 79 || !grid[j][i]) break;
 			} while (--d);
 			if (!d) {
-				register j=y, i=x, d=grid[y+dy][x+dx];
+				register int j=y, i=x, d=grid[y+dy][x+dx];
 
 				/* The next section chooses inverse-video    *
 				 * or not, and then "walks" chosen valid     *
@@ -529,8 +526,8 @@ int * attribs;
 
 /* doputc() simply prints out a character to stdout, used by tputs() */
 
-char doputc(c)
-register char c;
+int doputc(c)
+register int c;
 {
 	return(fputc(c, stdout));
 }
@@ -542,18 +539,19 @@ register char c;
 void topscores(newscore)
 register int newscore;
 {
-	register fd, count = 1;
+	register int fd, count = 1;
 	static char termbuf[BUFSIZ];
 	char *tptr = (char *) malloc(16), *boldon, *boldoff;
 	struct score *toplist = (struct score *) malloc(FILESIZE);
 	register struct score *ptrtmp, *eof = &toplist[MAXSCORE], *new = NULL;
-	extern char *getenv(), *tgetstr();
 #ifndef MSDOS
 	void lockit();
 #else
 	char user_name[100];
 #endif
 
+	boldon = boldoff = NULL;
+
 	(void) signal(SIGINT, SIG_IGN);		/* Catch all signals, so high */
 #ifndef MSDOS
 	(void) signal(SIGQUIT, SIG_IGN);	/* score file doesn't get     */
@@ -665,9 +663,9 @@ register int newscore;
 
 #ifndef MSDOS
 void lockit(on)
-register on;
+register int on;
 {
-	register fd, x = 1;
+	register int fd, x = 1;
 
 	if (on) {
 		while ((fd = creat(LOCKPATH, 0)) == -1) {
