[comp.sources.games] v06i047: scrabble - game of scrabble using curses, Part02/02

games@tekred.CNA.TEK.COM (04/07/89)

Submitted-by: "Wayne A. Christopher" <faustus@dogwood.Berkeley.EDU>
Posting-number: Volume 6, Issue 47
Archive-name: scrabble/Part02


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 2)."
# Contents:  board.c curses.ext player.c plural.c savegame.c user.c
#   util.c util.h
# Wrapped by billr@saab on Thu Apr  6 12:40:39 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'board.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'board.c'\"
else
echo shar: Extracting \"'board.c'\" \(3366 characters\)
sed "s/^X//" >'board.c' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.3 $ on $Date: 89/03/15 16:31:58 $
X *           $Source: /yew3/faustus/src/scrabble/RCS/board.c,v $
X * Copyright (c) 1989 Wayne A. Christopher, U. C. Berkeley CS Dept
X *	 faustus@renoir.berkeley.edu, ucbvax!faustus
X * Permission is granted to modify and re-distribute this code in any manner
X * as long as this notice is preserved.  All standard disclaimers apply.
X *
X */
X
X#include "scrabble.h"
X
Xstatic char *bonus_map[] = {
X	"T  d   T   d  T",
X	" D   t   t   D ",
X	"  D   d d   D  ",
X	"d  D   d   D  d",
X	"    D     D    ",
X	" t   t   t   t ",
X	"  d   d d   d  ",
X	"T  d   D   d  T",
X	"  d   d d   d  ",
X	" t   t   t   t ",
X	"    D     D    ",
X	"d  D   d   D  d",
X	"  D   d d   D  ",
X	" D   t   t   D ",
X	"T  d   T   d  T"
X} ;
X
Xstatic int distrib[NUM_LETTERS] = {
X	/* A  B  C  D  E  F  G  H  I  J  K  L  M */
X	   9, 2, 2, 4,12, 2, 3, 2, 9, 1, 1, 4, 2,
X
X	/* N  O  P  Q  R  S  T  U  V  W  X  Y  Z  * */
X	   6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1, 2
X} ;
X
Xint letterpoint_values[NUM_LETTERS] = {
X	/* A  B  C  D  E  F  G  H  I  J  K  L  M */
X	   1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3,
X
X	/* N  O  P  Q  R  S  T  U  V  W  X  Y  Z  * */
X	   1, 1, 3,10, 1, 1, 1, 1, 4, 4, 8, 4,10, 0
X} ;
X
Xboard_t *
Xmakeboard()
X{
X	board_t *board = (board_t *) util_malloc(sizeof (board_t));
X	int i, j, k;
X
X	for (i = 0; i < SIZE; i++)
X		for (j = 0; j < SIZE; j++) {
X			board->letters[i][j] = ' ';
X			switch (bonus_map[i][j]) {
X			    case ' ': board->bonus[i][j] = NONE; break;
X			    case 'd': board->bonus[i][j] = DOUBLE_LETTER; break;
X			    case 't': board->bonus[i][j] = TRIPLE_LETTER; break;
X			    case 'D': board->bonus[i][j] = DOUBLE_WORD; break;
X			    case 'T': board->bonus[i][j] = TRIPLE_WORD; break;
X			}
X		}
X
X	for (i = POOL_SIZE - 1; i >= 0; i--) {
X		j = random() % (i + 1);
X		for (k = 0; j >= 0; j -= distrib[k++])
X			;
X		k--;
X		distrib[k]--;
X		if (k == NUM_LETTERS - 1)
X			board->pool[i] = WILD;
X		else
X			board->pool[i] = 'a' + k;
X	}
X
X	board->numleft = POOL_SIZE;
X	board->virgin = true;
X
X	return (board);
X}
X
Xvoid
Xboardmove(board_t *board, move_t *move)
X{
X	int i;
X
X	if (move->horiz)
X		for (i = 0; i < move->length; i++) {
X			board->letters[move->x + i][move->y] = move->wild[i] ?
X					makewild(move->word[i]) : move->word[i];
X		}
X	else
X		for (i = 0; i < move->length; i++) {
X			board->letters[move->x][move->y + i] = move->wild[i] ?
X					makewild(move->word[i]) : move->word[i];
X		}
X
X	board->virgin = false;
X
X	return;
X}
X
Xchar
Xpickletter(board_t *board)
X{
X	if (board->numleft)
X		return (board->pool[--board->numleft]);
X	else
X		return (ZIP);
X}
X
X#ifdef notdef
X
Xstatic char lbchar[] = " `\"(<";
Xstatic char rbchar[] = " '\")>";
X
Xvoid
Xprintboard(board_t *board, FILE *fp)
X{
X	int i, j;
X	char c;
X
X	fprintf(fp, "   ");
X	for (j = 0; j < SIZE; j++)
X		fprintf(fp, " %-2d", j);
X	fprintf(fp, "\n");
X	for (i = 0; i < SIZE; i++) {
X		fprintf(fp, "%2d ", i);
X		for (j = 0; j < SIZE; j++) {
X			if (something(board->letters[j][i])) {
X				if (iswild(board->letters[j][i]))
X					c = tolower(board->letters[j][i]);
X				else
X					c = toupper(board->letters[j][i]);
X			} else {
X				c = '.';
X			}
X			fprintf(fp, "%c%c%c", lbchar[board->bonus[j][i]], c,
X					rbchar[board->bonus[j][i]]);
X		}
X		fprintf(fp, " %-2d\n", i);
X	}
X	fprintf(fp, "   ");
X	for (j = 0; j < SIZE; j++)
X		fprintf(fp, " %-2d", j);
X	fprintf(fp, "\n\tLetters left: %d\n", board->numleft);
X
X	return;
X}
X
X#endif
X
END_OF_FILE
if test 3366 -ne `wc -c <'board.c'`; then
    echo shar: \"'board.c'\" unpacked with wrong size!
