DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦16b0cb06e⟧ TextFile

    Length: 7377 (0x1cd1)
    Types: TextFile
    Names: »main.c.orig«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Tetris/main.c.orig« 

TextFile

/*
** written by adam margulies vespa@ssyx.ucsc.edu
**                           {...}!ucbvax!ucscc!ssyx!vespa
**
** permission is granted to freely distribute this code provided that you:
**
** 1) don't charge for it
** 2) leave my name and header on it
** 3) clearly document your changes and place your name on them
**
*/
/* Tetris: a game supposedly written by some Soviet kid.                     */
/*                                                                           */
/* Last kludge: February 23, 1989                                            */
/* Guilty party: adam margulies, vespa@ssyx.ucsc.edu                         */
/*                                                                           */
/* This program contains some hopelessly inbred array operations.            */
/* It also is a monster to behold.                                           */
/*                                                                           */
/* All hope abandon, ye who enter here.                                      */
/*                                                                           */
/* Tetris: main.c                                                            */
/*                                                                           */
/*    main loop, waits for keypress and then passes it to process_input()    */
/*                                                                           */

#include "tetris.h"

int	opterr = 1;
int	optind = 1;
int	optopt;
char	*optarg;

main(argc, argv, envp)
int argc;
char **argv, **envp;
{
	/* I do a lot of voids, so that lint doesn't complain */
	void init_tetris(), print_shape(), setup_next(), drop_block(); 

	char c, input;						/* holds user's keypresses */
	char tetrisenv[1024];
	char buf[1024];
	int i=0, j=0, k=0, disp_score;

	opterr = 0;
	disp_next = 1;
	disp_open = 1;
	shadow = 1;

	if(argv[1] && !strcmp(argv[1], "-")){
		fprintf(stderr, "Usage: %s [-] [-whotnbsa] [-L level] [-N name] [-O oblev] [-K keys]\n", argv[0]);
		fprintf(stderr, "\t- - give this summary of usage\n");
		fprintf(stderr, "\tw - makes you unwritable for duration of game\n");
		fprintf(stderr, "\th - suppress printing of high score list\n");
		fprintf(stderr, "\to - suppress opening screen selection box\n");
		fprintf(stderr, "\tt - display roguelike tombstone\n");
		fprintf(stderr, "\tn - turn off next block display\n");
		fprintf(stderr, "\tb - turn off shadowing\n");
		fprintf(stderr, "\ts - display high score list and exit\n");
		fprintf(stderr, "\ta - addict option, logs you out when game is over\n");
		fprintf(stderr, "\tN [name] - use [name] for high score list\n");
		fprintf(stderr, "\tL [level] - start at [level] of difficulty\n");
		fprintf(stderr, "\tO [oblev] - generate [oblev]s of debris\n");
		fprintf(stderr, "\tK [keys] - map control keys to [keys]\n");
		fprintf(stderr, "\t\tmail suggestions to vespa@ssyx.ucsc.edu\n");
		fprintf(stderr, "\t\t                    {...}!ucbvax!ucscc!ssyx!vespa\n");
		exit(0);
	}

	/* if the user has set an environment variable "TETRIS" then process it */

	if(argc<2 && getenv("TETRIS") == NULL) {
		i=0, j=0, k=0;
		
		strcpy(tetrisenv, getenv("TETRIS"));

		argc = 1;

		while(i < strlen(tetrisenv) + 1) {

			if(tetrisenv[i] == ' ' || tetrisenv[i] == '\0') {
				buf[k] = '\0';
				argv[++j] = (char *)malloc(100 * sizeof(char));
				strcpy(argv[j], buf);
				argc++;
				i++;
				k = 0;
			}
			else {
				buf[k] = tetrisenv[i];
				i++;
				k++;
			}
		}
	} else if(argc<2)
		argv[1] = (char *)malloc(100 * sizeof(char *));
	

	/* process the arguments to the program */

	while((c = getopt(argc, argv, "wtohnbsaL:N:O:K:")) != EOF) {
		switch(c) {
			case 'w':
				nowrite = 1;
				break;
			case 'a':
				addict = 1;
				break;
			case 't':
				disp_tomb = 1;
				break;
			case 'o':
				disp_open = 0;
				break;
			case 'h':
				disp_high = 1;
				break;
			case 'n':
				disp_next = 0;
				break;
			case 'b':
				shadow = 0;
				break;
			case 's':
				disp_score = 1;
				break;
			case 'N':
				strcpy(username, optarg);
				break;
			case 'L':
				level = (int)atoi(optarg);
				if(level>20)
					level = 20;
				break;
			case 'O':
				rubble = (int)atoi(optarg);
				if(rubble>13)
					rubble = 13;
				break;
			case 'K':
				if(strlen(optarg) == 7)
					strcpy(keystr, optarg);
				if(strlen(optarg) == 7)
					break;
			default:
				fprintf(stderr, "Unknown flag or improper usage:\n");
				fprintf(stderr, "\tuse '%s -' for usage\n", argv[0]);
				exit(1);
		}
	}

	if(!init_csr()) {
		exit(1);
	}

	if(disp_score) {
		display_high();
		exit(0);
	}

	init_tetris();					/* inits stuff */

	/* make unwritable */
	if(nowrite & 1) {
		ttystat->st_mode &= 495;
		chmod(ttyname(0), ttystat->st_mode);
	}

	while (1) {						/* main loop, soon to be replaced */

		while (read(0, &input, 1) == -1)	/* wait for input */
			;

		sprintf(argv[1], "%7.7d", points);

		process_input(input); 				/* call to input processor */

		SIGRELSE(14);						/* this is an attempt to fix a
											   rare bug. ignore it     */

	}
}

