From 164f814056645ef1910d5bf4c9147929e07c3a7c Mon Sep 17 00:00:00 2001 From: roy Date: Wed, 3 Feb 2010 15:34:37 +0000 Subject: Userland now builds and uses terminfo instead of termcap. OK: core@, jdc@ --- hack/Makefile | 8 +- hack/extern.h | 12 +- hack/hack.c | 6 +- hack/hack.cmd.c | 6 +- hack/hack.end.c | 6 +- hack/hack.main.c | 6 +- hack/hack.pager.c | 6 +- hack/hack.pri.c | 6 +- hack/hack.save.c | 6 +- hack/hack.termcap.c | 352 --------------------------------------------------- hack/hack.terminfo.c | 314 +++++++++++++++++++++++++++++++++++++++++++++ hack/hack.tty.c | 16 +-- hack/hack.u_init.c | 8 +- 13 files changed, 357 insertions(+), 395 deletions(-) delete mode 100644 hack/hack.termcap.c create mode 100644 hack/hack.terminfo.c (limited to 'hack') diff --git a/hack/Makefile b/hack/Makefile index fe787747..be6c78a1 100644 --- a/hack/Makefile +++ b/hack/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.41 2008/08/29 00:02:22 gmcgarry Exp $ +# $NetBSD: Makefile,v 1.42 2010/02/03 15:34:38 roy Exp $ # @(#)Makefile 8.2 (Berkeley) 4/27/95 .include @@ -13,13 +13,13 @@ SRCS+= alloc.c hack.Decl.c hack.apply.c hack.bones.c hack.c hack.cmd.c \ hack.mkmaze.c hack.mkobj.c hack.mkshop.c hack.mon.c hack.monst.c \ hack.o_init.c hack.objnam.c hack.options.c hack.pager.c hack.potion.c \ hack.pri.c hack.read.c hack.rip.c hack.rumors.c hack.save.c \ - hack.search.c hack.shk.c hack.shknam.c hack.steal.c hack.termcap.c \ + hack.search.c hack.shk.c hack.shknam.c hack.steal.c hack.terminfo.c \ hack.timeout.c hack.topl.c hack.track.c hack.trap.c hack.tty.c \ hack.u_init.c hack.unix.c hack.vault.c hack.version.c hack.wield.c \ hack.wizard.c hack.worm.c hack.worn.c hack.zap.c rnd.c MAN= hack.6 -DPADD+= ${LIBTERMCAP} -LDADD+= -ltermcap +DPADD+= ${LIBTERMINFO} +LDADD+= -lterminfo HIDEGAME=hidegame SETGIDGAME=yes CLEANFILES+=makedefs makedefs.lo diff --git a/hack/extern.h b/hack/extern.h index e2b67441..fe8bdfc5 100644 --- a/hack/extern.h +++ b/hack/extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.12 2009/08/12 07:28:40 dholland Exp $ */ +/* $NetBSD: extern.h,v 1.13 2010/02/03 15:34:38 roy Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -137,7 +137,7 @@ void done1(int); void done_in_by(struct monst *); void done(const char *); void clearlocks(void); -void hangup(int) __attribute__((__noreturn__)); +void hang_up(int) __attribute__((__noreturn__)); char *eos(char *); void charcat(char *, int); void prscore(int, char **); @@ -400,16 +400,16 @@ void relobj(struct monst *, int); /* hack.termcap.c */ void startup(void); -void start_screen(void); -void end_screen(void); +void startscreen(void); +void endscreen(void); void curs(int, int); void cl_end(void); -void clear_screen(void); +void clearscreen(void); void home(void); void standoutbeg(void); void standoutend(void); void backsp(void); -void bell(void); +void sound_bell(void); void delay_output(void); void cl_eos(void); diff --git a/hack/hack.c b/hack/hack.c index 8da2c771..8b1731a2 100644 --- a/hack/hack.c +++ b/hack/hack.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.c,v 1.9 2009/08/12 07:28:40 dholland Exp $ */ +/* $NetBSD: hack.c,v 1.10 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.c,v 1.9 2009/08/12 07:28:40 dholland Exp $"); +__RCSID("$NetBSD: hack.c,v 1.10 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ #include "hack.h" @@ -459,7 +459,7 @@ pickup(int all) pline("Pick up %s ? [ynaq]", doname(obj)); while (!strchr("ynaq ", (c = readchar()))) - bell(); + sound_bell(); if (c == 'q') return; if (c == 'n') diff --git a/hack/hack.cmd.c b/hack/hack.cmd.c index a9e7fc08..e2e931f9 100644 --- a/hack/hack.cmd.c +++ b/hack/hack.cmd.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.cmd.c,v 1.10 2009/08/12 07:28:40 dholland Exp $ */ +/* $NetBSD: hack.cmd.c,v 1.11 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.cmd.c,v 1.10 2009/08/12 07:28:40 dholland Exp $"); +__RCSID("$NetBSD: hack.cmd.c,v 1.11 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ #include "hack.h" @@ -159,7 +159,7 @@ rhack(const char *cmd) } if (!*cmd || (*cmd & 0377) == 0377 || (flags.no_rest_on_space && *cmd == ' ')) { - bell(); + sound_bell(); flags.move = 0; return; /* probably we just had an interrupt */ } diff --git a/hack/hack.end.c b/hack/hack.end.c index eef8effb..6d972497 100644 --- a/hack/hack.end.c +++ b/hack/hack.end.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.end.c,v 1.13 2009/08/12 07:28:40 dholland Exp $ */ +/* $NetBSD: hack.end.c,v 1.14 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.end.c,v 1.13 2009/08/12 07:28:40 dholland Exp $"); +__RCSID("$NetBSD: hack.end.c,v 1.14 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ #include @@ -648,7 +648,7 @@ clearlocks(void) #ifdef NOSAVEONHANGUP /*ARGSUSED*/ void -hangup(int n __unused) +hang_up(int n __unused) { (void) signal(SIGINT, SIG_IGN); clearlocks(); diff --git a/hack/hack.main.c b/hack/hack.main.c index 623752c7..cfa379b9 100644 --- a/hack/hack.main.c +++ b/hack/hack.main.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.main.c,v 1.14 2009/08/12 07:28:40 dholland Exp $ */ +/* $NetBSD: hack.main.c,v 1.15 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.main.c,v 1.14 2009/08/12 07:28:40 dholland Exp $"); +__RCSID("$NetBSD: hack.main.c,v 1.15 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ #include @@ -184,7 +184,7 @@ main(int argc, char *argv[]) cls(); u.uhp = 1; /* prevent RIP on early quits */ u.ux = FAR; /* prevent nscr() */ - (void) signal(SIGHUP, hangup); + (void) signal(SIGHUP, hang_up); /* * Find the creation date of this game, diff --git a/hack/hack.pager.c b/hack/hack.pager.c index b72cb99e..eb6484be 100644 --- a/hack/hack.pager.c +++ b/hack/hack.pager.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.pager.c,v 1.13 2009/08/12 07:28:41 dholland Exp $ */ +/* $NetBSD: hack.pager.c,v 1.14 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.pager.c,v 1.13 2009/08/12 07:28:41 dholland Exp $"); +__RCSID("$NetBSD: hack.pager.c,v 1.14 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ /* This file contains the command routine dowhatis() and a pager. */ @@ -359,7 +359,7 @@ dohelp(void) pline("Long or short help? "); while (((c = readchar()) != 'l') && (c != 's') && !strchr(quitchars, c)) - bell(); + sound_bell(); if (!strchr(quitchars, c)) (void) page_file((c == 'l') ? HELP : SHELP, FALSE); return (0); diff --git a/hack/hack.pri.c b/hack/hack.pri.c index 0db65d56..ad09bab6 100644 --- a/hack/hack.pri.c +++ b/hack/hack.pri.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.pri.c,v 1.12 2009/08/12 07:28:41 dholland Exp $ */ +/* $NetBSD: hack.pri.c,v 1.13 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.pri.c,v 1.12 2009/08/12 07:28:41 dholland Exp $"); +__RCSID("$NetBSD: hack.pri.c,v 1.13 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ #include "hack.h" @@ -796,7 +796,7 @@ cls(void) more(); flags.toplin = 0; - clear_screen(); + clearscreen(); flags.botlx = 1; } diff --git a/hack/hack.save.c b/hack/hack.save.c index 72722a02..65ce5012 100644 --- a/hack/hack.save.c +++ b/hack/hack.save.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.save.c,v 1.13 2009/08/12 07:28:41 dholland Exp $ */ +/* $NetBSD: hack.save.c,v 1.14 2010/02/03 15:34:38 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.save.c,v 1.13 2009/08/12 07:28:41 dholland Exp $"); +__RCSID("$NetBSD: hack.save.c,v 1.14 2010/02/03 15:34:38 roy Exp $"); #endif /* not lint */ #include @@ -87,7 +87,7 @@ dosave(void) #ifndef NOSAVEONHANGUP void -hangup(int n __unused) +hang_up(int n __unused) { (void) dosave0(1); exit(1); diff --git a/hack/hack.termcap.c b/hack/hack.termcap.c deleted file mode 100644 index 6e7e9662..00000000 --- a/hack/hack.termcap.c +++ /dev/null @@ -1,352 +0,0 @@ -/* $NetBSD: hack.termcap.c,v 1.18 2009/08/12 07:28:41 dholland Exp $ */ - -/* - * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, - * Amsterdam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - 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. - * - * - Neither the name of the Stichting Centrum voor Wiskunde en - * Informatica, 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER - * 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. - */ - -/* - * Copyright (c) 1982 Jay Fenlason - * All rights reserved. - * - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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. - */ - -#include -#ifndef lint -__RCSID("$NetBSD: hack.termcap.c,v 1.18 2009/08/12 07:28:41 dholland Exp $"); -#endif /* not lint */ - -#include -#include -#include -#include -#include -#include "hack.h" -#include "extern.h" -#include "def.flag.h" /* for flags.nonull */ - -static struct tinfo *info; -static const char *HO, *CL, *CE, *CM, *ND, *XD, *BC_BS, *SO, *SE, *TI, *TE; -static const char *VS, *VE; -static int SG; -char *CD; /* tested in pri.c: docorner() */ -int CO, LI; /* used in pri.c and whatis.c */ - -static void nocmov(int, int); -static void cmov(int, int); -static int xputc(int); -static void xputs(const char *); - -void -startup(void) -{ - char *term; - - /* UP, BC, PC already set */ - if (!(term = getenv("TERM"))) - error("Can't get TERM."); - if (!strncmp(term, "5620", 4)) - flags.nonull = 1; /* this should be a termcap flag */ - if (t_getent(&info, term) < 1) - error("Unknown terminal type: %s.", term); - BC_BS = t_agetstr(info, "bc"); - if (!BC_BS) { - if (!t_getflag(info, "bs")) - error("Terminal must backspace."); - BC_BS = "\b"; - } - HO = t_agetstr(info, "ho"); - CO = t_getnum(info, "co"); - LI = t_getnum(info, "li"); - if (CO < COLNO || LI < ROWNO + 2) - setclipped(); - if (!(CL = t_agetstr(info, "cl"))) - error("Hack needs CL."); - ND = t_agetstr(info, "nd"); - if (t_getflag(info, "os")) - error("Hack can't have OS."); - CE = t_agetstr(info, "ce"); - /* - * It seems that xd is no longer supported, and we should use a - * linefeed instead; unfortunately this requires resetting CRMOD, and - * many output routines will have to be modified slightly. Let's - * leave that till the next release. - */ - XD = t_agetstr(info, "xd"); - /* not: XD = t_agetstr(info, "do"); */ - if (!(CM = t_agetstr(info, "cm"))) { - if (!UP && !HO) - error("Hack needs CM or UP or HO."); - printf("Playing hack on terminals without cm is suspect...\n"); - getret(); - } - SO = t_agetstr(info, "so"); - SE = t_agetstr(info, "se"); - SG = t_getnum(info, "sg"); /* -1: not fnd; else # of spaces left by so */ - if (!SO || !SE || (SG > 0)) - SO = SE = 0; - CD = t_agetstr(info, "cd"); - set_whole_screen(); /* uses LI and CD */ -} - -void -start_screen(void) -{ - xputs(TI); - xputs(VS); -} - -void -end_screen(void) -{ - xputs(VE); - xputs(TE); -} - -/* - * Cursor movements - * - * x,y not xchar: perhaps xchar is unsigned and - * curx-x would be unsigned as well - */ -void -curs(int x, int y) -{ - - if (y == cury && x == curx) - return; - if (!ND && (curx != x || x <= 3)) { /* Extremely primitive */ - cmov(x, y); /* bunker!wtm */ - return; - } - if (abs(cury - y) <= 3 && abs(curx - x) <= 3) - nocmov(x, y); - else if ((x <= 3 && abs(cury - y) <= 3) || (!CM && x < abs(curx - x))) { - (void) putchar('\r'); - curx = 1; - nocmov(x, y); - } else if (!CM) { - nocmov(x, y); - } else - cmov(x, y); -} - -static void -nocmov(int x, int y) -{ - if (cury > y) { - if (UP) { - while (cury > y) { /* Go up. */ - xputs(UP); - cury--; - } - } else if (CM) { - cmov(x, y); - } else if (HO) { - home(); - curs(x, y); - } /* else impossible("..."); */ - } else if (cury < y) { - if (XD) { - while (cury < y) { - xputs(XD); - cury++; - } - } else if (CM) { - cmov(x, y); - } else { - while (cury < y) { - xputc('\n'); - curx = 1; - cury++; - } - } - } - if (curx < x) { /* Go to the right. */ - if (!ND) - cmov(x, y); - else /* bah */ - /* should instead print what is there already */ - while (curx < x) { - xputs(ND); - curx++; - } - } else if (curx > x) { - while (curx > x) { /* Go to the left. */ - xputs(BC_BS); - curx--; - } - } -} - -static void -cmov(int x, int y) -{ - char buf[256]; - - if (t_goto(info, CM, x - 1, y - 1, buf, 255) >= 0) { - xputs(buf); - cury = y; - curx = x; - } -} - -static int -xputc(int c) -{ - return (fputc(c, stdout)); -} - -static void -xputs(const char *s) -{ - tputs(s, 1, xputc); -} - -void -cl_end(void) -{ - if (CE) - xputs(CE); - else { /* no-CE fix - free after Harold Rynes */ - /* - * this looks terrible, especially on a slow terminal but is - * better than nothing - */ - int cx = curx, cy = cury; - - while (curx < COLNO) { - xputc(' '); - curx++; - } - curs(cx, cy); - } -} - -void -clear_screen(void) -{ - xputs(CL); - curx = cury = 1; -} - -void -home(void) -{ - char buf[256]; - - if (HO) - xputs(HO); - else if ((CM) && (t_goto(info, CM, 0, 0, buf, 255) >= 0)) - xputs(buf); - else - curs(1, 1); /* using UP ... */ - curx = cury = 1; -} - -void -standoutbeg(void) -{ - if (SO) - xputs(SO); -} - -void -standoutend(void) -{ - if (SE) - xputs(SE); -} - -void -backsp(void) -{ - xputs(BC_BS); - curx--; -} - -void -bell(void) -{ - (void) putchar('\007'); /* curx does not change */ - (void) fflush(stdout); -} - -void -delay_output(void) -{ - - /* delay 50 ms - could also use a 'nap'-system call */ - /* or the usleep call like this :-) */ - usleep(50000); -} - -void -cl_eos(void) -{ /* free after Robert Viduya *//* must only be - * called with curx = 1 */ - - if (CD) - xputs(CD); - else { - int cx = curx, cy = cury; - while (cury <= LI - 2) { - cl_end(); - xputc('\n'); - curx = 1; - cury++; - } - cl_end(); - curs(cx, cy); - } -} diff --git a/hack/hack.terminfo.c b/hack/hack.terminfo.c new file mode 100644 index 00000000..8ded6387 --- /dev/null +++ b/hack/hack.terminfo.c @@ -0,0 +1,314 @@ +/* $NetBSD: hack.terminfo.c,v 1.1 2010/02/03 15:34:38 roy Exp $ */ + +/* + * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, + * Amsterdam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - 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. + * + * - Neither the name of the Stichting Centrum voor Wiskunde en + * Informatica, 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER + * 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. + */ + +/* + * Copyright (c) 1982 Jay Fenlason + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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. + */ + +#include +#ifndef lint +__RCSID("$NetBSD: hack.terminfo.c,v 1.1 2010/02/03 15:34:38 roy Exp $"); +#endif /* not lint */ + +#include +#include +#include +#include +#include +#include "hack.h" +#include "extern.h" +#include "def.flag.h" /* for flags.nonull */ + +char *CD; /* tested in pri.c: docorner() */ +int CO, LI; /* used in pri.c and whatis.c */ + +void +startup(void) +{ + + /* Will exit if no suitable term found */ + setupterm(NULL, 0, NULL); + CO = columns; + LI = lines; + if (CO < COLNO || LI < ROWNO + 2) + setclipped(); + if (clear_screen == NULL) + error("Hack needs clear_screen."); + if (over_strike) + error("Hack can't have over_strike."); + if (cursor_address == NULL) { + printf("Playing hack without cursor_address is suspect..."); + getret(); + } + set_whole_screen(); +} + +void +startscreen(void) +{ +} + +void +endscreen(void) +{ +} + +static int +xputc(int c) +{ + return (fputc(c, stdout)); +} + +static void +xputs(const char *s) +{ + tputs(s, 1, xputc); +} + +static void +cmov(int x, int y) +{ + char *p; + + p = vtparm(cursor_address, y - 1, x - 1); + if (p) { + xputs(p); + cury = y; + curx = x; + } +} + +static void +nocmov(int x, int y) +{ + if (cury > y) { + if (cursor_up) { + while (cury > y) { /* Go up. */ + xputs(cursor_up); + cury--; + } + } else if (cursor_address) { + cmov(x, y); + } else if (cursor_home) { + home(); + curs(x, y); + } /* else impossible("..."); */ + } else if (cury < y) { + if (cursor_address) { + cmov(x, y); +#if 0 + } else if (XD) { + while (cury < y) { + xputs(XD); + cury++; + } +#endif + } else { + while (cury < y) { + xputc('\n'); + curx = 1; + cury++; + } + } + } + if (curx < x) { /* Go to the right. */ + if (!cursor_right) + cmov(x, y); + else /* bah */ + /* should instead print what is there already */ + while (curx < x) { + xputs(cursor_right); + curx++; + } + } else if (curx > x) { + while (curx > x) + backsp(); + } +} + +/* + * Cursor movements + * + * x,y not xchar: perhaps xchar is unsigned and + * curx-x would be unsigned as well + */ +void +curs(int x, int y) +{ + + if (y == cury && x == curx) + return; + if (!cursor_right && (curx != x || x <= 3)) { /* Extremely primitive */ + cmov(x, y); /* bunker!wtm */ + return; + } + if (abs(cury - y) <= 3 && abs(curx - x) <= 3) + nocmov(x, y); + else if ((x <= 3 && abs(cury - y) <= 3) || + (!cursor_address && x < abs(curx - x))) + { + (void) putchar('\r'); + curx = 1; + nocmov(x, y); + } else if (!cursor_address) { + nocmov(x, y); + } else + cmov(x, y); +} + +void +cl_end(void) +{ + if (clr_eol) + xputs(clr_eol); + else { /* no-CE fix - free after Harold Rynes */ + /* + * this looks terrible, especially on a slow terminal but is + * better than nothing + */ + int cx = curx, cy = cury; + + while (curx < COLNO) { + xputc(' '); + curx++; + } + curs(cx, cy); + } +} + +void +clearscreen(void) +{ + xputs(clear_screen); + curx = cury = 1; +} + +void +home(void) +{ + char *out; + + if (cursor_home) + xputs(cursor_home); + else if ((cursor_address) && (out = vtparm(cursor_address, 0, 0))) + xputs(out); + else + curs(1, 1); /* using UP ... */ + curx = cury = 1; +} + +void +standoutbeg(void) +{ + if (enter_standout_mode && exit_standout_mode && !magic_cookie_glitch) + xputs(enter_standout_mode); +} + +void +standoutend(void) +{ + if (exit_standout_mode && enter_standout_mode && !magic_cookie_glitch) + xputs(exit_standout_mode); +} + +void +backsp(void) +{ + if (cursor_left) + xputs(cursor_left); + else + (void) putchar('\b'); + curx--; +} + +void +sound_bell(void) +{ + (void) putchar('\007'); /* curx does not change */ + (void) fflush(stdout); +} + +void +delay_output(void) +{ + + /* delay 50 ms - could also use a 'nap'-system call */ + /* or the usleep call like this :-) */ + usleep(50000); +} + +void +cl_eos(void) +{ /* free after Robert Viduya *//* must only be + * called with curx = 1 */ + + if (clr_eos) + xputs(clr_eos); + else { + int cx = curx, cy = cury; + while (cury <= LI - 2) { + cl_end(); + xputc('\n'); + curx = 1; + cury++; + } + cl_end(); + curs(cx, cy); + } +} diff --git a/hack/hack.tty.c b/hack/hack.tty.c index 8d0802b7..474afab5 100644 --- a/hack/hack.tty.c +++ b/hack/hack.tty.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.tty.c,v 1.14 2009/08/12 07:28:41 dholland Exp $ */ +/* $NetBSD: hack.tty.c,v 1.15 2010/02/03 15:34:39 roy Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)hack.tty.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: hack.tty.c,v 1.14 2009/08/12 07:28:41 dholland Exp $"); +__RCSID("$NetBSD: hack.tty.c,v 1.15 2010/02/03 15:34:39 roy Exp $"); #endif #endif /* not lint */ @@ -152,8 +152,8 @@ gettty(void) void settty(const char *s) { - clear_screen(); - end_screen(); + clearscreen(); + endscreen(); if (s) printf("%s", s); (void) fflush(stdout); @@ -193,7 +193,7 @@ setftty(void) if (change) { setctty(); } - start_screen(); + startscreen(); } @@ -242,7 +242,7 @@ getlin(char *bufp) bufp--; putstr("\b \b"); /* putsym converts \b */ } else - bell(); + sound_bell(); } else if (c == '\n') { *bufp = 0; return; @@ -263,7 +263,7 @@ getlin(char *bufp) putstr("\b \b"); } } else - bell(); + sound_bell(); } } @@ -305,7 +305,7 @@ xwaitforspace(const char *s) morc = c; break; } - bell(); + sound_bell(); } } } diff --git a/hack/hack.u_init.c b/hack/hack.u_init.c index 5bed1e5e..b20bf1de 100644 --- a/hack/hack.u_init.c +++ b/hack/hack.u_init.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.u_init.c,v 1.11 2009/08/12 07:28:41 dholland Exp $ */ +/* $NetBSD: hack.u_init.c,v 1.12 2010/02/03 15:34:39 roy Exp $ */ /* * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, @@ -63,7 +63,7 @@ #include #ifndef lint -__RCSID("$NetBSD: hack.u_init.c,v 1.11 2009/08/12 07:28:41 dholland Exp $"); +__RCSID("$NetBSD: hack.u_init.c,v 1.12 2010/02/03 15:34:39 roy Exp $"); #endif /* not lint */ #include @@ -184,7 +184,7 @@ u_init(void) printf("\nAre you an experienced player? [ny] "); while (!strchr("ynYN \n\004", (exper = readchar()))) - bell(); + sound_bell(); if (exper == '\004') /* Give him an opportunity to get out */ end_of_input(); printf("%c\n", exper); /* echo */ @@ -218,7 +218,7 @@ u_init(void) if (pc == '\004') /* Give him the opportunity to get * out */ end_of_input(); - bell(); + sound_bell(); } if (pc == '\n') pc = 0; -- cgit v1.2.3-56-ge451