|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1987 by Ed James, UC Berkeley. All rights reserved. ! 3: * ! 4: * Copy permission is hereby granted provided that this notice is ! 5: * retained on all partial or complete copies. ! 6: * ! 7: * For more info on this and all of my stuff, mail [email protected]. ! 8: */ ! 9: ! 10: #include "include.h" ! 11: ! 12: main(ac, av) ! 13: char *av[]; ! 14: { ! 15: int seed; ! 16: int f_usage = 0, f_list = 0, f_showscore = 0; ! 17: int f_printpath = 0; ! 18: char *file = NULL; ! 19: char *name, *ptr; ! 20: #ifdef BSD ! 21: struct itimerval itv; ! 22: #endif ! 23: extern int update(), quit(), log_score(); ! 24: extern char *default_game(), *okay_game(); ! 25: ! 26: start_time = seed = time(0); ! 27: ! 28: name = *av++; ! 29: while (*av) { ! 30: #ifndef SAVEDASH ! 31: if (**av == '-') ! 32: *++*av; ! 33: else ! 34: break; ! 35: #endif ! 36: ptr = *av++; ! 37: while (*ptr) { ! 38: switch (*ptr) { ! 39: case '?': ! 40: case 'u': ! 41: f_usage++; ! 42: break; ! 43: case 'l': ! 44: f_list++; ! 45: break; ! 46: case 's': ! 47: case 't': ! 48: f_showscore++; ! 49: break; ! 50: case 'p': ! 51: f_printpath++; ! 52: break; ! 53: case 'r': ! 54: seed = atoi(*av); ! 55: av++; ! 56: break; ! 57: case 'f': ! 58: case 'g': ! 59: file = *av; ! 60: av++; ! 61: break; ! 62: default: ! 63: fprintf(stderr, "Unknown option '%c'\n", *ptr, ! 64: name); ! 65: f_usage++; ! 66: break; ! 67: } ! 68: ptr++; ! 69: } ! 70: } ! 71: srandom(seed); ! 72: ! 73: if (f_usage) ! 74: fprintf(stderr, ! 75: "Usage: %s -[u?lstp] [-[gf] game_name] [-r random seed]\n", ! 76: name); ! 77: if (f_showscore) ! 78: log_score(1); ! 79: if (f_list) ! 80: list_games(); ! 81: if (f_printpath) { ! 82: char buf[100]; ! 83: ! 84: strcpy(buf, SPECIAL_DIR); ! 85: buf[strlen(buf) - 1] = '\0'; ! 86: puts(buf); ! 87: } ! 88: ! 89: if (f_usage || f_showscore || f_list || f_printpath) ! 90: exit(0); ! 91: ! 92: if (file == NULL) ! 93: file = default_game(); ! 94: else ! 95: file = okay_game(file); ! 96: ! 97: if (file == NULL || read_file(file) < 0) ! 98: exit(1); ! 99: ! 100: init_gr(); ! 101: setup_screen(sp); ! 102: ! 103: addplane(); ! 104: ! 105: signal(SIGINT, quit); ! 106: signal(SIGQUIT, quit); ! 107: #ifdef BSD ! 108: signal(SIGTSTP, SIG_IGN); ! 109: signal(SIGSTOP, SIG_IGN); ! 110: #endif ! 111: signal(SIGHUP, log_score); ! 112: signal(SIGTERM, log_score); ! 113: ! 114: #ifdef BSD ! 115: ioctl(fileno(stdin), TIOCGETP, &tty_start); ! 116: bcopy(&tty_start, &tty_new, sizeof(tty_new)); ! 117: tty_new.sg_flags |= CBREAK; ! 118: tty_new.sg_flags &= ~ECHO; ! 119: ioctl(fileno(stdin), TIOCSETP, &tty_new); ! 120: #endif ! 121: ! 122: #ifdef SYSV ! 123: ioctl(fileno(stdin), TCGETA, &tty_start); ! 124: bcopy(&tty_start, &tty_new, sizeof(tty_new)); ! 125: tty_new.c_lflag &= ~ICANON; ! 126: tty_new.c_lflag &= ~ECHO; ! 127: tty_new.c_cc[VMIN] = 1; ! 128: tty_new.c_cc[VTIME] = 0; ! 129: ioctl(fileno(stdin), TCSETAW, &tty_new); ! 130: #endif ! 131: ! 132: signal(SIGALRM, update); ! 133: ! 134: #ifdef BSD ! 135: itv.it_value.tv_sec = 0; ! 136: itv.it_value.tv_usec = 1; ! 137: itv.it_interval.tv_sec = sp->update_secs; ! 138: itv.it_interval.tv_usec = 0; ! 139: setitimer(ITIMER_REAL, &itv, NULL); ! 140: #endif ! 141: #ifdef SYSV ! 142: alarm(sp->update_secs); ! 143: #endif ! 144: ! 145: for (;;) { ! 146: if (getcommand() != 1) ! 147: planewin(); ! 148: else { ! 149: #ifdef BSD ! 150: itv.it_value.tv_sec = 0; ! 151: itv.it_value.tv_usec = 0; ! 152: setitimer(ITIMER_REAL, &itv, NULL); ! 153: #endif ! 154: #ifdef SYSV ! 155: alarm(0); ! 156: #endif ! 157: ! 158: update(); ! 159: ! 160: #ifdef BSD ! 161: itv.it_value.tv_sec = sp->update_secs; ! 162: itv.it_value.tv_usec = 0; ! 163: itv.it_interval.tv_sec = sp->update_secs; ! 164: itv.it_interval.tv_usec = 0; ! 165: setitimer(ITIMER_REAL, &itv, NULL); ! 166: #endif ! 167: #ifdef SYSV ! 168: alarm(sp->update_secs); ! 169: #endif ! 170: } ! 171: } ! 172: } ! 173: ! 174: read_file(s) ! 175: char *s; ! 176: { ! 177: extern FILE *yyin; ! 178: int retval; ! 179: ! 180: file = s; ! 181: yyin = fopen(s, "r"); ! 182: if (yyin == NULL) { ! 183: perror(s); ! 184: return (-1); ! 185: } ! 186: retval = yyparse(); ! 187: fclose(yyin); ! 188: ! 189: if (retval != 0) ! 190: return (-1); ! 191: else ! 192: return (0); ! 193: } ! 194: ! 195: char * ! 196: default_game() ! 197: { ! 198: FILE *fp; ! 199: static char file[256]; ! 200: char line[256], games[256]; ! 201: ! 202: strcpy(games, SPECIAL_DIR); ! 203: strcat(games, GAMES); ! 204: ! 205: if ((fp = fopen(games, "r")) == NULL) { ! 206: perror(games); ! 207: return (NULL); ! 208: } ! 209: if (fgets(line, sizeof(line), fp) == NULL) { ! 210: fprintf(stderr, "%s: no default game available\n", games); ! 211: return (NULL); ! 212: } ! 213: fclose(fp); ! 214: line[strlen(line) - 1] = '\0'; ! 215: strcpy(file, SPECIAL_DIR); ! 216: strcat(file, line); ! 217: return (file); ! 218: } ! 219: ! 220: char * ! 221: okay_game(s) ! 222: char *s; ! 223: { ! 224: FILE *fp; ! 225: static char file[256]; ! 226: char *ret = NULL, line[256], games[256]; ! 227: ! 228: strcpy(games, SPECIAL_DIR); ! 229: strcat(games, GAMES); ! 230: ! 231: if ((fp = fopen(games, "r")) == NULL) { ! 232: perror(games); ! 233: return (NULL); ! 234: } ! 235: while (fgets(line, sizeof(line), fp) != NULL) { ! 236: line[strlen(line) - 1] = '\0'; ! 237: if (strcmp(s, line) == 0) { ! 238: strcpy(file, SPECIAL_DIR); ! 239: strcat(file, line); ! 240: ret = file; ! 241: break; ! 242: } ! 243: } ! 244: fclose(fp); ! 245: if (ret == NULL) { ! 246: test_mode = 1; ! 247: ret = s; ! 248: fprintf(stderr, "%s: %s: game not found\n", games, s); ! 249: fprintf(stderr, "Your score will not be logged.\n"); ! 250: sleep(2); /* give the guy time to read it */ ! 251: } ! 252: return (ret); ! 253: } ! 254: ! 255: list_games() ! 256: { ! 257: FILE *fp; ! 258: char line[256], games[256]; ! 259: int num_games = 0; ! 260: ! 261: strcpy(games, SPECIAL_DIR); ! 262: strcat(games, GAMES); ! 263: ! 264: if ((fp = fopen(games, "r")) == NULL) { ! 265: perror(games); ! 266: return (-1); ! 267: } ! 268: puts("available games:"); ! 269: while (fgets(line, sizeof(line), fp) != NULL) { ! 270: printf(" %s", line); ! 271: num_games++; ! 272: } ! 273: fclose(fp); ! 274: if (num_games == 0) { ! 275: fprintf(stderr, "%s: no games available\n", games); ! 276: return (-1); ! 277: } ! 278: return (0); ! 279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.