/*
 * Here's something you've all been waiting for:  the AT&T public domain
 * source for getopt (3).  It is the code which was given out at the 1985
 * UNIFORUM conference in Dallas.  I obtained it by electronic mail
 * directly from AT&T.  The people there assure me that it is indeed
 * in the public domain.
 * 
 * There is no manual page.  That is because the one they gave out at
 * UNIFORUM was slightly different from the current System V Release 2
 * manual page.  The difference apparently involved a note about the
 * famous rules 5 and 6, recommending using white space between an option
 * and its first argument, and not grouping options that have arguments.
 * Getopt itself is currently lenient about both of these things.  White
 * space is allowed, but not mandatory, and the last option in a group can
 * have an argument.  That particular version of the man page evidently
 * has no official existence, and my source at AT&T did not send a copy.
 * The current SVR2 man page reflects the actual behavor of this getopt.
 * However, I am not about to post a copy of anything licensed by AT&T.
 */

/*LINTLIBRARY*/
#define NULL	0
#define EOF	(-1)
#define ERR(s, c)	if (opterr){\
	extern int write();\
	char errbuf[2];\
	errbuf[0] = c; errbuf[1] = '\n';\
	(void) write (2, argv[0], (unsigned)strlen (argv[0]));\
	(void) write (2, s, (unsigned)strlen (s));\
	(void) write (2, errbuf, 2);}

extern char *index();


int getopt(argc, argv, opts)
int	argc;
char	**argv, *opts;
{
	static int sp = 1;
	register int c;
	register char *cp;

	if (sp == 1)
		if (optind >= argc ||
		   argv[optind][0] != '-' || argv[optind][1] == '\0')
			return (EOF);
		else if (strcmp (argv[optind], "--") == NULL) {
			optind++;
			return (EOF);
		}
	optopt = c = argv[optind][sp];
	if (c == ':' || (cp=index (opts, c)) == NULL) {
		ERR (": illegal option -- ", c);
		if (argv[optind][++sp] == '\0') {
			optind++;
			sp = 1;
		}
		return ('?');
	}
	if (*++cp == ':') {
		if (argv[optind][sp+1] != '\0')
			optarg = &argv[optind++][sp+1];
		else if (++optind >= argc) {
			ERR (": option requires an argument -- ", c);
			sp = 1;
			return ('?');
		} else
			optarg = argv[optind++];
		sp = 1;
	} else {
		if (argv[optind][++sp] == '\0') {
			sp = 1;
			optind++;
		}
		optarg = NULL;
	}
	return (c);
}