fi
# end of 'board.c'
fi
if test -f 'curses.ext' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'curses.ext'\"
else
echo shar: Extracting \"'curses.ext'\" \(862 characters\)
sed "s/^X//" >'curses.ext' <<'END_OF_FILE'
X/*
X * Copyright (c) 1981 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X *
X *	@(#)curses.ext	5.4 (Berkeley) 6/8/88
X */
X
X/*
X * External variables for the curses library
X */
X
X/* LINTLIBRARY */
X
X# include	"curses.h"
X
Xextern bool	_echoit, _rawmode, My_term, _endwin;
X
Xextern char	ttytype[50], *_unctrl[];
X
Xextern int	_tty_ch, LINES, COLS;
X
Xextern SGTTY	_tty;
X
Xchar		_putchar();
X
X#ifdef DEBUG
X# define	outf	_outf
X
XFILE		*outf;
X#endif
END_OF_FILE
if test 862 -ne `wc -c <'curses.ext'`; then
    echo shar: \"'curses.ext'\" unpacked with wrong size!
fi
# end of 'curses.ext'
fi
if test -f 'player.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'player.c'\"
else
echo shar: Extracting \"'player.c'\" \(3184 characters\)
sed "s/^X//" >'player.c' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.3 $ on $Date: 89/03/15 16:33:07 $
X *           $Source: /yew3/faustus/src/scrabble/RCS/player.c,v $
X * Copyright (c) 1989 Wayne A. Christopher, U. C. Berkeley CS Dept
X *	 faustus@renoir.berkeley.edu, ucbvax!faustus
X * Permission is granted to modify and re-distribute this code in any manner
X * as long as this notice is preserved.  All standard disclaimers apply.
X *
X */
X
X#include "scrabble.h"
X
Xplayer_t *
Xmakeplayer(board_t *board, int num)
X{
X	player_t *player = (player_t *) util_malloc(sizeof (player_t));
X	int i;
X	char buf[BSIZE], *s;
X
X	if (userpick) {
X		while (player->numworking < WORK_SIZE) {
X			printf("Input %d letters for player %d: ", WORK_SIZE -
X					player->numworking, num);
X			fgets(buf, BSIZE, stdin);
X			s = buf;
X			while ((player->numworking < WORK_SIZE) &&
X					(*s != '\n')) {
X				if (isupper(*s))
X					*s = tolower(*s);
X				else if (*s == ' ')
X					*s = WILD;
X				player->working[player->numworking++] =
X						*s++;
X				/* So that the count goes down. */
X				(void) pickletter(board);
X			}
X			if (*s != '\n')
X				printf("Ignored extra letters\n");
X		}
X	} else {
X		for (i = 0; i < WORK_SIZE; i++)
X			player->working[i] = pickletter(board);
X	}
X	
X	player->numworking = WORK_SIZE;
X	player->score = 0;
X	player->machine = true;
X
X	return (player);
X}
X
X/* Note that this must be called before boardmove. */
X
Xvoid
Xplayermove(board_t *board, player_t *player, move_t *move)
X{
X	int i, j, k;
X	char c;
X	char buf[BSIZE], *s;
X	bool found;
X
X	player->score += move->points;
X
X	for (i = 0; i < move->length; i++)
X		if (!something(boardletter(board, move->x, move->y,
X				move->horiz, i))) {
X			found = false;
X			for (j = 0; j < player->numworking; j++)
X				if (player->working[j] == move->word[i]) {
X					for (k = j; k < player->numworking - 1;
X							k++)
X						player->working[k] =
X							player->working[k + 1];
X					player->numworking--;
X					found = true;
X					break;
X				}
X			if (!found)
X				for (j = 0; j < player->numworking; j++)
X					if (player->working[j] == WILD) {
X						for (k = j; k < player->
X								numworking - 1;
X								k++)
X							player->working[k] =
X								player->
X								working[k + 1];
X						player->numworking--;
X						break;
X					}
X		}
X
X	if (userpick) {
X		if (board->numleft) {
X			sprintf(buf, "Input %d letters: ",
X					min(WORK_SIZE - player->numworking,
X					board->numleft));
X			s = user_question(buf);
X			while (*s && player->numworking < WORK_SIZE) {
X				if (!board->numleft)
X					break;
X				player->working[player->numworking++] =
X						isupper(*s) ? tolower(*s) : *s;
X				s++;
X				(void) pickletter(board);
X			}
X			if (*s)
X				user_message("Ignoring extra letters.\n");
X		}
X	} else {
X		while (player->numworking < WORK_SIZE) {
X			c = pickletter(board);
X			if (something(c))
X				player->working[player->numworking++] = c;
X			else
X				break;
X		}
X	}
X
X	return;
X}
X
X#ifdef notdef
X
Xvoid
Xprintplayer(player_t *player, int num, FILE *fp)
X{
X	int i;
X
X	if (num >= 0)
X		fprintf(fp, "Player %d: score = %d\tletters =", num,
X				player->score);
X	else
X		fprintf(fp, "Score = %d\tletters =", player->score);
X	for (i = 0; i < player->numworking; i++)
X		fprintf(fp, " %c", player->working[i]);
X	fprintf(fp, "\n");
X
X	return;
X}
X
X#endif
X
END_OF_FILE
if test 3184 -ne `wc -c <'player.c'`; then
    echo shar: \"'player.c'\" unpacked with wrong size!
