terminal.c revision 1.2 1 1.2 lukem /* $NetBSD: terminal.c,v 1.2 1997/10/10 16:34:05 lukem Exp $ */
2 1.1 mrg /*
3 1.1 mrg * Hunt
4 1.1 mrg * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
5 1.1 mrg * San Francisco, California
6 1.1 mrg */
7 1.1 mrg
8 1.2 lukem #include <sys/cdefs.h>
9 1.2 lukem #ifndef lint
10 1.2 lukem __RCSID("$NetBSD: terminal.c,v 1.2 1997/10/10 16:34:05 lukem Exp $");
11 1.2 lukem #endif /* not lint */
12 1.2 lukem
13 1.2 lukem #if __STDC__
14 1.2 lukem #include <stdarg.h>
15 1.2 lukem #else
16 1.2 lukem #include <varargs.h>
17 1.2 lukem #endif
18 1.1 mrg # include "hunt.h"
19 1.1 mrg # define TERM_WIDTH 80 /* Assume terminals are 80-char wide */
20 1.1 mrg
21 1.1 mrg /*
22 1.1 mrg * cgoto:
23 1.1 mrg * Move the cursor to the given position on the given player's
24 1.1 mrg * terminal.
25 1.1 mrg */
26 1.2 lukem void
27 1.1 mrg cgoto(pp, y, x)
28 1.2 lukem PLAYER *pp;
29 1.2 lukem int y, x;
30 1.1 mrg {
31 1.1 mrg if (x == pp->p_curx && y == pp->p_cury)
32 1.1 mrg return;
33 1.1 mrg sendcom(pp, MOVE, y, x);
34 1.1 mrg pp->p_cury = y;
35 1.1 mrg pp->p_curx = x;
36 1.1 mrg }
37 1.1 mrg
38 1.1 mrg /*
39 1.1 mrg * outch:
40 1.1 mrg * Put out a single character.
41 1.1 mrg */
42 1.2 lukem void
43 1.1 mrg outch(pp, ch)
44 1.2 lukem PLAYER *pp;
45 1.2 lukem char ch;
46 1.1 mrg {
47 1.1 mrg if (++pp->p_curx >= TERM_WIDTH) {
48 1.1 mrg pp->p_curx = 0;
49 1.1 mrg pp->p_cury++;
50 1.1 mrg }
51 1.1 mrg (void) putc(ch, pp->p_output);
52 1.1 mrg }
53 1.1 mrg
54 1.1 mrg /*
55 1.1 mrg * outstr:
56 1.1 mrg * Put out a string of the given length.
57 1.1 mrg */
58 1.2 lukem void
59 1.1 mrg outstr(pp, str, len)
60 1.2 lukem PLAYER *pp;
61 1.2 lukem char *str;
62 1.2 lukem int len;
63 1.1 mrg {
64 1.1 mrg pp->p_curx += len;
65 1.1 mrg pp->p_cury += (pp->p_curx / TERM_WIDTH);
66 1.1 mrg pp->p_curx %= TERM_WIDTH;
67 1.1 mrg while (len--)
68 1.1 mrg (void) putc(*str++, pp->p_output);
69 1.1 mrg }
70 1.1 mrg
71 1.1 mrg /*
72 1.1 mrg * clrscr:
73 1.1 mrg * Clear the screen, and reset the current position on the screen.
74 1.1 mrg */
75 1.2 lukem void
76 1.1 mrg clrscr(pp)
77 1.2 lukem PLAYER *pp;
78 1.1 mrg {
79 1.1 mrg sendcom(pp, CLEAR);
80 1.1 mrg pp->p_cury = 0;
81 1.1 mrg pp->p_curx = 0;
82 1.1 mrg }
83 1.1 mrg
84 1.1 mrg /*
85 1.1 mrg * ce:
86 1.1 mrg * Clear to the end of the line
87 1.1 mrg */
88 1.2 lukem void
89 1.1 mrg ce(pp)
90 1.2 lukem PLAYER *pp;
91 1.1 mrg {
92 1.1 mrg sendcom(pp, CLRTOEOL);
93 1.1 mrg }
94 1.1 mrg
95 1.2 lukem #if 0 /* XXX lukem*/
96 1.1 mrg /*
97 1.1 mrg * ref;
98 1.1 mrg * Refresh the screen
99 1.1 mrg */
100 1.2 lukem void
101 1.1 mrg ref(pp)
102 1.2 lukem PLAYER *pp;
103 1.1 mrg {
104 1.1 mrg sendcom(pp, REFRESH);
105 1.1 mrg }
106 1.2 lukem #endif
107 1.1 mrg
108 1.1 mrg /*
109 1.1 mrg * sendcom:
110 1.1 mrg * Send a command to the given user
111 1.1 mrg */
112 1.2 lukem void
113 1.2 lukem #if __STDC__
114 1.2 lukem sendcom(PLAYER *pp, int command, ...)
115 1.2 lukem #else
116 1.2 lukem sendcom(pp, command, va_alist)
117 1.2 lukem PLAYER *pp;
118 1.2 lukem int command;
119 1.2 lukem va_dcl
120 1.2 lukem #endif
121 1.2 lukem {
122 1.2 lukem va_list ap;
123 1.2 lukem int arg1, arg2;
124 1.2 lukem #if __STDC__
125 1.2 lukem va_start(ap, command);
126 1.2 lukem #else
127 1.2 lukem va_start(ap);
128 1.2 lukem #endif
129 1.1 mrg (void) putc(command, pp->p_output);
130 1.1 mrg switch (command & 0377) {
131 1.2 lukem case MOVE:
132 1.2 lukem arg1 = va_arg(ap, int);
133 1.2 lukem arg2 = va_arg(ap, int);
134 1.1 mrg (void) putc(arg1, pp->p_output);
135 1.1 mrg (void) putc(arg2, pp->p_output);
136 1.1 mrg break;
137 1.2 lukem case ADDCH:
138 1.2 lukem case READY:
139 1.2 lukem arg1 = va_arg(ap, int);
140 1.1 mrg (void) putc(arg1, pp->p_output);
141 1.1 mrg break;
142 1.1 mrg }
143 1.2 lukem
144 1.2 lukem va_end(ap); /* No return needed for void functions. */
145 1.1 mrg }
146