230 lines
4.9 KiB
Modula-2
230 lines
4.9 KiB
Modula-2
|
/* $NetBSD: msg_sys.def,v 1.1.1.1 1997/09/26 21:16:38 phil Exp $ */
|
||
|
|
||
|
/*
|
||
|
* Copyright 1997 Piermont Information Systems Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Written by Philip A. Nelson for Piermont Information Systems Inc.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
* 1. Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in the
|
||
|
* documentation and/or other materials provided with the distribution.
|
||
|
* 3. All advertising materials mentioning features or use of this software
|
||
|
* must display the following acknowledgement:
|
||
|
* This product includes software develooped for the NetBSD Project by
|
||
|
* Piermont Information Systems Inc.
|
||
|
* 4. The name of Piermont Information Systems Inc. may not be used to endorse
|
||
|
* or promote products derived from this software without specific prior
|
||
|
* written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
|
||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
* ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
|
||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
static WINDOW *msg_win = NULL;
|
||
|
static char cbuffer [ MAXSTR ];
|
||
|
static int do_echo = 1;
|
||
|
|
||
|
/* Routines */
|
||
|
|
||
|
void beep (void)
|
||
|
{
|
||
|
fprintf (stderr, "\a");
|
||
|
}
|
||
|
|
||
|
void msg_window(WINDOW *window)
|
||
|
{
|
||
|
msg_win = window;
|
||
|
}
|
||
|
|
||
|
char *msg_string (int msg_no)
|
||
|
{
|
||
|
return msg_list[msg_no];
|
||
|
}
|
||
|
|
||
|
void msg_clear(void)
|
||
|
{
|
||
|
wclear (msg_win);
|
||
|
wrefresh (msg_win);
|
||
|
}
|
||
|
|
||
|
void msg_standout(void)
|
||
|
{
|
||
|
wstandout(msg_win);
|
||
|
}
|
||
|
|
||
|
void msg_standend(void)
|
||
|
{
|
||
|
wstandend(msg_win);
|
||
|
}
|
||
|
|
||
|
int msg_vprintf (char *fmt, va_list ap)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
ret = vsnprintf (cbuffer, MAXSTR, fmt, ap);
|
||
|
waddstr (msg_win, cbuffer);
|
||
|
wrefresh (msg_win);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
void msg_display(int msg_no, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
|
||
|
va_start(ap, msg_no);
|
||
|
wclear (msg_win);
|
||
|
wmove (msg_win, 0, 0);
|
||
|
(void)msg_vprintf (msg_list[msg_no], ap);
|
||
|
va_end(ap);
|
||
|
}
|
||
|
|
||
|
void msg_display_add(int msg_no, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
|
||
|
va_start (ap, msg_no);
|
||
|
(void)msg_vprintf (msg_list[msg_no], ap);
|
||
|
va_end (ap);
|
||
|
}
|
||
|
|
||
|
int msg_printf (char *fmt, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
int res;
|
||
|
|
||
|
va_start (ap, fmt);
|
||
|
wclear (msg_win);
|
||
|
wmove (msg_win, 0, 0);
|
||
|
res = msg_vprintf (fmt, ap);
|
||
|
va_end (ap);
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
int msg_printf_add (char *fmt, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
int res;
|
||
|
|
||
|
va_start (ap, fmt);
|
||
|
res = msg_vprintf (fmt, ap);
|
||
|
va_end (ap);
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
|
||
|
static void msg_vprompt (char *msg, char *def, char *val, int max_chars,
|
||
|
va_list ap)
|
||
|
{
|
||
|
int ch;
|
||
|
int count = 0;
|
||
|
int y,x;
|
||
|
|
||
|
msg_vprintf (msg, ap);
|
||
|
if (def != NULL && *def) {
|
||
|
waddstr (msg_win, " [");
|
||
|
waddstr (msg_win, def);
|
||
|
waddstr (msg_win, "]");
|
||
|
}
|
||
|
waddstr (msg_win, ": ");
|
||
|
wrefresh (msg_win);
|
||
|
|
||
|
while ((ch = wgetch(msg_win)) != '\n') {
|
||
|
if (ch == 0x08 || ch == 0x7f) { /* bs or del */
|
||
|
if (count > 0) {
|
||
|
count--;
|
||
|
if (do_echo) {
|
||
|
getyx(msg_win, y, x);
|
||
|
x--;
|
||
|
wmove(msg_win, y, x);
|
||
|
wdelch(msg_win);
|
||
|
}
|
||
|
} else
|
||
|
beep ();
|
||
|
}
|
||
|
else if (count < max_chars && isprint(ch)) {
|
||
|
if (do_echo)
|
||
|
waddch (msg_win, ch);
|
||
|
val[count++] = ch;
|
||
|
} else
|
||
|
beep ();
|
||
|
if (do_echo)
|
||
|
wrefresh(msg_win);
|
||
|
}
|
||
|
if (do_echo)
|
||
|
waddch(msg_win, '\n');
|
||
|
|
||
|
if (count != 0)
|
||
|
val[count] = '\0';
|
||
|
|
||
|
/* Do a string copy if needed to get default */
|
||
|
if (count == 0 && def != NULL && val != def)
|
||
|
strncpy (val, def, max_chars);
|
||
|
|
||
|
}
|
||
|
|
||
|
void msg_prompt_addstr (char *fmt, char *def, char *val, int max_chars, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
|
||
|
va_start (ap, max_chars);
|
||
|
msg_vprompt (fmt, def, val, max_chars, ap);
|
||
|
va_end(ap);
|
||
|
}
|
||
|
|
||
|
void msg_prompt_add (int msg_no, char *def, char *val, int max_chars, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
|
||
|
va_start (ap, max_chars);
|
||
|
msg_vprompt (msg_list[msg_no], def, val, max_chars, ap);
|
||
|
va_end(ap);
|
||
|
}
|
||
|
|
||
|
void msg_prompt_str (char *msg, char *def, char *val, int max_chars, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
|
||
|
va_start (ap, max_chars);
|
||
|
wclear (msg_win);
|
||
|
wmove (msg_win, 0, 0);
|
||
|
msg_vprompt (msg, def, val, max_chars, ap);
|
||
|
va_end (ap);
|
||
|
}
|
||
|
|
||
|
void msg_prompt (int msg_no, char *def, char *val, int max_chars, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
|
||
|
va_start (ap, max_chars);
|
||
|
wclear (msg_win);
|
||
|
wmove (msg_win, 0, 0);
|
||
|
msg_vprompt (msg_list[msg_no], def, val, max_chars, ap);
|
||
|
va_end (ap);
|
||
|
}
|
||
|
|
||
|
void msg_noecho()
|
||
|
{
|
||
|
do_echo = 0;
|
||
|
}
|
||
|
|
||
|
void msg_echo()
|
||
|
{
|
||
|
do_echo = 1;
|
||
|
}
|