fi
# end of 'player.c'
fi
if test -f 'plural.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'plural.c'\"
else
echo shar: Extracting \"'plural.c'\" \(1304 characters\)
sed "s/^X//" >'plural.c' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.1 $ on $Date: 89/03/15 11:17:10 $
X *           $Source: /yew3/faustus/src/scrabble/RCS/plural.c,v $
X * Copyright (c) 1989 Wayne A. Christopher, U. C. Berkeley CS Dept
X *	 faustus@renoir.berkeley.edu, ucbvax!faustus
X * Permission is granted to modify and re-distribute this code in any manner
X * as long as this notice is preserved.  All standard disclaimers apply.
X *
X * This program reads words from standard input and pluralizes them.
X */
X
X#include <stdio.h>
X#include <strings.h>
X
Xstruct {
X	char *end;
X	char *new;
X} endings[] = {
X	{ "s",		"ses" },
X	{ "x",		"xes" },
X	{ "z",		"zes" },
X	{ "ch",		"ches" },
X	{ "sh",		"shes" },
X	{ "ey",		"eys" },
X	{ "y",		"ies" },
X	{ "",		"s" }
X} ;
X
Xvoid
Xpluralize(char *word)
X{
X	int i, wl, sl;
X	char *s, *t;
X
X	for (i = 0; i < sizeof (endings) / sizeof (endings[0]); i++) {
X		for (s = word, wl = 0; *s; s++, wl++)
X			;
X		for (t = endings[i].end, sl = 0; *t; t++, sl++)
X			;
X		if (sl > wl)
X			continue;
X		s -= sl;
X		for (t = endings[i].end; *t; t++, s++)
X			if (*s != *t)
X				break;
X		if (!*t) {
X			s -= sl;
X			for (t = endings[i].new; *t; t++, s++)
X				*s = *t;
X			*s = '\0';
X			break;
X		}
X	}
X}
X
Xmain()
X{
X	char buf[512];
X
X	while (fgets(buf, 512, stdin)) {
X		buf[strlen(buf) - 1] = '\0';
X		pluralize(buf);
X		printf("%s\n", buf);
X	}
X
X	exit(0);
X}
X
END_OF_FILE
if test 1304 -ne `wc -c <'plural.c'`; then
    echo shar: \"'plural.c'\" unpacked with wrong size!
