curses.c revision 1.26.2.1 1 /* $NetBSD: curses.c,v 1.26.2.1 2017/04/21 16:53:10 bouyer Exp $ */
2
3 /*
4 * Copyright (c) 1981, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32 #include <sys/cdefs.h>
33 #include <stdlib.h>
34 #ifndef lint
35 #if 0
36 static char sccsid[] = "@(#)curses.c 8.3 (Berkeley) 5/4/94";
37 #else
38 __RCSID("$NetBSD: curses.c,v 1.26.2.1 2017/04/21 16:53:10 bouyer Exp $");
39 #endif
40 #endif /* not lint */
41
42 #include "curses.h"
43 #include "curses_private.h"
44
45 /* Private. */
46 int __echoit = 1; /* If stty indicates ECHO. */
47 int __pfast;
48 int __rawmode = 0; /* If stty indicates RAW mode. */
49 int __noqch = 0;
50 /* If terminal doesn't have
51 * insert/delete line capabilities
52 * for quick change on refresh.
53 */
54 char __CA;
55
56 /*
57 * Public.
58 *
59 * XXX
60 * UPPERCASE isn't used by libcurses, and is left for backward
61 * compatibility only.
62 */
63 WINDOW *curscr; /* Current screen. */
64 WINDOW *stdscr; /* Standard screen. */
65 WINDOW *__virtscr; /* Virtual screen (for doupdate()). */
66 SCREEN *_cursesi_screen; /* the current screen we are using */
67 volatile bool _reentrant; /* If true, some global vars are ro. */
68 int COLS; /* Columns on the screen. */
69 int LINES; /* Lines on the screen. */
70 int ESCDELAY; /* ms delay between keys for esc seq */
71 int TABSIZE; /* Size of a tab. */
72 int COLORS; /* Maximum colors on the screen */
73 int COLOR_PAIRS = 0; /* Maximum color pairs on the screen */
74 int My_term = 0; /* Use Def_term regardless. */
75 const char *Def_term = "unknown"; /* Default terminal type. */
76 char __GT; /* Gtty indicates tabs. */
77 char __NONL; /* Term can't hack LF doing a CR. */
78 char __UPPERCASE; /* Terminal is uppercase only. */
79
80 #ifdef HAVE_WCHAR
81 /*
82 * Copy the non-spacing character list (src_nsp) to the given character,
83 * allocate or free storage as required.
84 */
85 int
86 _cursesi_copy_nsp(nschar_t *src_nsp, struct __ldata *ch)
87 {
88 nschar_t *np, *tnp, *pnp;
89
90 pnp = NULL;
91 np = src_nsp;
92 if (np) {
93 tnp = ch->nsp;
94 while (np) {
95 if (tnp) {
96 tnp->ch = np->ch;
97 pnp = tnp;
98 tnp = tnp->next;
99 } else {
100 tnp = malloc(sizeof(nschar_t));
101 if (!tnp)
102 return ERR;
103 tnp->ch = np->ch;
104 pnp->next = tnp;
105 tnp->next = NULL;
106 pnp = tnp;
107 tnp = NULL;
108 }
109 np = np->next;
110 }
111 np = tnp;
112 if (np) {
113 pnp->next = NULL;
114 __cursesi_free_nsp(np);
115 }
116 } else {
117 if (ch->nsp) {
118 __cursesi_free_nsp(ch->nsp);
119 ch->nsp = NULL;
120 }
121 }
122
123 return OK;
124 }
125
126 /*
127 * Free the storage associated with a non-spacing character - traverse the
128 * linked list until all storage is done.
129 */
130 void
131 __cursesi_free_nsp(nschar_t *inp)
132 {
133 nschar_t *tnp, *np;
134
135 np = inp;
136 if (np) {
137 while (np) {
138 tnp = np->next;
139 free(np);
140 np = tnp;
141 }
142 }
143 }
144
145 /*
146 * Traverse all the cells in the given window free'ing the non-spacing
147 * character storage.
148 */
149 void
150 __cursesi_win_free_nsp(WINDOW *win)
151 {
152 int i, j;
153 __LDATA *sp;
154
155 for (i = 0; i < win->maxy; i++) {
156 for (sp = win->alines[i]->line, j = 0; j < win->maxx;
157 j++, sp++) {
158 __cursesi_free_nsp(sp->nsp);
159 }
160 }
161 }
162
163 #endif
164