Annotation of dgamelaunch-openbsd/mygetnstr.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * Copyright (c) 2004, Jilles Tjoelker
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with
6: * or without modification, are permitted provided that the
7: * following conditions are met:
8: *
9: * 1. Redistributions of source code must retain the above
10: * copyright notice, this list of conditions and the
11: * following disclaimer.
12: * 2. Redistributions in binary form must reproduce the
13: * above copyright notice, this list of conditions and
14: * the following disclaimer in the documentation and/or
15: * other materials provided with the distribution.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
18: * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
19: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22: * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
23: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27: * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
30: * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
31: * OF SUCH DAMAGE.
32: */
33:
34: #include <curses.h>
35:
36: /* Assumes noecho(). */
37: /* As with getnstr(), maxlen does not include the '\0' character. */
38:
39: int
40: mygetnstr(char *buf, int maxlen, int doecho)
41: {
42: int c, i;
43:
44: i = 0;
45: for (;;)
46: {
47: c = getch();
48: if (c == 8 || c == 127 || c == KEY_BACKSPACE || c == KEY_DC ||
49: c == KEY_LEFT)
50: {
51: if (i > 0)
52: {
53: i--;
54: if (doecho)
55: addstr("\010 \010");
56: }
57: else
58: beep();
59: }
60: else if (c == 21 || c == 24 || c == KEY_DL) /* ^U/^X */
61: {
62: while (i > 0)
63: {
64: i--;
65: if (doecho)
66: addstr("\010 \010");
67: }
68: }
69: else if (c == 23) /* ^W */
70: {
71: while (i > 0 && buf[i - 1] == ' ')
72: {
73: i--;
74: if (doecho)
75: addstr("\010 \010");
76: }
77: while (i > 0 && buf[i - 1] != ' ')
78: {
79: i--;
80: if (doecho)
81: addstr("\010 \010");
82: }
83: }
84: else if ((c >= ' ' && c <= '~'))
85: {
86: if (i < maxlen)
87: {
88: buf[i] = c;
89: i++;
90: if (doecho)
91: addch(c);
92: }
93: else
94: beep();
95: }
96: else if (c == 10 || c == 13 || c == KEY_ENTER || c == KEY_RESIZE)
97: break;
98: else if (c == ERR)
99: {
100: buf[i] = 0;
101: return ERR;
102: }
103: else
104: beep();
105: }
106: buf[i] = 0;
107: return OK;
108: }
109:
110: /* vim:ts=8:cin:sw=4
111: */
CVSweb