fi
# end of 'plural.c'
fi
if test -f 'savegame.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'savegame.c'\"
else
echo shar: Extracting \"'savegame.c'\" \(681 characters\)
sed "s/^X//" >'savegame.c' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.1 $ on $Date: 89/03/15 11:17:14 $
X *           $Source: /yew3/faustus/src/scrabble/RCS/savegame.c,v $
X * Copyright (c) 1989 Wayne A. Christopher, U. C. Berkeley CS Dept
X *	 faustus@renoir.berkeley.edu, ucbvax!faustus
X * Permission is granted to modify and re-distribute this code in any manner
X * as long as this notice is preserved.  All standard disclaimers apply.
X *
X */
X
X#include "scrabble.h"
X
Xboard_t *
Xrestoregame(FILE *fp, int *nump, int *whosup, int *turn)
X{
X	return (NULL);
X}
X
Xplayer_t *
Xrestoreplayer(FILE *fp)
X{
X	return (NULL);
X}
X
Xvoid 
Xsavegame(FILE *fp, int nump, int whosup, int turn)
X{
X	return;
X}
X
Xvoid 
Xsaveplayer(FILE *fp)
X{
X	return;
X}
X
END_OF_FILE
if test 681 -ne `wc -c <'savegame.c'`; then
    echo shar: \"'savegame.c'\" unpacked with wrong size!
fi
# end of 'savegame.c'
fi
if test -f 'user.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'user.c'\"
else
echo shar: Extracting \"'user.c'\" \(3417 characters\)
sed "s/^X//" >'user.c' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.1 $ on $Date: 89/03/15 11:17:22 $
X *           $Source: /yew3/faustus/src/scrabble/RCS/user.c,v $
X * Copyright (c) 1989 Wayne A. Christopher, U. C. Berkeley CS Dept
X *	 faustus@renoir.berkeley.edu, ucbvax!faustus
X * Permission is granted to modify and re-distribute this code in any manner
X * as long as this notice is preserved.  All standard disclaimers apply.
X *
X * With a minimum amount of hacking more device descriptions can be
X * added to this file.
X */
X
X#include "scrabble.h"
X
Xstruct device {
X	void (*init)(board_t *board, player_t *players[], int numplayers);
X	void (*message)(char *message);
X	char *(*question)(char *message);
X	bool (*confirm)(char *message);
X	command_t (*command)(board_t *board, player_t *player, move_t *move);
X	void (*drawplayer)(player_t *player, int pos, bool up);
X	void (*drawsummary)(board_t *board, int turn);
X	void (*drawmove)(board_t *board, move_t *move, player_t *player);
X	void (*givehelp)();
X	void (*update)();
X	void (*cleanup)();
X} ;
X
Xstatic struct device tty_device = {
X	tty_init,
X	tty_message,
X	tty_question,
X	tty_confirm,
X	tty_command,
X	tty_drawplayer,
X	tty_drawsummary,
X	tty_drawmove,
X	tty_givehelp,
X	tty_update,
X	tty_cleanup
X} ;
X
Xstatic struct device *dev;
X
Xvoid
Xuser_init(devtype_t type, board_t *board, player_t *players[], int numplayers)
X{
X	switch (type) {
X	    case DEV_TTY:	dev = &tty_device; break;
X	    default:		abort();
X	}
X
X	(dev->init)(board, players, numplayers);
X	return;
X}
X
Xvoid
Xuser_message(char *message)
X{
X	(dev->message)(message);
X	return;
X}
X
Xchar *
Xuser_question(char *message)
X{
X	return ((dev->question)(message));
X}
X
Xbool
Xuser_confirm(char *message)
X{
X	return ((dev->confirm)(message));
X}
X
Xcommand_t
Xuser_command(board_t *board, player_t *player, move_t *move)
X{
X	return ((dev->command)(board, player, move));
X}
X
Xvoid
Xuser_drawplayer(player_t *player, int pos, bool up)
X{
X	(dev->drawplayer)(player, pos, up);
X	return;
X}
X
Xvoid
Xuser_drawsummary(board_t *board, int turn)
X{
X	(dev->drawsummary)(board, turn);
X	return;
X}
X
Xvoid
Xuser_drawmove(board_t *board, move_t *move, player_t *player)
X{
X	(dev->drawmove)(board, move, player);
X	return;
X}
X
Xvoid
Xuser_update()
X{
X	(dev->update)();
X	return;
X}
X
Xvoid
Xuser_cleanup()
X{
X	(dev->cleanup)();
X	return;
X}
X
Xvoid
Xuser_givehelp()
X{
X	(dev->givehelp)();
X	return;
X}
X
X#ifdef notdef
X
Xbool
Xreadmove(board_t *board, player_t *player, move_t *move)
X{
X	char buf[BSIZE];
X	int x, y, i;
X	char dir, word[BSIZE];
X
X	for (;;) {
X		printplayer(player, -1, stdout);
X		printf("Enter move [ x y dir word ]: ");
X		fgets(buf, BSIZE, stdin);
X		if (sscanf(buf, "%d %d %c %s", &x, &y, &dir, word) != 4) {
X			printf("Invalid command.\n");
X			printboard(board, stdout);
X			continue;
X		}
X		move->x = x;
X		move->y = y;
X		move->horiz = (dir == 'h') ? true : false;
X		for (i = 0; i < strlen(word); i++) {
X			if (!isalpha(word[i])) {
X				printf("Bad word.\n");
X				break;
X			} else if (isupper(word[i])) {
X				word[i] = tolower(word[i]);
X			}
X		}
X		if (word[i])
X			continue;
X
X		move->word = strsav(word);
X		move->length = strlen(move->word);
X		for (i = 0; i < SIZE; i++)
X			move->wild[i] = false;
X
X		if (!isaword(word)) {
X			printf("I don't think \"%s\" is a word.  Do you? ",
X					word);
X			fgets(buf, BSIZE, stdin);
X			if ((buf[0] != 'y') && (buf[0] != 'Y'))
X				continue;
X		}
X		trymove(move, board, player);
X
X		if (move->points < 0) {
X			printf("You can't do that.\n");
X			continue;
X		}
X
X		return (true);
X	}
X}
X
X#endif
X
END_OF_FILE
if test 3417 -ne `wc -c <'user.c'`; then
    echo shar: \"'user.c'\" unpacked with wrong size!
