173f0a83dSXin LI /****************************************************************************
2*e1865124SBaptiste Daroussin  * Copyright 2020 Thomas E. Dickey                                          *
3*e1865124SBaptiste Daroussin  * Copyright 2013-2014,2016 Free Software Foundation, Inc.                  *
473f0a83dSXin LI  *                                                                          *
573f0a83dSXin LI  * Permission is hereby granted, free of charge, to any person obtaining a  *
673f0a83dSXin LI  * copy of this software and associated documentation files (the            *
773f0a83dSXin LI  * "Software"), to deal in the Software without restriction, including      *
873f0a83dSXin LI  * without limitation the rights to use, copy, modify, merge, publish,      *
973f0a83dSXin LI  * distribute, distribute with modifications, sublicense, and/or sell       *
1073f0a83dSXin LI  * copies of the Software, and to permit persons to whom the Software is    *
1173f0a83dSXin LI  * furnished to do so, subject to the following conditions:                 *
1273f0a83dSXin LI  *                                                                          *
1373f0a83dSXin LI  * The above copyright notice and this permission notice shall be included  *
1473f0a83dSXin LI  * in all copies or substantial portions of the Software.                   *
1573f0a83dSXin LI  *                                                                          *
1673f0a83dSXin LI  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1773f0a83dSXin LI  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1873f0a83dSXin LI  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1973f0a83dSXin LI  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
2073f0a83dSXin LI  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2173f0a83dSXin LI  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2273f0a83dSXin LI  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2373f0a83dSXin LI  *                                                                          *
2473f0a83dSXin LI  * Except as contained in this notice, the name(s) of the above copyright   *
2573f0a83dSXin LI  * holders shall not be used in advertising or otherwise to promote the     *
2673f0a83dSXin LI  * sale, use or other dealings in this Software without prior written       *
2773f0a83dSXin LI  * authorization.                                                           *
2873f0a83dSXin LI  ****************************************************************************/
2973f0a83dSXin LI 
3073f0a83dSXin LI /****************************************************************************
31aae38d10SBaptiste Daroussin  *  Author: Thomas E. Dickey                        2013-on                 *
3273f0a83dSXin LI  ****************************************************************************/
3373f0a83dSXin LI 
3473f0a83dSXin LI /*
35aae38d10SBaptiste Daroussin **	Support for obsolete/unusual features.
3673f0a83dSXin LI */
3773f0a83dSXin LI 
3873f0a83dSXin LI #include <curses.priv.h>
3973f0a83dSXin LI 
40*e1865124SBaptiste Daroussin MODULE_ID("$Id: obsolete.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
4173f0a83dSXin LI 
4273f0a83dSXin LI /*
43aae38d10SBaptiste Daroussin  * Obsolete entrypoint retained for binary compatibility.
4473f0a83dSXin LI  */
NCURSES_EXPORT(void)4573f0a83dSXin LI NCURSES_EXPORT(void)
4673f0a83dSXin LI NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_DCLx FILE *ofp, int buffered)
4773f0a83dSXin LI {
4873f0a83dSXin LI #if NCURSES_SP_FUNCS
4973f0a83dSXin LI     (void) SP_PARM;
5073f0a83dSXin LI #endif
5173f0a83dSXin LI     (void) ofp;
5273f0a83dSXin LI     (void) buffered;
5373f0a83dSXin LI }
5473f0a83dSXin LI 
5573f0a83dSXin LI #if NCURSES_SP_FUNCS
5673f0a83dSXin LI NCURSES_EXPORT(void)
_nc_set_buffer(FILE * ofp,int buffered)5773f0a83dSXin LI _nc_set_buffer(FILE *ofp, int buffered)
5873f0a83dSXin LI {
5973f0a83dSXin LI     NCURSES_SP_NAME(_nc_set_buffer) (CURRENT_SCREEN, ofp, buffered);
6073f0a83dSXin LI }
6173f0a83dSXin LI #endif
6273f0a83dSXin LI 
6373f0a83dSXin LI #if !HAVE_STRDUP
6473f0a83dSXin LI NCURSES_EXPORT(char *)
_nc_strdup(const char * s)6573f0a83dSXin LI _nc_strdup(const char *s)
6673f0a83dSXin LI {
6773f0a83dSXin LI     char *result = 0;
6873f0a83dSXin LI     if (s != 0) {
6973f0a83dSXin LI 	size_t need = strlen(s);
7073f0a83dSXin LI 	result = malloc(need + 1);
7173f0a83dSXin LI 	if (result != 0) {
72aae38d10SBaptiste Daroussin 	    _nc_STRCPY(result, s, need);
7373f0a83dSXin LI 	}
7473f0a83dSXin LI     }
7573f0a83dSXin LI     return result;
7673f0a83dSXin LI }
7773f0a83dSXin LI #endif
7873f0a83dSXin LI 
7973f0a83dSXin LI #if USE_MY_MEMMOVE
8073f0a83dSXin LI #define DST ((char *)s1)
8173f0a83dSXin LI #define SRC ((const char *)s2)
8273f0a83dSXin LI NCURSES_EXPORT(void *)
_nc_memmove(void * s1,const void * s2,size_t n)8373f0a83dSXin LI _nc_memmove(void *s1, const void *s2, size_t n)
8473f0a83dSXin LI {
8573f0a83dSXin LI     if (n != 0) {
8673f0a83dSXin LI 	if ((DST + n > SRC) && (SRC + n > DST)) {
8773f0a83dSXin LI 	    static char *bfr;
8873f0a83dSXin LI 	    static size_t length;
8973f0a83dSXin LI 	    register size_t j;
9073f0a83dSXin LI 	    if (length < n) {
9173f0a83dSXin LI 		length = (n * 3) / 2;
9273f0a83dSXin LI 		bfr = typeRealloc(char, length, bfr);
9373f0a83dSXin LI 	    }
9473f0a83dSXin LI 	    for (j = 0; j < n; j++)
9573f0a83dSXin LI 		bfr[j] = SRC[j];
9673f0a83dSXin LI 	    s2 = bfr;
9773f0a83dSXin LI 	}
9873f0a83dSXin LI 	while (n-- != 0)
9973f0a83dSXin LI 	    DST[n] = SRC[n];
10073f0a83dSXin LI     }
10173f0a83dSXin LI     return s1;
10273f0a83dSXin LI }
10373f0a83dSXin LI #endif /* USE_MY_MEMMOVE */
104aae38d10SBaptiste Daroussin 
105aae38d10SBaptiste Daroussin #ifdef EXP_XTERM_1005
106aae38d10SBaptiste Daroussin NCURSES_EXPORT(int)
_nc_conv_to_utf8(unsigned char * target,unsigned source,unsigned limit)107aae38d10SBaptiste Daroussin _nc_conv_to_utf8(unsigned char *target, unsigned source, unsigned limit)
108aae38d10SBaptiste Daroussin {
109aae38d10SBaptiste Daroussin #define CH(n) UChar((source) >> ((n) * 8))
110aae38d10SBaptiste Daroussin     int rc = 0;
111aae38d10SBaptiste Daroussin 
112aae38d10SBaptiste Daroussin     if (source <= 0x0000007f)
113aae38d10SBaptiste Daroussin 	rc = 1;
114aae38d10SBaptiste Daroussin     else if (source <= 0x000007ff)
115aae38d10SBaptiste Daroussin 	rc = 2;
116aae38d10SBaptiste Daroussin     else if (source <= 0x0000ffff)
117aae38d10SBaptiste Daroussin 	rc = 3;
118aae38d10SBaptiste Daroussin     else if (source <= 0x001fffff)
119aae38d10SBaptiste Daroussin 	rc = 4;
120aae38d10SBaptiste Daroussin     else if (source <= 0x03ffffff)
121aae38d10SBaptiste Daroussin 	rc = 5;
122aae38d10SBaptiste Daroussin     else			/* (source <= 0x7fffffff) */
123aae38d10SBaptiste Daroussin 	rc = 6;
124aae38d10SBaptiste Daroussin 
125aae38d10SBaptiste Daroussin     if ((unsigned) rc > limit) {	/* whatever it is, we cannot decode it */
126aae38d10SBaptiste Daroussin 	rc = 0;
127aae38d10SBaptiste Daroussin     }
128aae38d10SBaptiste Daroussin 
129aae38d10SBaptiste Daroussin     if (target != 0) {
130aae38d10SBaptiste Daroussin 	switch (rc) {
131aae38d10SBaptiste Daroussin 	case 1:
132aae38d10SBaptiste Daroussin 	    target[0] = CH(0);
133aae38d10SBaptiste Daroussin 	    break;
134aae38d10SBaptiste Daroussin 
135aae38d10SBaptiste Daroussin 	case 2:
136aae38d10SBaptiste Daroussin 	    target[1] = UChar(0x80 | (CH(0) & 0x3f));
137aae38d10SBaptiste Daroussin 	    target[0] = UChar(0xc0 | (CH(0) >> 6) | ((CH(1) & 0x07) << 2));
138aae38d10SBaptiste Daroussin 	    break;
139aae38d10SBaptiste Daroussin 
140aae38d10SBaptiste Daroussin 	case 3:
141aae38d10SBaptiste Daroussin 	    target[2] = UChar(0x80 | (CH(0) & 0x3f));
142aae38d10SBaptiste Daroussin 	    target[1] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
143aae38d10SBaptiste Daroussin 	    target[0] = UChar(0xe0 | ((int) (CH(1) & 0xf0) >> 4));
144aae38d10SBaptiste Daroussin 	    break;
145aae38d10SBaptiste Daroussin 
146aae38d10SBaptiste Daroussin 	case 4:
147aae38d10SBaptiste Daroussin 	    target[3] = UChar(0x80 | (CH(0) & 0x3f));
148aae38d10SBaptiste Daroussin 	    target[2] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
149aae38d10SBaptiste Daroussin 	    target[1] = UChar(0x80 |
150aae38d10SBaptiste Daroussin 			      ((int) (CH(1) & 0xf0) >> 4) |
151aae38d10SBaptiste Daroussin 			      ((int) (CH(2) & 0x03) << 4));
152aae38d10SBaptiste Daroussin 	    target[0] = UChar(0xf0 | ((int) (CH(2) & 0x1f) >> 2));
153aae38d10SBaptiste Daroussin 	    break;
154aae38d10SBaptiste Daroussin 
155aae38d10SBaptiste Daroussin 	case 5:
156aae38d10SBaptiste Daroussin 	    target[4] = UChar(0x80 | (CH(0) & 0x3f));
157aae38d10SBaptiste Daroussin 	    target[3] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
158aae38d10SBaptiste Daroussin 	    target[2] = UChar(0x80 |
159aae38d10SBaptiste Daroussin 			      ((int) (CH(1) & 0xf0) >> 4) |
160aae38d10SBaptiste Daroussin 			      ((int) (CH(2) & 0x03) << 4));
161aae38d10SBaptiste Daroussin 	    target[1] = UChar(0x80 | (CH(2) >> 2));
162aae38d10SBaptiste Daroussin 	    target[0] = UChar(0xf8 | (CH(3) & 0x03));
163aae38d10SBaptiste Daroussin 	    break;
164aae38d10SBaptiste Daroussin 
165aae38d10SBaptiste Daroussin 	case 6:
166aae38d10SBaptiste Daroussin 	    target[5] = UChar(0x80 | (CH(0) & 0x3f));
167aae38d10SBaptiste Daroussin 	    target[4] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
168aae38d10SBaptiste Daroussin 	    target[3] = UChar(0x80 | (CH(1) >> 4) | ((CH(2) & 0x03) << 4));
169aae38d10SBaptiste Daroussin 	    target[2] = UChar(0x80 | (CH(2) >> 2));
170aae38d10SBaptiste Daroussin 	    target[1] = UChar(0x80 | (CH(3) & 0x3f));
171aae38d10SBaptiste Daroussin 	    target[0] = UChar(0xfc | ((int) (CH(3) & 0x40) >> 6));
172aae38d10SBaptiste Daroussin 	    break;
173aae38d10SBaptiste Daroussin 	}
174aae38d10SBaptiste Daroussin     }
175aae38d10SBaptiste Daroussin 
176aae38d10SBaptiste Daroussin     return rc;			/* number of bytes needed in target */
177aae38d10SBaptiste Daroussin #undef CH
178aae38d10SBaptiste Daroussin }
179aae38d10SBaptiste Daroussin 
180aae38d10SBaptiste Daroussin NCURSES_EXPORT(int)
_nc_conv_to_utf32(unsigned * target,const char * source,unsigned limit)181aae38d10SBaptiste Daroussin _nc_conv_to_utf32(unsigned *target, const char *source, unsigned limit)
182aae38d10SBaptiste Daroussin {
183aae38d10SBaptiste Daroussin #define CH(n) UChar((*target) >> ((n) * 8))
184aae38d10SBaptiste Daroussin     int rc = 0;
185aae38d10SBaptiste Daroussin     int j;
186aae38d10SBaptiste Daroussin     unsigned mask = 0;
187aae38d10SBaptiste Daroussin 
188aae38d10SBaptiste Daroussin     /*
189aae38d10SBaptiste Daroussin      * Find the number of bytes we will need from the source.
190aae38d10SBaptiste Daroussin      */
191aae38d10SBaptiste Daroussin     if ((*source & 0x80) == 0) {
192aae38d10SBaptiste Daroussin 	rc = 1;
193aae38d10SBaptiste Daroussin 	mask = (unsigned) *source;
194aae38d10SBaptiste Daroussin     } else if ((*source & 0xe0) == 0xc0) {
195aae38d10SBaptiste Daroussin 	rc = 2;
196aae38d10SBaptiste Daroussin 	mask = (unsigned) (*source & 0x1f);
197aae38d10SBaptiste Daroussin     } else if ((*source & 0xf0) == 0xe0) {
198aae38d10SBaptiste Daroussin 	rc = 3;
199aae38d10SBaptiste Daroussin 	mask = (unsigned) (*source & 0x0f);
200aae38d10SBaptiste Daroussin     } else if ((*source & 0xf8) == 0xf0) {
201aae38d10SBaptiste Daroussin 	rc = 4;
202aae38d10SBaptiste Daroussin 	mask = (unsigned) (*source & 0x07);
203aae38d10SBaptiste Daroussin     } else if ((*source & 0xfc) == 0xf8) {
204aae38d10SBaptiste Daroussin 	rc = 5;
205aae38d10SBaptiste Daroussin 	mask = (unsigned) (*source & 0x03);
206aae38d10SBaptiste Daroussin     } else if ((*source & 0xfe) == 0xfc) {
207aae38d10SBaptiste Daroussin 	rc = 6;
208aae38d10SBaptiste Daroussin 	mask = (unsigned) (*source & 0x01);
209aae38d10SBaptiste Daroussin     }
210aae38d10SBaptiste Daroussin 
211aae38d10SBaptiste Daroussin     if ((unsigned) rc > limit) {	/* whatever it is, we cannot decode it */
212aae38d10SBaptiste Daroussin 	rc = 0;
213aae38d10SBaptiste Daroussin     }
214aae38d10SBaptiste Daroussin 
215aae38d10SBaptiste Daroussin     /*
216aae38d10SBaptiste Daroussin      * sanity-check.
217aae38d10SBaptiste Daroussin      */
218aae38d10SBaptiste Daroussin     if (rc > 1) {
219aae38d10SBaptiste Daroussin 	for (j = 1; j < rc; j++) {
220aae38d10SBaptiste Daroussin 	    if ((source[j] & 0xc0) != 0x80)
221aae38d10SBaptiste Daroussin 		break;
222aae38d10SBaptiste Daroussin 	}
223aae38d10SBaptiste Daroussin 	if (j != rc) {
224aae38d10SBaptiste Daroussin 	    rc = 0;
225aae38d10SBaptiste Daroussin 	}
226aae38d10SBaptiste Daroussin     }
227aae38d10SBaptiste Daroussin 
228aae38d10SBaptiste Daroussin     if (target != 0) {
229aae38d10SBaptiste Daroussin 	int shift = 0;
230aae38d10SBaptiste Daroussin 	*target = 0;
231aae38d10SBaptiste Daroussin 	for (j = 1; j < rc; j++) {
232aae38d10SBaptiste Daroussin 	    *target |= (unsigned) (source[rc - j] & 0x3f) << shift;
233aae38d10SBaptiste Daroussin 	    shift += 6;
234aae38d10SBaptiste Daroussin 	}
235aae38d10SBaptiste Daroussin 	*target |= mask << shift;
236aae38d10SBaptiste Daroussin     }
237aae38d10SBaptiste Daroussin     return rc;
238aae38d10SBaptiste Daroussin #undef CH
239aae38d10SBaptiste Daroussin }
240aae38d10SBaptiste Daroussin #endif /* EXP_XTERM_1005 */
241