-
Notifications
You must be signed in to change notification settings - Fork 2
/
mygetnstr.c
111 lines (106 loc) · 2.53 KB
/
mygetnstr.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright (c) 2004, Jilles Tjoelker
* 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.
*
* 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.
*/
#include <curses.h>
/* Assumes noecho(). */
/* As with getnstr(), maxlen does not include the '\0' character. */
int
mygetnstr(char *buf, int maxlen, int doecho)
{
int c, i;
i = 0;
for (;;)
{
c = getch();
if (c == 8 || c == 127 || c == KEY_BACKSPACE || c == KEY_DC ||
c == KEY_LEFT)
{
if (i > 0)
{
i--;
if (doecho)
addstr("\010 \010");
}
else
beep();
}
else if (c == 21 || c == 24 || c == KEY_DL) /* ^U/^X */
{
while (i > 0)
{
i--;
if (doecho)
addstr("\010 \010");
}
}
else if (c == 23) /* ^W */
{
while (i > 0 && buf[i - 1] == ' ')
{
i--;
if (doecho)
addstr("\010 \010");
}
while (i > 0 && buf[i - 1] != ' ')
{
i--;
if (doecho)
addstr("\010 \010");
}
}
else if ((c >= ' ' && c <= '~') || (c >= 0xA0 && c <= 0xFF))
{
if (i < maxlen)
{
buf[i] = c;
i++;
if (doecho)
addch(c);
}
else
beep();
}
else if (c == 10 || c == 13 || c == KEY_ENTER || c == KEY_RESIZE)
break;
else if (c == ERR)
{
buf[i] = 0;
return ERR;
}
else
beep();
}
buf[i] = 0;
return OK;
}
/* vim:ts=8:cin:sw=4
*/