fi
# end of 'user.c'
fi
if test -f 'util.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'util.c'\"
else
echo shar: Extracting \"'util.c'\" \(2328 characters\)
sed "s/^X//" >'util.c' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.1 $ on $Date: 89/03/10 10:11:10 $
X *           $Source: /yew3/faustus/src/scrabble/RCS/util.c,v $
X * Copyright (c) 1988 Wayne A. Christopher, U. C. Berkeley CAD Group 
X *	 faustus@cad.berkeley.edu, ucbvax!faustus
X * Permission is granted to modify and re-distribute this code in any manner
X * as long as this notice is preserved.  All standard disclaimers apply.
X *
X */
X
X#include "util.h"
X#include <pwd.h>
X#include <sys/types.h>
X#include <sys/time.h>
X#include <sys/resource.h>
X
Xextern char *malloc();
Xextern char *realloc();
X
Xchar *
Xstrsav(str)
X	char *str;
X{
X	char *p;
X	
X	p = malloc(strlen(str) + 1);
X	if (p)
X		strcpy(p, str);
X	return (p);
X}
X
Xchar *
Xstrstr(str, sub)
X	char *str, *sub;
X{
X	char *s, *t;
X
X	while (*str) {
X		if (*str == *sub) {
X			for (s = sub, t = str; *s && *t; s++, t++)
X				if (*s != *t)
X					break;
X			if (!*s)
X				return (str);
X		}
X		str++;
X	}
X	return (NULL);
X}
X
Xchar *
Xutil_datestring()
X{
X	register char *tzn;
X	struct tm *tp;
X	static char tbuf[40];
X	char *ap;
X	struct timeval tv;
X	struct timezone tz;
X	char *timezone(), *asctime();
X	int i;
X	struct tm *localtime();
X
X	(void) gettimeofday(&tv, &tz);
X	tp = localtime((time_t *) &tv.tv_sec);
X	ap = asctime(tp);
X	tzn = timezone(tz.tz_minuteswest, tp->tm_isdst);
X	sprintf(tbuf, "%.20s", ap);
X	if (tzn)
X		strcat(tbuf, tzn);
X	strcat(tbuf, ap + 19);
X	i = strlen(tbuf);
X	tbuf[i - 1] = '\0';
X	return (tbuf);
X}
X
Xint
Xutil_seconds()
X{
X	struct rusage ruse;
X
X	getrusage(RUSAGE_SELF, &ruse);
X	return (ruse.ru_utime.tv_sec);
X}
X
Xchar *
Xutil_tildexpand(s)
X	char *s;
X{
X	struct passwd *pw;
X	char *n, buf[64];
X	int i;
X
X	if (*s != '~') {
X		n = malloc(strlen(s) + 1);
X		strcpy(n, s);
X		return (n);
X	}
X
X	for (s++, i = 0; *s != '/'; s++, i++)
X		buf[i] = *s;
X	buf[i] = '\0';
X	if (!i)
X		pw = getpwuid(getuid());
X	else
X		pw = getpwnam(buf);
X	if (!pw)
X		return (s);
X	n = malloc(strlen(s) + strlen(pw->pw_dir) + 1);
X	strcpy(n, pw->pw_dir);
X	strcat(n, s);
X	return (n);
X}
X
Xchar *
Xutil_malloc(num)
X	int num;
X{
X	char *s;
X
X	s = malloc((unsigned) num);
X	if (!s) {
X		fprintf(stderr, "malloc: can't allocate %d bytes", num);
X		exit(1);
X	}
X	bzero(s, num);
X	return (s);
X}
X
Xchar *
Xutil_realloc(ptr, num)
X	char *ptr;
X	int num;
X{
X	char *s;
X
X	s = realloc(ptr, (unsigned) num);
X	if (!s) {
X		fprintf(stderr, "realloc: can't allocate %d bytes", num);
X		exit(1);
X	}
X	return (s);
X}
X
END_OF_FILE
if test 2328 -ne `wc -c <'util.c'`; then
    echo shar: \"'util.c'\" unpacked with wrong size!
