Home | History | Annotate | Line # | Download | only in msgc
msg_sys.def revision 1.1
      1 /*	$NetBSD: msg_sys.def,v 1.1 1997/09/26 21:16:38 phil Exp $	*/
      2 
      3 /*
      4  * Copyright 1997 Piermont Information Systems Inc.
      5  * All rights reserved.
      6  *
      7  * Written by Philip A. Nelson for Piermont Information Systems Inc.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. All advertising materials mentioning features or use of this software
     18  *    must display the following acknowledgement:
     19  *      This product includes software develooped for the NetBSD Project by
     20  *      Piermont Information Systems Inc.
     21  * 4. The name of Piermont Information Systems Inc. may not be used to endorse
     22  *    or promote products derived from this software without specific prior
     23  *    written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
     26  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
     29  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     35  * THE POSSIBILITY OF SUCH DAMAGE.
     36  *
     37  */
     38 
     39 static WINDOW *msg_win = NULL;
     40 static char cbuffer [ MAXSTR ];
     41 static int do_echo = 1;
     42 
     43 /* Routines */
     44 
     45 void beep (void)
     46 {
     47 	fprintf (stderr, "\a");
     48 }
     49 
     50 void msg_window(WINDOW *window)
     51 {
     52 	msg_win = window;
     53 }
     54 
     55 char *msg_string (int msg_no)
     56 {
     57 	return msg_list[msg_no];
     58 }
     59 
     60 void msg_clear(void)
     61 {
     62 	wclear (msg_win);
     63 	wrefresh (msg_win);
     64 }
     65 
     66 void msg_standout(void)
     67 {
     68 	wstandout(msg_win);
     69 }
     70 
     71 void msg_standend(void)
     72 {
     73 	wstandend(msg_win);
     74 }
     75 
     76 int msg_vprintf (char *fmt, va_list ap)
     77 {
     78 	int ret;
     79 
     80 	ret = vsnprintf (cbuffer, MAXSTR, fmt, ap);
     81 	waddstr (msg_win, cbuffer);
     82 	wrefresh (msg_win);
     83 	return ret;
     84 }
     85 
     86 void msg_display(int msg_no, ...)
     87 {
     88 	va_list ap;
     89 
     90 	va_start(ap, msg_no);
     91 	wclear (msg_win);
     92 	wmove (msg_win, 0, 0);
     93 	(void)msg_vprintf (msg_list[msg_no], ap);
     94 	va_end(ap);
     95 }
     96 
     97 void msg_display_add(int msg_no, ...)
     98 {
     99 	va_list ap;
    100 
    101 	va_start (ap, msg_no);
    102 	(void)msg_vprintf (msg_list[msg_no], ap);
    103 	va_end (ap);
    104 }
    105 
    106 int msg_printf (char *fmt, ...)
    107 {
    108 	va_list ap;
    109 	int  res;
    110 
    111 	va_start (ap, fmt);
    112 	wclear (msg_win);
    113 	wmove (msg_win, 0, 0);
    114 	res = msg_vprintf (fmt, ap);
    115 	va_end (ap);
    116 	return res;
    117 }
    118 
    119 int msg_printf_add (char *fmt, ...)
    120 {
    121 	va_list ap;
    122 	int  res;
    123 
    124 	va_start (ap, fmt);
    125 	res = msg_vprintf (fmt, ap);
    126 	va_end (ap);
    127 	return res;
    128 }
    129 
    130 
    131 static void msg_vprompt (char *msg, char *def, char *val, int max_chars,
    132 			 va_list ap)
    133 {
    134 	int ch;
    135 	int count = 0;
    136 	int y,x;
    137 
    138 	msg_vprintf (msg, ap);
    139 	if (def != NULL && *def) {
    140 		waddstr (msg_win, " [");
    141 		waddstr (msg_win, def);
    142 		waddstr (msg_win, "]");
    143 	}
    144 	waddstr (msg_win, ": ");
    145 	wrefresh (msg_win);
    146 
    147 	while ((ch = wgetch(msg_win)) != '\n') {
    148 		if (ch == 0x08 || ch == 0x7f) {  /* bs or del */
    149 			if (count > 0) {
    150 				count--;
    151 				if (do_echo) {
    152 					getyx(msg_win, y, x);
    153 					x--;
    154 					wmove(msg_win, y, x);
    155 					wdelch(msg_win);
    156 				}
    157 			} else
    158 				beep ();
    159 		}
    160 		else if (count < max_chars && isprint(ch)) {
    161 			if (do_echo)
    162 				waddch (msg_win, ch);
    163 			val[count++] = ch;
    164 		} else
    165 			beep ();
    166 		if (do_echo)
    167 			wrefresh(msg_win);
    168 	}
    169 	if (do_echo)
    170 		waddch(msg_win, '\n');
    171 
    172 	if (count != 0)
    173 		val[count] = '\0';
    174 
    175 	/* Do a string copy if needed to get default */
    176 	if (count == 0 && def != NULL && val != def)
    177 		strncpy (val, def, max_chars);
    178 
    179 }
    180 
    181 void msg_prompt_addstr (char *fmt, char *def, char *val, int max_chars, ...)
    182 {
    183 	va_list ap;
    184 
    185 	va_start (ap, max_chars);
    186 	msg_vprompt (fmt, def, val, max_chars, ap);
    187 	va_end(ap);
    188 }
    189 
    190 void msg_prompt_add (int msg_no, char *def, char *val, int max_chars, ...)
    191 {
    192 	va_list ap;
    193 
    194 	va_start (ap, max_chars);
    195 	msg_vprompt (msg_list[msg_no], def, val, max_chars, ap);
    196 	va_end(ap);
    197 }
    198 
    199 void msg_prompt_str (char *msg, char *def, char *val, int max_chars, ...)
    200 {
    201 	va_list ap;
    202 
    203 	va_start (ap, max_chars);
    204 	wclear (msg_win);
    205 	wmove (msg_win, 0, 0);
    206 	msg_vprompt (msg, def, val, max_chars, ap);
    207 	va_end (ap);
    208 }
    209 
    210 void msg_prompt (int msg_no, char *def, char *val, int max_chars, ...)
    211 {
    212 	va_list ap;
    213 
    214 	va_start (ap, max_chars);
    215 	wclear (msg_win);
    216 	wmove (msg_win, 0, 0);
    217 	msg_vprompt (msg_list[msg_no], def, val, max_chars, ap);
    218 	va_end (ap);
    219 }
    220 
    221 void msg_noecho()
    222 {
    223 	do_echo = 0;
    224 }
    225 
    226 void msg_echo()
    227 {
    228 	do_echo = 1;
    229 }
    230