summaryrefslogtreecommitdiff
path: root/games/rogue/curses.c
diff options
context:
space:
mode:
Diffstat (limited to 'games/rogue/curses.c')
-rw-r--r--games/rogue/curses.c727
1 files changed, 0 insertions, 727 deletions
diff --git a/games/rogue/curses.c b/games/rogue/curses.c
deleted file mode 100644
index c66e3b67284..00000000000
--- a/games/rogue/curses.c
+++ /dev/null
@@ -1,727 +0,0 @@
-/* $OpenBSD: curses.c,v 1.3 1998/08/22 08:55:25 pjanzen Exp $ */
-/* $NetBSD: curses.c,v 1.3 1995/04/22 10:27:27 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 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
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)curses.c 8.1 (Berkeley) 5/31/93";
-#else
-static char rcsid[] = "$OpenBSD: curses.c,v 1.3 1998/08/22 08:55:25 pjanzen Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * curses.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#ifdef CURSES
-
-/* The following is a curses emulation package suitable for the rogue program
- * in which it is included. No other suitability is claimed or suspected.
- * Only those routines currently needed by this rogue program are included.
- * This is being provided for those systems that don't have a suitable
- * curses package and want to run this rogue program.
- *
- * Compile the entire program with -DCURSES to incorporate this package.
- *
- * The following is NOT supported:
- * "%D", "%B", "%n", or "%>" inside a cursor motion (cm) termcap string.
- * Terminals in which the cursor motion addresses the row differently from
- * the column, as in ":cm=\E%2,%3" or ":cm=\EY%+x;%+y"
- * Termcap database stored in the TERMCAP environ variable as returned
- * from md_getenv(). Only the termcap file name can be stored there.
- * See the comments for md_getenv() in machdep.c.
- * Terminals without non-destructive backspace. Backspace (^H) is used
- * for cursor motion regardless of any termcap entries.
- * The ":tc=" termcap entry is ignored.
- *
- * Suggestions:
- * Use line-feed as your termcap "do" entry: ":do=^J", ":do=\012" or
- * ":do=\n" This will help cursor motion optimization. If line-feed
- * won't work, then a short escape sequence will do.
- */
-
-#include <stdio.h>
-#include "rogue.h"
-
-#define BS 010
-#define LF 012
-#define CR 015
-#define ESC '\033'
-#define TAB '\011'
-
-#define ST_MASK 0x80
-#define BUFLEN 256
-
-char terminal[DROWS][DCOLS];
-char buffer[DROWS][DCOLS];
-char *tc_file;
-
-char cm_esc[16];
-char cm_sep[16];
-char cm_end[16];
-boolean cm_reverse = 0;
-boolean cm_two = 0;
-boolean cm_three = 0;
-boolean cm_char = 0;
-short cm_inc = 0;
-
-boolean screen_dirty;
-boolean lines_dirty[DROWS];
-boolean buf_stand_out = 0;
-boolean term_stand_out = 0;
-
-int LINES = DROWS;
-int COLS = DCOLS;
-WINDOW scr_buf;
-WINDOW *curscr = &scr_buf;
-
-char *CL = (char *) 0;
-char *CM = (char *) 0;
-char *UC = (char *) 0; /* UP */
-char *DO = (char *) 0;
-char *VS = "";
-char *VE = "";
-char *TI = "";
-char *TE = "";
-char *SO = "";
-char *SE = "";
-
-short cur_row;
-short cur_col;
-
-void
-initscr()
-{
- clear();
- get_term_info();
- printf("%s%s", TI, VS);
-}
-
-void
-endwin()
-{
- printf("%s%s", TE, VE);
- md_cbreak_no_echo_nonl(0);
-}
-
-void
-move(row, col)
- short row, col;
-{
- curscr->_cury = row;
- curscr->_curx = col;
- screen_dirty = 1;
-}
-
-void
-mvaddstr(row, col, str)
- short row, col;
- char *str;
-{
- move(row, col);
- addstr(str);
-}
-
-void
-addstr(str)
- char *str;
-{
- while (*str) {
- addch((int) *str++);
- }
-}
-
-void
-addch(ch)
- int ch;
-{
- short row, col;
-
- row = curscr->_cury;
- col = curscr->_curx++;
-
- if (buf_stand_out) {
- ch |= ST_MASK;
- }
- buffer[row][col] = (char) ch;
- lines_dirty[row] = 1;
- screen_dirty = 1;
-}
-
-void
-mvaddch(row, col, ch)
- short row, col;
- int ch;
-{
- move(row, col);
- addch(ch);
-}
-
-void
-refresh()
-{
- int i, j, line;
- short old_row, old_col, first_row;
-
- if (screen_dirty) {
-
- old_row = curscr->_cury;
- old_col = curscr->_curx;
- first_row = cur_row;
-
- for (i = 0; i < DROWS; i++) {
- line = (first_row + i) % DROWS;
- if (lines_dirty[line]) {
- for (j = 0; j < DCOLS; j++) {
- if (buffer[line][j] != terminal[line][j]) {
- put_char_at(line, j, buffer[line][j]);
- }
- }
- lines_dirty[line] = 0;
- }
- }
- put_cursor(old_row, old_col);
- screen_dirty = 0;
- fflush(stdout);
- }
-}
-
-void
-wrefresh(scr)
- WINDOW *scr;
-{
- short i, col;
-
- printf("%s", CL);
- cur_row = cur_col = 0;
-
- for (i = 0; i < DROWS; i++) {
- col = 0;
- while (col < DCOLS) {
- while ((col < DCOLS) && (buffer[i][col] == ' ')) {
- col++;
- }
- if (col < DCOLS) {
- put_cursor(i, col);
- }
- while ((col < DCOLS) && (buffer[i][col] != ' ')) {
- put_st_char((int) buffer[i][col]);
- cur_col++;
- col++;
- }
- }
- }
- put_cursor(curscr->_cury, curscr->_curx);
- fflush(stdout);
- scr = scr; /* make lint happy */
-}
-
-int
-mvinch(row, col)
- short row, col;
-{
- move(row, col);
- return((int) buffer[row][col]);
-}
-
-void
-clear()
-{
- printf("%s", CL);
- fflush(stdout);
- cur_row = cur_col = 0;
- move(0, 0);
- clear_buffers();
-}
-
-void
-clrtoeol()
-{
- short row, col;
-
- row = curscr->_cury;
-
- for (col = curscr->_curx; col < DCOLS; col++) {
- buffer[row][col] = ' ';
- }
- lines_dirty[row] = 1;
-}
-
-void
-standout()
-{
- buf_stand_out = 1;
-}
-
-void
-standend()
-{
- buf_stand_out = 0;
-}
-
-void
-crmode()
-{
- md_cbreak_no_echo_nonl(1);
-}
-
-void
-noecho()
-{
- /* crmode() takes care of this */
-}
-
-void
-nonl()
-{
- /* crmode() takes care of this */
-}
-
-void
-clear_buffers()
-{
- int i, j;
-
- screen_dirty = 0;
-
- for (i = 0; i < DROWS; i++) {
- lines_dirty[i] = 0;
- for (j = 0; j < DCOLS; j++) {
- terminal[i][j] = ' ';
- buffer[i][j] = ' ';
- }
- }
-}
-
-void
-put_char_at(row, col, ch)
- short row, col;
- int ch;
-{
- put_cursor(row, col);
- put_st_char(ch);
- terminal[row][col] = (char) ch;
- cur_col++;
-}
-
-void
-put_cursor(row, col)
- short row, col;
-{
- int i, rdif, cdif;
- short ch, t;
-
- rdif = (row > cur_row) ? row - cur_row : cur_row - row;
- cdif = (col > cur_col) ? col - cur_col : cur_col - col;
-
- if (((row > cur_row) && DO) || ((cur_row > row) && UC)) {
- if ((rdif < 4) && (cdif < 4)) {
- for (i = 0; i < rdif; i++) {
- printf("%s", ((row < cur_row) ? UC : DO));
- }
- cur_row = row;
- if (col == cur_col) {
- return;
- }
- }
- }
- if (row == cur_row) {
- if (cdif <= 6) {
- for (i = 0; i < cdif; i++) {
- ch = (col < cur_col) ? BS :
- terminal[row][cur_col + i];
- put_st_char((int) ch);
- }
- cur_row = row;
- cur_col = col;
- return;
- }
- }
- cur_row = row;
- cur_col = col;
-
- row += cm_inc;
- col += cm_inc;
-
- if (cm_reverse) {
- t = row;
- row = col;
- col = t;
- }
- if (cm_two) {
- printf("%s%02d%s%02d%s", cm_esc, row, cm_sep, col, cm_end);
- } else if (cm_three) {
- printf("%s%03d%s%03d%s", cm_esc, row, cm_sep, col, cm_end);
- } else if (cm_char) {
- printf("%s%c%s%c%s", cm_esc, row, cm_sep, col, cm_end);
- } else {
- printf("%s%d%s%d%s", cm_esc, row, cm_sep, col, cm_end);
- }
-}
-
-void
-put_st_char(ch)
- int ch;
-{
- if ((ch & ST_MASK) && (!term_stand_out)) {
- ch &= ~ST_MASK;
- printf("%s%c", SO, ch);
- term_stand_out = 1;
- } else if ((!(ch & ST_MASK)) && term_stand_out) {
- printf("%s%c", SE, ch);
- term_stand_out = 0;
- } else {
- ch &= ~ST_MASK;
- putchar(ch);
- }
-}
-
-void
-get_term_info()
-{
- FILE *fp;
- char *term, *tcf;
- char buf[BUFLEN];
-
- if ((tcf = md_getenv("TERMCAP"))) {
- if (strlen(tcf) > 40) {
- clean_up("TERMCAP file name too long");
- }
- tc_file = tcf;
- } else {
- if (!(tc_file = md_gdtcf())) {
- clean_up("I need a termcap file");
- }
- }
-
- if (!(term = md_getenv("TERM"))) {
- clean_up("Cannot find TERM variable in environ");
- }
- if ((fp = fopen(tc_file, "r")) == NULL) {
- sprintf(buf, "Cannot open TERMCAP file: %s", tc_file);
- clean_up(buf);
- }
-
- if (!tc_tname(fp, term, buf)) {
- sprintf(buf, "Cannot find TERM type: %s in TERMCAP file: %s", term,
- tc_file);
- clean_up(buf);
- }
- tc_gtdata(fp, buf);
- fclose(fp);
-}
-
-boolean
-tc_tname(fp, term, buf)
- FILE *fp;
- char *term;
- char *buf;
-{
- short i, j;
- boolean found = 0;
- char *fg;
-
- while (!found) {
- i = 0;
- fg = fgets(buf, BUFLEN, fp);
- if (fg != NULL) {
- if ( (buf[0] != '#') && (buf[0] != ' ') && (buf[0] != TAB) &&
- (buf[0] != CR) && (buf[0] != LF)) {
- while (buf[i] && (!found)) {
- j = 0;
- while (buf[i] == term[j]) {
- i++;
- j++;
- }
- if ((!term[j]) && ((buf[i] == '|') || (buf[i] == ':'))) {
- found = 1;
- } else {
- while (buf[i] && (buf[i] != '|') && (buf[i] != ':')) {
- i++;
- }
- if (buf[i]) {
- i++;
- }
- }
- }
- }
- } else {
- break;
- }
- }
- return(found);
-}
-
-void
-tc_gtdata(fp, buf)
- FILE *fp;
- char *buf;
-{
- short i;
- boolean first = 1;
-
- do {
- if (!first) {
- if ((buf[0] != TAB) && (buf[0] != ' ')) {
- break;
- }
- }
- first = 0;
- i = 0;
- while (buf[i]) {
- while (buf[i] && (buf[i] != ':')) {
- i++;
- }
- if (buf[i] == ':') {
- if (!strncmp(buf + i, ":cl=", 4)) {
- tc_gets(buf + i, &CL);
- } else if (!strncmp(buf + i, ":cm=", 4)) {
- tc_gets(buf + i, &CM);
- } else if (!strncmp(buf + i, ":up=", 4)) {
- tc_gets(buf + i, &UC);
- } else if (!strncmp(buf + i, ":do=", 4)) {
- tc_gets(buf + i, &DO);
- } else if (!strncmp(buf + i, ":vs=", 4)) {
- tc_gets(buf + i, &VS);
- } else if (!strncmp(buf + i, ":ve=", 4)) {
- tc_gets(buf + i, &VE);
- } else if (!strncmp(buf + i, ":ti=", 4)) {
- tc_gets(buf + i, &TI);
- } else if (!strncmp(buf + i, ":te=", 4)) {
- tc_gets(buf + i, &TE);
- } else if (!strncmp(buf + i, ":vs=", 4)) {
- tc_gets(buf + i, &VS);
- } else if (!strncmp(buf + i, ":ve=", 4)) {
- tc_gets(buf + i, &VE);
- } else if (!strncmp(buf + i, ":so=", 4)) {
- tc_gets(buf + i, &SO);
- } else if (!strncmp(buf + i, ":se=", 4)) {
- tc_gets(buf + i, &SE);
- } else if (!strncmp(buf + i, ":li#", 4)) {
- tc_gnum(buf + i, &LINES);
- } else if (!strncmp(buf + i, ":co#", 4)) {
- tc_gnum(buf + i, &COLS);
- }
- i++;
- }
- }
- } while (fgets(buf, BUFLEN, fp) != NULL);
-
- if ((!CM) || (!CL)) {
- clean_up("Terminal and termcap must have cm and cl");
- }
- tc_cmget();
-}
-
-void
-tc_gets(ibuf, tcstr)
- char *ibuf;
- char **tcstr;
-{
- short i, j, k, n;
- char obuf[BUFLEN];
-
- i = 4;
- j = 0;
-
- while (ibuf[i] && is_digit(ibuf[i])) {
- i++;
- }
-
- while (ibuf[i] && (ibuf[i] != ':')) {
- if (ibuf[i] == '\\') {
- i++;
- switch(ibuf[i]) {
- case 'E':
- obuf[j] = ESC;
- i++;
- break;
- case 'n':
- obuf[j] = LF;
- i++;
- break;
- case 'r':
- obuf[j] = CR;
- i++;
- break;
- case 'b':
- obuf[j] = BS;
- i++;
- break;
- case 't':
- obuf[j] = TAB;
- i++;
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- n = 0;
- k = 0;
- while (k < 3 && ibuf[i] && is_digit(ibuf[i])) {
- n = (8 * n) + (ibuf[i] - '0');
- i++;
- k++;
- }
- obuf[j] = (char) n;
- break;
- default:
- obuf[j] = ibuf[i];
- i++;
- }
- } else if (ibuf[i] == '^') {
- obuf[j] = ibuf[i+1] - 64;
- i += 2;
- } else {
- obuf[j] = ibuf[i++];
- }
- j++;
- }
- obuf[j] = 0;
- if (!(*tcstr = md_malloc(j + 1))) {
- clean_up("cannot alloc() memory");
- }
- (void) strcpy(*tcstr, obuf);
-}
-
-void
-tc_gnum(ibuf, n)
- char *ibuf;
- int *n;
-{
- short i;
- int r = 0;
-
- i = 4;
-
- while (is_digit(ibuf[i])) {
- r = (r * 10) + (ibuf[i] - '0');
- i++;
- }
- *n = r;
-}
-
-void
-tstp()
-{
- endwin();
- md_tstp();
-
- start_window();
- printf("%s%s", TI, VS);
- wrefresh(curscr);
- md_slurp();
-}
-
-void
-tc_cmget()
-{
- short i = 0, j = 0, rc_spec = 0;
-
- while (CM[i] && (CM[i] != '%') && (j < 15)) {
- cm_esc[j++] = CM[i++];
- }
- cm_esc[j] = 0;
-
- while (CM[i] && (rc_spec < 2)) {
- if (CM[i] == '%') {
- i++;
- switch(CM[i]) {
- case 'd':
- rc_spec++;
- break;
- case 'i':
- cm_inc = 1;
- break;
- case '2':
- cm_two = 1;
- rc_spec++;
- break;
- case '3':
- cm_three = 1;
- rc_spec++;
- break;
- case '.':
- cm_char = 1;
- rc_spec++;
- break;
- case 'r':
- cm_reverse = 1;
- break;
- case '+':
- i++;
- cm_inc = CM[i];
- cm_char = 1;
- rc_spec++;
- break;
- }
- i++;
- } else {
- j = 0;
- while (CM[i] && (CM[i] != '%')) {
- cm_sep[j++] = CM[i++];
- }
- cm_sep[j] = 0;
- }
- }
-
- j = 0;
- if (rc_spec == 2) {
- while (CM[i] && (j < 15)) {
- cm_end[j++] = CM[i++];
- }
- }
- cm_end[j] = 0;
-}
-
-#endif