fi
# end of 'util.c'
fi
if test -f 'util.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'util.h'\"
else
echo shar: Extracting \"'util.h'\" \(1876 characters\)
sed "s/^X//" >'util.h' <<'END_OF_FILE'
X
X/* RCS Info: $Revision: 1.1 $ on $Date: 89/03/10 10:11:14 $
X *		   $Source: /yew3/faustus/src/scrabble/RCS/util.h,v $
X * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
X *
X * Standard definitions.
X */
X
X#define UNIX
X#define BSD
X
X/* vcc has problems with math.h */
X
X#define u3b     0
X#define u3b5    0
X#define gcos    0
X#define gould   0
X#define pdp11   0
X#define u370    0
X
X#ifndef FILE
X#include <stdio.h>
X#endif
X#ifndef isalpha
X#include <ctype.h>
X#endif
X#ifndef HUGE
X#include <math.h>
X#endif
X#include <strings.h>
X
X#ifdef assert
X#undef assert
X#endif
X
X#define assert(ex) \
X	{if (!(ex)) {\
X		fprintf(stderr,"Internal error: file %s, line %d\n",\
X			__FILE__, __LINE__);\
X		abort();\
X	}}
X
Xtypedef int bool;
X
X#define false 0
X#define true 1
X
X#define boolname(vv) ((vv) ? "true" : "false")
X
X#define gprof_point(name)       asm("   .globl name"); asm("name:");
X
X#define BSIZE	   512
X
X/* Some standard macros. */
X
X#define eq(a,b)	 (!strcmp((a), (b)))
X#define alloc(strname)  ((struct strname *) util_malloc(sizeof(struct strname)))
X#define max(i, j)       (((i) > (j)) ? (i) : (j))
X#define min(i, j)       (((i) < (j)) ? (i) : (j))
X#define badness()	{ fprintf(stderr, \
X		"Internal Error: line %d in file %s\n",\
X		__LINE__, __FILE__);\
X		exit(1); }
X
X#define EXIT_NORMAL	0
X#define EXIT_BAD	1
X
X/* Utility things. */
X
Xextern char *strsav();
Xextern char *strstr();
Xextern char *util_datestring();
Xextern char *util_malloc();
Xextern char *util_realloc();
Xextern int util_seconds();
Xextern char *util_tildexpand();
X
X/* Externs from libc */
X
Xextern char *getenv();
Xextern char *mktemp();
Xextern int errno;
Xextern char *sys_errlist[];
Xextern double atof();
Xextern long random();
Xextern void srandom();
Xextern long time();
Xextern void exit();
Xextern void bcopy();
Xextern char *sbrk();
Xextern char *getlogin();
Xextern void free();
Xextern void perror();
Xextern void abort();
X
END_OF_FILE
if test 1876 -ne `wc -c <'util.h'`; then
    echo shar: \"'util.h'\" unpacked with wrong size!
fi
# end of 'util.h'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0