1 /* $NetBSD: tscroll.c,v 1.12 2003/08/07 16:44:25 agc Exp $ */
4 * Copyright (c) 1992, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
32 #include <sys/cdefs.h>
36 static char sccsid
[] = "@(#)tscroll.c 8.4 (Berkeley) 7/27/94";
38 __RCSID("$NetBSD: tscroll.c,v 1.12 2003/08/07 16:44:25 agc Exp $");
45 #include "curses_private.h"
47 #define MAXRETURNSIZE 64
50 __tscroll(const char *cap
, int n1
, int n2
)
52 return (__parse_cap(cap
, n1
, n2
));
56 * Routines to parse capabilities. Derived from tgoto.c in termcap(3)
57 * library. Cap is a string containing printf type escapes to allow
58 * scrolling. The following escapes are defined for substituting n:
63 * %. gives %c hacking special case characters
64 * %+x like %c but adding x first
66 * The codes below affect the state but don't use up a value.
68 * %>xy if value > x add y
71 * %B BCD (2 decimal digits encoded in one byte)
72 * %D Delta Data (backwards bcd)
74 * all other characters are ``self-inserting''.
77 * %r reverse order of two parameters
78 * is also defined but we don't support it (yet).
81 __parse_cap (char const *cap
, ...)
84 static char result
[MAXRETURNSIZE
];
90 n
= 0; /* XXX gcc -Wuninitialized */
98 __CTRACE(__CTRACE_MISC
, "__parse_cap: cap = ");
99 for (i
= 0; i
< strlen(cap
); i
++)
100 __CTRACE(__CTRACE_MISC
, "%s", unctrl(cap
[i
]));
101 __CTRACE(__CTRACE_MISC
, "\n");
105 for (dp
= result
; (c
= *cap
++) != '\0';) {
110 switch (c
= *cap
++) {
113 n
= va_arg (ap
, int);
116 __CTRACE(__CTRACE_MISC
,
117 "__parse_cap: %%n, val = %d\n", n
);
124 n
= va_arg (ap
, int);
127 __CTRACE(__CTRACE_MISC
,
128 "__parse_cap: %%d, val = %d\n", n
);
138 n
= va_arg (ap
, int);
141 __CTRACE(__CTRACE_MISC
,
142 "__parse_cap: %%3, val = %d\n", n
);
145 *dp
++ = (n
/ 100) | '0';
150 n
= va_arg (ap
, int);
153 __CTRACE(__CTRACE_MISC
,
154 "__parse_cap: %%2, val = %d\n", n
);
157 two
: *dp
++ = n
/ 10 | '0';
158 one
: *dp
++ = n
% 10 | '0';
163 n
= va_arg (ap
, int);
166 __CTRACE(__CTRACE_MISC
,
167 "__parse_cap: %%>, val = %d\n", n
);
177 n
= va_arg (ap
, int);
180 __CTRACE(__CTRACE_MISC
,
181 "__parse_cap: %%+, val = %d\n", n
);
188 n
= va_arg (ap
, int);
191 __CTRACE(__CTRACE_MISC
,
192 "__parse_cap: %%., val = %d\n", n
);
200 n
= va_arg (ap
, int);
203 __CTRACE(__CTRACE_MISC
,
204 "__parse_cap: %%i, val = %d\n", n
);
214 n
= va_arg (ap
, int);
217 __CTRACE(__CTRACE_MISC
,
218 "__parse_cap: %%B, val = %d\n", n
);
221 n
= (n
/ 10 << 4) + n
% 10;
225 n
= va_arg (ap
, int);
228 __CTRACE(__CTRACE_MISC
,
229 "__parse_cap: %%D, val = %d\n", n
);
232 n
= n
- 2 * (n
% 16);
236 * System V terminfo files have lots of extra gunk.
237 * The only other one we've seen in capability strings
238 * is %pN, and it seems to work okay if we ignore it.
252 return ((char *) "\0");