make.rc: enable WANT_TERMCAP by default
[s-mailx.git] / termcap.c
blobd23efbc9f636297f0d02be14467e8652874f5039
1 /*@ S-nail - a mail user agent derived from Berkeley Mail.
2 *@ Terminal capability interaction.
4 * Copyright (c) 2015 Steffen (Daode) Nurpmeso <sdaoden@users.sf.net>.
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #undef n_FILE
19 #define n_FILE termcap
21 #ifndef HAVE_AMALGAMATION
22 # include "nail.h"
23 #endif
25 EMPTY_FILE()
26 #ifdef HAVE_TERMCAP
27 /* If available, curses.h must be included before term.h! */
28 #ifdef HAVE_TERMCAP_CURSES
29 # include <curses.h>
30 #endif
31 #include <term.h>
33 static char *a_termcap_buffer, *a_termcap_ti, *a_termcap_te;
35 static int a_termcap_putc(int c);
37 static int
38 a_termcap_putc(int c){
39 return putchar(c);
42 FL void
43 (termcap_init)(void){
44 /* For newer ncurses based termcap emulation buf will remain unused, for
45 * elder non-emulated ones really weird things will happen if an entry
46 * would require more than 1024 bytes, so don't mind.
47 * Things are more unserious with cmdbuf, but a single termcap command
48 * should really not excess that limit */
49 char buf[1024 + 512], cmdbuf[2048], *cpb, *cpti, *cpte, *cp;
50 NYD_ENTER;
52 assert(options & OPT_INTERACTIVE);
54 if(!ok_blook(term_ca_mode))
55 goto jleave;
56 if((cp = env_vlook("TERM", FAL0)) == NULL)
57 goto jleave;
59 if(!tgetent(buf, cp))
60 goto jleave;
61 cpb = cmdbuf;
63 cpti = cpb;
64 if((cp = tgetstr(UNCONST("ti"), &cpb)) == NULL)
65 goto jleave;
66 cpte = cpb;
67 if((cp = tgetstr(UNCONST("te"), &cpb)) == NULL)
68 goto jleave;
70 a_termcap_buffer = smalloc(PTR2SIZE(cpb - cmdbuf));
71 memcpy(a_termcap_buffer, cmdbuf, PTR2SIZE(cpb - cmdbuf));
73 a_termcap_ti = a_termcap_buffer + PTR2SIZE(cpti - cmdbuf);
74 a_termcap_te = a_termcap_ti + PTR2SIZE(cpte - cpti);
76 tputs(a_termcap_ti, 1, &a_termcap_putc);
77 fflush(stdout);
78 jleave:
79 NYD_LEAVE;
82 FL void
83 (termcap_destroy)(void){
84 NYD_ENTER;
85 assert(options & OPT_INTERACTIVE);
87 if(a_termcap_buffer != NULL){
88 tputs(a_termcap_te, 1, &a_termcap_putc);
89 fflush(stdout);
91 free(a_termcap_buffer);
92 DBG( a_termcap_buffer = NULL; )
94 NYD_LEAVE;
97 FL void
98 (termcap_suspend)(void){
99 NYD2_ENTER;
100 assert(options & OPT_INTERACTIVE);
102 if(a_termcap_buffer != NULL){
103 tputs(a_termcap_te, 1, &a_termcap_putc);
104 fflush(stdout);
106 NYD2_LEAVE;
109 FL void
110 (termcap_resume)(void){
111 NYD2_ENTER;
112 assert(options & OPT_INTERACTIVE);
114 if(a_termcap_buffer != NULL){
115 tputs(a_termcap_ti, 1, &a_termcap_putc);
116 fflush(stdout);
118 NYD2_LEAVE;
120 #endif /* HAVE_TERMCAP */
122 /* s-it-mode */