1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-27 11:55:06 +00:00

- Resolve conflicts

- Remove files that are removed in vender branch

Approved by:	delphij
This commit is contained in:
Rong-En Fan 2007-01-20 07:39:17 +00:00
parent 8ada63303e
commit 7d0e8efafb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=166128
68 changed files with 539 additions and 23853 deletions

View File

@ -1,405 +0,0 @@
# Copyright (C) 1997,1998 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB. If not,
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
# Makefile for ncurses part.
#
subdir := ncurses
ncurses-version = 4.2
form-version = $(ncurses-version)
menu-version = $(ncurses-version)
panel-version = $(ncurses-version)
extras := form menu ncurses panel
extra-libs = $(extras:%=lib%)
# These libraries will be built in the `others' pass rather than
# the `lib' pass, because they depend on libc.so being built already.
extra-libs-others = $(extra-libs)
# The sources are found in the appropriate subdir.
subdir-dirs = $(extras) progs test
vpath %.c $(subdir-dirs)
vpath %.h $(subdir-dirs)
libform-routines = \
fld_arg \
fld_attr \
fld_current \
fld_def \
fld_dup \
fld_ftchoice \
fld_ftlink \
fld_info \
fld_just \
fld_link \
fld_max \
fld_move \
fld_newftyp \
fld_opts \
fld_pad \
fld_page \
fld_stat \
fld_type \
fld_user \
frm_cursor \
frm_data \
frm_def \
frm_driver \
frm_hook \
frm_opts \
frm_page \
frm_post \
frm_req_name \
frm_scale \
frm_sub \
frm_user \
frm_win \
fty_alnum \
fty_alpha \
fty_enum \
fty_int \
fty_ipv4 \
fty_num \
fty_regex
libncurses-routines = \
base/define_key \
base/keybound \
base/keyok \
base/lib_addch \
base/lib_addstr \
base/lib_beep \
base/lib_bkgd \
base/lib_box \
base/lib_chgat \
base/lib_clear \
base/lib_clearok \
base/lib_clrbot \
base/lib_clreol \
base/lib_color \
base/lib_colorset \
base/lib_delch \
base/lib_delwin \
base/lib_dft_fgbg \
base/lib_echo \
base/lib_endwin \
base/lib_erase \
base/lib_flash \
base/lib_freeall \
base/lib_getch \
base/lib_getstr \
base/lib_hline \
base/lib_immedok \
base/lib_inchstr \
base/lib_initscr \
base/lib_insch \
base/lib_insdel \
base/lib_insstr \
base/lib_instr \
base/lib_isendwin \
base/lib_leaveok \
base/lib_mouse \
base/lib_move \
base/lib_mvwin \
base/lib_newterm \
base/lib_newwin \
base/lib_nl \
base/lib_overlay \
base/lib_pad \
base/lib_printw \
base/lib_redrawln \
base/lib_refresh \
base/lib_restart \
base/lib_scanw \
base/lib_screen \
base/lib_scroll \
base/lib_scrollok \
base/lib_scrreg \
base/lib_set_term \
base/lib_slk \
base/lib_slkatr_set \
base/lib_slkatrof \
base/lib_slkatron \
base/lib_slkatrset \
base/lib_slkattr \
base/lib_slkclear \
base/lib_slkcolor \
base/lib_slkinit \
base/lib_slklab \
base/lib_slkrefr \
base/lib_slkset \
base/lib_slktouch \
base/lib_touch \
base/lib_ungetch \
base/lib_vline \
base/lib_wattroff \
base/lib_wattron \
base/lib_winch \
base/lib_window \
base/memmove \
base/nc_panel \
base/resizeterm \
base/safe_sprintf \
base/sigaction \
base/tries \
base/version \
base/vsscanf \
base/wresize \
codes \
comp_captab \
expanded \
fallback \
lib_gen \
lib_keyname \
names \
tinfo/access \
tinfo/add_tries \
tinfo/alloc_entry \
tinfo/alloc_ttype \
tinfo/captoinfo \
tinfo/comp_error \
tinfo/comp_expand \
tinfo/comp_hash \
tinfo/comp_parse \
tinfo/comp_scan \
tinfo/doalloc \
tinfo/free_ttype \
tinfo/getenv_num \
tinfo/home_terminfo \
tinfo/init_keytry \
tinfo/lib_acs \
tinfo/lib_baudrate \
tinfo/lib_cur_term \
tinfo/lib_data \
tinfo/lib_has_cap \
tinfo/lib_kernel \
tinfo/lib_longname \
tinfo/lib_napms \
tinfo/lib_options \
tinfo/lib_print \
tinfo/lib_raw \
tinfo/lib_setup \
tinfo/lib_termcap \
tinfo/lib_termname \
tinfo/lib_tgoto \
tinfo/lib_ti \
tinfo/lib_tparm \
tinfo/lib_tputs \
tinfo/lib_ttyflags \
tinfo/name_match \
tinfo/parse_entry \
tinfo/read_entry \
tinfo/read_termcap \
tinfo/setbuf \
tinfo/strings \
tinfo/write_entry \
trace/lib_trace \
trace/lib_traceatr \
trace/lib_tracebits \
trace/lib_tracechr \
trace/lib_tracedmp \
trace/lib_tracemse \
trace/trace_buf \
trace/trace_tries \
trace/trace_xnames \
trace/varargs \
trace/visbuf \
tty/hardscroll \
tty/hashmap \
tty/lib_mvcur \
tty/lib_tstp \
tty/lib_twait \
tty/lib_vidattr \
tty/tty_update \
unctrl
libmenu-routines = \
m_attribs \
m_cursor \
m_driver \
m_format \
m_global \
m_hook \
m_item_cur \
m_item_nam \
m_item_new \
m_item_opt \
m_item_top \
m_item_use \
m_item_val \
m_item_vis \
m_items \
m_new \
m_opts \
m_pad \
m_pattern \
m_post \
m_req_name \
m_scale \
m_spacing \
m_sub \
m_userptr \
m_win
libpanel-routines = \
panel \
p_above \
p_below \
p_bottom \
p_delete \
p_hide \
p_hidden \
p_move \
p_new \
p_replace \
p_show \
p_top \
p_update \
p_user \
p_win
headers = curses.h eti.h form.h menu.h panel.h term.h termcap.h \
unctrl.h
others = clear infocmp tic toe tput tset
install-bin = $(others)
clear-objs = clear.o
infocmp-objs = infocmp.o dump_entry.o
tic-objs = tic.o dump_entry.o
toe-objs = toe.o dump_entry.o
tput-objs = tput.o
tset-objs = tset.o dump_entry.o
extra-objs = $(tic-objs) $(toe-objs) $(infocmp-objs) $(clear-objs) \
$(tput-objs) $(tset-objs)
test-srcs = blue bs cardfile ditto firework firstlast gdc hanoi hashtest knight \
lrtest ncurses newdemo rain tclock testaddch testcurs \
testscanw view worm xmas
include ../Rules
ifndef tabsetdir
tabsetdir = $(datadir)/tabset
endif
ifndef inst_tabsetdir
inst_tabsetdir = $(install_root)/$(tabsetdir)
endif
ifndef terminfodir
terminfodir = $(datadir)/terminfo
endif
ifndef inst_terminfodir
inst_terminfodir = $(install_root)/$(terminfodir)
endif
ifndef mandir
mandir = $(prefix)/man
endif
ifndef inst_mandir
inst_mandir = $(install_root)/$(mandir)
endif
CPPFLAGS += -DTERMINFO='"$(terminfodir)"' -Iinclude -Iform -Incurses \
-Imenu -Ipanel -Iprogs -Itest
ifneq ($(strip $(objpfx)),)
CPPFLAGS += -I$(objpfx)
endif
LDLIBS-tclock = math/libm
tests: $(test-srcs:%=$(objpfx)%)
$(objpfx)clear: $(addprefix $(objpfx),$(clear-objs))
$(objpfx)infocmp: $(addprefix $(objpfx),$(infocmp-objs))
$(objpfx)tic: $(addprefix $(objpfx),$(tic-objs))
$(objpfx)toe: $(addprefix $(objpfx),$(toe-objs))
$(objpfx)tput: $(addprefix $(objpfx),$(tput-objs))
$(objpfx)tset: $(addprefix $(objpfx),$(tset-objs))
ifeq ($(build-shared),yes)
$(others:%=$(objpfx)%): $(objpfx)libncurses.so
else
$(others:%=$(objpfx)%): $(objpfx)libncurses.a
endif
$(test-srcs:%=$(objpfx)%): $(objpfx)libform.a $(objpfx)libmenu.a \
$(objpfx)libpanel.a $(objpfx)libncurses.a
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
# This ensures they will load libc.so for needed symbols if loaded by
# a statically-linked program that hasn't already loaded it.
$(extras:%=$(objpfx)lib%.so): $(common-objpfx)libc.so
subdir_install: $(inst_libdir)/libtermcap.a $(inst_libdir)/libcurses.a \
$(inst_bindir)/reset $(inst_bindir)/captoinfo
$(inst_libdir)/libtermcap.a $(inst_libdir)/libcurses.a: \
$(inst_libdir)/libncurses.a
$(make-link)
$(inst_bindir)/reset: $(inst_bindir)/tset
$(make-link)
$(inst_bindir)/captoinfo: $(inst_bindir)/tic
$(make-link)
ifeq (yes,$(build-shared))
subdir_install: $(inst_libdir)/libtermcap.so $(inst_libdir)/libcurses.so
$(inst_libdir)/libtermcap.so $(inst_libdir)/libcurses.so: \
$(inst_libdir)/libncurses.so
$(make-link)
endif
subdir_install: $(inst_mandir)/man5/terminfo.5
$(inst_mandir)/man5/terminfo.5: $(objpfx)terminfo.5 $(wildcard man/*.[0-9]*)
$(make-target-directory)
sh $(edit_man-sh) $(prefix) $(inst_mandir) $(edit_man-sed) $^
subdir_install: $(inst_tabsetdir)/std
$(inst_tabsetdir)/std: \
$(filter-out misc/tabset/CVS, $(wildcard misc/tabset/*))
$(make-target-directory)
for f in $^; do \
echo installing $$f; \
$(INSTALL_DATA) $$f $(inst_tabsetdir); \
done
ifeq (no,$(cross-compiling))
subdir_install: $(inst_terminfodir)/v/vt100
$(inst_terminfodir)/v/vt100: misc/terminfo.src $(objpfx)tic
$(make-target-directory)
sh $(run_tic-sh) $(common-objpfx) misc $(terminfodir) \
$(install_root)
endif
subdir_distclean subdir_realclean:
-rm -f $(addprefix $(objpfx), MKterm.h.awk codes.c \
comp_captab.c confdefs.h config.log curses.h \
expanded.c fallback.c hashsize.h keys.tries \
lib_gen.c lib_keyname.c names.c ncurses_cfg.h \
nomacros.h parametrized.h term.h termcap.h \
terminfo.5 termsort.c unctrl.c unctrl.h)

View File

@ -1,5 +0,0 @@
To compile this as an add-on for glibc, unpack it in the glibc source
tree and put ncurses on the add-on list when you do configure.
hjl@gnu.ai.mit.edu
03/21/1997

View File

@ -1,220 +0,0 @@
# $Id: Makefile.in,v 1.64 2002/01/19 20:25:31 NIIBE.Yutaka Exp $
##############################################################################
# Copyright (c) 1998,1999,2000,2001,2002 Free Software Foundation, Inc. #
# #
# Permission is hereby granted, free of charge, to any person obtaining a #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation #
# the rights to use, copy, modify, merge, publish, distribute, distribute #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the #
# following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
# DEALINGS IN THE SOFTWARE. #
# #
# Except as contained in this notice, the name(s) of the above copyright #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
#
# Author: Thomas E. Dickey <dickey@clark.net> 1996,1997
#
# Simple makefile for c++ window class demo
# turn off _all_ suffix rules; we'll generate our own
.SUFFIXES:
SHELL = /bin/sh
CF_MFLAGS = @cf_cv_makeflags@
@SET_MAKE@
x = @PROG_EXT@
MODEL = ../@DFT_OBJ_SUBDIR@
DESTDIR = @DESTDIR@
srcdir = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
libdir = @libdir@
includedir = @includedir@
LIBTOOL = @LIBTOOL@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
AR = @AR@
AR_OPTS = @AR_OPTS@
CXX_AR = @CXX_AR@
CXX_AR_OPTS = @CXX_AR_OPTS@
RANLIB = @RANLIB@
CXX = @CXX@
CPP = @CPP@
CXXFLAGS = @CXXFLAGS@
CXXLIBS = @CXXLIBS@
INCDIR = ../include
CPPFLAGS = -I../c++ -I$(INCDIR) -I$(srcdir) -DHAVE_CONFIG_H @CPPFLAGS@
CCFLAGS = $(CPPFLAGS) $(CXXFLAGS)
CFLAGS_LIBTOOL = $(CCFLAGS)
CFLAGS_NORMAL = $(CCFLAGS)
CFLAGS_DEBUG = $(CCFLAGS) @CXX_G_OPT@ -DTRACE
CFLAGS_PROFILE = $(CCFLAGS) -pg
CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@
CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
NCURSES_MAJOR = @NCURSES_MAJOR@
NCURSES_MINOR = @NCURSES_MINOR@
REL_VERSION = @cf_cv_rel_version@
ABI_VERSION = @cf_cv_abi_version@
LINK = @LINK_PROGS@ $(LIBTOOL) $(CXX) @CXXLDFLAGS@
LIBROOT = ncurses++
LIBNAME_LIBTOOL = @LIB_PREFIX@$(LIBROOT)@LIB_SUFFIX@.la
LIBNAME_NORMAL = @LIB_PREFIX@$(LIBROOT)@LIB_SUFFIX@.a
LIBNAME = @LIB_PREFIX@$(LIBROOT)@CXX_LIB_SUFFIX@
LINK_FLAGS = @EXTRA_LDFLAGS@ -L../lib -l$(LIBROOT)@LIB_SUFFIX@
LINK_LIBTOOL = @EXTRA_LDFLAGS@ -L../lib ../lib/$(LIBNAME)
LINK_NORMAL = $(LINK_FLAGS)
LINK_DEBUG = $(LINK_FLAGS)
LINK_PROFILE = $(LINK_FLAGS)
LINK_SHARED = $(LINK_FLAGS)
LDFLAGS = @TEST_ARGS@ @LDFLAGS@ \
@LD_MODEL@ @LIBS@ @EXTRA_LIBS@ @LOCAL_LDFLAGS@ $(CXXLIBS)
LDFLAGS_LIBTOOL = $(LDFLAGS)
LDFLAGS_NORMAL = $(LDFLAGS)
LDFLAGS_DEBUG = $(LDFLAGS) @CC_G_OPT@
LDFLAGS_PROFILE = $(LDFLAGS) -pg
LDFLAGS_SHARED = $(LDFLAGS) @LD_SHARED_OPTS@
LDFLAGS_DEFAULT = $(LINK_@DFT_UPR_MODEL@) $(LDFLAGS_@DFT_UPR_MODEL@)
AUTO_SRC = \
etip.h
all \
libs :: $(AUTO_SRC) ../lib/$(LIBNAME)
all :: demo$x
sources : $(AUTO_SRC)
depend :
# Build a conventional library for installing, since a shared library would
# pull in all of the ncurses libraries (panel, menu, form, ncurses) as direct
# dependencies.
LIB_OBJS = \
$(MODEL)/cursesf.o \
$(MODEL)/cursesm.o \
$(MODEL)/cursesw.o \
$(MODEL)/cursespad.o \
$(MODEL)/cursesp.o \
$(MODEL)/cursslk.o \
$(MODEL)/cursesapp.o \
$(MODEL)/cursesmain.o
../lib/$(LIBNAME_NORMAL) : $(LIB_OBJS)
$(CXX_AR) $(CXX_AR_OPTS) $@ $?
$(RANLIB) $@
../lib/$(LIBNAME_LIBTOOL) : $(LIB_OBJS)
cd ../lib && $(LIBTOOL) $(CXX) -o $(LIBNAME) $(LIB_OBJS:.o=.lo) \
-rpath $(INSTALL_PREFIX)$(libdir) \
-version-info $(NCURSES_MAJOR):$(NCURSES_MINOR)
OBJS_DEMO = $(MODEL)/demo.o
$(MODEL)/demo.o : $(srcdir)/demo.cc \
$(cursesf_h) $(cursesm_h) $(cursesapp_h)
demo$x: $(OBJS_DEMO) \
../lib/$(LIBNAME) \
@TEST_DEPS@
@ECHO_LINK@ $(LINK) -o $@ $(OBJS_DEMO) $(LDFLAGS_DEFAULT)
etip.h: $(srcdir)/etip.h.in $(srcdir)/edit_cfg.sh
cp $(srcdir)/etip.h.in $@
sh $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@
$(DESTDIR)$(libdir) :
sh $(srcdir)/../mkinstalldirs $@
install \
install.libs:: ../lib/$(LIBNAME) $(DESTDIR)$(libdir)
$(LIBTOOL) $(INSTALL) ../lib/$(LIBNAME) $(DESTDIR)$(libdir)/$(LIBNAME)
uninstall \
uninstall.libs::
-$(LIBTOOL) rm -f $(DESTDIR)$(libdir)/$(LIBNAME)
mostlyclean ::
-rm -f core tags TAGS *~ *.bak *.i *.ii *.ln *.atac trace
clean :: mostlyclean
-rm -rf $(MODEL)/SunWS_cache
-$(LIBTOOL) rm -f demo$x $(AUTO_SRC) ../lib/$(LIBNAME) $(LIB_OBJS) $(LIB_OBJS:.o=.lo) $(OBJS_DEMO)
-rm -rf .libs
distclean :: clean
-rm -f Makefile
realclean :: distclean
###############################################################################
cursesw_h = $(srcdir)/cursesw.h \
etip.h \
$(INCDIR)/curses.h
cursesp_h = $(srcdir)/cursesp.h \
$(cursesw_h) \
$(INCDIR)/panel.h
cursesf_h = $(srcdir)/cursesf.h \
$(cursesp_h) \
$(INCDIR)/form.h
cursesm_h = $(srcdir)/cursesm.h \
$(cursesp_h) \
$(INCDIR)/menu.h
cursslk_h = $(srcdir)/cursslk.h \
$(cursesw_h)
cursesapp_h = $(srcdir)/cursesapp.h \
$(cursslk_h)
$(INCDIR)/form.h :
cd ../form && $(MAKE) $@
$(INCDIR)/menu.h :
cd ../menu && $(MAKE) $@
$(INCDIR)/panel.h :
cd ../panel && $(MAKE) $@
###############################################################################
# The remainder of this file is automatically generated during configuration
###############################################################################

View File

@ -1,42 +0,0 @@
This is a log of changes that the ncurses C++ binding has gone
through starting with the integration of menu and forms integration
into the binding.
990731 + Improve support for pads. A viewport window may now be added to
a pad. It will then be possible to use a builtin panning mechanism
to view the pad.
970908 + Improve NCursesWindow class: added additional methods to
cover more ncurses functionality. Make refresh() and
noutrefresh() virtual members to allow different implementation
in the NCursesPanel class.
+ CAUTION: changed order of parameters in vline() and hline() of
NCursesWindow class.
+ Make refresh() in NCursesPanel non-static, it is now a
reimplementation of refresh() in the base class. Added
noutrefresh() to NCursesPanel.
+ Added NCursesForm and related classes to support libform
functionality.
+ Moved most of configuration related stuff from cursesw.h to
etip.h
+ Added NCursesApplication class to support easy configuration
of menu and forms related attributes as well as ripped of
title lines and Soft-Label-Keys for an application.
+ Support of Auto-Cleanup for a menus fieldlist.
+ Change of return type for current_item() and operator[] for
menus.
+ Enhanced demo.
970502
+ Introduced the THROW and THROWS functions/macros to prepare
a smoother transition to real exception handling.
+ Exception classes provided in etip.h
+ Added the NCursesMenu class to support libmenu functionality.
+ The inheritace relation between NCursesWindow and NCursesColorWindow
was kind of brain damage. Monochrome is a special case of colored, so
the relation should be just the opposite. This would allow all
derived classes like NCursesPanel, NCursesMenu or NCursesForm to
have colors.
To resolve that design flaw I put the color functionality into the
NCursesWindow class and it can be switched on by the static member
useColors(). NCursesColorWindow is still there for compatibility
reasons.

View File

@ -1,5 +0,0 @@
This is a list of open problems. This mainly lists known missing pieces
and design flaws.
1. Testing!!!
2. Better demo program

View File

@ -1,58 +0,0 @@
C++ interface to ncurses routines
-----------------------------------------------------------------------
This directory contains the source code for several C++ classes which
ease the use of writing ncurses-based programs. The code is derived
from the libg++ CursesWindow class but enhanced for ncurses.
The classes simplify the use of window specific functions by
encapsulating them in the window object. Function overloading is
used in order to narrow the interface. E.g. you don't have the
distinction between `printw' and `mvprintw' anymore.
A second benefit is the removal of all #defines which are included in
the curses.h file. This is a steady cause of trouble because many
common identifiers are used. Instead now all #defines are inline
functions which also allows strict type checking of arguments.
The next enhancement is color support. It was originally provided by a
derived class. This caused some trouble if you think about Panels or
Menus and Forms with colors. We decided to put color support into the
base class so that any derived class may use color support also.
The implementation chosen here is directed to unrestricted use
of mixes of color and monochrome windows. The original NCursesColorWindow
class is maintained for compatibility reasons.
The last point to mention is the support of other packages that are
distributed with the ncurses package: the panels library, the menu library
and the form library. This support is provided by the NCursesPanel class,
which is also derived from the NCursesWindow class and the NCursesMenu
and NCursesForm classes which are derived from NCursesPanel. This allows
building interfaces with windows.
Please see the example program for a quick introduction.
Note that at this point, there is no documentation for these classes.
Hopefully some will be written in the not too distant future. For now,
to find out how to use the classes, read the code and the example program.
Suggestions for enhancements and contributions of code (and docs) are
welcome. Please let us know which functionality you miss.
ATTENTION LINUX USERS: There is currently some discussion of
replacing the BSD curses in the Linux libc with ncurses. If
this is done we could perhaps include these classes in the Linux
libg++ replacing the original CursesWindow class (and renaming it
to CursesWindow). This could be done because NCursesWindow can
be made easily to a superset of the CursesWindow class.
Original author:
Eric Newton <newton@rocky.oswego.edu> for FSF's libg++
Authors of first ncurses based release (NCursesWindow, NCursesPanel):
Ulrich Drepper <drepper@ira.uka.de>
and Anatoly Ivasyuk <anatoly@nick.csh.rit.edu>
Author of this release:
Juergen Pfeifer <juergen.pfeifer@gmx.net>

View File

@ -1,146 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
#include "internal.h"
#include "cursesapp.h"
MODULE_ID("$Id: cursesapp.cc,v 1.8 2001/03/24 21:25:36 tom Exp $")
void
NCursesApplication::init(bool bColors) {
if (bColors)
NCursesWindow::useColors();
if (Root_Window->colors() > 1) {
b_Colors = TRUE;
Root_Window->setcolor(1);
Root_Window->setpalette(COLOR_YELLOW,COLOR_BLUE);
Root_Window->setcolor(2);
Root_Window->setpalette(COLOR_CYAN,COLOR_BLUE);
Root_Window->setcolor(3);
Root_Window->setpalette(COLOR_BLACK,COLOR_BLUE);
Root_Window->setcolor(4);
Root_Window->setpalette(COLOR_BLACK,COLOR_CYAN);
Root_Window->setcolor(5);
Root_Window->setpalette(COLOR_BLUE,COLOR_YELLOW);
Root_Window->setcolor(6);
Root_Window->setpalette(COLOR_BLACK,COLOR_GREEN);
}
else
b_Colors = FALSE;
Root_Window->bkgd(' '|window_backgrounds());
}
NCursesApplication* NCursesApplication::theApp = 0;
NCursesWindow* NCursesApplication::titleWindow = 0;
NCursesApplication::SLK_Link* NCursesApplication::slk_stack = 0;
NCursesApplication::~NCursesApplication() {
Soft_Label_Key_Set* S;
delete titleWindow;
while( (S=top()) ) {
pop();
delete S;
}
delete Root_Window;
::endwin();
}
int NCursesApplication::rinit(NCursesWindow& w) {
titleWindow = &w;
return OK;
}
void NCursesApplication::push(Soft_Label_Key_Set& S) {
SLK_Link* L = new SLK_Link;
assert(L != 0);
L->prev = slk_stack;
L->SLKs = &S;
slk_stack = L;
if (Root_Window)
S.show();
}
bool NCursesApplication::pop() {
if (slk_stack) {
SLK_Link* L = slk_stack;
slk_stack = slk_stack->prev;
delete L;
if (Root_Window && top())
top()->show();
}
return (slk_stack ? FALSE : TRUE);
}
Soft_Label_Key_Set* NCursesApplication::top() const {
if (slk_stack)
return slk_stack->SLKs;
else
return (Soft_Label_Key_Set*)0;
}
int NCursesApplication::operator()(void) {
bool bColors = b_Colors;
Soft_Label_Key_Set* S;
int ts = titlesize();
if (ts>0)
NCursesWindow::ripoffline(ts,rinit);
Soft_Label_Key_Set::Label_Layout fmt = useSLKs();
if (fmt!=Soft_Label_Key_Set::None) {
S = new Soft_Label_Key_Set(fmt);
assert(S != 0);
init_labels(*S);
}
Root_Window = new NCursesWindow(::stdscr);
init(bColors);
if (ts>0)
title();
if (fmt!=Soft_Label_Key_Set::None) {
push(*S);
}
return run();
}
NCursesApplication::NCursesApplication(bool bColors) {
b_Colors = bColors;
if (theApp)
THROW(new NCursesException("Application object already created."));
else
theApp = this;
}

View File

@ -1,163 +0,0 @@
// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,2000 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
// $Id: cursesapp.h,v 1.7 2001/03/24 21:41:18 tom Exp $
#ifndef NCURSES_CURSESAPP_H_incl
#define NCURSES_CURSESAPP_H_incl
#include <cursslk.h>
class NCURSES_IMPEXP NCursesApplication {
public:
typedef struct _slk_link { // This structure is used to maintain
struct _slk_link* prev; // a stack of SLKs
Soft_Label_Key_Set* SLKs;
} SLK_Link;
private:
static int rinit(NCursesWindow& w); // Internal Init function for title
static NCursesApplication* theApp; // Global ref. to the application
static SLK_Link* slk_stack;
protected:
static NCursesWindow* titleWindow; // The Title Window (if any)
bool b_Colors; // Is this a color application?
NCursesWindow* Root_Window; // This is the stdscr equiv.
// Initialization of attributes;
// Rewrite this in your derived class if you prefer other settings
virtual void init(bool bColors);
// The number of lines for the title window. Default is no title window
// You may rewrite this in your derived class
virtual int titlesize() const {
return 0;
}
// This method is called to put something into the title window initially
// You may rewrite this in your derived class
virtual void title() {
}
// The layout used for the Soft Label Keys. Default is to have no SLKs.
// You may rewrite this in your derived class
virtual Soft_Label_Key_Set::Label_Layout useSLKs() const {
return Soft_Label_Key_Set::None;
}
// This method is called to initialize the SLKs. Default is nothing.
// You may rewrite this in your derived class
virtual void init_labels(Soft_Label_Key_Set& S) const {
}
// Your derived class must implement this method. The return value must
// be the exit value of your application.
virtual int run() = 0;
// The constructor is protected, so you may use it in your derived
// class constructor. The argument tells whether or not you want colors.
NCursesApplication(bool wantColors = FALSE);
public:
virtual ~NCursesApplication();
// Get a pointer to the current application object
static NCursesApplication* getApplication() {
return theApp;
}
// This method runs the application and returns its exit value
int operator()(void);
// Process the commandline arguments. The default implementation simply
// ignores them. Your derived class may rewrite this.
virtual void handleArgs(int argc, char* argv[]) {
}
// Does this application use colors?
inline bool useColors() const {
return b_Colors;
}
// Push the Key Set S onto the SLK Stack. S then becomes the current set
// of Soft Labelled Keys.
void push(Soft_Label_Key_Set& S);
// Throw away the current set of SLKs and make the previous one the
// new current set.
bool pop();
// Retrieve the current set of Soft Labelled Keys.
Soft_Label_Key_Set* top() const;
// Attributes to use for menu and forms foregrounds
virtual chtype foregrounds() const {
return b_Colors ? COLOR_PAIR(1) : A_BOLD;
}
// Attributes to use for menu and forms backgrounds
virtual chtype backgrounds() const {
return b_Colors ? COLOR_PAIR(2) : A_NORMAL;
}
// Attributes to use for inactive (menu) elements
virtual chtype inactives() const {
return b_Colors ? (COLOR_PAIR(3)|A_DIM) : A_DIM;
}
// Attributes to use for (form) labels and SLKs
virtual chtype labels() const {
return b_Colors ? COLOR_PAIR(4) : A_NORMAL;
}
// Attributes to use for form backgrounds
virtual chtype dialog_backgrounds() const {
return b_Colors ? COLOR_PAIR(4) : A_NORMAL;
}
// Attributes to use as default for (form) window backgrounds
virtual chtype window_backgrounds() const {
return b_Colors ? COLOR_PAIR(5) : A_NORMAL;
}
// Attributes to use for the title window
virtual chtype screen_titles() const {
return b_Colors ? COLOR_PAIR(6) : A_BOLD;
}
};
#endif // NCURSES_CURSESAPP_H_incl

View File

@ -1,426 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
#include "internal.h"
#include "cursesf.h"
#include "cursesapp.h"
MODULE_ID("$Id: cursesf.cc,v 1.14 2001/07/14 20:54:43 juergen Exp $")
NCursesFormField::~NCursesFormField () {
if (field)
OnError(::free_field (field));
}
/* Construct a FIELD* array from an array of NCursesFormField
* objects.
*/
FIELD**
NCursesForm::mapFields(NCursesFormField* nfields[]) {
int fieldCount = 0,lcv;
FIELD** old_fields;
assert(nfields != 0);
for (lcv=0; nfields[lcv]->field; ++lcv)
++fieldCount;
FIELD** fields = new FIELD*[fieldCount + 1];
for (lcv=0;nfields[lcv]->field;++lcv) {
fields[lcv] = nfields[lcv]->field;
}
fields[lcv] = NULL;
my_fields = nfields;
if (form && (old_fields = ::form_fields(form))) {
::set_form_fields(form,(FIELD**)0);
delete[] old_fields;
}
return fields;
}
void NCursesForm::setDefaultAttributes() {
NCursesApplication* S = NCursesApplication::getApplication();
int n = count();
if (n > 0) {
for(int i=0; i<n; i++) {
NCursesFormField* f = (*this)[i];
if ((f->options() & (O_EDIT|O_ACTIVE))==(O_EDIT|O_ACTIVE)) {
if (S) {
f->set_foreground(S->foregrounds());
f->set_background(S->backgrounds());
}
f->set_pad_character('_');
}
else {
if (S)
f->set_background(S->labels());
}
}
}
if (S) {
bkgd(' '|S->dialog_backgrounds());
if (sub)
sub->bkgd(' '|S->dialog_backgrounds());
}
}
void
NCursesForm::InitForm(NCursesFormField* nfields[],
bool with_frame,
bool autoDelete_Fields) {
int mrows, mcols;
keypad(TRUE);
meta(TRUE);
b_framed = with_frame;
b_autoDelete = autoDelete_Fields;
form = (FORM*)0;
form = ::new_form(mapFields(nfields));
if (!form)
OnError (E_SYSTEM_ERROR);
UserHook* hook = new UserHook;
hook->m_user = NULL;
hook->m_back = this;
hook->m_owner = form;
::set_form_userptr(form,(void*)hook);
::set_form_init (form, NCursesForm::frm_init);
::set_form_term (form, NCursesForm::frm_term);
::set_field_init (form, NCursesForm::fld_init);
::set_field_term (form, NCursesForm::fld_term);
scale(mrows, mcols);
::set_form_win(form, w);
if (with_frame) {
if ((mrows > height()-2) || (mcols > width()-2))
OnError(E_NO_ROOM);
sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
::set_form_sub(form, sub->w);
b_sub_owner = TRUE;
}
else {
sub = (NCursesWindow*)0;
b_sub_owner = FALSE;
}
options_on(O_NL_OVERLOAD);
setDefaultAttributes();
}
NCursesForm::~NCursesForm() {
UserHook* hook = (UserHook*)::form_userptr(form);
delete hook;
if (b_sub_owner) {
delete sub;
::set_form_sub(form,(WINDOW *)0);
}
if (form) {
FIELD** fields = ::form_fields(form);
int cnt = count();
OnError(::set_form_fields(form,(FIELD**)0));
if (b_autoDelete) {
if (cnt>0) {
for (int i=0; i <= cnt; i++)
delete my_fields[i];
}
delete[] my_fields;
}
::free_form(form);
// It's essential to do this after free_form()
delete[] fields;
}
}
void
NCursesForm::setSubWindow(NCursesWindow& nsub) {
if (!isDescendant(nsub))
OnError(E_SYSTEM_ERROR);
else {
if (b_sub_owner)
delete sub;
sub = &nsub;
::set_form_sub(form,sub->w);
}
}
/* Internal hook functions. They will route the hook
* calls to virtual methods of the NCursesForm class,
* so in C++ providing a hook is done simply by
* implementing a virtual method in a derived class
*/
void
NCursesForm::frm_init(FORM *f) {
getHook(f)->On_Form_Init();
}
void
NCursesForm::frm_term(FORM *f) {
getHook(f)->On_Form_Termination();
}
void
NCursesForm::fld_init(FORM *f) {
NCursesForm* F = getHook(f);
F->On_Field_Init (*(F->current_field ()));
}
void
NCursesForm::fld_term(FORM *f) {
NCursesForm* F = getHook(f);
F->On_Field_Termination (*(F->current_field ()));
}
void
NCursesForm::On_Form_Init() {
}
void
NCursesForm::On_Form_Termination() {
}
void
NCursesForm::On_Field_Init(NCursesFormField& field) {
}
void
NCursesForm::On_Field_Termination(NCursesFormField& field) {
}
// call the form driver and do basic error checking.
int
NCursesForm::driver (int c) {
int res = ::form_driver (form, c);
switch (res) {
case E_OK:
case E_REQUEST_DENIED:
case E_INVALID_FIELD:
case E_UNKNOWN_COMMAND:
break;
default:
OnError (res);
}
return (res);
}
void NCursesForm::On_Request_Denied(int c) const {
::beep();
}
void NCursesForm::On_Invalid_Field(int c) const {
::beep();
}
void NCursesForm::On_Unknown_Command(int c) const {
::beep();
}
static const int CMD_QUIT = MAX_COMMAND + 1;
NCursesFormField*
NCursesForm::operator()(void) {
int drvCmnd;
int err;
int c;
post();
show();
refresh();
while (((drvCmnd = virtualize((c=getKey()))) != CMD_QUIT)) {
switch((err=driver(drvCmnd))) {
case E_REQUEST_DENIED:
On_Request_Denied(c);
break;
case E_INVALID_FIELD:
On_Invalid_Field(c);
break;
case E_UNKNOWN_COMMAND:
On_Unknown_Command(c);
break;
case E_OK:
break;
default:
OnError(err);
}
}
unpost();
hide();
refresh();
return my_fields[::field_index (::current_field (form))];
}
// Provide a default key virtualization. Translate the keyboard
// code c into a form request code.
// The default implementation provides a hopefully straightforward
// mapping for the most common keystrokes and form requests.
int
NCursesForm::virtualize(int c) {
switch(c) {
case KEY_HOME : return(REQ_FIRST_FIELD);
case KEY_END : return(REQ_LAST_FIELD);
case KEY_DOWN : return(REQ_DOWN_CHAR);
case KEY_UP : return(REQ_UP_CHAR);
case KEY_LEFT : return(REQ_PREV_CHAR);
case KEY_RIGHT : return(REQ_NEXT_CHAR);
case KEY_NPAGE : return(REQ_NEXT_PAGE);
case KEY_PPAGE : return(REQ_PREV_PAGE);
case KEY_BACKSPACE : return(REQ_DEL_PREV);
case KEY_ENTER : return(REQ_NEW_LINE);
case KEY_CLEAR : return(REQ_CLR_FIELD);
case CTRL('X') : return(CMD_QUIT); // eXit
case CTRL('F') : return(REQ_NEXT_FIELD); // Forward
case CTRL('B') : return(REQ_PREV_FIELD); // Backward
case CTRL('L') : return(REQ_LEFT_FIELD); // Left
case CTRL('R') : return(REQ_RIGHT_FIELD); // Right
case CTRL('U') : return(REQ_UP_FIELD); // Up
case CTRL('D') : return(REQ_DOWN_FIELD); // Down
case CTRL('W') : return(REQ_NEXT_WORD);
case CTRL('T') : return(REQ_PREV_WORD);
case CTRL('A') : return(REQ_BEG_FIELD);
case CTRL('E') : return(REQ_END_FIELD);
case CTRL('I') : return(REQ_INS_CHAR);
case CTRL('M') :
case CTRL('J') : return(REQ_NEW_LINE);
case CTRL('O') : return(REQ_INS_LINE);
case CTRL('V') : return(REQ_DEL_CHAR);
case CTRL('H') : return(REQ_DEL_PREV);
case CTRL('Y') : return(REQ_DEL_LINE);
case CTRL('G') : return(REQ_DEL_WORD);
case CTRL('K') : return(REQ_CLR_EOF);
case CTRL('N') : return(REQ_NEXT_CHOICE);
case CTRL('P') : return(REQ_PREV_CHOICE);
default:
return(c);
}
}
//
// -------------------------------------------------------------------------
// User Defined Fieldtypes
// -------------------------------------------------------------------------
//
bool UserDefinedFieldType::fcheck(FIELD *f, const void *u) {
NCursesFormField* F = (NCursesFormField*)u;
assert(F != 0);
UserDefinedFieldType* udf = (UserDefinedFieldType*)(F->fieldtype());
assert(udf != 0);
return udf->field_check(*F);
}
bool UserDefinedFieldType::ccheck(int c, const void *u) {
NCursesFormField* F = (NCursesFormField*)u;
assert(F != 0);
UserDefinedFieldType* udf =
(UserDefinedFieldType*)(F->fieldtype());
assert(udf != 0);
return udf->char_check(c);
}
void* UserDefinedFieldType::makearg(va_list* va) {
return va_arg(*va,NCursesFormField*);
}
FIELDTYPE* UserDefinedFieldType::generic_fieldtype =
::new_fieldtype(UserDefinedFieldType::fcheck,
UserDefinedFieldType::ccheck);
FIELDTYPE* UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice =
::new_fieldtype(UserDefinedFieldType::fcheck,
UserDefinedFieldType::ccheck);
bool UserDefinedFieldType_With_Choice::next_choice(FIELD *f, const void *u) {
NCursesFormField* F = (NCursesFormField*)u;
assert(F != 0);
UserDefinedFieldType_With_Choice* udf =
(UserDefinedFieldType_With_Choice*)(F->fieldtype());
assert(udf != 0);
return udf->next(*F);
}
bool UserDefinedFieldType_With_Choice::prev_choice(FIELD *f, const void *u) {
NCursesFormField* F = (NCursesFormField*)u;
assert(F != 0);
UserDefinedFieldType_With_Choice* udf =
(UserDefinedFieldType_With_Choice*)(F->fieldtype());
assert(udf != 0);
return udf->previous(*F);
}
class UDF_Init {
private:
int code;
static UDF_Init* I;
public:
UDF_Init() {
code = ::set_fieldtype_arg(UserDefinedFieldType::generic_fieldtype,
UserDefinedFieldType::makearg,
NULL,
NULL);
if (code==E_OK)
code = ::set_fieldtype_arg
(UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice,
UserDefinedFieldType::makearg,
NULL,
NULL);
if (code==E_OK)
code = ::set_fieldtype_choice
(UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice,
UserDefinedFieldType_With_Choice::next_choice,
UserDefinedFieldType_With_Choice::prev_choice);
}
};
UDF_Init* UDF_Init::I = new UDF_Init();

View File

@ -1,824 +0,0 @@
// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
// $Id: cursesf.h,v 1.16 2001/07/15 00:02:53 tom Exp $
#ifndef NCURSES_CURSESF_H_incl
#define NCURSES_CURSESF_H_incl 1
#include <cursesp.h>
#include <string.h>
extern "C" {
# include <form.h>
}
//
// -------------------------------------------------------------------------
// The abstract base class for buitin and user defined Fieldtypes.
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP NCursesFormField; // forward declaration
// Class to represent builtin field types as well as C++ written new
// fieldtypes (see classes UserDefineFieldType...
class NCURSES_IMPEXP NCursesFieldType {
friend class NCursesFormField;
protected:
FIELDTYPE* fieldtype;
inline void OnError(int err) const THROWS(NCursesFormException) {
if (err!=E_OK)
THROW(new NCursesFormException (err));
}
NCursesFieldType(FIELDTYPE *f) : fieldtype(f) {
}
virtual ~NCursesFieldType() {}
// Set the fields f fieldtype to this one.
virtual void set(NCursesFormField& f) = 0;
public:
NCursesFieldType() : fieldtype((FIELDTYPE*)0) {
}
};
//
// -------------------------------------------------------------------------
// The class representing a forms field, wrapping the lowlevel FIELD struct
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP NCursesFormField {
friend class NCursesForm;
protected:
FIELD *field; // lowlevel structure
NCursesFieldType* ftype; // Associated field type
// Error handler
inline void OnError (int err) const THROWS(NCursesFormException) {
if (err != E_OK)
THROW(new NCursesFormException (err));
}
public:
// Create a 'Null' field. Can be used to delimit a field list
NCursesFormField()
: field((FIELD*)0), ftype((NCursesFieldType*)0) {
}
// Create a new field
NCursesFormField (int rows,
int cols,
int first_row = 0,
int first_col = 0,
int offscreen_rows = 0,
int additional_buffers = 0)
: ftype((NCursesFieldType*)0) {
field = ::new_field(rows,cols,first_row,first_col,
offscreen_rows, additional_buffers);
if (!field)
OnError(errno);
}
virtual ~NCursesFormField ();
// Duplicate the field at a new position
inline NCursesFormField* dup(int first_row, int first_col) {
NCursesFormField* f = new NCursesFormField();
if (!f)
OnError(E_SYSTEM_ERROR);
else {
f->ftype = ftype;
f->field = ::dup_field(field,first_row,first_col);
if (!f->field)
OnError(errno);
}
return f;
}
// Link the field to a new location
inline NCursesFormField* link(int first_row, int first_col) {
NCursesFormField* f = new NCursesFormField();
if (!f)
OnError(E_SYSTEM_ERROR);
else {
f->ftype = ftype;
f->field = ::link_field(field,first_row,first_col);
if (!f->field)
OnError(errno);
}
return f;
}
// Get the lowlevel field representation
inline FIELD* get_field() const {
return field;
}
// Retrieve info about the field
inline void info(int& rows, int& cols,
int& first_row, int& first_col,
int& offscreen_rows, int& additional_buffers) const {
OnError(::field_info(field, &rows, &cols,
&first_row, &first_col,
&offscreen_rows, &additional_buffers));
}
// Retrieve info about the fields dynamic properties.
inline void dynamic_info(int& dynamic_rows, int& dynamic_cols,
int& max_growth) const {
OnError(::dynamic_field_info(field, &dynamic_rows, &dynamic_cols,
&max_growth));
}
// For a dynamic field you may set the maximum growth limit.
// A zero means unlimited growth.
inline void set_maximum_growth(int growth = 0) {
OnError(::set_max_field(field,growth));
}
// Move the field to a new position
inline void move(int row, int col) {
OnError(::move_field(field,row,col));
}
// Mark the field to start a new page
inline void new_page(bool pageFlag = FALSE) {
OnError(::set_new_page(field,pageFlag));
}
// Retrieve whether or not the field starts a new page.
inline bool is_new_page() const {
return ::new_page(field);
}
// Set the justification for the field
inline void set_justification(int just) {
OnError(::set_field_just(field,just));
}
// Retrieve the fields justification
inline int justification() const {
return ::field_just(field);
}
// Set the foreground attribute for the field
inline void set_foreground(chtype fore) {
OnError(::set_field_fore(field,fore));
}
// Retrieve the fields foreground attribute
inline chtype fore() const {
return ::field_fore(field);
}
// Set the background attribute for the field
inline void set_background(chtype back) {
OnError(::set_field_back(field,back));
}
// Retrieve the fields background attribute
inline chtype back() const {
return ::field_back(field);
}
// Set the padding character for the field
inline void set_pad_character(int pad) {
OnError(::set_field_pad(field,pad));
}
// Retrieve the fields padding character
inline int pad() const {
return ::field_pad(field);
}
// Switch on the fields options
inline void options_on (Field_Options options) {
OnError (::field_opts_on (field, options));
}
// Switch off the fields options
inline void options_off (Field_Options options) {
OnError (::field_opts_off (field, options));
}
// Retrieve the fields options
inline Field_Options options () const {
return ::field_opts (field);
}
// Set the fields options
inline void set_options (Field_Options options) {
OnError (::set_field_opts (field, options));
}
// Mark the field as changed
inline void set_changed(bool changeFlag = TRUE) {
OnError(::set_field_status(field,changeFlag));
}
// Test whether or not the field is marked as changed
inline bool changed() const {
return ::field_status(field);
}
// Return the index of the field in the field array of a form
// or -1 if the field is not associated to a form
inline int (index)() const {
return ::field_index(field);
}
// Store a value in a fields buffer. The default buffer is nr. 0
inline void set_value(const char *val, int buffer = 0) {
OnError(::set_field_buffer(field,buffer,val));
}
// Retrieve the value of a fields buffer. The default buffer is nr. 0
inline char* value(int buffer = 0) const {
return ::field_buffer(field,buffer);
}
// Set the validation type of the field.
inline void set_fieldtype(NCursesFieldType& f) {
ftype = &f;
f.set(*this); // A good friend may do that...
}
// Retrieve the validation type of the field.
inline NCursesFieldType* fieldtype() const {
return ftype;
}
};
//
// -------------------------------------------------------------------------
// The class representing a form, wrapping the lowlevel FORM struct
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP NCursesForm : public NCursesPanel {
protected:
FORM* form; // the lowlevel structure
private:
NCursesWindow* sub; // the subwindow object
bool b_sub_owner; // is this our own subwindow?
bool b_framed; // has the form a border?
bool b_autoDelete; // Delete fields when deleting form?
NCursesFormField** my_fields; // The array of fields for this form
// This structure is used for the form's user data field to link the
// FORM* to the C++ object and to provide extra space for a user pointer.
typedef struct {
void* m_user; // the pointer for the user's data
const NCursesForm* m_back; // backward pointer to C++ object
const FORM* m_owner;
} UserHook;
// Get the backward pointer to the C++ object from a FORM
static inline NCursesForm* getHook(const FORM *f) {
UserHook* hook = (UserHook*)::form_userptr(f);
assert(hook != 0 && hook->m_owner==f);
return (NCursesForm*)(hook->m_back);
}
// This are the built-in hook functions in this C++ binding. In C++ we use
// virtual member functions (see below On_..._Init and On_..._Termination)
// to provide this functionality in an object oriented manner.
static void frm_init(FORM *);
static void frm_term(FORM *);
static void fld_init(FORM *);
static void fld_term(FORM *);
// Calculate FIELD* array for the menu
FIELD** mapFields(NCursesFormField* nfields[]);
protected:
// internal routines
inline void set_user(void *user) {
UserHook* uptr = (UserHook*)::form_userptr (form);
assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form);
uptr->m_user = user;
}
inline void *get_user() {
UserHook* uptr = (UserHook*)::form_userptr (form);
assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form);
return uptr->m_user;
}
void InitForm (NCursesFormField* Fields[],
bool with_frame,
bool autoDeleteFields);
inline void OnError (int err) const THROWS(NCursesFormException) {
if (err != E_OK)
THROW(new NCursesFormException (err));
}
// this wraps the form_driver call.
virtual int driver (int c) ;
// 'Internal' constructor, builds an object without association to a
// field array.
NCursesForm( int lines,
int cols,
int begin_y = 0,
int begin_x = 0)
: NCursesPanel(lines,cols,begin_y,begin_x),
form ((FORM*)0) {
}
public:
// Create form for the default panel.
NCursesForm (NCursesFormField* Fields[],
bool with_frame=FALSE, // reserve space for a frame?
bool autoDelete_Fields=FALSE) // do automatic cleanup?
: NCursesPanel() {
InitForm(Fields, with_frame, autoDelete_Fields);
}
// Create a form in a panel with the given position and size.
NCursesForm (NCursesFormField* Fields[],
int lines,
int cols,
int begin_y,
int begin_x,
bool with_frame=FALSE, // reserve space for a frame?
bool autoDelete_Fields=FALSE) // do automatic cleanup?
: NCursesPanel(lines, cols, begin_y, begin_x) {
InitForm(Fields, with_frame, autoDelete_Fields);
}
virtual ~NCursesForm();
// Set the default attributes for the form
virtual void setDefaultAttributes();
// Retrieve current field of the form.
inline NCursesFormField* current_field() const {
return my_fields[::field_index(::current_field(form))];
}
// Set the forms subwindow
void setSubWindow(NCursesWindow& sub);
// Set these fields for the form
inline void setFields(NCursesFormField* Fields[]) {
OnError(::set_form_fields(form,mapFields(Fields)));
}
// Remove the form from the screen
inline void unpost (void) {
OnError (::unpost_form (form));
}
// Post the form to the screen if flag is true, unpost it otherwise
inline void post(bool flag = TRUE) {
OnError (flag ? ::post_form(form) : ::unpost_form (form));
}
// Decorations
inline void frame(const char *title=NULL, const char* btitle=NULL) {
if (b_framed)
NCursesPanel::frame(title,btitle);
else
OnError(E_SYSTEM_ERROR);
}
inline void boldframe(const char *title=NULL, const char* btitle=NULL) {
if (b_framed)
NCursesPanel::boldframe(title,btitle);
else
OnError(E_SYSTEM_ERROR);
}
inline void label(const char *topLabel, const char *bottomLabel) {
if (b_framed)
NCursesPanel::label(topLabel,bottomLabel);
else
OnError(E_SYSTEM_ERROR);
}
// -----
// Hooks
// -----
// Called after the form gets repositioned in its window.
// This is especially true if the form is posted.
virtual void On_Form_Init();
// Called before the form gets repositioned in its window.
// This is especially true if the form is unposted.
virtual void On_Form_Termination();
// Called after the field became the current field
virtual void On_Field_Init(NCursesFormField& field);
// Called before this field is left as current field.
virtual void On_Field_Termination(NCursesFormField& field);
// Calculate required window size for the form.
void scale(int& rows, int& cols) const {
OnError(::scale_form(form,&rows,&cols));
}
// Retrieve number of fields in the form.
int count() const {
return ::field_count(form);
}
// Make the page the current page of the form.
void set_page(int page) {
OnError(::set_form_page(form,page));
}
// Retrieve current page number
int page() const {
return ::form_page(form);
}
// Switch on the forms options
inline void options_on (Form_Options options) {
OnError (::form_opts_on (form, options));
}
// Switch off the forms options
inline void options_off (Form_Options options) {
OnError (::form_opts_off (form, options));
}
// Retrieve the forms options
inline Form_Options options () const {
return ::form_opts (form);
}
// Set the forms options
inline void set_options (Form_Options options) {
OnError (::set_form_opts (form, options));
}
// Are there more data in the current field after the data shown
inline bool data_ahead() const {
return ::data_ahead(form);
}
// Are there more data in the current field before the data shown
inline bool data_behind() const {
return ::data_behind(form);
}
// Position the cursor to the current field
inline void position_cursor () {
OnError (::pos_form_cursor (form));
}
// Set the current field
inline void set_current(NCursesFormField& F) {
OnError (::set_current_field(form, F.field));
}
// Provide a default key virtualization. Translate the keyboard
// code c into a form request code.
// The default implementation provides a hopefully straightforward
// mapping for the most common keystrokes and form requests.
virtual int virtualize(int c);
// Operators
inline NCursesFormField* operator[](int i) const {
if ( (i < 0) || (i >= ::field_count (form)) )
OnError (E_BAD_ARGUMENT);
return my_fields[i];
}
// Perform the menu's operation
// Return the field where you left the form.
virtual NCursesFormField* operator()(void);
// Exception handlers. The default is a Beep.
virtual void On_Request_Denied(int c) const;
virtual void On_Invalid_Field(int c) const;
virtual void On_Unknown_Command(int c) const;
};
//
// -------------------------------------------------------------------------
// This is the typical C++ typesafe way to allow to attach
// user data to a field of a form. Its assumed that the user
// data belongs to some class T. Use T as template argument
// to create a UserField.
// -------------------------------------------------------------------------
template<class T> class NCURSES_IMPEXP NCursesUserField : public NCursesFormField
{
public:
NCursesUserField (int rows,
int cols,
int first_row = 0,
int first_col = 0,
const T* p_UserData = (T*)0,
int offscreen_rows = 0,
int additional_buffers = 0)
: NCursesFormField (rows, cols,
first_row, first_col,
offscreen_rows, additional_buffers) {
if (field)
OnError(::set_field_userptr(field,(void *)p_UserData));
}
virtual ~NCursesUserField() {};
inline const T* UserData (void) const {
return (const T*)::field_userptr (field);
}
inline virtual void setUserData(const T* p_UserData) {
if (field)
OnError (::set_field_userptr (field, (void *)p_UserData));
}
};
//
// -------------------------------------------------------------------------
// The same mechanism is used to attach user data to a form
// -------------------------------------------------------------------------
//
template<class T> class NCURSES_IMPEXP NCursesUserForm : public NCursesForm
{
protected:
// 'Internal' constructor, builds an object without association to a
// field array.
NCursesUserForm( int lines,
int cols,
int begin_y = 0,
int begin_x = 0,
const T* p_UserData = (T*)0)
: NCursesForm(lines,cols,begin_y,begin_x) {
if (form)
set_user ((void *)p_UserData);
}
public:
NCursesUserForm (NCursesFormField Fields[],
bool with_frame=FALSE,
bool autoDelete_Fields=FALSE)
: NCursesForm (Fields, with_frame, autoDelete_Fields) {
};
NCursesUserForm (NCursesFormField Fields[],
const T* p_UserData = (T*)0,
bool with_frame=FALSE,
bool autoDelete_Fields=FALSE)
: NCursesForm (Fields, with_frame, autoDelete_Fields) {
if (form)
set_user ((void *)p_UserData);
};
NCursesUserForm (NCursesFormField Fields[],
int lines,
int cols,
int begin_y = 0,
int begin_x = 0,
const T* p_UserData = (T*)0,
bool with_frame=FALSE,
bool autoDelete_Fields=FALSE)
: NCursesForm (Fields, lines, cols, begin_y, begin_x,
with_frame, autoDelete_Fields) {
if (form)
set_user ((void *)p_UserData);
};
virtual ~NCursesUserForm() {
};
inline T* UserData (void) const {
return (T*)get_user ();
};
inline virtual void setUserData (const T* p_UserData) {
if (form)
set_user ((void *)p_UserData);
}
};
//
// -------------------------------------------------------------------------
// Builtin Fieldtypes
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP Alpha_Field : public NCursesFieldType {
private:
int min_field_width;
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,min_field_width));
}
public:
Alpha_Field(int width)
: NCursesFieldType(TYPE_ALPHA),
min_field_width(width) {
}
};
class NCURSES_IMPEXP Alphanumeric_Field : public NCursesFieldType {
private:
int min_field_width;
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,min_field_width));
}
public:
Alphanumeric_Field(int width)
: NCursesFieldType(TYPE_ALNUM),
min_field_width(width) {
}
};
class NCURSES_IMPEXP Integer_Field : public NCursesFieldType {
private:
int precision;
long lower_limit, upper_limit;
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,
precision,lower_limit,upper_limit));
}
public:
Integer_Field(int prec, long low=0L, long high=0L)
: NCursesFieldType(TYPE_INTEGER),
precision(prec), lower_limit(low), upper_limit(high) {
}
};
class NCURSES_IMPEXP Numeric_Field : public NCursesFieldType {
private:
int precision;
double lower_limit, upper_limit;
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,
precision,lower_limit,upper_limit));
}
public:
Numeric_Field(int prec, double low=0.0, double high=0.0)
: NCursesFieldType(TYPE_NUMERIC),
precision(prec), lower_limit(low), upper_limit(high) {
}
};
class NCURSES_IMPEXP Regular_Expression_Field : public NCursesFieldType {
private:
char* regex;
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,regex));
}
public:
Regular_Expression_Field(const char *expr)
: NCursesFieldType(TYPE_REGEXP) {
regex = new char[1 + ::strlen(expr)];
(::strcpy)(regex,expr);
}
~Regular_Expression_Field() {
delete[] regex;
}
};
class NCURSES_IMPEXP Enumeration_Field : public NCursesFieldType {
private:
char** list;
int case_sensitive;
int non_unique_matches;
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,
list,case_sensitive,non_unique_matches));
}
public:
Enumeration_Field(char* enums[],
bool case_sens=FALSE,
bool non_unique=FALSE)
: NCursesFieldType(TYPE_ENUM),
list(enums),
case_sensitive(case_sens?-1:0),
non_unique_matches(non_unique?-1:0) {
}
};
class NCURSES_IMPEXP IPV4_Address_Field : public NCursesFieldType {
private:
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype));
}
public:
IPV4_Address_Field() : NCursesFieldType(TYPE_IPV4) {
}
};
//
// -------------------------------------------------------------------------
// Abstract base class for User-Defined Fieldtypes
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP UserDefinedFieldType : public NCursesFieldType {
friend class UDF_Init; // Internal helper to set up statics
private:
// For all C++ defined fieldtypes we need only one generic lowlevel
// FIELDTYPE* element.
static FIELDTYPE* generic_fieldtype;
protected:
// This are the functions required by the low level libforms functions
// to construct a fieldtype.
static bool fcheck(FIELD *, const void*);
static bool ccheck(int c, const void *);
static void* makearg(va_list*);
void set(NCursesFormField& f) {
OnError(::set_field_type(f.get_field(),fieldtype,&f));
}
protected:
// Redefine this function to do a field validation. The argument
// is a reference to the field you should validate.
virtual bool field_check(NCursesFormField& f) = 0;
// Redefine this function to do a character validation. The argument
// is the character to be validated.
virtual bool char_check (int c) = 0;
public:
UserDefinedFieldType() : NCursesFieldType(generic_fieldtype) {
}
};
//
// -------------------------------------------------------------------------
// Abstract base class for User-Defined Fieldtypes with Choice functions
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP UserDefinedFieldType_With_Choice : public UserDefinedFieldType {
friend class UDF_Init; // Internal helper to set up statics
private:
// For all C++ defined fieldtypes with choice functions we need only one
// generic lowlevel FIELDTYPE* element.
static FIELDTYPE* generic_fieldtype_with_choice;
// This are the functions required by the low level libforms functions
// to construct a fieldtype with choice functions.
static bool next_choice(FIELD*, const void *);
static bool prev_choice(FIELD*, const void *);
protected:
// Redefine this function to do the retrieval of the next choice value.
// The argument is a reference to the field tobe examined.
virtual bool next (NCursesFormField& f) = 0;
// Redefine this function to do the retrieval of the previous choice value.
// The argument is a reference to the field tobe examined.
virtual bool previous(NCursesFormField& f) = 0;
public:
UserDefinedFieldType_With_Choice() {
fieldtype = generic_fieldtype_with_choice;
}
};
#endif // NCURSES_CURSESF_H_incl

View File

@ -1,382 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
#include "internal.h"
#include "cursesm.h"
#include "cursesapp.h"
MODULE_ID("$Id: cursesm.cc,v 1.16 2001/07/14 20:54:43 juergen Exp $")
NCursesMenuItem::~NCursesMenuItem() {
if (item)
OnError(::free_item(item));
}
bool
NCursesMenuItem::action() {
return FALSE;
};
NCursesMenuCallbackItem::~NCursesMenuCallbackItem() {
}
bool
NCursesMenuCallbackItem::action() {
if (p_fct)
return p_fct (*this);
else
return FALSE;
}
/* Internal hook functions. They will route the hook
* calls to virtual methods of the NCursesMenu class,
* so in C++ providing a hook is done simply by
* implementing a virtual method in a derived class
*/
void
NCursesMenu::mnu_init(MENU *m) {
getHook(m)->On_Menu_Init();
}
void
NCursesMenu::mnu_term(MENU *m) {
getHook(m)->On_Menu_Termination();
}
void
NCursesMenu::itm_init(MENU *m) {
NCursesMenu* M = getHook(m);
M->On_Item_Init (*(M->current_item ()));
}
void
NCursesMenu::itm_term(MENU *m) {
NCursesMenu* M = getHook(m);
M->On_Item_Termination (*(M->current_item ()));
}
/* Construct an ITEM* array from an array of NCursesMenuItem
* objects.
*/
ITEM**
NCursesMenu::mapItems(NCursesMenuItem* nitems[]) {
int itemCount = 0,lcv;
for (lcv=0; nitems[lcv]->item; ++lcv)
++itemCount;
ITEM** items = new ITEM*[itemCount + 1];
for (lcv=0;nitems[lcv]->item;++lcv) {
items[lcv] = nitems[lcv]->item;
}
items[lcv] = NULL;
my_items = nitems;
if (menu)
delete[] ::menu_items(menu);
return items;
}
void
NCursesMenu::InitMenu(NCursesMenuItem* nitems[],
bool with_frame,
bool autoDelete_Items) {
int mrows, mcols;
keypad(TRUE);
meta(TRUE);
b_framed = with_frame;
b_autoDelete = autoDelete_Items;
menu = (MENU*)0;
menu = ::new_menu(mapItems(nitems));
if (!menu)
OnError (E_SYSTEM_ERROR);
UserHook* hook = new UserHook;
hook->m_user = NULL;
hook->m_back = this;
hook->m_owner = menu;
::set_menu_userptr(menu,(void*)hook);
::set_menu_init (menu, NCursesMenu::mnu_init);
::set_menu_term (menu, NCursesMenu::mnu_term);
::set_item_init (menu, NCursesMenu::itm_init);
::set_item_term (menu, NCursesMenu::itm_term);
scale(mrows, mcols);
::set_menu_win(menu, w);
if (with_frame) {
if ((mrows > height()-2) || (mcols > width()-2))
OnError(E_NO_ROOM);
sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
::set_menu_sub(menu, sub->w);
b_sub_owner = TRUE;
}
else {
sub = (NCursesWindow*)0;
b_sub_owner = FALSE;
}
setDefaultAttributes();
}
void
NCursesMenu::setDefaultAttributes() {
NCursesApplication* S = NCursesApplication::getApplication();
if (S) {
::set_menu_fore(menu, S->foregrounds());
::set_menu_back(menu, S->backgrounds());
::set_menu_grey(menu, S->inactives());
}
}
NCursesMenu::~NCursesMenu() {
UserHook* hook = (UserHook*)::menu_userptr(menu);
delete hook;
if (b_sub_owner) {
delete sub;
::set_menu_sub(menu,(WINDOW *)0);
}
if (menu) {
ITEM** itms = ::menu_items(menu);
int cnt = count();
OnError(::set_menu_items(menu,(ITEM**)0));
if (b_autoDelete) {
if (cnt>0) {
for (int i=0; i <= cnt; i++)
delete my_items[i];
}
delete[] my_items;
}
::free_menu(menu);
// It's essential to do this after free_menu()
delete[] itms;
}
}
void
NCursesMenu::setSubWindow(NCursesWindow& nsub) {
if (!isDescendant(nsub))
OnError(E_SYSTEM_ERROR);
else {
if (b_sub_owner)
delete sub;
sub = &nsub;
::set_menu_sub(menu,sub->w);
}
}
bool
NCursesMenu::set_pattern (const char *pat) {
int res = ::set_menu_pattern (menu, pat);
switch(res) {
case E_OK:
break;
case E_NO_MATCH:
return FALSE;
default:
OnError (res);
}
return TRUE;
}
// call the menu driver and do basic error checking.
int
NCursesMenu::driver (int c) {
int res = ::menu_driver (menu, c);
switch (res) {
case E_OK:
case E_REQUEST_DENIED:
case E_NOT_SELECTABLE:
case E_UNKNOWN_COMMAND:
case E_NO_MATCH:
break;
default:
OnError (res);
}
return (res);
}
static const int CMD_QUIT = MAX_COMMAND + 1;
static const int CMD_ACTION = MAX_COMMAND + 2;
//
// -------------------------------------------------------------------------
// Provide a default key virtualization. Translate the keyboard
// code c into a menu request code.
// The default implementation provides a hopefully straightforward
// mapping for the most common keystrokes and menu requests.
// -------------------------------------------------------------------------
int
NCursesMenu::virtualize(int c) {
switch(c) {
case CTRL('X') : return(CMD_QUIT); // eXit
case KEY_DOWN : return(REQ_DOWN_ITEM);
case CTRL('N') : return(REQ_NEXT_ITEM); // Next
case KEY_UP : return(REQ_UP_ITEM);
case CTRL('P') : return(REQ_PREV_ITEM); // Previous
case CTRL('U') : return(REQ_SCR_ULINE); // Up
case CTRL('D') : return(REQ_SCR_DLINE); // Down
case CTRL('F') : return(REQ_SCR_DPAGE); // Forward
case CTRL('B') : return(REQ_SCR_UPAGE); // Backward
case CTRL('Y') : return(REQ_CLEAR_PATTERN);
case CTRL('H') : return(REQ_BACK_PATTERN);
case CTRL('A') : return(REQ_NEXT_MATCH);
case CTRL('E') : return(REQ_PREV_MATCH);
case CTRL('T') : return(REQ_TOGGLE_ITEM);
case CTRL('J') :
case CTRL('M') : return(CMD_ACTION);
case KEY_HOME : return(REQ_FIRST_ITEM);
case KEY_LEFT : return(REQ_LEFT_ITEM);
case KEY_RIGHT : return(REQ_RIGHT_ITEM);
case KEY_END : return(REQ_LAST_ITEM);
case KEY_BACKSPACE : return(REQ_BACK_PATTERN);
case KEY_NPAGE : return(REQ_SCR_DPAGE);
case KEY_PPAGE : return(REQ_SCR_UPAGE);
default:
return(c);
}
}
NCursesMenuItem*
NCursesMenu::operator()(void) {
int drvCmnd;
int err;
int c;
bool b_action = FALSE;
post();
show();
refresh();
while (!b_action && ((drvCmnd = virtualize((c=getKey()))) != CMD_QUIT)) {
switch((err=driver(drvCmnd))) {
case E_REQUEST_DENIED:
On_Request_Denied(c);
break;
case E_NOT_SELECTABLE:
On_Not_Selectable(c);
break;
case E_UNKNOWN_COMMAND:
if (drvCmnd == CMD_ACTION) {
if (options() & O_ONEVALUE) {
NCursesMenuItem* itm = current_item();
assert(itm != 0);
if (itm->options() & O_SELECTABLE)
{
b_action = itm->action();
refresh();
}
else
On_Not_Selectable(c);
}
else {
int n = count();
for(int i=0; i<n; i++) {
NCursesMenuItem* itm = my_items[i];
if (itm->value()) {
b_action |= itm->action();
refresh();
}
}
}
} else
On_Unknown_Command(c);
break;
case E_NO_MATCH:
On_No_Match(c);
break;
case E_OK:
break;
default:
OnError(err);
}
}
unpost();
hide();
refresh();
if (options() & O_ONEVALUE)
return my_items[::item_index (::current_item (menu))];
else
return NULL;
}
void
NCursesMenu::On_Menu_Init() {
}
void
NCursesMenu::On_Menu_Termination() {
}
void
NCursesMenu::On_Item_Init(NCursesMenuItem& item) {
}
void
NCursesMenu::On_Item_Termination(NCursesMenuItem& item) {
}
void
NCursesMenu::On_Request_Denied(int c) const {
::beep();
}
void
NCursesMenu::On_Not_Selectable(int c) const {
::beep();
}
void
NCursesMenu::On_No_Match(int c) const {
::beep();
}
void
NCursesMenu::On_Unknown_Command(int c) const {
::beep();
}

View File

@ -1,592 +0,0 @@
// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2000 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
// $Id: cursesm.h,v 1.15 2001/03/24 21:41:28 tom Exp $
#ifndef NCURSES_CURSESM_H_incl
#define NCURSES_CURSESM_H_incl 1
#include <cursesp.h>
extern "C" {
# include <menu.h>
}
//
// -------------------------------------------------------------------------
// This wraps the ITEM type of <menu.h>
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP NCursesMenuItem {
friend class NCursesMenu;
protected:
ITEM *item;
inline void OnError (int err) const THROWS(NCursesMenuException) {
if (err != E_OK)
THROW(new NCursesMenuException (err));
}
public:
NCursesMenuItem (const char* p_name = NULL,
const char* p_descript = NULL ) {
item = p_name ? ::new_item (p_name, p_descript) : (ITEM*)0;
if (p_name && !item)
OnError (E_SYSTEM_ERROR);
}
// Create an item. If you pass both parameters as NULL, a delimiting
// item is constructed which can be used to terminate a list of
// NCursesMenu objects.
virtual ~NCursesMenuItem ();
// Release the items memory
inline const char* name () const {
return ::item_name (item);
}
// Name of the item
inline const char* description () const {
return ::item_description (item);
}
// Description of the item
inline int (index) (void) const {
return ::item_index (item);
}
// Index of the item in an item array (or -1)
inline void options_on (Item_Options options) {
OnError (::item_opts_on (item, options));
}
// Switch on the items options
inline void options_off (Item_Options options) {
OnError (::item_opts_off (item, options));
}
// Switch off the item's option
inline Item_Options options () const {
return ::item_opts (item);
}
// Retrieve the items options
inline void set_options (Item_Options options) {
OnError (::set_item_opts (item, options));
}
// Set the items options
inline void set_value (bool f) {
OnError (::set_item_value (item,f));
}
// Set/Reset the items selection state
inline bool value () const {
return ::item_value (item);
}
// Retrieve the items selection state
inline bool visible () const {
return ::item_visible (item);
}
// Retrieve visibility of the item
virtual bool action();
// Perform an action associated with this item; you may use this in an
// user supplied driver for a menu; you may derive from this class and
// overload action() to supply items with different actions.
// If an action returns true, the menu will be exited. The default action
// is to do nothing.
};
// Prototype for an items callback function.
typedef bool ITEMCALLBACK(NCursesMenuItem&);
// If you don't like to create a child class for individual items to
// overload action(), you may use this class and provide a callback
// function pointer for items.
class NCURSES_IMPEXP NCursesMenuCallbackItem : public NCursesMenuItem {
private:
ITEMCALLBACK* p_fct;
public:
NCursesMenuCallbackItem(ITEMCALLBACK* fct = NULL,
const char* p_name = NULL,
const char* p_descript = NULL )
: NCursesMenuItem (p_name, p_descript),
p_fct (fct) {
}
virtual ~NCursesMenuCallbackItem();
bool action();
};
//
// -------------------------------------------------------------------------
// This wraps the MENU type of <menu.h>
// -------------------------------------------------------------------------
//
class NCURSES_IMPEXP NCursesMenu : public NCursesPanel {
protected:
MENU *menu;
private:
NCursesWindow* sub; // the subwindow object
bool b_sub_owner; // is this our own subwindow?
bool b_framed; // has the menu a border?
bool b_autoDelete; // Delete items when deleting menu?
NCursesMenuItem** my_items; // The array of items for this menu
// This structure is used for the menu's user data field to link the
// MENU* to the C++ object and to provide extra space for a user pointer.
typedef struct {
void* m_user; // the pointer for the user's data
const NCursesMenu* m_back; // backward pointer to C++ object
const MENU* m_owner;
} UserHook;
// Get the backward pointer to the C++ object from a MENU
static inline NCursesMenu* getHook(const MENU *m) {
UserHook* hook = (UserHook*)::menu_userptr(m);
assert(hook != 0 && hook->m_owner==m);
return (NCursesMenu*)(hook->m_back);
}
// This are the built-in hook functions in this C++ binding. In C++ we use
// virtual member functions (see below On_..._Init and On_..._Termination)
// to provide this functionality in an object oriented manner.
static void mnu_init(MENU *);
static void mnu_term(MENU *);
static void itm_init(MENU *);
static void itm_term(MENU *);
// Calculate ITEM* array for the menu
ITEM** mapItems(NCursesMenuItem* nitems[]);
protected:
// internal routines
inline void set_user(void *user) {
UserHook* uptr = (UserHook*)::menu_userptr (menu);
assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
uptr->m_user = user;
}
inline void *get_user() {
UserHook* uptr = (UserHook*)::menu_userptr (menu);
assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
return uptr->m_user;
}
void InitMenu (NCursesMenuItem* menu[],
bool with_frame,
bool autoDeleteItems);
inline void OnError (int err) const THROWS(NCursesMenuException) {
if (err != E_OK)
THROW(new NCursesMenuException (this, err));
}
// this wraps the menu_driver call.
virtual int driver (int c) ;
// 'Internal' constructor to create a menu without association to
// an array of items.
NCursesMenu( int lines,
int cols,
int begin_y = 0,
int begin_x = 0)
: NCursesPanel(lines,cols,begin_y,begin_x),
menu ((MENU*)0) {
}
public:
// Make a full window size menu
NCursesMenu (NCursesMenuItem* Items[],
bool with_frame=FALSE, // Reserve space for a frame?
bool autoDelete_Items=FALSE) // Autocleanup of Items?
: NCursesPanel() {
InitMenu(Items, with_frame, autoDelete_Items);
}
// Make a menu with a window of this size.
NCursesMenu (NCursesMenuItem* Items[],
int lines,
int cols,
int begin_y = 0,
int begin_x = 0,
bool with_frame=FALSE, // Reserve space for a frame?
bool autoDelete_Items=FALSE) // Autocleanup of Items?
: NCursesPanel(lines, cols, begin_y, begin_x) {
InitMenu(Items, with_frame, autoDelete_Items);
}
virtual ~NCursesMenu ();
// Retrieve the menus subwindow
inline NCursesWindow& subWindow() const {
assert(sub!=NULL);
return *sub;
}
// Set the menus subwindow
void setSubWindow(NCursesWindow& sub);
// Set these items for the menu
inline void setItems(NCursesMenuItem* Items[]) {
OnError(::set_menu_items(menu,mapItems(Items)));
}
// Remove the menu from the screen
inline void unpost (void) {
OnError (::unpost_menu (menu));
}
// Post the menu to the screen if flag is true, unpost it otherwise
inline void post(bool flag = TRUE) {
flag ? OnError (::post_menu(menu)) : OnError (::unpost_menu (menu));
}
// Get the numer of rows and columns for this menu
inline void scale (int& mrows, int& mcols) const {
OnError (::scale_menu (menu, &mrows, &mcols));
}
// Set the format of this menu
inline void set_format(int mrows, int mcols) {
OnError (::set_menu_format(menu, mrows, mcols));
}
// Get the format of this menu
inline void menu_format(int& rows,int& cols) {
::menu_format(menu,&rows,&cols);
}
// Items of the menu
inline NCursesMenuItem* items() const {
return *my_items;
}
// Get the number of items in this menu
inline int count() const {
return ::item_count(menu);
}
// Get the current item (i.e. the one the cursor is located)
inline NCursesMenuItem* current_item() const {
return my_items[::item_index(::current_item(menu))];
}
// Get the marker string
inline const char* mark() const {
return ::menu_mark(menu);
}
// Set the marker string
inline void set_mark(const char *mark) {
OnError (::set_menu_mark (menu, mark));
}
// Get the name of the request code c
inline static const char* request_name(int c) {
return ::menu_request_name(c);
}
// Get the current pattern
inline char* pattern() const {
return ::menu_pattern(menu);
}
// true if there is a pattern match, false otherwise.
bool set_pattern (const char *pat);
// set the default attributes for the menu
// i.e. set fore, back and grey attribute
virtual void setDefaultAttributes();
// Get the menus background attributes
inline chtype back() const {
return ::menu_back(menu);
}
// Get the menus foreground attributes
inline chtype fore() const {
return ::menu_fore(menu);
}
// Get the menus grey attributes (used for unselectable items)
inline chtype grey() const {
return ::menu_grey(menu);
}
// Set the menus background attributes
inline chtype set_background(chtype a) {
return ::set_menu_back(menu,a);
}
// Set the menus foreground attributes
inline chtype set_foreground(chtype a) {
return ::set_menu_fore(menu,a);
}
// Set the menus grey attributes (used for unselectable items)
inline chtype set_grey(chtype a) {
return ::set_menu_grey(menu,a);
}
inline void options_on (Menu_Options opts) {
OnError (::menu_opts_on (menu,opts));
}
inline void options_off(Menu_Options opts) {
OnError (::menu_opts_off(menu,opts));
}
inline Menu_Options options() const {
return ::menu_opts(menu);
}
inline void set_options (Menu_Options opts) {
OnError (::set_menu_opts (menu,opts));
}
inline int pad() const {
return ::menu_pad(menu);
}
inline void set_pad (int padch) {
OnError (::set_menu_pad (menu, padch));
}
// Position the cursor to the current item
inline void position_cursor () const {
OnError (::pos_menu_cursor (menu));
}
// Set the current item
inline void set_current(NCursesMenuItem& I) {
OnError (::set_current_item(menu, I.item));
}
// Get the current top row of the menu
inline int top_row (void) const {
return ::top_row (menu);
}
// Set the current top row of the menu
inline void set_top_row (int row) {
OnError (::set_top_row (menu, row));
}
// spacing control
// Set the spacing for the menu
inline void setSpacing(int spc_description,
int spc_rows,
int spc_columns) {
OnError(::set_menu_spacing(menu,
spc_description,
spc_rows,
spc_columns));
}
// Get the spacing info for the menu
inline void Spacing(int& spc_description,
int& spc_rows,
int& spc_columns) const {
OnError(::menu_spacing(menu,
&spc_description,
&spc_rows,
&spc_columns));
}
// Decorations
inline void frame(const char *title=NULL, const char* btitle=NULL) {
if (b_framed)
NCursesPanel::frame(title,btitle);
else
OnError(E_SYSTEM_ERROR);
}
inline void boldframe(const char *title=NULL, const char* btitle=NULL) {
if (b_framed)
NCursesPanel::boldframe(title,btitle);
else
OnError(E_SYSTEM_ERROR);
}
inline void label(const char *topLabel, const char *bottomLabel) {
if (b_framed)
NCursesPanel::label(topLabel,bottomLabel);
else
OnError(E_SYSTEM_ERROR);
}
// -----
// Hooks
// -----
// Called after the menu gets repositioned in its window.
// This is especially true if the menu is posted.
virtual void On_Menu_Init();
// Called before the menu gets repositioned in its window.
// This is especially true if the menu is unposted.
virtual void On_Menu_Termination();
// Called after the item became the current item
virtual void On_Item_Init(NCursesMenuItem& item);
// Called before this item is left as current item.
virtual void On_Item_Termination(NCursesMenuItem& item);
// Provide a default key virtualization. Translate the keyboard
// code c into a menu request code.
// The default implementation provides a hopefully straightforward
// mapping for the most common keystrokes and menu requests.
virtual int virtualize(int c);
// Operators
inline NCursesMenuItem* operator[](int i) const {
if ( (i < 0) || (i >= ::item_count (menu)) )
OnError (E_BAD_ARGUMENT);
return (my_items[i]);
}
// Perform the menu's operation
// Return the item where you left the selection mark for a single
// selection menu, or NULL for a multivalued menu.
virtual NCursesMenuItem* operator()(void);
// --------------------
// Exception handlers
// Called by operator()
// --------------------
// Called if the request is denied
virtual void On_Request_Denied(int c) const;
// Called if the item is not selectable
virtual void On_Not_Selectable(int c) const;
// Called if pattern doesn't match
virtual void On_No_Match(int c) const;
// Called if the command is unknown
virtual void On_Unknown_Command(int c) const;
};
//
// -------------------------------------------------------------------------
// This is the typical C++ typesafe way to allow to attach
// user data to an item of a menu. Its assumed that the user
// data belongs to some class T. Use T as template argument
// to create a UserItem.
// -------------------------------------------------------------------------
//
template<class T> class NCURSES_IMPEXP NCursesUserItem : public NCursesMenuItem
{
public:
NCursesUserItem (const char* p_name,
const char* p_descript = NULL,
const T* p_UserData = (T*)0)
: NCursesMenuItem (p_name, p_descript) {
if (item)
OnError (::set_item_userptr (item, (void *)p_UserData));
};
virtual ~NCursesUserItem() {};
inline const T* UserData (void) const {
return (const T*)::item_userptr (item);
};
inline virtual void setUserData(const T* p_UserData) {
if (item)
OnError (::set_item_userptr (item, (void *)p_UserData));
}
};
//
// -------------------------------------------------------------------------
// The same mechanism is used to attach user data to a menu
// -------------------------------------------------------------------------
//
template<class T> class NCURSES_IMPEXP NCursesUserMenu : public NCursesMenu
{
protected:
NCursesUserMenu( int lines,
int cols,
int begin_y = 0,
int begin_x = 0,
const T* p_UserData = (T*)0)
: NCursesMenu(lines,cols,begin_y,begin_x) {
if (menu)
set_user ((void *)p_UserData);
}
public:
NCursesUserMenu (NCursesMenuItem Items[],
const T* p_UserData = (T*)0,
bool with_frame=FALSE,
bool autoDelete_Items=FALSE)
: NCursesMenu (Items, with_frame, autoDelete_Items) {
if (menu)
set_user ((void *)p_UserData);
};
NCursesUserMenu (NCursesMenuItem Items[],
int lines,
int cols,
int begin_y = 0,
int begin_x = 0,
const T* p_UserData = (T*)0,
bool with_frame=FALSE)
: NCursesMenu (Items, lines, cols, begin_y, begin_x, with_frame) {
if (menu)
set_user ((void *)p_UserData);
};
virtual ~NCursesUserMenu() {
};
inline T* UserData (void) const {
return (T*)get_user ();
};
inline virtual void setUserData (const T* p_UserData) {
if (menu)
set_user ((void *)p_UserData);
}
};
#endif // NCURSES_CURSESM_H_incl

View File

@ -1,57 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
#include "internal.h"
#include "cursesapp.h"
MODULE_ID("$Id: cursesmain.cc,v 1.8 2001/07/14 20:54:43 juergen Exp $")
/* This is the default implementation of main() for a NCursesApplication.
* You only have to instantiate a static NCursesApplication object in your
* main application source file and link this module with your application.
*/
int main(int argc, char* argv[])
{
NCursesApplication* A = NCursesApplication::getApplication();
if (!A)
return(1);
else {
int res;
A->handleArgs(argc,argv);
::endwin();
res = (*A)();
::endwin();
return(res);
}
}

View File

@ -1,129 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1993,1997 *
****************************************************************************/
#include "internal.h"
#include "cursesp.h"
#include <string.h>
MODULE_ID("$Id: cursesp.cc,v 1.19 2001/07/14 20:54:43 juergen Exp $")
NCursesPanel* NCursesPanel::dummy = (NCursesPanel*)0;
void NCursesPanel::init() {
p = ::new_panel(w);
if (!p)
OnError(ERR);
UserHook* hook = new UserHook;
hook->m_user = NULL;
hook->m_back = this;
hook->m_owner = p;
::set_panel_userptr(p, (void *)hook);
}
NCursesPanel::~NCursesPanel() {
UserHook* hook = (UserHook*)::panel_userptr(p);
assert(hook != 0 && hook->m_back==this && hook->m_owner==p);
delete hook;
::del_panel(p);
::update_panels();
}
void
NCursesPanel::redraw() {
PANEL *pan;
pan = ::panel_above(NULL);
while (pan) {
::touchwin(panel_window(pan));
pan = ::panel_above(pan);
}
::update_panels();
::doupdate();
}
int
NCursesPanel::refresh() {
::update_panels();
return ::doupdate();
}
int
NCursesPanel::noutrefresh() {
::update_panels();
return OK;
}
void
NCursesPanel::boldframe(const char *title, const char* btitle) {
standout();
frame(title, btitle);
standend();
}
void
NCursesPanel::frame(const char *title,const char *btitle) {
int err = OK;
if (!title && !btitle) {
err = box();
}
else {
err = box();
if (err==OK)
label(title,btitle);
}
OnError(err);
}
void
NCursesPanel::label(const char *tLabel, const char *bLabel) {
if (tLabel)
centertext(0,tLabel);
if (bLabel)
centertext(maxy(),bLabel);
}
void
NCursesPanel::centertext(int row,const char *label) {
if (label) {
int x = (maxx() - ::strlen(label)) / 2;
if (x<0)
x=0;
OnError(addstr(row, x, label, width()));
}
}
int
NCursesPanel::getKey(void) {
return getch();
}

View File

@ -1,221 +0,0 @@
// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
#ifndef NCURSES_CURSESP_H_incl
#define NCURSES_CURSESP_H_incl 1
// $Id: cursesp.h,v 1.15 2001/07/14 20:56:18 juergen Exp $
#include <cursesw.h>
extern "C" {
# include <panel.h>
}
class NCURSES_IMPEXP NCursesPanel : public NCursesWindow {
protected:
PANEL *p;
static NCursesPanel *dummy;
private:
// This structure is used for the panel's user data field to link the
// PANEL* to the C++ object and to provide extra space for a user pointer.
typedef struct {
void* m_user; // the pointer for the user's data
const NCursesPanel* m_back; // backward pointer to C++ object
const PANEL* m_owner; // the panel itself
} UserHook;
void init(); // Initialize the panel object
protected:
void set_user(void *user) {
UserHook* uptr = (UserHook*)::panel_userptr (p);
assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==p);
uptr->m_user = user;
}
// Set the user pointer of the panel.
void *get_user() {
UserHook* uptr = (UserHook*)::panel_userptr (p);
assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==p);
return uptr->m_user;
}
void OnError (int err) const THROWS((NCursesPanelException)) {
if (err==ERR)
THROW(new NCursesPanelException (this, err));
}
// If err is equal to the curses error indicator ERR, an error handler
// is called.
// Get a keystroke. Default implementation calls getch()
virtual int getKey(void);
public:
NCursesPanel(int lines,
int cols,
int begin_y = 0,
int begin_x = 0)
: NCursesWindow(lines,cols,begin_y,begin_x) {
init();
}
// Create a panel with this size starting at the requested position.
NCursesPanel() : NCursesWindow(::stdscr) { init(); }
// This constructor creates the default Panel associated with the
// ::stdscr window
virtual ~NCursesPanel();
// basic manipulation
inline void hide() {
OnError (::hide_panel(p));
}
// Hide the panel. It stays in the stack but becomes invisible.
inline void show() {
OnError (::show_panel(p));
}
// Show the panel, i.e. make it visible.
inline void top() {
OnError (::top_panel(p));
}
// Make this panel the top panel in the stack.
inline void bottom() {
OnError (::bottom_panel(p));
}
// Make this panel the bottom panel in the stack.
// N.B.: The panel associated with ::stdscr is always on the bottom. So
// actually bottom() makes the panel the first above ::stdscr.
virtual int mvwin(int y, int x) {
OnError(::move_panel(p, y, x));
return OK;
}
inline bool hidden() const {
return (::panel_hidden (p) ? TRUE : FALSE);
}
// Return TRUE if the panel is hidden, FALSE otherwise.
/* The functions panel_above() and panel_below() are not reflected in
the NCursesPanel class. The reason for this is, that we cannot
assume that a panel retrieved by those operations is one wrapped
by a C++ class. Although this situation might be handled, we also
need a reverse mapping from PANEL to NCursesPanel which needs some
redesign of the low level stuff. At the moment, we define them in the
interface but they will always produce an error. */
inline NCursesPanel& above() const {
OnError(ERR);
return *dummy;
}
inline NCursesPanel& below() const {
OnError(ERR);
return *dummy;
}
// Those two are rewrites of the corresponding virtual members of
// NCursesWindow
virtual int refresh();
// Propagate all panel changes to the virtual screen and update the
// physical screen.
virtual int noutrefresh();
// Propagate all panel changes to the virtual screen.
static void redraw();
// Redraw all panels.
// decorations
virtual void frame(const char* title=NULL,
const char* btitle=NULL);
// Put a frame around the panel and put the title centered in the top line
// and btitle in the bottom line.
virtual void boldframe(const char* title=NULL,
const char* btitle=NULL);
// Same as frame(), but use highlighted attributes.
virtual void label(const char* topLabel,
const char* bottomLabel);
// Put the title centered in the top line and btitle in the bottom line.
virtual void centertext(int row,const char* label);
// Put the label text centered in the specified row.
};
/* We use templates to provide a typesafe mechanism to associate
* user data with a panel. A NCursesUserPanel<T> is a panel
* associated with some user data of type T.
*/
template<class T> class NCursesUserPanel : public NCursesPanel
{
public:
NCursesUserPanel (int lines,
int cols,
int begin_y = 0,
int begin_x = 0,
const T* p_UserData = (T*)0)
: NCursesPanel (lines, cols, begin_y, begin_x) {
if (p)
set_user ((void *)p_UserData);
};
// This creates an user panel of the requested size with associated
// user data pointed to by p_UserData.
NCursesUserPanel(const T* p_UserData = (T*)0) : NCursesPanel() {
if (p)
set_user((void *)p_UserData);
};
// This creates an user panel associated with the ::stdscr and user data
// pointed to by p_UserData.
virtual ~NCursesUserPanel() {};
T* UserData (void) const {
return (T*)get_user ();
};
// Retrieve the user data associated with the panel.
virtual void setUserData (const T* p_UserData) {
if (p)
set_user ((void *)p_UserData);
}
// Associate the user panel with the user data pointed to by p_UserData.
};
#endif // NCURSES_CURSESP_H_incl

View File

@ -1,270 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1999,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1999 *
****************************************************************************/
#include "internal.h"
#include "etip.h"
#include "cursesw.h"
MODULE_ID("$Id: cursespad.cc,v 1.4 2001/03/24 21:25:57 tom Exp $")
NCursesPad::NCursesPad(int lines, int cols)
: NCursesWindow(),
viewWin((NCursesWindow*)0),
viewSub((NCursesWindow*)0),
h_gridsize(0), v_gridsize(0),
min_row(0), min_col(0)
{
w = ::newpad(lines,cols);
if ((WINDOW*)0==w) {
count--;
err_handler("Cannot construct window");
}
alloced = TRUE;
}
int NCursesPad::driver (int key) {
// Default implementation
switch(key) {
case KEY_UP:
// =======
return REQ_PAD_UP;
case KEY_DOWN:
// =========
return REQ_PAD_DOWN;
case KEY_LEFT:
// =========
return REQ_PAD_LEFT;
case KEY_RIGHT:
// ==========
return REQ_PAD_RIGHT;
case KEY_EXIT:
// =========
case CTRL('X'):
// ==========
return REQ_PAD_EXIT;
default: return(key);
}
}
void NCursesPad::operator()(void) {
NCursesWindow* W = Win();
if ((NCursesWindow*)0 != W) {
int Width = W->width();
int Height = W->height();
int req = REQ_PAD_REFRESH;
W->keypad(TRUE);
W->meta(TRUE);
refresh();
do {
bool changed = FALSE;
switch (req) {
case REQ_PAD_REFRESH:
// ================
changed = TRUE;
break;
case REQ_PAD_LEFT:
// =============
if (min_col > 0) {
changed = TRUE;
if (min_col < h_gridsize)
min_col = 0;
else
min_col -= h_gridsize;
}
else
OnNavigationError(req);
break;
case REQ_PAD_RIGHT:
// ==============
if (min_col < (width() - Width - 1)) {
changed = TRUE;
if (min_col > (width() - Width - h_gridsize - 1))
min_col = width() - Width - 1;
else
min_col += h_gridsize;
}
else
OnNavigationError(req);
break;
case REQ_PAD_UP:
// ===========
if (min_row > 0) {
changed = TRUE;
if (min_row < v_gridsize)
min_row = 0;
else
min_row -= v_gridsize;
}
else
OnNavigationError(req);
break;
case REQ_PAD_DOWN:
// =============
if (min_row < (height() - Height - 1)) {
changed = TRUE;
if (min_row > (height() - Height - v_gridsize - 1))
min_row = height() - Height - 1;
else
min_row += v_gridsize;
}
else
OnNavigationError(req);
break;
default:
OnUnknownOperation(req);
}
if (changed) {
noutrefresh();
W->syncup();
OnOperation(req);
viewWin->refresh();
}
} while( (req=driver(W->getch())) != REQ_PAD_EXIT );
}
}
int NCursesPad::refresh() {
int res = noutrefresh();
if (res==OK && ((NCursesWindow*)0 != viewWin)) {
res = (viewWin->refresh());
}
return(res);
}
int NCursesPad::noutrefresh() {
int res = OK;
NCursesWindow* W = Win();
if ((NCursesWindow*)0 != W) {
res = copywin(*W,min_row,min_col,
0,0,W->maxy(),W->maxx(),
FALSE);
if (res==OK) {
W->syncup();
res = viewWin->noutrefresh();
}
}
return (res);
}
void NCursesPad::setWindow(NCursesWindow& view,
int v_grid NCURSES_PARAM_INIT(1),
int h_grid NCURSES_PARAM_INIT(1))
{
viewWin = &view;
min_row = min_col = 0;
if (h_grid <=0 || v_grid <= 0)
err_handler("Illegal Gridsize");
else {
h_gridsize = h_grid;
v_gridsize = v_grid;
}
}
void NCursesPad::setSubWindow(NCursesWindow& sub)
{
if ((NCursesWindow*)0 == viewWin)
err_handler("Pad has no viewport");
if (!viewWin->isDescendant(sub))
THROW(new NCursesException("NCursesFramePad", E_SYSTEM_ERROR));
viewSub = &sub;
}
void NCursesFramedPad::OnOperation(int pad_req) {
NCursesWindow* W = Win();
NCursesWindow* Win = getWindow();
if (((NCursesWindow*)0 != W) && ((NCursesWindow*)0 != Win)) {
int Width = W->width();
int Height = W->height();
int i, row, col, h_len, v_len;
h_len = (Width*Width + width() - 1)/width();
if (h_len==0)
h_len = 1;
if (h_len > Width)
h_len = Width;
v_len = (Height*Height + height() - 1)/height();
if (v_len==0)
v_len = 1;
if (v_len > Height)
v_len = Height;
col = (min_col * Width + width() - 1) / width();
if (col + h_len > Width)
col = Width - h_len;
row = (min_row * Height + height() - 1) / height();
if (row + v_len > Height)
row = Height - v_len;
Win->vline(1,Width+1,Height);
Win->attron(A_REVERSE);
if (v_len>=2) {
Win->addch(row+1,Width+1,ACS_UARROW);
for(i=2;i<v_len;i++)
Win->addch(row+i,Width+1,' ');
Win->addch(row+v_len,Width+1,ACS_DARROW);
}
else {
for(i=1;i<=v_len;i++)
Win->addch(row+i,Width+1,' ');
}
Win->attroff(A_REVERSE);
Win->hline(Height+1,1,Width);
Win->attron(A_REVERSE);
if (h_len >= 2) {
Win->addch(Height+1,col+1,ACS_LARROW);
for(i=2;i<h_len;i++)
Win->addch(Height+1,col+i,' ');
Win->addch(Height+1,col+h_len,ACS_RARROW);
}
else {
for(i=1;i<=h_len;i++)
Win->addch(Height+1,col+i,' ');
}
Win->attroff(A_REVERSE);
}
}

View File

@ -1,455 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/*
Copyright (C) 1989 Free Software Foundation
written by Eric Newton (newton@rocky.oswego.edu)
This file is part of the GNU C++ Library. This library is free
software; you can redistribute it and/or modify it under the terms of
the GNU Library General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your
option) any later version. This library is distributed in the hope
that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
modified by Ulrich Drepper (drepper@karlsruhe.gmd.de)
and Anatoly Ivasyuk (anatoly@nick.csh.rit.edu)
modified by Juergen Pfeifer (juergen.pfeifer@gmx.net)
*/
#include "internal.h"
#include "cursesw.h"
MODULE_ID("$Id: cursesw.cc,v 1.24 2001/12/08 21:02:33 tom Exp $")
#define COLORS_NEED_INITIALIZATION -1
#define COLORS_NOT_INITIALIZED 0
#define COLORS_MONOCHROME 1
#define COLORS_ARE_REALLY_THERE 2
// declare static variables for the class
long NCursesWindow::count = 0L;
bool NCursesWindow::b_initialized = FALSE;
/*
* The ncurses library has a fallback for vsscanf(), which may work...
*/
#if !(USE_STRSTREAM_VSCAN || USE_STRSTREAM_VSCAN_CAST)
# undef USE_STDIO_VSCAN
# define USE_STDIO_VSCAN 1
#endif
#if defined(__GNUG__)
# ifndef _IO_va_list
# define _IO_va_list char *
# endif
#endif
int
NCursesWindow::scanw(const char* fmt, ...)
{
int result = ERR;
char buf[BUFSIZ];
if (::wgetnstr(w, buf, sizeof(buf)) != ERR) {
va_list args;
va_start(args, fmt);
#if USE_STDIO_VSCAN
if (::vsscanf(buf, fmt, args) != -1)
result = OK;
#elif USE_STRSTREAM_VSCAN /* powerpc, os390 */
strstreambuf ss(buf, sizeof(buf));
if (ss.vscan(fmt, args) != -1)
result = OK;
#elif USE_STRSTREAM_VSCAN_CAST /* pre-gcc 3.0 */
strstreambuf ss(buf, sizeof(buf));
if (ss.vscan(fmt, (_IO_va_list)args) != -1)
result = OK;
#endif
va_end(args);
}
return result;
}
int
NCursesWindow::scanw(int y, int x, const char* fmt, ...)
{
int result = ERR;
char buf[BUFSIZ];
if (::wmove(w, y, x) != ERR) {
if (::wgetnstr(w, buf, sizeof(buf)) != ERR) {
va_list args;
va_start(args, fmt);
#if USE_STDIO_VSCAN
if (::vsscanf(buf, fmt, args) != -1)
result = OK;
#elif USE_STRSTREAM_VSCAN /* powerpc, os390 */
strstreambuf ss(buf, sizeof(buf));
if (ss.vscan(fmt, args) != -1)
result = OK;
#elif USE_STRSTREAM_VSCAN_CAST /* pre-gcc 3.0 */
strstreambuf ss(buf, sizeof(buf));
if (ss.vscan(fmt, (_IO_va_list)args) != -1)
result = OK;
#endif
va_end(args);
}
}
return result;
}
int
NCursesWindow::printw(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
char buf[BUFSIZ];
::vsprintf(buf, fmt, args);
va_end(args);
return waddstr(w, buf);
}
int
NCursesWindow::printw(int y, int x, const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
int result = ::wmove(w, y, x);
if (result == OK) {
char buf[BUFSIZ];
::vsprintf(buf, fmt, args);
result = waddstr(w, buf);
}
va_end(args);
return result;
}
void
NCursesWindow::init(void)
{
leaveok(0);
keypad(1);
meta(1);
}
void
NCursesWindow::err_handler(const char *msg) const THROWS(NCursesException)
{
THROW(new NCursesException(msg));
}
void
NCursesWindow::initialize() {
if (!b_initialized) {
::initscr();
b_initialized = TRUE;
if (colorInitialized==COLORS_NEED_INITIALIZATION) {
colorInitialized=COLORS_NOT_INITIALIZED;
useColors();
}
::noecho();
::cbreak();
}
}
NCursesWindow::NCursesWindow() {
initialize();
w = (WINDOW *)0;
init();
alloced = FALSE;
subwins = par = sib = 0;
count++;
}
NCursesWindow::NCursesWindow(int lines, int cols, int begin_y, int begin_x)
{
initialize();
w = ::newwin(lines, cols, begin_y, begin_x);
if (w == 0) {
err_handler("Cannot construct window");
}
init();
alloced = TRUE;
subwins = par = sib = 0;
count++;
}
NCursesWindow::NCursesWindow(WINDOW* &window)
{
initialize();
w = window;
init();
alloced = FALSE;
subwins = par = sib = 0;
count++;
}
NCursesWindow::NCursesWindow(NCursesWindow& win, int l, int c,
int begin_y, int begin_x, char absrel)
{
initialize();
if (absrel == 'a') { // absolute origin
begin_y -= win.begy();
begin_x -= win.begx();
}
// Even though we treat subwindows as a tree, the standard curses
// library needs the `subwin' call to link to the parent in
// order to correctly perform refreshes, etc.
// Friendly enough, this also works for pads.
w = ::derwin(win.w, l, c, begin_y, begin_x);
if (w == 0) {
err_handler("Cannot construct subwindow");
}
par = &win;
sib = win.subwins;
win.subwins = this;
subwins = 0;
alloced = TRUE;
count++;
}
NCursesWindow::NCursesWindow(NCursesWindow& win,
bool do_box NCURSES_PARAM_INIT(TRUE))
{
initialize();
w = :: derwin(win.w,win.height()-2,win.width()-2,1,1);
if (w == 0) {
err_handler("Cannot construct subwindow");
}
par = &win;
sib = win.subwins;
win.subwins = this;
subwins = 0;
alloced = TRUE;
count++;
if (do_box) {
win.box();
win.touchwin();
}
}
NCursesWindow NCursesWindow::Clone() {
WINDOW *d = ::dupwin(w);
NCursesWindow W(d);
W.subwins = subwins;
W.sib = sib;
W.par = par;
W.alloced = alloced;
return W;
}
typedef int (*RIPOFFINIT)(NCursesWindow&);
static RIPOFFINIT R_INIT[5]; // There can't be more
static int r_init_idx = 0;
static RIPOFFINIT* prip = R_INIT;
extern "C" int _nc_ripoffline(int,int (*init)(WINDOW*,int));
NCursesWindow::NCursesWindow(WINDOW *win, int cols) {
initialize();
w = win;
assert((w->_maxx+1)==cols);
alloced = FALSE;
subwins = par = sib = 0;
}
int NCursesWindow::ripoff_init(WINDOW *w, int cols)
{
int res = ERR;
RIPOFFINIT init = *prip++;
if (init) {
NCursesWindow* W = new NCursesWindow(w,cols);
res = init(*W);
}
return res;
}
int NCursesWindow::ripoffline(int ripoff_lines,
int (*init)(NCursesWindow& win)) {
int code = ::_nc_ripoffline(ripoff_lines,ripoff_init);
if (code==OK && init && ripoff_lines) {
R_INIT[r_init_idx++] = init;
}
return code;
}
bool
NCursesWindow::isDescendant(NCursesWindow& win) {
for (NCursesWindow* p = subwins; p != NULL; p = p->sib) {
if (p==&win)
return TRUE;
else {
if (p->isDescendant(win))
return TRUE;
}
}
return FALSE;
}
void
NCursesWindow::kill_subwindows()
{
for (NCursesWindow* p = subwins; p != 0; p = p->sib) {
p->kill_subwindows();
if (p->alloced) {
if (p->w != 0)
::delwin(p->w);
p->alloced = FALSE;
}
p->w = 0; // cause a run-time error if anyone attempts to use...
}
}
NCursesWindow::~NCursesWindow()
{
kill_subwindows();
if (par != 0) { // Snip us from the parent's list of subwindows.
NCursesWindow * win = par->subwins;
NCursesWindow * trail = 0;
for (;;) {
if (win == 0)
break;
else if (win == this) {
if (trail != 0)
trail->sib = win->sib;
else
par->subwins = win->sib;
break;
} else {
trail = win;
win = win->sib;
}
}
}
if (alloced && w != 0)
::delwin(w);
if (alloced) {
--count;
if (count == 0) {
::endwin();
}
else if (count < 0) { // cannot happen!
err_handler("Too many windows destroyed");
}
}
}
// ---------------------------------------------------------------------
// Color stuff
//
int NCursesWindow::colorInitialized = COLORS_NOT_INITIALIZED;
void
NCursesWindow::useColors(void)
{
if (colorInitialized == COLORS_NOT_INITIALIZED) {
if (b_initialized) {
if (::has_colors()) {
::start_color();
colorInitialized = COLORS_ARE_REALLY_THERE;
}
else
colorInitialized = COLORS_MONOCHROME;
}
else
colorInitialized = COLORS_NEED_INITIALIZATION;
}
}
short
NCursesWindow::getcolor(int getback) const
{
short fore, back;
if (colorInitialized==COLORS_ARE_REALLY_THERE) {
if (::pair_content((short)PAIR_NUMBER(w->_attrs), &fore, &back))
err_handler("Can't get color pair");
}
else {
// Monochrome means white on black
back = COLOR_BLACK;
fore = COLOR_WHITE;
}
return getback ? back : fore;
}
int NCursesWindow::NumberOfColors()
{
if (colorInitialized==COLORS_ARE_REALLY_THERE)
return COLORS;
else
return 1; // monochrome (actually there are two ;-)
}
short
NCursesWindow::getcolor() const
{
if (colorInitialized==COLORS_ARE_REALLY_THERE)
return PAIR_NUMBER(w->_attrs);
else
return 0; // we only have pair zero
}
int
NCursesWindow::setpalette(short fore, short back, short pair)
{
if (colorInitialized==COLORS_ARE_REALLY_THERE)
return ::init_pair(pair, fore, back);
else
return OK;
}
int
NCursesWindow::setpalette(short fore, short back)
{
if (colorInitialized==COLORS_ARE_REALLY_THERE)
return setpalette(fore, back, (short)PAIR_NUMBER(w->_attrs));
else
return OK;
}
int
NCursesWindow::setcolor(short pair)
{
if (colorInitialized==COLORS_ARE_REALLY_THERE) {
if ((pair < 1) || (pair > COLOR_PAIRS))
err_handler("Can't set color pair");
attroff(A_COLOR);
attrset(COLOR_PAIR(pair));
}
return OK;
}
#if HAVE_HAS_KEY
extern "C" int _nc_has_mouse(void);
bool NCursesWindow::has_mouse() const {
return ((::has_key(KEY_MOUSE) || ::_nc_has_mouse())
? TRUE : FALSE);
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,122 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
#include "internal.h"
#include "cursslk.h"
#include "cursesapp.h"
#include <string.h>
MODULE_ID("$Id: cursslk.cc,v 1.9 2001/03/24 20:04:15 tom Exp $")
void Soft_Label_Key_Set::Soft_Label_Key::operator=(char *text) {
delete[] label;
label = new char[1 + ::strlen(text)];
(::strcpy)(label,text);
}
long Soft_Label_Key_Set::count = 0L;
int Soft_Label_Key_Set::num_labels = 0;
Soft_Label_Key_Set::Label_Layout
Soft_Label_Key_Set::format = None;
void Soft_Label_Key_Set::init() {
slk_array = new Soft_Label_Key[num_labels];
for(int i=0; i < num_labels; i++) {
slk_array[i].num = i+1;
}
b_attrInit = FALSE;
}
Soft_Label_Key_Set::Soft_Label_Key_Set() {
if (format==None)
Error("No default SLK layout");
init();
}
Soft_Label_Key_Set::Soft_Label_Key_Set(Soft_Label_Key_Set::Label_Layout fmt) {
if (fmt==None)
Error("Invalid SLK Layout");
if (count++==0) {
format = fmt;
if (ERR == ::slk_init((int)fmt))
Error("slk_init");
num_labels = (fmt>=PC_Style?12:8);
}
else if (fmt!=format)
Error("All SLKs must have same layout");
init();
}
Soft_Label_Key_Set::~Soft_Label_Key_Set() {
if (!::isendwin())
clear();
delete[] slk_array;
count--;
}
Soft_Label_Key_Set::Soft_Label_Key& Soft_Label_Key_Set::operator[](int i) {
if (i<1 || i>num_labels)
Error("Invalid Label index");
return slk_array[i-1];
}
void Soft_Label_Key_Set::activate_label(int i, bool bf) {
if (!b_attrInit) {
NCursesApplication* A = NCursesApplication::getApplication();
if (A) attrset(A->labels());
b_attrInit = TRUE;
}
Soft_Label_Key& K = (*this)[i];
if (ERR==::slk_set(K.num,bf?K.label:"",K.format))
Error("slk_set");
noutrefresh();
}
void Soft_Label_Key_Set::activate_labels(bool bf) {
if (!b_attrInit) {
NCursesApplication* A = NCursesApplication::getApplication();
if (A) attrset(A->labels());
b_attrInit = TRUE;
}
for(int i=1; i <= num_labels; i++) {
Soft_Label_Key& K = (*this)[i];
if (ERR==::slk_set(K.num,bf?K.label:"",K.format))
Error("slk_set");
}
if (bf)
restore();
else
clear();
noutrefresh();
}

View File

@ -1,205 +0,0 @@
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,2000 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
// $Id: cursslk.h,v 1.7 2001/03/24 21:41:47 tom Exp $
#ifndef NCURSES_CURSSLK_H_incl
#define NCURSES_CURSSLK_H_incl
#include <cursesw.h>
class NCURSES_IMPEXP Soft_Label_Key_Set {
public:
// This inner class represents the attributes of a Soft Label Key (SLK)
class NCURSES_IMPEXP Soft_Label_Key {
friend class Soft_Label_Key_Set;
public:
typedef enum { Left=0, Center=1, Right=2 } Justification;
private:
char *label; // The Text of the Label
Justification format; // The Justification
int num; // The number of the Label
Soft_Label_Key() : label((char*)0),format(Left),num(-1) {
}
virtual ~Soft_Label_Key() {
delete[] label;
};
public:
// Set the text of the Label
void operator=(char *text);
// Set the Justification of the Label
inline void operator=(Justification just) {
format = just;
}
// Retrieve the text of the label
inline char* operator()(void) const {
return label;
}
};
public:
typedef enum {
None = -1,
Three_Two_Three = 0,
Four_Four = 1,
PC_Style = 2,
PC_Style_With_Index = 3
} Label_Layout;
private:
static long NCURSES_IMPEXP count; // Number of Key Sets
static Label_Layout NCURSES_IMPEXP format; // Layout of the Key Sets
static int NCURSES_IMPEXP num_labels; // Number Of Labels in Key Sets
bool NCURSES_IMPEXP b_attrInit; // Are attributes initialized
Soft_Label_Key *slk_array; // The array of SLK's
// Init the Key Set
void init();
// Activate or Deactivate Label# i, Label counting starts with 1!
void activate_label(int i, bool bf=TRUE);
// Activate of Deactivate all Labels
void activate_labels(bool bf);
protected:
inline void Error (const char* msg) const THROWS(NCursesException) {
THROW(new NCursesException (msg));
}
// Remove SLK's from screen
void clear() {
if (ERR==::slk_clear())
Error("slk_clear");
}
// Restore them
void restore() {
if (ERR==::slk_restore())
Error("slk_restore");
}
public:
// Construct a Key Set, use the most comfortable layout as default.
// You must create a Soft_Label_Key_Set before you create any object of
// the NCursesWindow, NCursesPanel or derived classes. (Actually before
// ::initscr() is called).
Soft_Label_Key_Set(Label_Layout fmt);
// This constructor assumes, that you already constructed a Key Set
// with a layout by the constructor above. This layout will be reused.
NCURSES_IMPEXP Soft_Label_Key_Set();
virtual ~Soft_Label_Key_Set();
// Get Label# i. Label counting starts with 1!
NCURSES_IMPEXP Soft_Label_Key& operator[](int i);
// Retrieve number of Labels
inline int labels() const { return num_labels; }
// Refresh the SLK portion of the screen
inline void refresh() {
if (ERR==::slk_refresh())
Error("slk_refresh");
}
// Mark the SLK portion of the screen for refresh, defer actual refresh
// until next update call.
inline void noutrefresh() {
if (ERR==::slk_noutrefresh())
Error("slk_noutrefresh");
}
// Mark the whole SLK portion of the screen as modified
inline void touch() {
if (ERR==::slk_touch())
Error("slk_touch");
}
// Activate Label# i
inline void show(int i) {
activate_label(i,FALSE);
activate_label(i,TRUE);
}
// Hide Label# i
inline void hide(int i) {
activate_label(i,FALSE);
}
// Show all Labels
inline void show() {
activate_labels(FALSE);
activate_labels(TRUE);
}
// Hide all Labels
inline void hide() {
activate_labels(FALSE);
}
inline void attron(attr_t attrs) {
if (ERR==::slk_attron(attrs))
Error("slk_attron");
}
inline void attroff(attr_t attrs) {
if (ERR==::slk_attroff(attrs))
Error("slk_attroff");
}
inline void attrset(attr_t attrs) {
if (ERR==::slk_attrset(attrs))
Error("slk_attrset");
}
inline void color(short color_pair_number) {
if (ERR==::slk_color(color_pair_number))
Error("slk_color");
}
inline attr_t attr() const {
return ::slk_attr();
}
};
#endif // NCURSES_CURSSLK_H_incl

View File

@ -1,492 +0,0 @@
/*
* Silly demo program for the NCursesPanel class.
*
* written by Anatoly Ivasyuk (anatoly@nick.csh.rit.edu)
*
* Demo code for NCursesMenu and NCursesForm written by
* Juergen Pfeifer <juergen.pfeifer@gmx.net>
*
* $Id: demo.cc,v 1.21 2001/07/15 01:15:26 tom Exp $
*/
#include "cursesapp.h"
#include "cursesm.h"
#include "cursesf.h"
#if HAVE_LIBC_H
# include <libc.h>
#endif
extern "C" unsigned int sleep(unsigned int);
#undef index // needed for NeXT
//
// -------------------------------------------------------------------------
//
class SillyDemo
{
public:
void run(int sleeptime) {
NCursesPanel *std = new NCursesPanel();
// Make a few small demo panels
NCursesPanel *u = new NCursesPanel(8,20,12,4);
NCursesPanel *v = new NCursesPanel(8,20,10,6);
NCursesPanel *w = new NCursesPanel(8,20,8,8);
NCursesPanel *x = new NCursesPanel(8,20,6,10);
NCursesPanel *y = new NCursesPanel(8,20,4,12);
NCursesPanel *z = new NCursesPanel(8,30,2,14);
// Draw something on the main screen, so we can see what happens
// when panels get moved or deleted.
std->box();
std->move(std->height()/2,1);
std->hline(std->width()-2);
std->move(1,std->width()/2);
std->vline(std->height()-2);
std->addch(0,std->width()/2,ACS_TTEE);
std->addch(std->height()-1,std->width()/2,ACS_BTEE);
std->addch(std->height()/2,0,ACS_LTEE);
std->addch(std->height()/2,std->width()-1,ACS_RTEE);
std->addch(std->height()/2,std->width()/2,ACS_PLUS);
// Draw frames with titles around panels so that we can see where
// the panels are located.
u->boldframe("Win U");
v->frame("Win V");
w->boldframe("Win W");
x->frame("Win X");
y->boldframe("Win Y");
z->frame("Win Z");
if (NCursesApplication::getApplication()->useColors()) {
u->bkgd(' '|COLOR_PAIR(1));
w->bkgd(' '|COLOR_PAIR(1));
y->bkgd(' '|COLOR_PAIR(1));
v->bkgd(' '|COLOR_PAIR(2));
x->bkgd(' '|COLOR_PAIR(2));
z->bkgd(' '|COLOR_PAIR(2));
}
// A refresh to any valid panel updates all panels and refreshes
// the screen. Using std is just convenient - We know it's always
// valid until the end of the program.
std->refresh();
sleep(sleeptime);
// Show what happens when panels are deleted and moved.
sleep(sleeptime);
delete u;
std->refresh();
sleep(sleeptime);
delete z;
std->refresh();
sleep(sleeptime);
delete v;
std->refresh();
// show how it looks when a panel moves
sleep(sleeptime);
y->mvwin(5,30);
std->refresh();
sleep(sleeptime);
delete y;
std->refresh();
// show how it looks when you raise a panel
sleep(sleeptime);
w->top();
std->refresh();
sleep(sleeptime);
delete w;
std->refresh();
sleep(sleeptime);
delete x;
std->clear();
std->refresh();
// Don't forget to clean up the main screen. Since this is the
// last thing using NCursesWindow, this has the effect of
// shutting down ncurses and restoring the terminal state.
sleep(sleeptime);
delete std;
}
};
class UserData
{
private:
int u;
public:
UserData(int x) : u(x) {}
int sleeptime() const { return u; }
};
//
// -------------------------------------------------------------------------
//
template<class T> class MyAction : public NCursesUserItem<T>
{
public:
MyAction (const char* p_name,
const T* p_UserData)
: NCursesUserItem<T>(p_name, (const char*)0, p_UserData)
{};
~MyAction() {}
bool action() {
SillyDemo a;
a.run(NCursesUserItem<T>::UserData()->sleeptime());
return FALSE;
}
};
class QuitItem : public NCursesMenuItem
{
public:
QuitItem() : NCursesMenuItem("Quit") {
}
bool action() {
return TRUE;
}
};
//
// -------------------------------------------------------------------------
//
class Label : public NCursesFormField
{
public:
Label(const char* title,
int row, int col)
: NCursesFormField(1,(int)::strlen(title),row,col) {
set_value(title);
options_off(O_EDIT|O_ACTIVE);
}
};
//
// -------------------------------------------------------------------------
//
class MyFieldType : public UserDefinedFieldType {
private:
int chk;
protected:
bool field_check(NCursesFormField& f) {
return TRUE;
}
bool char_check(int c) {
return (c==chk?TRUE:FALSE);
}
public:
MyFieldType(int x) : chk(x) {
}
};
//
// -------------------------------------------------------------------------
//
class TestForm : public NCursesForm
{
private:
NCursesFormField** F;
MyFieldType* mft;
Integer_Field *ift;
Enumeration_Field *eft;
static char *weekdays[];
public:
TestForm() : NCursesForm(13,51,(lines()-15)/2,(cols()-53)/2) {
F = new NCursesFormField*[10];
mft = new MyFieldType('X');
ift = new Integer_Field(0,1,10);
eft = new Enumeration_Field(weekdays);
F[0] = new Label("Demo Entry Form",0,16);
F[1] = new Label("Weekday Enum",2,1);
F[2] = new Label("Number(1-10)",2,21);
F[3] = new Label("Only 'X'",2,35);
F[4] = new Label("Multiline Field (Dynamic and Scrollable)",5,1);
F[5] = new NCursesFormField(1,18,3,1);
F[6] = new NCursesFormField(1,12,3,21);
F[7] = new NCursesFormField(1,12,3,35);
F[8] = new NCursesFormField(4,46,6,1,2);
F[9] = new NCursesFormField();
InitForm(F,TRUE,TRUE);
boldframe();
F[5]->set_fieldtype(*eft);
F[6]->set_fieldtype(*ift);
F[7]->set_fieldtype(*mft);
F[7]->set_maximum_growth(20); // max. 20 characters
F[7]->options_off(O_STATIC); // make field dynamic
F[8]->set_maximum_growth(10); // max. 10 lines
F[8]->options_off(O_STATIC); // make field dynamic
}
~TestForm() {
delete mft;
delete ift;
delete eft;
}
};
char* TestForm::weekdays[] = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", (char *)0 };
//
// -------------------------------------------------------------------------
//
class FormAction : public NCursesMenuItem
{
public:
FormAction(const char *s) : NCursesMenuItem(s) {
}
bool action() {
TestForm F;
Soft_Label_Key_Set* S = new Soft_Label_Key_Set;
for(int i=1; i <= S->labels(); i++) {
char buf[5];
::sprintf(buf,"Frm%02d",i);
(*S)[i] = buf; // Text
(*S)[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification
}
NCursesApplication::getApplication()->push(*S);
F();
NCursesApplication::getApplication()->pop();
return FALSE;
}
};
//
// -------------------------------------------------------------------------
//
class PadAction : public NCursesMenuItem
{
public:
PadAction(const char* s) : NCursesMenuItem(s) {
}
bool action() {
const int GRIDSIZE = 3;
const int PADSIZE = 200;
unsigned gridcount = 0;
NCursesPanel std;
NCursesPanel P(std.lines()-2,std.cols()-2,1,1);
NCursesFramedPad FP(P,PADSIZE,PADSIZE);
for (int i=0; i < PADSIZE; i++) {
for (int j=0; j < PADSIZE; j++) {
if (i % GRIDSIZE == 0 && j % GRIDSIZE == 0) {
if (i==0 || j==0)
FP.addch('+');
else
FP.addch((chtype)('A' + (gridcount++ % 26)));
}
else if (i % GRIDSIZE == 0)
FP.addch('-');
else if (j % GRIDSIZE == 0)
FP.addch('|');
else
FP.addch(' ');
}
}
P.label("Pad Demo",NULL);
FP();
P.clear();
return FALSE;
}
};
//
// -------------------------------------------------------------------------
//
class PassiveItem : public NCursesMenuItem {
public:
PassiveItem(const char* text) : NCursesMenuItem(text) {
options_off(O_SELECTABLE);
}
};
//
// -------------------------------------------------------------------------
//
class ScanAction : public NCursesMenuItem
{
public:
ScanAction(const char* s) : NCursesMenuItem(s) {
}
bool action() {
NCursesPanel *std = new NCursesPanel();
NCursesPanel *w = new NCursesPanel(std->lines() - 2, std->cols() - 2, 1, 1);
w->box();
w->refresh();
NCursesPanel *s = new NCursesPanel(w->lines() - 6, w->cols() - 6, 3, 3);
s->scrollok(TRUE);
::echo();
s->printw("Enter decimal integers. The running total will be shown\n");
int value = -1;
int result = 0;
while (value != 0) {
value = 0;
s->scanw("%d", &value);
if (value != 0) {
s->printw("%d: ", result += value);
}
s->refresh();
}
s->printw("\nPress any key to continue...");
s->getch();
delete s;
delete w;
delete std;
::noecho();
return FALSE;
}
};
//
// -------------------------------------------------------------------------
//
class MyMenu : public NCursesMenu
{
private:
NCursesPanel* P;
NCursesMenuItem** I;
UserData *u;
#define n_items 7
public:
MyMenu ()
: NCursesMenu (n_items+2, 8, (lines()-10)/2, (cols()-10)/2)
{
u = new UserData(1);
I = new NCursesMenuItem*[1+n_items];
I[0] = new PassiveItem("One");
I[1] = new PassiveItem("Two");
I[2] = new MyAction<UserData> ("Silly", u);
I[3] = new FormAction("Form");
I[4] = new PadAction("Pad");
I[5] = new ScanAction("Scan");
I[6] = new QuitItem();
I[7] = new NCursesMenuItem(); // Terminating empty item
InitMenu(I,TRUE,TRUE);
P = new NCursesPanel(1,n_items,LINES-1,1);
boldframe("Demo","Silly");
P->show();
}
~MyMenu()
{
P->hide();
delete P;
delete u;
}
virtual void On_Menu_Init()
{
NCursesWindow W(::stdscr);
P->move(0,0);
P->clrtoeol();
for(int i=1; i<=count(); i++)
P->addch('0' + i);
P->bkgd(W.getbkgd());
refresh();
}
virtual void On_Menu_Termination()
{
P->move(0,0);
P->clrtoeol();
refresh();
}
virtual void On_Item_Init(NCursesMenuItem& item)
{
P->move(0,item.index());
P->attron(A_REVERSE);
P->printw("%1d",1+item.index());
P->attroff(A_REVERSE);
refresh();
}
virtual void On_Item_Termination(NCursesMenuItem& item)
{
P->move(0,item.index());
P->attroff(A_REVERSE);
P->printw("%1d",1+item.index());
refresh();
}
};
//
// -------------------------------------------------------------------------
//
class TestApplication : public NCursesApplication {
protected:
int titlesize() const { return 1; }
void title();
Soft_Label_Key_Set::Label_Layout useSLKs() const {
return Soft_Label_Key_Set::PC_Style_With_Index;
}
void init_labels(Soft_Label_Key_Set& S) const;
public:
TestApplication() : NCursesApplication(TRUE) {
}
int run();
};
void TestApplication::init_labels(Soft_Label_Key_Set& S) const {
for(int i=1; i <= S.labels(); i++) {
char buf[5];
::sprintf(buf,"Key%02d",i);
S[i] = buf; // Text
S[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification
}
}
void TestApplication::title() {
const char * const title = "Simple C++ Binding Demo";
const int len = ::strlen(title);
titleWindow->bkgd(screen_titles());
titleWindow->addstr(0,(titleWindow->cols()-len)/2,title);
titleWindow->noutrefresh();
}
int TestApplication::run() {
MyMenu M;
M();
return 0;
}
//
// -------------------------------------------------------------------------
//
static TestApplication Demo;

View File

@ -1,70 +0,0 @@
#!/bin/sh
# $Id: edit_cfg.sh,v 1.12 2001/12/08 20:44:59 tom Exp $
##############################################################################
# Copyright (c) 1998,2000,2001 Free Software Foundation, Inc. #
# #
# Permission is hereby granted, free of charge, to any person obtaining a #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation #
# the rights to use, copy, modify, merge, publish, distribute, distribute #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the #
# following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
# DEALINGS IN THE SOFTWARE. #
# #
# Except as contained in this notice, the name(s) of the above copyright #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
#
# Author: Thomas E. Dickey <dickey@clark.net> 1997
#
# Edit the default value of the etip.h file based on the autoconf-generated
# values:
#
# $1 = ncurses_cfg.h
# $2 = etip.h
#
echo "substituting autoconf'd values from $1 into $2"
for name in \
CPP_HAS_PARAM_INIT \
ETIP_NEEDS_MATH_EXCEPTION \
ETIP_NEEDS_MATH_H \
HAVE_BUILTIN_H \
HAVE_GPP_BUILTIN_H \
HAVE_GXX_BUILTIN_H \
HAVE_STRSTREAM_H \
HAVE_TYPEINFO \
HAVE_VALUES_H \
USE_STRSTREAM_VSCAN \
USE_STRSTREAM_VSCAN_CAST
do
mv $2 $2.bak
if ( grep "[ ]$name[ ]1" $1 2>&1 >/dev/null)
then
value=1
sed -e 's/define '$name'.*$/define '$name' 1/' $2.bak >$2
else
value=0
sed -e 's/define '$name'.*$/define '$name' 0/' $2.bak >$2
fi
if (cmp -s $2 $2.bak)
then
echo '... '$name $value
mv $2.bak $2
else
echo '... '$name $value
rm -f $2.bak
fi
done

View File

@ -1,291 +0,0 @@
// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
// $Id: etip.h.in,v 1.22 2001/12/08 21:26:49 tom Exp $
#ifndef NCURSES_ETIP_H_incl
#define NCURSES_ETIP_H_incl 1
// These are substituted at configure/build time
#ifndef HAVE_BUILTIN_H
#define HAVE_BUILTIN_H 0
#endif
#ifndef HAVE_GXX_BUILTIN_H
#define HAVE_GXX_BUILTIN_H 0
#endif
#ifndef HAVE_GPP_BUILTIN_H
#define HAVE_GPP_BUILTIN_H 0
#endif
#ifndef HAVE_STRSTREAM_H
#define HAVE_STRSTREAM_H 0
#endif
#ifndef HAVE_TYPEINFO
#define HAVE_TYPEINFO 0
#endif
#ifndef HAVE_VALUES_H
#define HAVE_VALUES_H 0
#endif
#ifndef ETIP_NEEDS_MATH_H
#define ETIP_NEEDS_MATH_H 0
#endif
#ifndef ETIP_NEEDS_MATH_EXCEPTION
#define ETIP_NEEDS_MATH_EXCEPTION 0
#endif
#ifndef CPP_HAS_PARAM_INIT
#define CPP_HAS_PARAM_INIT 0
#endif
#ifndef USE_STRSTREAM_VSCAN
#define USE_STRSTREAM_VSCAN 0
#endif
#ifndef USE_STRSTREAM_VSCAN_CAST
#define USE_STRSTREAM_VSCAN_CAST 0
#endif
#ifdef __GNUG__
# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
# if HAVE_TYPEINFO
# include <typeinfo>
# endif
# endif
#endif
#if defined(__GNUG__)
# if HAVE_BUILTIN_H || HAVE_GXX_BUILTIN_H || HAVE_GPP_BUILTIN_H
# if ETIP_NEEDS_MATH_H
# if ETIP_NEEDS_MATH_EXCEPTION
# undef exception
# define exception math_exception
# endif
# include <math.h>
# endif
# undef exception
# define exception builtin_exception
# if HAVE_GPP_BUILTIN_H
# include <gpp/builtin.h>
# elif HAVE_GXX_BUILTIN_H
# include <g++/builtin.h>
# else
# include <builtin.h>
# endif
# undef exception
# endif
#elif defined (__SUNPRO_CC)
# include <generic.h>
# include <string.h>
#else
# include <string.h>
#endif
#include <ncurses_dll.h>
extern "C" {
#if HAVE_VALUES_H
# include <values.h>
#endif
#include <assert.h>
#include <eti.h>
#include <errno.h>
}
// Language features
#if CPP_HAS_PARAM_INIT
#define NCURSES_PARAM_INIT(value) = value
#else
#define NCURSES_PARAM_INIT(value) /*nothing*/
#endif
// Forward Declarations
class NCURSES_IMPEXP NCursesPanel;
class NCURSES_IMPEXP NCursesMenu;
class NCURSES_IMPEXP NCursesForm;
class NCURSES_IMPEXP NCursesException
{
public:
const char *message;
int errorno;
NCursesException (const char* msg, int err)
: message(msg), errorno (err)
{};
NCursesException (const char* msg)
: message(msg), errorno (E_SYSTEM_ERROR)
{};
virtual const char *classname() const {
return "NCursesWindow";
}
};
class NCURSES_IMPEXP NCursesPanelException : public NCursesException
{
public:
const NCursesPanel* p;
NCursesPanelException (const char *msg, int err) :
NCursesException (msg, err),
p ((NCursesPanel*)0)
{};
NCursesPanelException (const NCursesPanel* panel,
const char *msg,
int err) :
NCursesException (msg, err),
p (panel)
{};
NCursesPanelException (int err) :
NCursesException ("panel library error", err),
p ((NCursesPanel*)0)
{};
NCursesPanelException (const NCursesPanel* panel,
int err) :
NCursesException ("panel library error", err),
p (panel)
{};
virtual const char *classname() const {
return "NCursesPanel";
}
};
class NCURSES_IMPEXP NCursesMenuException : public NCursesException
{
public:
const NCursesMenu* m;
NCursesMenuException (const char *msg, int err) :
NCursesException (msg, err),
m ((NCursesMenu *)0)
{};
NCursesMenuException (const NCursesMenu* menu,
const char *msg,
int err) :
NCursesException (msg, err),
m (menu)
{};
NCursesMenuException (int err) :
NCursesException ("menu library error", err),
m ((NCursesMenu *)0)
{};
NCursesMenuException (const NCursesMenu* menu,
int err) :
NCursesException ("menu library error", err),
m (menu)
{};
virtual const char *classname() const {
return "NCursesMenu";
}
};
class NCURSES_IMPEXP NCursesFormException : public NCursesException
{
public:
const NCursesForm* f;
NCursesFormException (const char *msg, int err) :
NCursesException (msg, err),
f ((NCursesForm*)0)
{};
NCursesFormException (const NCursesForm* form,
const char *msg,
int err) :
NCursesException (msg, err),
f (form)
{};
NCursesFormException (int err) :
NCursesException ("form library error", err),
f ((NCursesForm*)0)
{};
NCursesFormException (const NCursesForm* form,
int err) :
NCursesException ("form library error", err),
f (form)
{};
virtual const char *classname() const {
return "NCursesForm";
}
};
#if !(defined(__GNUG__)||defined(__SUNPRO_CC))
# include <iostream.h>
extern "C" void exit(int);
#endif
inline void THROW(const NCursesException *e) {
#if defined(__GNUG__)
# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
(*lib_error_handler)(e?e->classname():"",e?e->message:"");
#else
throw *e;
#endif
#elif defined(__SUNPRO_CC)
# if !defined(__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT < 5)
genericerror(1, ((e != 0) ? (char *)(e->message) : ""));
#else
throw *e;
#endif
#else
if (e)
cerr << e->message << endl;
exit(0);
#endif
}
#define THROWS(s)
#endif // NCURSES_ETIP_H_incl

View File

@ -1,39 +0,0 @@
# C++ headers
# $Id: headers,v 1.2 1998/02/11 12:13:40 tom Exp $
##############################################################################
# Copyright (c) 1998 Free Software Foundation, Inc. #
# #
# Permission is hereby granted, free of charge, to any person obtaining a #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation #
# the rights to use, copy, modify, merge, publish, distribute, distribute #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the #
# following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
# DEALINGS IN THE SOFTWARE. #
# #
# Except as contained in this notice, the name(s) of the above copyright #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
#
# Author: Thomas E. Dickey <dickey@clark.net> 1997
#
$(srcdir)/cursesapp.h
$(srcdir)/cursesf.h
$(srcdir)/cursesm.h
$(srcdir)/cursesp.h
$(srcdir)/cursesw.h
$(srcdir)/cursslk.h
etip.h

View File

@ -1,49 +0,0 @@
// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
* Copyright (c) 1998,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
****************************************************************************/
// $Id: internal.h,v 1.8 2001/03/24 21:36:17 tom Exp $
#ifndef NCURSES_CPLUS_INTERNAL_H
#define NCURSES_CPLUS_INTERNAL_H 1
#include <ncurses_cfg.h>
#if USE_RCS_IDS
#define MODULE_ID(id) static const char Ident[] = id;
#else
#define MODULE_ID(id) /*nothing*/
#endif
#define CTRL(x) ((x) & 0x1f)
#endif // NCURSES_CPLUS_INTERNAL_H

View File

@ -1,43 +0,0 @@
# Program modules
# $Id: modules,v 1.6 1999/07/31 09:46:54 juergen Exp $
##############################################################################
# Copyright (c) 1998 Free Software Foundation, Inc. #
# #
# Permission is hereby granted, free of charge, to any person obtaining a #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation #
# the rights to use, copy, modify, merge, publish, distribute, distribute #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the #
# following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
# DEALINGS IN THE SOFTWARE. #
# #
# Except as contained in this notice, the name(s) of the above copyright #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
#
# Author: Thomas E. Dickey <dickey@clark.net> 1995,1997
#
@ base
cursesf c++ $(srcdir) $(cursesf_h) $(cursesapp_h)
cursesm c++ $(srcdir) $(cursesm_h) $(cursesapp_h)
cursesp c++ $(srcdir) $(cursesp_h)
cursesw c++ $(srcdir) $(cursesw_h)
cursespad c++ $(srcdir) $(cursesw_h)
cursslk c++ $(srcdir) $(cursslk_h) $(cursesapp_h)
cursesapp c++ $(srcdir) $(cursesapp_h)
cursesmain c++ $(srcdir) $(cursesapp_h)
demo c++ $(srcdir) $(cursesf_h) $(cursesm_h) $(cursesapp_h)

View File

@ -1,35 +0,0 @@
/* Use this with indent 2.0 (2.1 is not acceptable, since it has more bugs) */
/* indent 4 columns */
-i4
/* tab stops every 8 columns */
-ts8
/* cuddle 'else' */
-ce
/* force blank lines after procedure body */
-bap
/* do not force newline after comma in declaration */
-nbc
/* do not force blank line after declarations */
-nbad
/* format braces inline */
-br
/* do not line up parentheses */
-lp
/* put the type of a procedure on the line before its name */
-psl
/* do not insert a space between procedure name and '(' */
-npcs
/* leave preprocessor space */
-lps
/* swallow optional blank lines */
-sob
/* continuation indent of 0 spaces */
-ci0
/* force space before semicolon on same line */
-ss
/* for vile */
-T size_t
-T LINE
-T BUFFER
-T WINDOW

View File

@ -1,83 +0,0 @@
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
****************************************************************************/
/*
** lib_insstr.c
**
** The routine winsnstr().
**
*/
#include <curses.priv.h>
#include <ctype.h>
MODULE_ID("$Id: lib_insstr.c,v 1.19 2001/06/09 23:43:02 skimo Exp $")
NCURSES_EXPORT(int)
winsnstr(WINDOW *win, const char *s, int n)
{
int code = ERR;
NCURSES_SIZE_T oy;
NCURSES_SIZE_T ox;
const unsigned char *str = (const unsigned char *) s;
const unsigned char *cp;
T((T_CALLED("winsnstr(%p,%s,%d)"), win, _nc_visbuf(s), n));
if (win && str) {
oy = win->_cury;
ox = win->_curx;
for (cp = str; *cp && (n <= 0 || (cp - str) < n); cp++) {
if (*cp == '\n' || *cp == '\r' || *cp == '\t' || *cp == '\b') {
NCURSES_CH_T wch;
SetChar2(wch, *cp);
_nc_waddch_nosync(win, wch);
} else if (is7bits(*cp) && iscntrl(*cp)) {
winsch(win, ' ' + (chtype) (*cp));
winsch(win, (chtype) '^');
win->_curx += 2;
} else {
winsch(win, (chtype) (*cp));
win->_curx++;
}
if (win->_curx > win->_maxx)
win->_curx = win->_maxx;
}
win->_curx = ox;
win->_cury = oy;
_nc_synchook(win);
code = OK;
}
returnCode(code);
}

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
@ -29,6 +29,7 @@
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
* and: Thomas E. Dickey 1996 on *
****************************************************************************/
/* $FreeBSD$ */
@ -52,7 +53,7 @@
#include <term_entry.h>
#include <tic.h>
MODULE_ID("$Id: comp_scan.c,v 1.59 2001/09/23 00:56:29 tom Exp $")
MODULE_ID("$Id: comp_scan.c,v 1.78 2006/12/16 19:17:01 tom Exp $")
/*
* Maximum length of string capability we'll accept before raising an error.
@ -86,6 +87,7 @@ _nc_curr_token =
*****************************************************************************/
static bool first_column; /* See 'next_char()' below */
static bool had_newline;
static char separator; /* capability separator */
static int pushtype; /* type of pushback token */
static char *pushname;
@ -95,14 +97,196 @@ NCURSES_EXPORT_VAR(bool)
_nc_disable_period = FALSE; /* used by tic -a option */
#endif
static int last_char(void);
static int next_char(void);
static long stream_pos(void);
static bool end_of_stream(void);
static void push_back(char c);
/*****************************************************************************
*
* Character-stream handling
*
*****************************************************************************/
#define LEXBUFSIZ 1024
static char *bufptr; /* otherwise, the input buffer pointer */
static char *bufstart; /* start of buffer so we can compute offsets */
static FILE *yyin; /* scanner's input file descriptor */
/*
* _nc_reset_input()
*
* Resets the input-reading routines. Used on initialization,
* or after a seek has been done. Exactly one argument must be
* non-null.
*/
NCURSES_EXPORT(void)
_nc_reset_input(FILE *fp, char *buf)
{
pushtype = NO_PUSHBACK;
if (pushname != 0)
pushname[0] = '\0';
yyin = fp;
bufstart = bufptr = buf;
_nc_curr_file_pos = 0L;
if (fp != 0)
_nc_curr_line = 0;
_nc_curr_col = 0;
}
/*
* int last_char()
*
* Returns the final nonblank character on the current input buffer
*/
static int
last_char(void)
{
size_t len = strlen(bufptr);
while (len--) {
if (!isspace(UChar(bufptr[len])))
return bufptr[len];
}
return 0;
}
/*
* int next_char()
*
* Returns the next character in the input stream. Comments and leading
* white space are stripped.
*
* The global state variable 'firstcolumn' is set TRUE if the character
* returned is from the first column of the input line.
*
* The global variable _nc_curr_line is incremented for each new line.
* The global variable _nc_curr_file_pos is set to the file offset of the
* beginning of each line.
*/
static int
next_char(void)
{
static char *result;
static size_t allocated;
int the_char;
if (!yyin) {
if (result != 0) {
FreeAndNull(result);
FreeAndNull(pushname);
allocated = 0;
}
/*
* An string with an embedded null will truncate the input. This is
* intentional (we don't read binary files here).
*/
if (bufptr == 0 || *bufptr == '\0')
return (EOF);
if (*bufptr == '\n') {
_nc_curr_line++;
_nc_curr_col = 0;
} else if (*bufptr == '\t') {
_nc_curr_col = (_nc_curr_col | 7);
}
} else if (!bufptr || !*bufptr) {
/*
* In theory this could be recoded to do its I/O one character at a
* time, saving the buffer space. In practice, this turns out to be
* quite hard to get completely right. Try it and see. If you
* succeed, don't forget to hack push_back() correspondingly.
*/
size_t used;
size_t len;
do {
bufstart = 0;
used = 0;
do {
if (used + (LEXBUFSIZ / 4) >= allocated) {
allocated += (allocated + LEXBUFSIZ);
result = typeRealloc(char, allocated, result);
if (result == 0)
return (EOF);
}
if (used == 0)
_nc_curr_file_pos = ftell(yyin);
if (fgets(result + used, (int) (allocated - used), yyin) != 0) {
bufstart = result;
if (used == 0) {
_nc_curr_line++;
_nc_curr_col = 0;
}
} else {
if (used != 0)
strcat(result, "\n");
}
if ((bufptr = bufstart) != 0) {
used = strlen(bufptr);
while (iswhite(*bufptr)) {
if (*bufptr == '\t') {
_nc_curr_col = (_nc_curr_col | 7) + 1;
} else {
_nc_curr_col++;
}
bufptr++;
}
/*
* Treat a trailing <cr><lf> the same as a <newline> so we
* can read files on OS/2, etc.
*/
if ((len = strlen(bufptr)) > 1) {
if (bufptr[len - 1] == '\n'
&& bufptr[len - 2] == '\r') {
len--;
bufptr[len - 1] = '\n';
bufptr[len] = '\0';
}
}
} else {
return (EOF);
}
} while (bufptr[len - 1] != '\n'); /* complete a line */
} while (result[0] == '#'); /* ignore comments */
} else if (*bufptr == '\t') {
_nc_curr_col = (_nc_curr_col | 7);
}
first_column = (bufptr == bufstart);
if (first_column)
had_newline = FALSE;
_nc_curr_col++;
the_char = *bufptr++;
return UChar(the_char);
}
static void
push_back(char c)
/* push a character back onto the input stream */
{
if (bufptr == bufstart)
_nc_syserr_abort("Can't backspace off beginning of line");
*--bufptr = c;
_nc_curr_col--;
}
static long
stream_pos(void)
/* return our current character position in the input stream */
{
return (yyin ? ftell(yyin) : (bufptr ? bufptr - bufstart : 0));
}
static bool
end_of_stream(void)
/* are we at end of input? */
{
return ((yyin ? feof(yyin) : (bufptr && *bufptr == '\0'))
? TRUE : FALSE);
}
/* Assume we may be looking at a termcap-style continuation */
static inline int
static NCURSES_INLINE int
eat_escaped_newline(int ch)
{
if (ch == '\\')
@ -150,8 +334,11 @@ _nc_get_token(bool silent)
static const char terminfo_punct[] = "@%&*!#";
static char *buffer;
char *after_list;
char *after_name;
char *numchk;
char *ptr;
char *s;
char numbuf[80];
int ch;
int dot_flag = FALSE;
@ -159,6 +346,10 @@ _nc_get_token(bool silent)
long number;
long token_start;
unsigned found;
#ifdef TRACE
int old_line;
int old_col;
#endif
if (pushtype != NO_PUSHBACK) {
int retval = pushtype;
@ -175,16 +366,31 @@ _nc_get_token(bool silent)
return (retval);
}
if (end_of_stream())
if (end_of_stream()) {
yyin = 0;
next_char(); /* frees its allocated memory */
if (buffer != 0) {
if (_nc_curr_token.tk_name == buffer)
_nc_curr_token.tk_name = 0;
FreeAndNull(buffer);
}
return (EOF);
}
start_token:
token_start = stream_pos();
while ((ch = next_char()) == '\n' || iswhite(ch))
while ((ch = next_char()) == '\n' || iswhite(ch)) {
if (ch == '\n')
had_newline = TRUE;
continue;
}
ch = eat_escaped_newline(ch);
#ifdef TRACE
old_line = _nc_curr_line;
old_col = _nc_curr_col;
#endif
if (ch == EOF)
type = EOF;
else {
@ -210,36 +416,44 @@ _nc_get_token(bool silent)
}
/* have to make some punctuation chars legal for terminfo */
if (!isalnum(ch)
if (!isalnum(UChar(ch))
#if NCURSES_EXT_FUNCS
&& !(ch == '.' && _nc_disable_period)
#endif
&& !strchr(terminfo_punct, (char) ch)) {
if (!silent)
_nc_warning("Illegal character (expected alphanumeric or %s) - %s",
_nc_warning("Illegal character (expected alphanumeric or %s) - '%s'",
terminfo_punct, unctrl((chtype) ch));
_nc_panic_mode(separator);
goto start_token;
}
if (buffer == 0)
buffer = _nc_doalloc(buffer, MAX_ENTRY_SIZE);
buffer = typeMalloc(char, MAX_ENTRY_SIZE);
#ifdef TRACE
old_line = _nc_curr_line;
old_col = _nc_curr_col;
#endif
ptr = buffer;
*(ptr++) = ch;
if (first_column) {
char *desc;
_nc_comment_start = token_start;
_nc_comment_end = _nc_curr_file_pos;
_nc_start_line = _nc_curr_line;
_nc_syntax = ERR;
after_name = 0;
after_list = 0;
while ((ch = next_char()) != '\n') {
if (ch == EOF)
_nc_err_abort("premature EOF");
else if (ch == ':' && last_char() != ',') {
if (ch == EOF) {
_nc_err_abort(MSG_NO_INPUTS);
} else if (ch == '|') {
after_list = ptr;
if (after_name == 0)
after_name = ptr;
} else if (ch == ':' && last_char() != ',') {
_nc_syntax = SYN_TERMCAP;
separator = ':';
break;
@ -247,14 +461,18 @@ _nc_get_token(bool silent)
_nc_syntax = SYN_TERMINFO;
separator = ',';
/*
* Fall-through here is not an accident. The idea is that
* if we see a comma, we figure this is terminfo unless we
* subsequently run into a colon -- but we don't stop
* looking for that colon until hitting a newline. This
* If we did not see a '|', then we found a name with no
* aliases or description.
*/
if (after_name == 0)
break;
/*
* If we see a comma, we assume this is terminfo unless we
* subsequently run into a colon. But we don't stop
* looking for a colon until hitting a newline. This
* allows commas to be embedded in description fields of
* either syntax.
*/
/* FALLTHRU */
} else
ch = eat_escaped_newline(ch);
@ -279,60 +497,64 @@ _nc_get_token(bool silent)
/*
* This is the soonest we have the terminal name fetched. Set up
* for following warning messages.
* for following warning messages. If there's no '|', then there
* is no description.
*/
ptr = strchr(buffer, '|');
if (ptr == (char *) NULL)
ptr = buffer + strlen(buffer);
ch = *ptr;
*ptr = '\0';
_nc_set_type(buffer);
*ptr = ch;
if (after_name != 0) {
ch = *after_name;
*after_name = '\0';
_nc_set_type(buffer);
*after_name = ch;
}
/*
* Compute the boundary between the aliases and the description
* field for syntax-checking purposes.
*/
desc = strrchr(buffer, '|');
if (!silent && desc) {
if (*desc == '\0')
_nc_warning("empty longname field");
if (after_list != 0) {
if (!silent) {
if (*after_list == '\0')
_nc_warning("empty longname field");
#ifndef FREEBSD_NATIVE
else if (strchr(desc, ' ') == (char *) NULL)
_nc_warning("older tic versions may treat the description field as an alias");
else if (strchr(after_list, ' ') == 0)
_nc_warning("older tic versions may treat the description field as an alias");
#endif
}
} else {
after_list = buffer + strlen(buffer);
DEBUG(1, ("missing description"));
}
if (!desc)
desc = buffer + strlen(buffer);
/*
* Whitespace in a name field other than the long name can confuse
* rdist and some termcap tools. Slashes are a no-no. Other
* special characters can be dangerous due to shell expansion.
*/
for (ptr = buffer; ptr < desc; ptr++) {
if (isspace(UChar(*ptr))) {
for (s = buffer; s < after_list; ++s) {
if (isspace(UChar(*s))) {
if (!silent)
_nc_warning("whitespace in name or alias field");
break;
} else if (*ptr == '/') {
} else if (*s == '/') {
if (!silent)
_nc_warning("slashes aren't allowed in names or aliases");
break;
} else if (strchr("$[]!*?", *ptr)) {
} else if (strchr("$[]!*?", *s)) {
if (!silent)
_nc_warning("dubious character `%c' in name or alias field", *ptr);
_nc_warning("dubious character `%c' in name or alias field", *s);
break;
}
}
ptr = buffer;
_nc_curr_token.tk_name = buffer;
type = NAMES;
} else {
if (had_newline && _nc_syntax == SYN_TERMCAP) {
_nc_warning("Missing backslash before newline");
had_newline = FALSE;
}
while ((ch = next_char()) != EOF) {
if (!isalnum(ch)) {
if (!isalnum(UChar(ch))) {
if (_nc_syntax == SYN_TERMINFO) {
if (ch != '_')
break;
@ -397,7 +619,7 @@ _nc_get_token(bool silent)
/* just to get rid of the compiler warning */
type = UNDEF;
if (!silent)
_nc_warning("Illegal character - %s", unctrl((chtype) ch));
_nc_warning("Illegal character - '%s'", unctrl((chtype) ch));
}
} /* end else (first_column == FALSE) */
} /* end else (ch != EOF) */
@ -408,6 +630,11 @@ _nc_get_token(bool silent)
if (dot_flag == TRUE)
DEBUG(8, ("Commented out "));
if (_nc_tracing >= DEBUG_LEVEL(8)) {
_tracef("parsed %d.%d to %d.%d",
old_line, old_col,
_nc_curr_line, _nc_curr_col);
}
if (_nc_tracing >= DEBUG_LEVEL(7)) {
switch (type) {
case BOOLEAN:
@ -452,8 +679,9 @@ _nc_get_token(bool silent)
type = _nc_get_token(silent);
DEBUG(3, ("token: `%s', class %d",
_nc_curr_token.tk_name != 0 ? _nc_curr_token.tk_name :
"<null>",
((_nc_curr_token.tk_name != 0)
? _nc_curr_token.tk_name
: "<null>"),
type));
return (type);
@ -478,7 +706,7 @@ _nc_get_token(bool silent)
*
*/
NCURSES_EXPORT(char)
NCURSES_EXPORT(int)
_nc_trans_string(char *ptr, char *last)
{
int count = 0;
@ -496,10 +724,10 @@ _nc_trans_string(char *ptr, char *last)
if (ch == '^' && last_ch != '%') {
ch = c = next_char();
if (c == EOF)
_nc_err_abort("Premature EOF");
_nc_err_abort(MSG_NO_INPUTS);
if (!(is7bits(ch) && isprint(ch))) {
_nc_warning("Illegal ^ character - %s", unctrl(ch));
_nc_warning("Illegal ^ character - '%s'", unctrl(ch));
}
if (ch == '?') {
*(ptr++) = '\177';
@ -513,14 +741,14 @@ _nc_trans_string(char *ptr, char *last)
} else if (ch == '\\') {
ch = c = next_char();
if (c == EOF)
_nc_err_abort("Premature EOF");
_nc_err_abort(MSG_NO_INPUTS);
if (ch >= '0' && ch <= '7') {
number = ch - '0';
for (i = 0; i < 2; i++) {
ch = c = next_char();
if (c == EOF)
_nc_err_abort("Premature EOF");
_nc_err_abort(MSG_NO_INPUTS);
if (c < '0' || c > '7') {
if (isdigit(c)) {
@ -594,21 +822,31 @@ _nc_trans_string(char *ptr, char *last)
continue;
default:
_nc_warning("Illegal character %s in \\ sequence",
_nc_warning("Illegal character '%s' in \\ sequence",
unctrl(ch));
/* FALLTHRU */
case '|':
*(ptr++) = (char) ch;
} /* endswitch (ch) */
} /* endelse (ch < '0' || ch > '7') */
}
/* end else if (ch == '\\') */
else if (ch == '\n' && (_nc_syntax == SYN_TERMINFO)) {
/* newlines embedded in a terminfo string are ignored */
/*
* Newlines embedded in a terminfo string are ignored, provided
* that the next line begins with whitespace.
*/
ignored = TRUE;
} else {
*(ptr++) = (char) ch;
}
if (!ignored) {
if (_nc_curr_col <= 1) {
push_back(ch);
ch = '\n';
break;
}
last_ch = ch;
count++;
}
@ -643,11 +881,14 @@ _nc_push_token(int tokclass)
*/
pushtype = tokclass;
if (pushname == 0)
pushname = _nc_doalloc(pushname, MAX_NAME_SIZE + 1);
pushname = typeMalloc(char, MAX_NAME_SIZE + 1);
_nc_get_type(pushname);
DEBUG(3, ("pushing token: `%s', class %d",
_nc_curr_token.tk_name, pushtype));
((_nc_curr_token.tk_name != 0)
? _nc_curr_token.tk_name
: "<null>"),
pushtype));
}
/*
@ -667,169 +908,12 @@ _nc_panic_mode(char ch)
}
}
/*****************************************************************************
*
* Character-stream handling
*
*****************************************************************************/
#define LEXBUFSIZ 1024
static char *bufptr; /* otherwise, the input buffer pointer */
static char *bufstart; /* start of buffer so we can compute offsets */
static FILE *yyin; /* scanner's input file descriptor */
/*
* _nc_reset_input()
*
* Resets the input-reading routines. Used on initialization,
* or after a seek has been done. Exactly one argument must be
* non-null.
*/
#if NO_LEAKS
NCURSES_EXPORT(void)
_nc_reset_input(FILE * fp, char *buf)
_nc_comp_scan_leaks(void)
{
pushtype = NO_PUSHBACK;
if (pushname != 0)
pushname[0] = '\0';
yyin = fp;
bufstart = bufptr = buf;
_nc_curr_file_pos = 0L;
if (fp != 0)
_nc_curr_line = 0;
_nc_curr_col = 0;
}
/*
* int last_char()
*
* Returns the final nonblank character on the current input buffer
*/
static int
last_char(void)
{
size_t len = strlen(bufptr);
while (len--) {
if (!isspace(UChar(bufptr[len])))
return bufptr[len];
if (pushname != 0) {
FreeAndNull(pushname);
}
return 0;
}
/*
* int next_char()
*
* Returns the next character in the input stream. Comments and leading
* white space are stripped.
*
* The global state variable 'firstcolumn' is set TRUE if the character
* returned is from the first column of the input line.
*
* The global variable _nc_curr_line is incremented for each new line.
* The global variable _nc_curr_file_pos is set to the file offset of the
* beginning of each line.
*/
static int
next_char(void)
{
if (!yyin) {
/*
* An string with an embedded null will truncate the input. This is
* intentional (we don't read binary files here).
*/
if (*bufptr == '\0')
return (EOF);
if (*bufptr == '\n') {
_nc_curr_line++;
_nc_curr_col = 0;
}
} else if (!bufptr || !*bufptr) {
/*
* In theory this could be recoded to do its I/O one character at a
* time, saving the buffer space. In practice, this turns out to be
* quite hard to get completely right. Try it and see. If you
* succeed, don't forget to hack push_back() correspondingly.
*/
static char *result;
static size_t allocated;
size_t used;
size_t len;
do {
bufstart = 0;
used = 0;
do {
if (used + (LEXBUFSIZ / 4) >= allocated) {
allocated += (allocated + LEXBUFSIZ);
result = _nc_doalloc(result, allocated);
if (result == 0)
return (EOF);
}
if (used == 0)
_nc_curr_file_pos = ftell(yyin);
if (fgets(result + used, allocated - used, yyin) != NULL) {
bufstart = result;
if (used == 0) {
_nc_curr_line++;
_nc_curr_col = 0;
}
} else {
if (used != 0)
strcat(result, "\n");
}
if ((bufptr = bufstart) != 0) {
used = strlen(bufptr);
while (iswhite(*bufptr))
bufptr++;
/*
* Treat a trailing <cr><lf> the same as a <newline> so we
* can read files on OS/2, etc.
*/
if ((len = strlen(bufptr)) > 1) {
if (bufptr[len - 1] == '\n'
&& bufptr[len - 2] == '\r') {
len--;
bufptr[len - 1] = '\n';
bufptr[len] = '\0';
}
}
} else {
return (EOF);
}
} while (bufptr[len - 1] != '\n'); /* complete a line */
} while (result[0] == '#'); /* ignore comments */
}
first_column = (bufptr == bufstart);
_nc_curr_col++;
return (*bufptr++);
}
static void
push_back(char c)
/* push a character back onto the input stream */
{
if (bufptr == bufstart)
_nc_syserr_abort("Can't backspace off beginning of line");
*--bufptr = c;
}
static long
stream_pos(void)
/* return our current character position in the input stream */
{
return (yyin ? ftell(yyin) : (bufptr ? bufptr - bufstart : 0));
}
static bool
end_of_stream(void)
/* are we at end of input? */
{
return ((yyin ? feof(yyin) : (bufptr && *bufptr == '\0'))
? TRUE : FALSE);
}
#endif

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. *
* Copyright (c) 1998-2001,2002 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
@ -29,6 +29,7 @@
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
* and: Thomas E. Dickey 1998 on *
****************************************************************************/
/* $FreeBSD$ */
@ -50,7 +51,7 @@
#include <curses.priv.h>
#include <term.h> /* cur_term */
MODULE_ID("$Id: lib_raw.c,v 1.12 2001/08/04 17:18:38 tom Exp $")
MODULE_ID("$Id: lib_raw.c,v 1.13 2002/07/06 22:00:45 tom Exp $")
#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
#define _POSIX_SOURCE
@ -62,6 +63,9 @@ MODULE_ID("$Id: lib_raw.c,v 1.12 2001/08/04 17:18:38 tom Exp $")
#ifdef __EMX__
#include <io.h>
#define _nc_setmode(mode) setmode(SP->_ifd, mode)
#else
#define _nc_setmode(mode) /* nothing */
#endif
#define COOKED_INPUT (IXON|BRKINT|PARMRK)
@ -77,162 +81,218 @@ MODULE_ID("$Id: lib_raw.c,v 1.12 2001/08/04 17:18:38 tom Exp $")
NCURSES_EXPORT(int)
raw(void)
{
int result = ERR;
T((T_CALLED("raw()")));
if (SP != 0 && cur_term != 0) {
TTY buf;
SP->_raw = TRUE;
SP->_cbreak = 1;
#ifdef __EMX__
setmode(SP->_ifd, O_BINARY);
#endif
#ifdef TERMIOS
BEFORE("raw");
cur_term->Nttyb.c_lflag &= ~(ICANON | ISIG | IEXTEN);
cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT);
cur_term->Nttyb.c_cc[VMIN] = 1;
cur_term->Nttyb.c_cc[VTIME] = 0;
AFTER("raw");
_nc_setmode(O_BINARY);
buf = cur_term->Nttyb;
#ifdef TERMIOS
buf.c_lflag &= ~(ICANON | ISIG | IEXTEN);
buf.c_iflag &= ~(COOKED_INPUT);
buf.c_cc[VMIN] = 1;
buf.c_cc[VTIME] = 0;
#else
cur_term->Nttyb.sg_flags |= RAW;
buf.sg_flags |= RAW;
#endif
returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
if ((result = _nc_set_tty_mode(&buf)) == OK) {
SP->_raw = TRUE;
SP->_cbreak = 1;
cur_term->Nttyb = buf;
}
AFTER("raw");
}
returnCode(ERR);
returnCode(result);
}
NCURSES_EXPORT(int)
cbreak(void)
{
int result = ERR;
T((T_CALLED("cbreak()")));
SP->_cbreak = 1;
if (SP != 0 && cur_term != 0) {
TTY buf;
#ifdef __EMX__
setmode(SP->_ifd, O_BINARY);
#endif
BEFORE("cbreak");
_nc_setmode(O_BINARY);
buf = cur_term->Nttyb;
#ifdef TERMIOS
BEFORE("cbreak");
cur_term->Nttyb.c_lflag &= ~ICANON;
cur_term->Nttyb.c_iflag &= ~ICRNL;
cur_term->Nttyb.c_lflag |= ISIG;
cur_term->Nttyb.c_cc[VMIN] = 1;
cur_term->Nttyb.c_cc[VTIME] = 0;
AFTER("cbreak");
buf.c_lflag &= ~ICANON;
buf.c_iflag &= ~ICRNL;
buf.c_lflag |= ISIG;
buf.c_cc[VMIN] = 1;
buf.c_cc[VTIME] = 0;
#else
cur_term->Nttyb.sg_flags |= CBREAK;
buf.sg_flags |= CBREAK;
#endif
returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
if ((result = _nc_set_tty_mode(&buf)) == OK) {
SP->_cbreak = 1;
cur_term->Nttyb = buf;
}
AFTER("cbreak");
}
returnCode(result);
}
/*
* Note:
* this implementation may be wrong. See the comment under intrflush().
*/
NCURSES_EXPORT(void)
qiflush(void)
{
int result = ERR;
T((T_CALLED("qiflush()")));
/*
* Note: this implementation may be wrong. See the comment under
* intrflush().
*/
if (cur_term != 0) {
TTY buf;
BEFORE("qiflush");
buf = cur_term->Nttyb;
#ifdef TERMIOS
BEFORE("qiflush");
cur_term->Nttyb.c_lflag &= ~(NOFLSH);
AFTER("qiflush");
(void) _nc_set_tty_mode(&cur_term->Nttyb);
buf.c_lflag &= ~(NOFLSH);
result = _nc_set_tty_mode(&buf);
#else
/* FIXME */
#endif
if (result == OK)
cur_term->Nttyb = buf;
AFTER("qiflush");
}
returnVoid;
}
NCURSES_EXPORT(int)
noraw(void)
{
int result = ERR;
T((T_CALLED("noraw()")));
SP->_raw = FALSE;
SP->_cbreak = 0;
if (SP != 0 && cur_term != 0) {
TTY buf;
#ifdef __EMX__
setmode(SP->_ifd, O_TEXT);
#endif
BEFORE("noraw");
_nc_setmode(O_TEXT);
buf = cur_term->Nttyb;
#ifdef TERMIOS
BEFORE("noraw");
cur_term->Nttyb.c_lflag |= ISIG | ICANON |
(cur_term->Ottyb.c_lflag & IEXTEN);
cur_term->Nttyb.c_iflag |= COOKED_INPUT;
AFTER("noraw");
buf.c_lflag |= ISIG | ICANON |
(cur_term->Ottyb.c_lflag & IEXTEN);
buf.c_iflag |= COOKED_INPUT;
#else
cur_term->Nttyb.sg_flags &= ~(RAW | CBREAK);
buf.sg_flags &= ~(RAW | CBREAK);
#endif
returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
if ((result = _nc_set_tty_mode(&buf)) == OK) {
SP->_raw = FALSE;
SP->_cbreak = 0;
cur_term->Nttyb = buf;
}
AFTER("noraw");
}
returnCode(result);
}
NCURSES_EXPORT(int)
nocbreak(void)
{
int result = ERR;
T((T_CALLED("nocbreak()")));
SP->_cbreak = 0;
if (SP != 0 && cur_term != 0) {
TTY buf;
#ifdef __EMX__
setmode(SP->_ifd, O_TEXT);
#endif
BEFORE("nocbreak");
_nc_setmode(O_TEXT);
buf = cur_term->Nttyb;
#ifdef TERMIOS
BEFORE("nocbreak");
cur_term->Nttyb.c_lflag |= ICANON;
cur_term->Nttyb.c_iflag |= ICRNL;
AFTER("nocbreak");
buf.c_lflag |= ICANON;
buf.c_iflag |= ICRNL;
#else
cur_term->Nttyb.sg_flags &= ~CBREAK;
buf.sg_flags &= ~CBREAK;
#endif
returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
if ((result = _nc_set_tty_mode(&buf)) == OK) {
SP->_cbreak = 0;
cur_term->Nttyb = buf;
}
AFTER("nocbreak");
}
returnCode(result);
}
/*
* Note:
* this implementation may be wrong. See the comment under intrflush().
*/
NCURSES_EXPORT(void)
noqiflush(void)
{
int result = ERR;
T((T_CALLED("noqiflush()")));
/*
* Note: this implementation may be wrong. See the comment under
* intrflush().
*/
if (cur_term != 0) {
TTY buf;
BEFORE("noqiflush");
buf = cur_term->Nttyb;
#ifdef TERMIOS
BEFORE("noqiflush");
cur_term->Nttyb.c_lflag |= NOFLSH;
AFTER("noqiflush");
(void) _nc_set_tty_mode(&cur_term->Nttyb);
buf.c_lflag |= NOFLSH;
result = _nc_set_tty_mode(&buf);
#else
/* FIXME */
#endif
if (result == OK) {
cur_term->Nttyb = buf;
}
AFTER("noqiflush");
}
returnVoid;
}
/*
* This call does the same thing as the qiflush()/noqiflush() pair. We know
* for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the other hand,
* the match (in the SVr4 man pages) between the language describing NOFLSH in
* termio(7) and the language describing qiflush()/noqiflush() in
* curs_inopts(3x) is too exact to be coincidence.
*/
NCURSES_EXPORT(int)
intrflush(WINDOW *win GCC_UNUSED, bool flag)
{
int result = ERR;
T((T_CALLED("intrflush(%d)"), flag));
/*
* This call does the same thing as the qiflush()/noqiflush() pair. We
* know for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the
* other hand, the match (in the SVr4 man pages) between the language
* describing NOFLSH in termio(7) and the language describing
* qiflush()/noqiflush() in curs_inopts(3x) is too exact to be coincidence.
*/
if (cur_term != 0) {
TTY buf;
BEFORE("intrflush");
buf = cur_term->Nttyb;
#ifdef TERMIOS
BEFORE("intrflush");
if (flag)
cur_term->Nttyb.c_lflag &= ~(NOFLSH);
else
cur_term->Nttyb.c_lflag |= (NOFLSH);
AFTER("intrflush");
returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
if (flag)
buf.c_lflag &= ~(NOFLSH);
else
buf.c_lflag |= (NOFLSH);
result = _nc_set_tty_mode(&buf);
#else
returnCode(ERR);
/* FIXME */
#endif
if (result == OK) {
cur_term->Nttyb = buf;
}
AFTER("intrflush");
}
returnCode(result);
}

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2001,2002 Free Software Foundation, Inc. *
* Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
@ -29,9 +29,11 @@
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
* and: Thomas E. Dickey 1996-on *
* *
* some of the code in here was contributed by: *
* Magnus Bengtsson, d6mbeng@dtek.chalmers.se (Nov'93) *
* (but it has changed a lot) *
****************************************************************************/
/* $FreeBSD$ */
@ -45,72 +47,30 @@
#include <term_entry.h>
MODULE_ID("$Id: lib_termcap.c,v 1.43 2002/05/25 12:24:13 tom Exp $")
#define CSI 233
#define ESC 033 /* ^[ */
#define L_BRACK '['
#define SHIFT_OUT 017 /* ^N */
MODULE_ID("$Id: lib_termcap.c,v 1.58 2006/09/02 19:39:46 Miroslav.Lichvar Exp $")
NCURSES_EXPORT_VAR(char *) UP = 0;
NCURSES_EXPORT_VAR(char *) BC = 0;
#ifdef FREEBSD_NATIVE
#undef GCC_UNUSED
#define GCC_UNUSED
extern char _nc_termcap[]; /* buffer to copy out */
#endif
static char *fix_me = 0;
typedef struct {
long sequence;
char *fix_sgr0; /* this holds the filtered sgr0 string */
char *last_bufp; /* help with fix_sgr0 leak */
TERMINAL *last_term;
} CACHE;
static char *
set_attribute_9(int flag)
{
const char *result;
#define MAX_CACHE 4
static CACHE cache[MAX_CACHE];
static int in_cache = 0;
if ((result = tparm(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag)) == 0)
result = "";
return strdup(result);
}
static int
is_csi(char *s)
{
if (UChar(s[0]) == CSI)
return 1;
else if (s[0] == ESC && s[1] == L_BRACK)
return 2;
return 0;
}
static char *
skip_zero(char *s)
{
if (s[0] == '0') {
if (s[1] == ';')
s += 2;
else if (isalpha(UChar(s[1])))
s += 1;
}
return s;
}
static bool
similar_sgr(char *a, char *b)
{
int csi_a = is_csi(a);
int csi_b = is_csi(b);
if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
a += csi_a;
b += csi_b;
if (*a != *b) {
a = skip_zero(a);
b = skip_zero(b);
}
}
return strcmp(a, b) == 0;
}
#define FIX_SGR0 cache[in_cache].fix_sgr0
#define LAST_TRM cache[in_cache].last_term
#define LAST_BUF cache[in_cache].last_bufp
#define LAST_SEQ cache[in_cache].sequence
/***************************************************************************
*
@ -128,18 +88,64 @@ similar_sgr(char *a, char *b)
***************************************************************************/
NCURSES_EXPORT(int)
tgetent(char *bufp GCC_UNUSED, const char *name)
tgetent(char *bufp, const char *name)
{
int errcode;
static long sequence;
int errcode;
int n;
bool found_cache = FALSE;
START_TRACE();
T((T_CALLED("tgetent()")));
setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode);
_nc_setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode, TRUE);
/*
* In general we cannot tell if the fixed sgr0 is still used by the
* caller, but if tgetent() is called with the same buffer, that is
* good enough, since the previous data would be invalidated by the
* current call.
*/
for (n = 0; n < MAX_CACHE; ++n) {
bool same_result = (bufp != 0 && cache[n].last_bufp == bufp);
if (same_result) {
in_cache = n;
if (FIX_SGR0 != 0) {
FreeAndNull(FIX_SGR0);
}
/*
* Also free the terminfo data that we loaded (much bigger leak).
*/
if (LAST_TRM != 0 && LAST_TRM != cur_term) {
TERMINAL *trm = LAST_TRM;
del_curterm(LAST_TRM);
for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache)
if (LAST_TRM == trm)
LAST_TRM = 0;
in_cache = n;
}
found_cache = TRUE;
break;
}
}
if (!found_cache) {
int best = 0;
for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache) {
if (LAST_SEQ < cache[best].sequence) {
best = in_cache;
}
}
in_cache = best;
}
LAST_TRM = cur_term;
LAST_SEQ = ++sequence;
PC = 0;
UP = 0;
BC = 0;
fix_me = 0;
FIX_SGR0 = 0; /* don't free it - application may still use */
if (errcode == 1) {
@ -155,67 +161,15 @@ tgetent(char *bufp GCC_UNUSED, const char *name)
if (backspace_if_not_bs != NULL)
BC = backspace_if_not_bs;
/*
* While 'sgr0' is the "same" as termcap 'me', there is a compatibility
* issue. The sgr/sgr0 capabilities include setting/clearing alternate
* character set mode. A termcap application cannot use sgr, so sgr0
* strings that reset alternate character set mode will be
* misinterpreted. Here, we remove those from the more common
* ISO/ANSI/VT100 entries, which have sgr0 agreeing with sgr.
*/
if (exit_attribute_mode != 0
&& set_attributes != 0) {
char *on = set_attribute_9(1);
char *off = set_attribute_9(0);
char *tmp;
size_t i, j, k;
if (similar_sgr(off, exit_attribute_mode)
&& !similar_sgr(off, on)) {
TR(TRACE_DATABASE, ("adjusting sgr0 : %s", _nc_visbuf(off)));
FreeIfNeeded(fix_me);
fix_me = off;
for (i = 0; off[i] != '\0'; ++i) {
if (on[i] != off[i]) {
j = strlen(off);
k = strlen(on);
while (j != 0
&& k != 0
&& off[j - 1] == on[k - 1]) {
--j, --k;
}
while (off[j] != '\0') {
off[i++] = off[j++];
}
off[i] = '\0';
break;
}
}
/* SGR 10 would reset to normal font */
if ((i = is_csi(off)) != 0
&& off[strlen(off) - 1] == 'm') {
tmp = skip_zero(off + i);
if (tmp[0] == '1'
&& skip_zero(tmp + 1) != tmp + 1) {
i = tmp - off;
if (off[i - 1] == ';')
i--;
j = skip_zero(tmp + 1) - off;
while (off[j] != '\0') {
off[i++] = off[j++];
}
off[i] = '\0';
}
}
TR(TRACE_DATABASE, ("...adjusted me : %s", _nc_visbuf(fix_me)));
if (!strcmp(fix_me, exit_attribute_mode)) {
TR(TRACE_DATABASE, ("...same result, discard"));
free(fix_me);
fix_me = 0;
if ((FIX_SGR0 = _nc_trim_sgr0(&(cur_term->type))) != 0) {
if (!strcmp(FIX_SGR0, exit_attribute_mode)) {
if (FIX_SGR0 != exit_attribute_mode) {
free(FIX_SGR0);
}
FIX_SGR0 = 0;
}
free(on);
}
LAST_BUF = bufp;
(void) baudrate(); /* sets ospeed as a side-effect */
@ -251,7 +205,7 @@ tgetent(char *bufp GCC_UNUSED, const char *name)
NCURSES_EXPORT(int)
tgetflag(NCURSES_CONST char *id)
{
int i;
unsigned i;
T((T_CALLED("tgetflag(%s)"), id));
if (cur_term != 0) {
@ -279,7 +233,7 @@ tgetflag(NCURSES_CONST char *id)
NCURSES_EXPORT(int)
tgetnum(NCURSES_CONST char *id)
{
int i;
unsigned i;
T((T_CALLED("tgetnum(%s)"), id));
if (cur_term != 0) {
@ -308,7 +262,7 @@ tgetnum(NCURSES_CONST char *id)
NCURSES_EXPORT(char *)
tgetstr(NCURSES_CONST char *id, char **area)
{
int i;
unsigned i;
char *result = NULL;
T((T_CALLED("tgetstr(%s,%p)"), id, area));
@ -322,13 +276,14 @@ tgetstr(NCURSES_CONST char *id, char **area)
/* setupterm forces canceled strings to null */
if (VALID_STRING(result)) {
if (result == exit_attribute_mode
&& fix_me != 0) {
result = fix_me;
&& FIX_SGR0 != 0) {
result = FIX_SGR0;
TR(TRACE_DATABASE, ("altered to : %s", _nc_visbuf(result)));
}
if (area != 0
&& *area != 0) {
(void) strcpy(*area, result);
result = *area;
*area += strlen(*area) + 1;
}
}
@ -338,3 +293,14 @@ tgetstr(NCURSES_CONST char *id, char **area)
}
returnPtr(result);
}
#if NO_LEAKS
NCURSES_EXPORT(void)
_nc_tgetent_leaks(void)
{
for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache) {
FreeIfNeeded(FIX_SGR0);
del_curterm(LAST_TRM);
}
}
#endif

View File

@ -1,84 +0,0 @@
/****************************************************************************
* Copyright (c) 2002 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Thomas Dickey 2002 *
****************************************************************************/
/*
** lib_ins_nwstr.c
**
** The routine wins_nwstr().
**
*/
#include <curses.priv.h>
#include <ctype.h>
MODULE_ID("$Id: lib_ins_nwstr.c,v 1.2 2002/03/10 22:43:12 tom Exp $")
NCURSES_EXPORT(int)
wins_nwstr(WINDOW *win, const wchar_t * wstr, int n)
{
int code = ERR;
NCURSES_SIZE_T oy;
NCURSES_SIZE_T ox;
const wchar_t *cp;
T((T_CALLED("wins_nwstr(%p,%s,%d)"), win, _nc_viswbuf(wstr), n));
if (win != 0
&& wstr != 0
&& wcwidth(*wstr) > 0) {
code = OK;
if (n < 1)
n = wcslen(wstr);
oy = win->_cury;
ox = win->_curx;
for (cp = wstr; *cp && ((cp - wstr) < n); cp++) {
NCURSES_CH_T wch;
SetChar2(wch, *cp);
if (*cp == '\n' || *cp == '\r' || *cp == '\t' || *cp == '\b') {
_nc_waddch_nosync(win, wch);
} else if (is7bits(*cp) && iscntrl(*cp)) {
winsch(win, ' ' + (chtype) (*cp));
winsch(win, (chtype) '^');
win->_curx += 2;
} else if (wins_wch(win, &wch) == ERR
|| win->_curx > win->_maxx) {
break;
}
}
win->_curx = ox;
win->_cury = oy;
_nc_synchook(win);
code = OK;
}
returnCode(code);
}

View File

@ -1,221 +0,0 @@
# $Id: Makefile.in,v 1.63 2002/02/03 00:54:10 china Exp $
##############################################################################
# Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. #
# #
# Permission is hereby granted, free of charge, to any person obtaining a #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation #
# the rights to use, copy, modify, merge, publish, distribute, distribute #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the #
# following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
# DEALINGS IN THE SOFTWARE. #
# #
# Except as contained in this notice, the name(s) of the above copyright #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
#
# Author: Thomas E. Dickey <dickey@clark.net> 1996,1997,1998
#
# Makefile for ncurses tests.
# turn off _all_ suffix rules; we'll generate our own
.SUFFIXES:
SHELL = /bin/sh
x = @PROG_EXT@
MODEL = ../@DFT_OBJ_SUBDIR@
srcdir = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
libdir = @libdir@
includedir = @includedir@
LIBTOOL = @LIBTOOL@
CC = @CC@
CPP = @CPP@
CFLAGS = @CFLAGS@
CPPFLAGS = -I../test -I$(srcdir) @CPPFLAGS@ -DHAVE_CONFIG_H
CCFLAGS = $(CPPFLAGS) $(CFLAGS)
CFLAGS_LIBTOOL = $(CCFLAGS)
CFLAGS_NORMAL = $(CCFLAGS)
CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
CFLAGS_PROFILE = $(CCFLAGS) -pg
CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@
CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
REL_VERSION = @cf_cv_rel_version@
ABI_VERSION = @cf_cv_abi_version@
LOCAL_LIBS = @TEST_DEPS@
MATH_LIB = @MATH_LIB@
LD = @LD@
LINK = @LINK_TESTS@ $(LIBTOOL) $(CC) $(CFLAGS)
LDFLAGS = @LD_MODEL@ @TEST_ARGS@ @LIBS@ @EXTRA_LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@
LDFLAGS_LIBTOOL = $(LDFLAGS)
LDFLAGS_NORMAL = $(LDFLAGS)
LDFLAGS_DEBUG = $(LDFLAGS) @CC_G_OPT@
LDFLAGS_PROFILE = $(LDFLAGS) -pg
LDFLAGS_SHARED = $(LDFLAGS) @LD_SHARED_OPTS@
LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@)
LINT = @LINT@
LINT_OPTS = @LINT_OPTS@
LINT_LIBS = -lform -lmenu -lpanel -lncurses @LIBS@
TESTS = \
blue$x \
bs$x \
cardfile$x \
ditto$x \
dots$x \
filter$x \
firework$x \
firstlast$x \
gdc$x \
hanoi$x \
hashtest$x \
keynames$x \
knight$x \
lrtest$x \
ncurses$x \
newdemo$x \
rain$x \
railroad$x \
tclock$x \
testaddch$x \
testcurs$x \
testscanw$x \
view$x \
worm$x \
xmas$x
all: $(TESTS)
sources:
blue$x: $(MODEL)/blue.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/blue.o $(LDFLAGS_DEFAULT)
bs$x: $(MODEL)/bs.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/bs.o $(LDFLAGS_DEFAULT)
cardfile$x: $(MODEL)/cardfile.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/cardfile.o $(LDFLAGS_DEFAULT)
ditto$x: $(MODEL)/ditto.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/ditto.o $(LDFLAGS_DEFAULT)
dots$x: $(MODEL)/dots.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/dots.o $(LDFLAGS_DEFAULT)
filter$x: $(MODEL)/filter.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/filter.o $(LDFLAGS_DEFAULT)
firework$x: $(MODEL)/firework.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/firework.o $(LDFLAGS_DEFAULT)
firstlast$x: $(MODEL)/firstlast.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/firstlast.o $(LDFLAGS_DEFAULT)
gdc$x: $(MODEL)/gdc.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/gdc.o $(LDFLAGS_DEFAULT)
hanoi$x: $(MODEL)/hanoi.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/hanoi.o $(LDFLAGS_DEFAULT)
hashtest$x: $(MODEL)/hashtest.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/hashtest.o $(LDFLAGS_DEFAULT)
keynames$x: $(MODEL)/keynames.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/keynames.o $(LDFLAGS_DEFAULT)
knight$x: $(MODEL)/knight.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/knight.o $(LDFLAGS_DEFAULT)
lrtest$x: $(MODEL)/lrtest.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/lrtest.o $(LDFLAGS_DEFAULT)
ncurses$x: $(MODEL)/ncurses.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/ncurses.o $(LDFLAGS_DEFAULT)
newdemo$x: $(MODEL)/newdemo.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/newdemo.o $(LDFLAGS_DEFAULT)
rain$x: $(MODEL)/rain.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/rain.o $(LDFLAGS_DEFAULT)
railroad$x: $(MODEL)/railroad.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/railroad.o $(LDFLAGS_DEFAULT)
tclock$x: $(MODEL)/tclock.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/tclock.o $(LDFLAGS_DEFAULT) $(MATH_LIB)
testaddch$x: $(MODEL)/testaddch.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/testaddch.o $(LDFLAGS_DEFAULT)
testcurs$x: $(MODEL)/testcurs.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/testcurs.o $(LDFLAGS_DEFAULT)
testscanw$x: $(MODEL)/testscanw.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/testscanw.o $(LDFLAGS_DEFAULT)
view$x: $(MODEL)/view.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/view.o $(LDFLAGS_DEFAULT)
worm$x: $(MODEL)/worm.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/worm.o $(LDFLAGS_DEFAULT)
xmas$x: $(MODEL)/xmas.o $(LOCAL_LIBS)
@ECHO_LINK@ $(LINK) -o $@ $(MODEL)/xmas.o $(LDFLAGS_DEFAULT)
libs \
install \
install.libs \
install.test:
uninstall:
uninstall.libs:
uninstall.test:
mostlyclean ::
-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
clean :: mostlyclean
-rm -rf *.o screendump *.lis $(TESTS) .libs
distclean :: clean
-rm -f Makefile ncurses_cfg.h config.*
realclean :: distclean
lint:
sh -c 'for N in $(TESTS); do echo LINT:$$N; $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/$$N.c $(LINT_LIBS); done'
# Use this to get a list of test-programs for the standalone configure script.
echo_tests :
@echo "$(TESTS)"
echo_suffix :
@echo "$x"

View File

@ -1,22 +0,0 @@
The programs in this directory are designed to test your newest toy :-)
Check the sources for any further details.
blue - Blue Moon, a nifty solitaire (uses color)
bs.c - the game of Battleships (uses color)
firework.c - multi-colored fireworks (uses color)
gdc.c - Great Digital Clock (uses color)
hanoi.c - the game of hanoi (uses color essentially)
knight.c - the game of Knight's Tour (uses color)
lrtest.c - test of access to the lower-right corner
ncurses.c - multi-test program (uses color)
newdemo.c - another test from PDCurses (uses color)
rain.c - rain drops keep falling on my head...
tclock.c - analog/digital clock
testcurs.c - a test from the PDCurses people (uses color)
worm.c - worms run all over your screen (uses color)
xmas.c - Xmas greeting card
The bs and knight games demonstrate processing of mouse events under xterm.
This directory also contains:
tracemunch - Perl script to crunch trace scripts to make them easier to read

View File

@ -1,429 +0,0 @@
/*****************************************************************************
* *
* B l u e M o o n *
* ================= *
* V2.2 *
* A patience game by T.A.Lister *
* Integral screen support by Eric S. Raymond *
* *
*****************************************************************************/
/*
* Compile this with the command `cc -O blue.c -lcurses -o blue'. For best
* results, use the ncurses(3) library. On non-Intel machines, SVr4 curses is
* just as good.
*
* $Id: blue.c,v 1.23 2002/04/06 23:05:16 tom Exp $
*/
#include <time.h>
#include <test.priv.h>
#define NOCARD (-1)
#define ACE 0
#define KING 12
#define SUIT_LENGTH 13
#define HEARTS 0
#define SPADES 1
#define DIAMONDS 2
#define CLUBS 3
#define NSUITS 4
#define GRID_WIDTH 14 /* 13+1 */
#define GRID_LENGTH 56 /* 4*(13+1) */
#define PACK_SIZE 52
#define BASEROW 1
#define PROMPTROW 11
#define RED_ON_WHITE 1
#define BLACK_ON_WHITE 2
#define BLUE_ON_WHITE 3
static RETSIGTYPE die(int onsig) GCC_NORETURN;
static int deck_size = PACK_SIZE; /* initial deck */
static int deck[PACK_SIZE];
static int grid[GRID_LENGTH]; /* card layout grid */
static int freeptr[4]; /* free card space pointers */
static int deal_number = 0;
static chtype ranks[SUIT_LENGTH][2] =
{
{' ', 'A'},
{' ', '2'},
{' ', '3'},
{' ', '4'},
{' ', '5'},
{' ', '6'},
{' ', '7'},
{' ', '8'},
{' ', '9'},
{'1', '0'},
{' ', 'J'},
{' ', 'Q'},
{' ', 'K'}
};
/* Please note, that this is a bad example.
Color values should not be or'ed in. This
only works, because the characters used here
are plain and have no color attribute themselves. */
#ifdef COLOR_PAIR
#define OR_COLORS(value,pair) ((value) | COLOR_PAIR(pair))
#else
#define OR_COLORS(value,pair) (value)
#endif
#define PC_COLORS(value,pair) (OR_COLORS(value,pair) | A_ALTCHARSET)
static chtype letters[4] =
{
OR_COLORS('h', RED_ON_WHITE), /* hearts */
OR_COLORS('s', BLACK_ON_WHITE), /* spades */
OR_COLORS('d', RED_ON_WHITE), /* diamonds */
OR_COLORS('c', BLACK_ON_WHITE), /* clubs */
};
#if defined(__i386__)
static chtype glyphs[] =
{
PC_COLORS('\003', RED_ON_WHITE), /* hearts */
PC_COLORS('\006', BLACK_ON_WHITE), /* spades */
PC_COLORS('\004', RED_ON_WHITE), /* diamonds */
PC_COLORS('\005', BLACK_ON_WHITE), /* clubs */
};
#endif /* __i386__ */
static chtype *suits = letters; /* this may change to glyphs below */
static RETSIGTYPE
die(int onsig)
{
(void) signal(onsig, SIG_IGN);
endwin();
ExitProgram(EXIT_SUCCESS);
}
static void
init_vars(void)
{
int i;
deck_size = PACK_SIZE;
for (i = 0; i < PACK_SIZE; i++)
deck[i] = i;
for (i = 0; i < 4; i++)
freeptr[i] = i * GRID_WIDTH;
}
static void
shuffle(int size)
{
int i, j, numswaps, swapnum, temp;
numswaps = size * 10; /* an arbitrary figure */
for (swapnum = 0; swapnum < numswaps; swapnum++) {
i = rand() % size;
j = rand() % size;
temp = deck[i];
deck[i] = deck[j];
deck[j] = temp;
}
}
static void
deal_cards(void)
{
int ptr, card = 0, value, csuit, crank, suit, aces[4];
for (suit = HEARTS; suit <= CLUBS; suit++) {
ptr = freeptr[suit];
grid[ptr++] = NOCARD; /* 1st card space is blank */
while ((ptr % GRID_WIDTH) != 0) {
value = deck[card++];
crank = value % SUIT_LENGTH;
csuit = value / SUIT_LENGTH;
if (crank == ACE)
aces[csuit] = ptr;
grid[ptr++] = value;
}
}
if (deal_number == 1) /* shift the aces down to the 1st column */
for (suit = HEARTS; suit <= CLUBS; suit++) {
grid[suit * GRID_WIDTH] = suit * SUIT_LENGTH;
grid[aces[suit]] = NOCARD;
freeptr[suit] = aces[suit];
}
}
static void
printcard(int value)
{
(void) addch(' ');
if (value == NOCARD)
(void) addstr(" ");
else {
addch(ranks[value % SUIT_LENGTH][0] | COLOR_PAIR(BLUE_ON_WHITE));
addch(ranks[value % SUIT_LENGTH][1] | COLOR_PAIR(BLUE_ON_WHITE));
addch(suits[value / SUIT_LENGTH]);
}
(void) addch(' ');
}
static void
display_cards(int deal)
{
int row, card;
clear();
(void) printw(
"Blue Moon 2.1 - by Tim Lister & Eric Raymond - Deal %d.\n",
deal);
for (row = HEARTS; row <= CLUBS; row++) {
move(BASEROW + row + row + 2, 1);
for (card = 0; card < GRID_WIDTH; card++)
printcard(grid[row * GRID_WIDTH + card]);
}
move(PROMPTROW + 2, 0);
refresh();
#define P(x) (void)printw("%s\n", x)
P(" This 52-card solitaire starts with the entire deck shuffled and dealt");
P("out in four rows. The aces are then moved to the left end of the layout,");
P("making 4 initial free spaces. You may move to a space only the card that");
P("matches the left neighbor in suit, and is one greater in rank. Kings are");
P("high, so no cards may be placed to their right (they create dead spaces).");
P(" When no moves can be made, cards still out of sequence are reshuffled");
P("and dealt face up after the ends of the partial sequences, leaving a card");
P("space after each sequence, so that each row looks like a partial sequence");
P("followed by a space, followed by enough cards to make a row of 14. ");
P(" A moment's reflection will show that this game cannot take more than 13");
P("deals. A good score is 1-3 deals, 4-7 is average, 8 or more is poor. ");
#undef P
refresh();
}
static int
find(int card)
{
int i;
if ((card < 0) || (card >= PACK_SIZE))
return (NOCARD);
for (i = 0; i < GRID_LENGTH; i++)
if (grid[i] == card)
return i;
return (NOCARD);
}
static void
movecard(int src, int dst)
{
grid[dst] = grid[src];
grid[src] = NOCARD;
move(BASEROW + (dst / GRID_WIDTH) * 2 + 2, (dst % GRID_WIDTH) * 5 + 1);
printcard(grid[dst]);
move(BASEROW + (src / GRID_WIDTH) * 2 + 2, (src % GRID_WIDTH) * 5 + 1);
printcard(grid[src]);
refresh();
}
static void
play_game(void)
{
int dead = 0, i, j;
char c;
int selection[4], card;
while (dead < 4) {
dead = 0;
for (i = 0; i < 4; i++) {
card = grid[freeptr[i] - 1];
if (((card % SUIT_LENGTH) == KING)
||
(card == NOCARD))
selection[i] = NOCARD;
else
selection[i] = find(card + 1);
if (selection[i] == NOCARD)
dead++;
};
if (dead < 4) {
char live[NSUITS + 1], *lp = live;
for (i = 0; i < 4; i++) {
if (selection[i] != NOCARD) {
move(BASEROW + (selection[i] / GRID_WIDTH) * 2 + 3,
(selection[i] % GRID_WIDTH) * 5);
(void) printw(" %c ", *lp++ = 'a' + i);
}
};
*lp = '\0';
if (strlen(live) == 1) {
move(PROMPTROW, 0);
(void) printw(
"Making forced moves... ");
refresh();
(void) sleep(1);
c = live[0];
} else {
char buf[BUFSIZ];
(void) sprintf(buf,
"Type [%s] to move, r to redraw, q or INTR to quit: ",
live);
do {
move(PROMPTROW, 0);
(void) addstr(buf);
move(PROMPTROW, (int) strlen(buf));
clrtoeol();
(void) addch(' ');
} while
(((c = getch()) < 'a' || c > 'd') && (c != 'r') && (c != 'q'));
}
for (j = 0; j < 4; j++)
if (selection[j] != NOCARD) {
move(BASEROW + (selection[j] / GRID_WIDTH) * 2 + 3,
(selection[j] % GRID_WIDTH) * 5);
(void) printw(" ");
}
if (c == 'r')
display_cards(deal_number);
else if (c == 'q')
die(SIGINT);
else {
i = c - 'a';
if (selection[i] == NOCARD)
beep();
else {
movecard(selection[i], freeptr[i]);
freeptr[i] = selection[i];
}
}
}
}
move(PROMPTROW, 0);
standout();
(void) printw("Finished deal %d - type any character to continue...", deal_number);
standend();
(void) getch();
}
static int
collect_discards(void)
{
int row, col, cardno = 0, finish, gridno;
for (row = HEARTS; row <= CLUBS; row++) {
finish = 0;
for (col = 1; col < GRID_WIDTH; col++) {
gridno = row * GRID_WIDTH + col;
if ((grid[gridno] != (grid[gridno - 1] + 1)) && (finish == 0)) {
finish = 1;
freeptr[row] = gridno;
};
if ((finish != 0) && (grid[gridno] != NOCARD))
deck[cardno++] = grid[gridno];
}
}
return cardno;
}
static void
game_finished(int deal)
{
clear();
(void) printw("You finished the game in %d deals. This is ", deal);
standout();
if (deal < 2)
(void) addstr("excellent");
else if (deal < 4)
(void) addstr("good");
else if (deal < 8)
(void) addstr("average");
else
(void) addstr("poor");
standend();
(void) addstr(". ");
refresh();
}
int
main(int argc, char *argv[])
{
(void) signal(SIGINT, die);
initscr();
/*
* We use COLOR_GREEN because COLOR_BLACK is wired to the wrong thing.
*/
start_color();
init_pair(RED_ON_WHITE, COLOR_RED, COLOR_WHITE);
init_pair(BLUE_ON_WHITE, COLOR_BLUE, COLOR_WHITE);
init_pair(BLACK_ON_WHITE, COLOR_BLACK, COLOR_WHITE);
#ifndef COLOR_PAIR
letters[0] = OR_COLORS('h', RED_ON_WHITE); /* hearts */
letters[1] = OR_COLORS('s', BLACK_ON_WHITE); /* spades */
letters[2] = OR_COLORS('d', RED_ON_WHITE); /* diamonds */
letters[3] = OR_COLORS('c', BLACK_ON_WHITE); /* clubs */
#if defined(__i386__) && defined(A_ALTCHARSET)
glyphs[0] = PC_COLORS('\003', RED_ON_WHITE); /* hearts */
glyphs[1] = PC_COLORS('\006', BLACK_ON_WHITE); /* spades */
glyphs[2] = PC_COLORS('\004', RED_ON_WHITE); /* diamonds */
glyphs[3] = PC_COLORS('\005', BLACK_ON_WHITE); /* clubs */
#endif
#endif
#if defined(__i386__) && defined(A_ALTCHARSET)
if (tigetstr("smpch"))
suits = glyphs;
#endif /* __i386__ && A_ALTCHARSET */
cbreak();
if (argc == 2)
srand((unsigned) atoi(argv[1]));
else
srand((unsigned) time((time_t *) 0));
init_vars();
do {
deal_number++;
shuffle(deck_size);
deal_cards();
display_cards(deal_number);
play_game();
}
while
((deck_size = collect_discards()) != 0);
game_finished(deal_number);
die(SIGINT);
/*NOTREACHED */
}
/* blue.c ends here */

View File

@ -1,42 +0,0 @@
.TH BATTLESHIPS 6 "Aug 23, 1989"
.SH NAME
bs \- battleships game
.SH SYNOPSIS
battle [ -b | -s ] [ -c ]
.SH DESCRIPTION
This program allows you to play the familiar Battleships game against the
computer on a 10x10 board. The interface is visual and largely
self-explanatory; you place your ships and pick your shots by moving the
cursor around the `sea' with the rogue/hack motion keys hjklyubn.
.PP
Note that when selecting a ship to place, you must type the capital letter
(these are, after all, capital ships). During ship placement, the `r' command
may be used to ignore the current position and randomly place your currently
selected ship. The `R' command will place all remaining ships randomly. The ^L
command (form feed, ASCII 12) will force a screen redraw).
.PP
The command-line arguments control game modes.
.nf
-b selects a `blitz' variant
-s selects a `salvo' variant
-c permits ships to be placed adjacently
.fi
The `blitz' variant allows a side to shoot for as long as it continues to
score hits.
.PP
The `salvo' game allows a player one shot per turn for each of his/her ships
still afloat. This puts a premium scoring hits early and knocking out some
ships and also makes much harder the situation where you face a superior force
with only your PT-boat.
.PP
Normally, ships must be separated by at least one square of open water. The
-c option disables this check and allows them to close-pack.
.PP
The algorithm the computer uses once it has found a ship to sink is provably
optimal. The dispersion criterion for the random-fire algorithm may not be.
.SH AUTHORS
Originally written by one Bruce Holloway in 1986. Salvo mode added by Chuck A.
DeGaul (cbosgd!cad). Visual user interface, `closepack' option, code rewrite
and manual page by Eric S. Raymond <esr@snark.thyrsus.com> August 1989.

File diff suppressed because it is too large Load Diff

View File

@ -1,434 +0,0 @@
/****************************************************************************
* Copyright (c) 1999-2001,2002 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/*
* Author: Thomas E. Dickey <dickey@clark.net> 1999
*
* $Id: cardfile.c,v 1.11 2002/04/06 23:12:50 tom Exp $
*
* File format: text beginning in column 1 is a title; other text forms the content.
*/
#include <test.priv.h>
#if HAVE_FORM_H && HAVE_PANEL_H && HAVE_LIBFORM && HAVE_LIBPANEL
#include <form.h>
#include <panel.h>
#include <ctype.h>
#define VISIBLE_CARDS 10
#define OFFSET_CARD 2
#ifndef CTRL
#define CTRL(x) ((x) & 0x1f)
#endif
typedef struct _card {
struct _card *link;
PANEL *panel;
FORM *form;
char *title;
char *content;
} CARD;
static CARD *all_cards;
static char default_name[] = "cardfile.dat";
#if !HAVE_STRDUP
#define strdup my_strdup
static char *
strdup(char *s)
{
char *p = (char *) malloc(strlen(s) + 1);
if (p)
strcpy(p, s);
return (p);
}
#endif /* not HAVE_STRDUP */
static const char *
skip(const char *buffer)
{
while (isspace(UChar(*buffer)))
buffer++;
return buffer;
}
static void
trim(char *buffer)
{
unsigned n = strlen(buffer);
while (n-- && isspace(UChar(buffer[n])))
buffer[n] = 0;
}
/*******************************************************************************/
static CARD *
add_title(const char *title)
{
CARD *card, *p, *q;
for (p = all_cards, q = 0; p != 0; q = p, p = p->link) {
int cmp = strcmp(p->title, title);
if (cmp == 0)
return p;
if (cmp > 0)
break;
}
card = (CARD *) calloc(1, sizeof(CARD));
card->title = strdup(title);
card->content = strdup("");
if (q == 0) {
card->link = all_cards;
all_cards = card;
} else {
card->link = q->link;
q->link = card;
}
return card;
}
static void
add_content(CARD * card, const char *content)
{
unsigned total, offset;
content = skip(content);
if ((total = strlen(content)) != 0) {
if ((offset = strlen(card->content)) != 0) {
total += 1 + offset;
card->content = (char *) realloc(card->content, total + 1);
strcpy(card->content + offset++, " ");
} else {
card->content = (char *) malloc(total + 1);
}
strcpy(card->content + offset, content);
}
}
static CARD *
new_card(void)
{
CARD *card = add_title("");
add_content(card, "");
return card;
}
static CARD *
find_card(char *title)
{
CARD *card;
for (card = all_cards; card != 0; card = card->link)
if (!strcmp(card->title, title))
break;
return card;
}
static void
read_data(char *fname)
{
FILE *fp;
CARD *card = 0;
char buffer[BUFSIZ];
if ((fp = fopen(fname, "r")) != 0) {
while (fgets(buffer, sizeof(buffer), fp)) {
trim(buffer);
if (isspace(UChar(*buffer))) {
if (card == 0)
card = add_title("");
add_content(card, buffer);
} else if ((card = find_card(buffer)) == 0) {
card = add_title(buffer);
}
}
fclose(fp);
}
}
/*******************************************************************************/
static void
write_data(const char *fname)
{
FILE *fp;
CARD *p = 0;
int n;
if (!strcmp(fname, default_name))
fname = "cardfile.out";
if ((fp = fopen(fname, "w")) != 0) {
for (p = all_cards; p != 0; p = p->link) {
FIELD **f = form_fields(p->form);
for (n = 0; f[n] != 0; n++) {
char *s = field_buffer(f[n], 0);
if (s != 0
&& (s = strdup(s)) != 0) {
trim(s);
fprintf(fp, "%s%s\n", n ? "\t" : "", s);
free(s);
}
}
}
fclose(fp);
}
}
/*******************************************************************************/
/*
* Count the cards
*/
static int
count_cards(void)
{
CARD *p;
int count = 0;
for (p = all_cards; p != 0; p = p->link)
count++;
return count;
}
/*
* Shuffle the panels to keep them in a natural hierarchy.
*/
static void
order_cards(CARD * first, int depth)
{
if (first) {
if (depth && first->link)
order_cards(first->link, depth - 1);
top_panel(first->panel);
}
}
/*
* Return the next card in the list
*/
static CARD *
next_card(CARD * now)
{
if (now->link)
now = now->link;
return now;
}
/*
* Return the previous card in the list
*/
static CARD *
prev_card(CARD * now)
{
CARD *p;
for (p = all_cards; p != 0; p = p->link)
if (p->link == now)
return p;
return now;
}
/*******************************************************************************/
static int
form_virtualize(WINDOW *w)
{
int c = wgetch(w);
switch (c) {
case CTRL('W'):
return (MAX_FORM_COMMAND + 4);
case CTRL('N'):
return (MAX_FORM_COMMAND + 3);
case CTRL('P'):
return (MAX_FORM_COMMAND + 2);
case CTRL('Q'):
case 033:
return (MAX_FORM_COMMAND + 1);
case KEY_BACKSPACE:
return (REQ_DEL_PREV);
case KEY_DC:
return (REQ_DEL_CHAR);
case KEY_LEFT:
return (REQ_LEFT_CHAR);
case KEY_RIGHT:
return (REQ_RIGHT_CHAR);
case KEY_DOWN:
case KEY_NEXT:
return (REQ_NEXT_FIELD);
case KEY_UP:
case KEY_PREVIOUS:
return (REQ_PREV_FIELD);
default:
return (c);
}
}
/*******************************************************************************/
static void
cardfile(char *fname)
{
WINDOW *win;
CARD *p;
CARD *top_card;
int visible_cards = count_cards();
int panel_wide = COLS - (visible_cards * OFFSET_CARD);
int panel_high = LINES - (visible_cards * OFFSET_CARD) - 5;
int form_wide = panel_wide - 2;
int form_high = panel_high - 2;
int x = (visible_cards - 1) * OFFSET_CARD;
int y = 0;
int ch;
int finished = FALSE;
move(LINES - 3, 0);
addstr("^Q/ESC -- exit form ^W -- writes data to file\n");
addstr("^N -- go to next card ^P -- go to previous card\n");
addstr("Arrow keys move left/right within a field, up/down between fields");
/* make a panel for each CARD */
for (p = all_cards; p != 0; p = p->link) {
FIELD **f = (FIELD **) calloc(3, sizeof(FIELD *));
win = newwin(panel_high, panel_wide, x, y);
keypad(win, TRUE);
p->panel = new_panel(win);
box(win, 0, 0);
/* ...and a form in each panel */
f[0] = new_field(1, form_wide, 0, 0, 0, 0);
set_field_back(f[0], A_REVERSE);
set_field_buffer(f[0], 0, p->title);
f[1] = new_field(form_high - 1, form_wide, 1, 0, 0, 0);
set_field_buffer(f[1], 0, p->content);
set_field_just(f[1], JUSTIFY_LEFT);
f[2] = 0;
p->form = new_form(f);
set_form_win(p->form, win);
set_form_sub(p->form, derwin(win, form_high, form_wide, 1, 1));
post_form(p->form);
x -= OFFSET_CARD;
y += OFFSET_CARD;
}
order_cards(top_card = all_cards, visible_cards);
while (!finished) {
update_panels();
doupdate();
switch (form_driver(top_card->form, ch =
form_virtualize(panel_window(top_card->panel)))) {
case E_OK:
break;
case E_UNKNOWN_COMMAND:
switch (ch) {
case MAX_FORM_COMMAND + 1:
finished = TRUE;
break;
case MAX_FORM_COMMAND + 2:
top_card = prev_card(top_card);
order_cards(top_card, visible_cards);
break;
case MAX_FORM_COMMAND + 3:
top_card = next_card(top_card);
order_cards(top_card, visible_cards);
break;
case MAX_FORM_COMMAND + 4:
write_data(fname);
break;
#ifdef KEY_RESIZE
case KEY_RESIZE:
flash();
break;
#endif
default:
beep();
break;
}
break;
default:
flash();
break;
}
}
}
/*******************************************************************************/
int
main(int argc, char *argv[])
{
int n;
initscr();
cbreak();
noecho();
if (argc > 1) {
for (n = 1; n < argc; n++)
read_data(argv[n]);
if (count_cards() == 0)
new_card();
cardfile(argv[1]);
} else {
read_data(default_name);
if (count_cards() == 0)
new_card();
cardfile(default_name);
}
endwin();
ExitProgram(EXIT_SUCCESS);
}
#else
int
main(void)
{
printf("This program requires the curses form and panel libraries\n");
ExitProgram(EXIT_FAILURE);
}
#endif

View File

@ -1,13 +0,0 @@
title 1
Some text for title1
and some more text
title 2
The quicker brown fox ran all over the lazy dog.
put a card before the first two
This is an example of a simple cardfile.
show a fourth card
The fourth card
has a large amount of data,
more than the other cards.
At least, that is what I thought it should do, since I want to see how well
the forms package handles justification.

File diff suppressed because it is too large Load Diff

View File

@ -1,327 +0,0 @@
dnl***************************************************************************
dnl Copyright (c) 1998-2000,2002 Free Software Foundation, Inc. *
dnl *
dnl Permission is hereby granted, free of charge, to any person obtaining a *
dnl copy of this software and associated documentation files (the *
dnl "Software"), to deal in the Software without restriction, including *
dnl without limitation the rights to use, copy, modify, merge, publish, *
dnl distribute, distribute with modifications, sublicense, and/or sell *
dnl copies of the Software, and to permit persons to whom the Software is *
dnl furnished to do so, subject to the following conditions: *
dnl *
dnl The above copyright notice and this permission notice shall be included *
dnl in all copies or substantial portions of the Software. *
dnl *
dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
dnl *
dnl Except as contained in this notice, the name(s) of the above copyright *
dnl holders shall not be used in advertising or otherwise to promote the *
dnl sale, use or other dealings in this Software without prior written *
dnl authorization. *
dnl***************************************************************************
dnl
dnl Author: Thomas E. Dickey 1996, etc.
dnl
dnl $Id: configure.in,v 1.35 2002/04/06 22:02:50 tom Exp $
dnl This is a simple configuration-script for the ncurses test programs that
dnl allows the test-directory to be separately configured against a reference
dnl system (i.e., sysvr4 curses)
dnl
dnl If you're configuring ncurses, you shouldn't need to use this script.
dnl It's only for testing purposes.
dnl
dnl See http://dickey.his.com/autoconf/ for additional information.
dnl ---------------------------------------------------------------------------
AC_PREREQ(2.13.20000819)
AC_INIT(ncurses.c)
AC_CONFIG_HEADER(ncurses_cfg.h:ncurses_tst.hin)
AC_PROG_CC
dnl Things that we don't need (or must override) if we're not building ncurses
CC_G_OPT="-g" AC_SUBST(CC_G_OPT)
CC_SHARED_OPTS=unknown AC_SUBST(CC_SHARED_OPTS)
CPPFLAGS="$CPPFLAGS" AC_SUBST(CPPFLAGS)
DFT_DEP_SUFFIX="" AC_SUBST(DFT_DEP_SUFFIX)
DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'` AC_SUBST(DFT_OBJ_SUBDIR)
DFT_UPR_MODEL="NORMAL" AC_SUBST(DFT_UPR_MODEL)
ECHO_LINK='@ echo linking $@ ... ;' AC_SUBST(ECHO_LINK)
EXTRA_LIBS="" AC_SUBST(EXTRA_LIBS)
LD="ld" AC_SUBST(LD)
LDFLAGS_SHARED="" AC_SUBST(LDFLAGS_SHARED)
LD_MODEL="" AC_SUBST(LD_MODEL)
LD_SHARED_OPTS="" AC_SUBST(LD_SHARED_OPTS)
LIBTOOL="" AC_SUBST(LIBTOOL)
LIB_NAME=curses AC_SUBST(LIB_NAME)
LIB_PREFIX="-l" AC_SUBST(LIB_PREFIX)
LINK_TESTS="" AC_SUBST(LINK_TESTS)
LINT=lint AC_SUBST(LINT)
LINT_OPTS="" AC_SUBST(LINT_OPTS)
LOCAL_LDFLAGS="" AC_SUBST(LOCAL_LDFLAGS)
MATH_LIB="-lm" AC_SUBST(MATH_LIB)
PROG_EXT="" AC_SUBST(PROG_EXT)
TEST_ARGS="" AC_SUBST(TEST_ARGS)
TEST_DEPS="" AC_SUBST(TEST_DEPS)
cf_cv_abi_version="" AC_SUBST(cf_cv_abi_version)
cf_cv_rel_version="" AC_SUBST(cf_cv_rel_version)
dnl SunOS 4.x
AC_ARG_WITH(5lib,
[ --with-5lib use SunOS sysv-libraries],
[LIBS="-L/usr/5lib $LIBS"
CPPFLAGS="$CPPFLAGS -I/usr/5include"])
dnl ---------------------------------------------------------------------------
dnl Check for libutf8
AC_DEFUN([CF_LIBUTF8],
[
AC_CACHE_CHECK(for putwc in libutf8,cf_cv_libutf8,[
cf_save_LIBS="$LIBS"
LIBS="-lutf8 $LIBS"
AC_TRY_LINK([
#include <libutf8.h>],[putwc(0,0);],
[cf_cv_libutf8=yes],
[cf_cv_libutf8=no])
LIBS="$cf_save_LIBS"
])
if test "$cf_cv_libutf8" = yes ; then
AC_DEFINE(HAVE_LIBUTF8_H)
LIBS="-lutf8 $LIBS"
fi
])dnl
dnl ---------------------------------------------------------------------------
dnl NcursesW, installed in conventional location
AC_ARG_WITH(ncursesw,
[ --with-ncursesw use wide ncurses-libraries (installed)],
[
AC_DEFINE(_GNU_SOURCE)
AC_DEFINE(_XOPEN_SOURCE_EXTENDED)
AC_CHECK_FUNC(initscr,,[
AC_CHECK_LIB(gpm,Gpm_Open)
LIB_NAME=ncursesw
AC_CHECK_FUNC(putwc,,[CF_LIBUTF8])
for p in $HOME /usr/local /usr
do
if test -f $p/include/ncursesw/curses.h
then
CPPFLAGS="$CPPFLAGS -I$p/include/ncursesw"
test $p != /usr && CPPFLAGS="$CPPFLAGS -I$p/include"
test $p != /usr && LIBS="-L$p/lib $LIBS"
break
elif test $p != /usr
then
if test -f $p/include/curses.h
then
CPPFLAGS="$CPPFLAGS -I$p/include"
LIBS="-L$p/lib $LIBS"
break
fi
fi
done
],[test -d /usr/ccs/lib && LIBS="-L/usr/ccs/lib $LIBS"])])
dnl Ncurses, installed in conventional location
AC_ARG_WITH(ncurses,
[ --with-ncurses use ncurses-libraries (installed)],
[AC_CHECK_FUNC(initscr,,[
AC_CHECK_LIB(gpm,Gpm_Open)
LIB_NAME=ncurses
for p in $HOME /usr/local /usr
do
if test -f $p/include/ncurses/curses.h
then
CPPFLAGS="$CPPFLAGS -I$p/include/ncurses"
test $p != /usr && CPPFLAGS="$CPPFLAGS -I$p/include"
test $p != /usr && LIBS="-L$p/lib $LIBS"
break
elif test $p != /usr
then
if test -f $p/include/curses.h
then
CPPFLAGS="$CPPFLAGS -I$p/include"
LIBS="-L$p/lib $LIBS"
break
fi
fi
done
],[test -d /usr/ccs/lib && LIBS="-L/usr/ccs/lib $LIBS"])])
dnl If we've not specified a library, assume we're using sysvr4 libraries
dnl installed conventionally (e.g., SunOS 5.x - solaris).
dnl Autoconf builds up the $LIBS in reverse order
AC_CHECK_FUNC(initscr,,[
AC_CHECK_LIB($LIB_NAME,initscr)])
AC_CHECK_LIB(form,form_driver)
AC_CHECK_LIB(menu,menu_driver)
AC_CHECK_LIB(panel,new_panel)
AC_TYPE_SIGNAL
AC_STDC_HEADERS
AC_HEADER_TIME
AC_CHECK_HEADERS( \
form.h \
getopt.h \
locale.h \
menu.h \
nc_alloc.h \
nomacros.h \
panel.h \
sys/ioctl.h \
sys/select.h \
sys/time.h \
termios.h \
unistd.h \
)
AC_CHECK_FUNCS( \
getnstr \
gettimeofday \
napms \
resize_term \
resizeterm \
strdup \
use_default_colors \
vsscanf \
wresize \
)
dnl ---------------------------------------------------------------------------
dnl Solaris has a data item 'curses_version', which confuses AC_CHECK_FUNCS.
dnl It's a character string "SVR4", not documented.
AC_CACHE_CHECK(for function curses_version, cf_cv_func_curses_version,[
AC_TRY_RUN([
#include <curses.h>
int main()
{
char temp[1024];
sprintf(temp, "%s\n", curses_version());
exit(0);
}]
,[cf_cv_func_curses_version=yes]
,[cf_cv_func_curses_version=no]
,[cf_cv_func_curses_version=unknown])
rm -f core])
test "$cf_cv_func_curses_version" = yes && AC_DEFINE(HAVE_CURSES_VERSION)
dnl ---------------------------------------------------------------------------
dnl Check for likely values of acs_map[]:
AC_CACHE_CHECK(for alternate character set array, cf_cv_curses_acs_map,[
cf_cv_curses_acs_map=unknown
for name in acs_map _acs_map __acs_map _nc_acs_map
do
AC_TRY_LINK([
#include <curses.h>
],[
$name['k'] = ACS_PLUS
],[cf_cv_curses_acs_map=$name; break])
done
])
test "$cf_cv_curses_acs_map" != unknown && AC_DEFINE_UNQUOTED(CURSES_ACS_ARRAY,$cf_cv_curses_acs_map)
dnl ---------------------------------------------------------------------------
dnl Check for likely values of wacs_map[]:
AC_CACHE_CHECK(for wide alternate character set array, cf_cv_curses_wacs_map,[
cf_cv_curses_wacs_map=unknown
for name in wacs_map _wacs_map __wacs_map _nc_wacs
do
AC_TRY_LINK([
#ifndef _XOPEN_SOURCE_EXTENDED
#define _XOPEN_SOURCE_EXTENDED
#endif
#include <curses.h>
],[
$name['k'] = *WACS_PLUS
],[cf_cv_curses_wacs_map=$name; break])
done
])
test "$cf_cv_curses_wacs_map" != unknown && AC_DEFINE_UNQUOTED(CURSES_WACS_ARRAY,$cf_cv_curses_wacs_map)
dnl ---------------------------------------------------------------------------
dnl Make an uppercase version of a variable
dnl $1=uppercase($2)
AC_DEFUN([CF_UPPER],
[
$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
])dnl
dnl ---------------------------------------------------------------------------
dnl Check if curses.h defines the given type
AC_DEFUN([CF_CURSES_TYPE],
[
AC_MSG_CHECKING(for type $1 in curses.h)
AC_TRY_COMPILE([
#ifndef _XOPEN_SOURCE_EXTENDED
#define _XOPEN_SOURCE_EXTENDED
#endif
#include <curses.h>],[
$1 foo
],cf_result=yes,cf_result=no)
AC_MSG_RESULT($cf_result)
if test $cf_result = yes ; then
CF_UPPER(cf_result,have_type_$1)
AC_DEFINE_UNQUOTED($cf_result)
else
AC_DEFINE_UNQUOTED($1,$2)
fi
])dnl
CF_CURSES_TYPE(attr_t,long)
CF_CURSES_TYPE(mbstate_t,long)
dnl ---------------------------------------------------------------------------
dnl Check if we can include <sys/time.h> with <sys/select.h>; this breaks on
dnl older SCO configurations.
dnl [CF_SYS_TIME_SELECT]
AC_MSG_CHECKING(if sys/time.h works with sys/select.h)
AC_CACHE_VAL(cf_cv_sys_time_select,[
AC_TRY_COMPILE([
#include <sys/types.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
],[],[cf_cv_sys_time_select=yes],
[cf_cv_sys_time_select=no])
])
AC_MSG_RESULT($cf_cv_sys_time_select)
test "$cf_cv_sys_time_select" = yes && AC_DEFINE(HAVE_SYS_TIME_SELECT)
dnl ---------------------------------------------------------------------------
AC_OUTPUT(Makefile,[
cat >>Makefile <<TEST_EOF
# These rules are generated so we do not rely on suffix rules, which do not
# work consistently for different make-programs (the '\$(MODEL)/' confuses
# some, and the '\$x' confuses others).
TEST_EOF
LIST=`make echo_tests`
LAST=`make echo_suffix`
for n in $LIST
do
N=`echo $n | sed -e s/${LAST}\$//`
cat >>Makefile <<TEST_EOF
\$(MODEL)/$N.o : $N.c \\
test.priv.h \\
ncurses_cfg.h
@echo compiling $N; \$(CC) -c \$(CFLAGS_DEFAULT) $N.c
TEST_EOF
done
],[],sort)

View File

@ -1,148 +0,0 @@
/****************************************************************************
* Copyright (c) 1998,2001 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/*
* Author: Thomas E. Dickey <dickey@clark.net> 1998
*
* $Id: ditto.c,v 1.4 2001/09/15 21:53:37 tom Exp $
*
* The program illustrates how to set up multiple screens from a single
* program. Invoke the program by specifying another terminal on the same
* machine by specifying its device, e.g.,
* ditto /dev/ttyp1
*/
#include <test.priv.h>
#include <sys/stat.h>
#include <errno.h>
typedef struct {
FILE *input;
FILE *output;
SCREEN *screen;
} DITTO;
static void
failed(const char *s)
{
perror(s);
ExitProgram(EXIT_FAILURE);
}
static void
usage(void)
{
fprintf(stderr, "usage: ditto [terminal1 ...]\n");
ExitProgram(EXIT_FAILURE);
}
static FILE *
open_tty(char *path)
{
FILE *fp;
struct stat sb;
if (stat(path, &sb) < 0)
failed(path);
if ((sb.st_mode & S_IFMT) != S_IFCHR) {
errno = ENOTTY;
failed(path);
}
fp = fopen(path, "a+");
if (fp == 0)
failed(path);
printf("opened %s\n", path);
return fp;
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
int j;
int active_tty = 0;
DITTO *data;
if (argc <= 1)
usage();
if ((data = (DITTO *) calloc(argc, sizeof(DITTO))) == 0)
failed("calloc data");
data[0].input = stdin;
data[0].output = stdout;
for (j = 1; j < argc; j++) {
data[j].input =
data[j].output = open_tty(argv[j]);
}
/*
* If we got this far, we have open connection(s) to the terminal(s).
* Set up the screens.
*/
for (j = 0; j < argc; j++) {
active_tty++;
data[j].screen = newterm(
(char *) 0, /* assume $TERM is the same */
data[j].output,
data[j].input);
if (data[j].screen == 0)
failed("newterm");
cbreak();
noecho();
scrollok(stdscr, TRUE);
}
/*
* Loop, reading characters from any of the inputs and writing to all
* of the screens.
*/
for (;;) {
int ch;
set_term(data[0].screen);
ch = getch();
if (ch == ERR)
continue;
if (ch == 4)
break;
for (j = 0; j < argc; j++) {
set_term(data[j].screen);
addch(ch);
refresh();
}
}
/*
* Cleanup and exit
*/
for (j = argc - 1; j >= 0; j--) {
set_term(data[j].screen);
endwin();
}
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,140 +0,0 @@
/****************************************************************************
* Copyright (c) 1999-2001,2002 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/*
* Author: Thomas E. Dickey <dickey@clark.net> 1999
*
* $Id: dots.c,v 1.8 2002/04/06 21:33:42 tom Exp $
*
* A simple demo of the terminfo interface.
*/
#include <time.h>
#include <test.priv.h>
#define valid(s) ((s != 0) && s != (char *)-1)
static bool interrupted = FALSE;
static int
outc(int c)
{
if (interrupted) {
char tmp = c;
write(STDOUT_FILENO, &tmp, 1);
} else {
putc(c, stdout);
}
return 0;
}
static bool
outs(char *s)
{
if (valid(s)) {
tputs(s, 1, outc);
return TRUE;
}
return FALSE;
}
static void
cleanup(void)
{
outs(exit_attribute_mode);
if (!outs(orig_colors))
outs(orig_pair);
outs(clear_screen);
outs(cursor_normal);
}
static void
onsig(int n GCC_UNUSED)
{
interrupted = TRUE;
cleanup();
ExitProgram(EXIT_FAILURE);
}
static float
ranf(void)
{
long r = (rand() & 077777);
return ((float) r / 32768.);
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
int x, y, z, j, p;
float r;
float c;
for (j = SIGHUP; j <= SIGTERM; j++)
if (signal(j, SIG_IGN) != SIG_IGN)
signal(j, onsig);
srand(time(0));
setupterm((char *) 0, 1, (int *) 0);
outs(clear_screen);
outs(cursor_invisible);
if (max_colors > 1) {
if (!valid(set_a_foreground)
|| !valid(set_a_background)
|| (!valid(orig_colors) && !valid(orig_pair)))
max_colors = -1;
}
r = (float) (lines - 4);
c = (float) (columns - 4);
for (;;) {
x = (int) (c * ranf()) + 2;
y = (int) (r * ranf()) + 2;
p = (ranf() > 0.9) ? '*' : ' ';
tputs(tparm3(cursor_address, y, x), 1, outc);
if (max_colors > 0) {
z = (int) (ranf() * max_colors);
if (ranf() > 0.01) {
tputs(tparm2(set_a_foreground, z), 1, outc);
} else {
tputs(tparm2(set_a_background, z), 1, outc);
}
} else if (valid(exit_attribute_mode)
&& valid(enter_reverse_mode)) {
if (ranf() <= 0.01)
outs((ranf() > 0.6) ? enter_reverse_mode :
exit_attribute_mode);
}
outc(p);
fflush(stdout);
}
}

View File

@ -1,103 +0,0 @@
/****************************************************************************
* Copyright (c) 1998-2001,2002 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/*
* Author: Thomas E. Dickey <dickey@clark.net> 1998
*
* $Id: filter.c,v 1.7 2002/03/23 23:02:15 tom Exp $
*/
#include <test.priv.h>
/*
* An example of the 'filter()' function in ncurses, this program prompts
* for commands and executes them (like a command shell). It illustrates
* how ncurses can be used to implement programs that are not full-screen.
*
* Ncurses differs slightly from SVr4 curses. The latter does not flush its
* state when exiting program mode, so the attributes on the command lines of
* this program 'bleed' onto the executed commands. Rather than use the
* reset_shell_mode() and reset_prog_mode() functions, we could invoke endwin()
* and refresh(), but that does not work any better.
*/
static int
new_command(char *buffer, int length, attr_t underline)
{
int code;
attron(A_BOLD);
printw("Command: ");
attron(underline);
code = getnstr(buffer, length);
attroff(underline);
attroff(A_BOLD);
printw("\n");
return code;
}
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
char buffer[80];
attr_t underline;
filter();
(void) newterm((char *) 0, stdout, stdin);
cbreak();
keypad(stdscr, TRUE);
if (has_colors()) {
int background = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() != ERR)
background = -1;
#endif
init_pair(1, COLOR_CYAN, background);
underline = COLOR_PAIR(1);
} else {
underline = A_UNDERLINE;
}
while (new_command(buffer, sizeof(buffer) - 1, underline) != ERR
&& strlen(buffer) != 0) {
reset_shell_mode();
printf("\n");
fflush(stdout);
system(buffer);
reset_prog_mode();
touchwin(stdscr);
erase();
refresh();
}
printw("done");
refresh();
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,173 +0,0 @@
/*
* $Id: firework.c,v 1.20 2002/03/23 21:41:42 tom Exp $
*/
#include <time.h>
#include <test.priv.h>
static int my_bg = COLOR_BLACK;
static void
cleanup(void)
{
curs_set(1);
endwin();
}
static RETSIGTYPE
onsig(int n GCC_UNUSED)
{
cleanup();
ExitProgram(EXIT_FAILURE);
}
static void
showit(void)
{
int ch;
napms(120);
if ((ch = getch()) != ERR) {
#ifdef KEY_RESIZE
if (ch == KEY_RESIZE) {
erase();
} else
#endif
if (ch == 'q') {
cleanup();
ExitProgram(EXIT_SUCCESS);
} else if (ch == 's') {
nodelay(stdscr, FALSE);
} else if (ch == ' ') {
nodelay(stdscr, TRUE);
}
}
}
static
int
get_colour(chtype * bold)
{
int attr;
attr = (rand() % 16) + 1;
*bold = A_NORMAL;
if (attr > 8) {
*bold = A_BOLD;
attr &= 7;
}
return (attr);
}
static
void
explode(int row, int col)
{
chtype bold;
erase();
mvprintw(row, col, "-");
showit();
init_pair(1, get_colour(&bold), my_bg);
attrset(COLOR_PAIR(1) | bold);
mvprintw(row - 1, col - 1, " - ");
mvprintw(row + 0, col - 1, "-+-");
mvprintw(row + 1, col - 1, " - ");
showit();
init_pair(1, get_colour(&bold), my_bg);
attrset(COLOR_PAIR(1) | bold);
mvprintw(row - 2, col - 2, " --- ");
mvprintw(row - 1, col - 2, "-+++-");
mvprintw(row + 0, col - 2, "-+#+-");
mvprintw(row + 1, col - 2, "-+++-");
mvprintw(row + 2, col - 2, " --- ");
showit();
init_pair(1, get_colour(&bold), my_bg);
attrset(COLOR_PAIR(1) | bold);
mvprintw(row - 2, col - 2, " +++ ");
mvprintw(row - 1, col - 2, "++#++");
mvprintw(row + 0, col - 2, "+# #+");
mvprintw(row + 1, col - 2, "++#++");
mvprintw(row + 2, col - 2, " +++ ");
showit();
init_pair(1, get_colour(&bold), my_bg);
attrset(COLOR_PAIR(1) | bold);
mvprintw(row - 2, col - 2, " # ");
mvprintw(row - 1, col - 2, "## ##");
mvprintw(row + 0, col - 2, "# #");
mvprintw(row + 1, col - 2, "## ##");
mvprintw(row + 2, col - 2, " # ");
showit();
init_pair(1, get_colour(&bold), my_bg);
attrset(COLOR_PAIR(1) | bold);
mvprintw(row - 2, col - 2, " # # ");
mvprintw(row - 1, col - 2, "# #");
mvprintw(row + 0, col - 2, " ");
mvprintw(row + 1, col - 2, "# #");
mvprintw(row + 2, col - 2, " # # ");
showit();
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
int j;
int start, end, row, diff, flag = 0, direction;
unsigned seed;
for (j = SIGHUP; j <= SIGTERM; j++)
if (signal(j, SIG_IGN) != SIG_IGN)
signal(j, onsig);
initscr();
noecho();
cbreak();
keypad(stdscr, TRUE);
nodelay(stdscr, TRUE);
if (has_colors()) {
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
my_bg = -1;
#endif
}
curs_set(0);
seed = time((time_t *) 0);
srand(seed);
for (;;) {
do {
start = rand() % (COLS - 3);
end = rand() % (COLS - 3);
start = (start < 2) ? 2 : start;
end = (end < 2) ? 2 : end;
direction = (start > end) ? -1 : 1;
diff = abs(start - end);
} while (diff < 2 || diff >= LINES - 2);
attrset(A_NORMAL);
for (row = 0; row < diff; row++) {
mvprintw(LINES - row, start + (row * direction),
(direction < 0) ? "\\" : "/");
if (flag++) {
showit();
erase();
flag = 0;
}
}
if (flag++) {
showit();
flag = 0;
}
seed = time((time_t *) 0);
srand(seed);
explode(LINES - row, start + (diff * direction));
erase();
showit();
}
}

View File

@ -1,90 +0,0 @@
/*
* This test was written by Alexander V. Lukyanov to demonstrate difference
* between ncurses 4.1 and SVR4 curses
*
* $Id: firstlast.c,v 1.3 2001/09/15 21:46:34 tom Exp $
*/
#include <test.priv.h>
static void
fill(WINDOW *w, const char *str)
{
const char *s;
for (;;) {
for (s = str; *s; s++) {
if (waddch(w, *s) == ERR) {
wmove(w, 0, 0);
return;
}
}
}
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
WINDOW *large, *small;
initscr();
noecho();
large = newwin(20, 60, 2, 10);
small = newwin(10, 30, 7, 25);
/* test 1 - addch */
fill(large, "LargeWindow");
refresh();
wrefresh(large);
wrefresh(small);
mvwaddstr(small, 5, 5, " Test <place to change> String ");
wrefresh(small);
getch();
touchwin(large);
wrefresh(large);
mvwaddstr(small, 5, 5, " Test <***************> String ");
wrefresh(small);
/* DIFFERENCE! */
getch();
/* test 2: erase */
erase();
refresh();
getch();
/* test 3: clrtoeol */
werase(small);
wrefresh(small);
touchwin(large);
wrefresh(large);
wmove(small, 5, 0);
waddstr(small, " clrtoeol>");
wclrtoeol(small);
wrefresh(small);
/* DIFFERENCE! */ ;
getch();
/* test 4: clrtobot */
werase(small);
wrefresh(small);
touchwin(large);
wrefresh(large);
wmove(small, 5, 3);
waddstr(small, " clrtobot>");
wclrtobot(small);
wrefresh(small);
/* DIFFERENCE! */
getch();
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,22 +0,0 @@
.TH GDC 6
.SH NAME
gdc \- grand digital clock (curses)
.SH SYNOPSIS
.B gdc
[-s] [
.I n
]
.SH DESCRIPTION
.I Gdc
runs a digital clock made of reverse-video blanks on a curses
compatible VDU screen. With an optional numeric argument
.I n
it stops after
.I n
seconds (default never).
The optional
.B -s
flag makes digits scroll as they change. In this curses mode implementation,
the scrolling option has trouble keeping up.
.SH AUTHOR
Amos Shapir, modified for curses by John Lupien.

View File

@ -1,315 +0,0 @@
/*
* Grand digital clock for curses compatible terminals
* Usage: gdc [-s] [n] -- run for n seconds (default infinity)
* Flags: -s: scroll
*
* modified 10-18-89 for curses (jrl)
* 10-18-89 added signal handling
*
* $Id: gdc.c,v 1.21 2002/03/23 22:17:24 tom Exp $
*/
#include <time.h>
#include <test.priv.h>
#define YBASE 10
#define XBASE 10
#define XLENGTH 54
#define YDEPTH 5
static short disp[11] =
{
075557, 011111, 071747, 071717, 055711,
074717, 074757, 071111, 075757, 075717, 002020
};
static long older[6], next[6], newer[6], mask;
static int sigtermed = 0;
static bool redirected = FALSE;
static bool hascolor = FALSE;
static RETSIGTYPE
sighndl(int signo)
{
signal(signo, sighndl);
sigtermed = signo;
if (redirected) {
endwin();
ExitProgram(EXIT_FAILURE);
}
}
static void
drawbox(void)
{
chtype bottom[XLENGTH + 1];
int n;
if (hascolor)
attrset(COLOR_PAIR(3));
mvaddch(YBASE - 1, XBASE - 1, ACS_ULCORNER);
hline(ACS_HLINE, XLENGTH);
mvaddch(YBASE - 1, XBASE + XLENGTH, ACS_URCORNER);
mvaddch(YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER);
mvinchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH);
for (n = 0; n < XLENGTH; n++)
bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR));
mvaddchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH);
mvaddch(YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER);
move(YBASE, XBASE - 1);
vline(ACS_VLINE, YDEPTH);
move(YBASE, XBASE + XLENGTH);
vline(ACS_VLINE, YDEPTH);
if (hascolor)
attrset(COLOR_PAIR(2));
}
static void
standt(int on)
{
if (on) {
if (hascolor) {
attron(COLOR_PAIR(1));
} else {
attron(A_STANDOUT);
}
} else {
if (hascolor) {
attron(COLOR_PAIR(2));
} else {
attroff(A_STANDOUT);
}
}
}
static void
set(int t, int n)
{
int i, m;
m = 7 << n;
for (i = 0; i < 5; i++) {
next[i] |= ((disp[t] >> ((4 - i) * 3)) & 07) << n;
mask |= (next[i] ^ older[i]) & m;
}
if (mask & m)
mask |= m;
}
static void
usage(void)
{
static const char *msg[] =
{
"Usage: gdc [options] [count]"
,""
,"Options:"
," -n redirect input to /dev/null"
," -s scroll each number into place, rather than flipping"
,""
,"If you specify a count, gdc runs for that number of seconds"
};
unsigned j;
for (j = 0; j < SIZEOF(msg); j++)
fprintf(stderr, "%s\n", msg[j]);
ExitProgram(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
time_t now;
struct tm *tm;
long t, a;
int i, j, s, k;
int count = 0;
FILE *ofp = stdout;
FILE *ifp = stdin;
bool scrol = FALSE;
signal(SIGINT, sighndl);
signal(SIGTERM, sighndl);
signal(SIGKILL, sighndl);
while ((k = getopt(argc, argv, "sn")) != EOF) {
switch (k) {
case 's':
scrol = TRUE;
break;
case 'n':
ifp = fopen("/dev/null", "r");
redirected = TRUE;
break;
default:
usage();
}
}
if (optind < argc) {
count = atoi(argv[optind++]);
}
if (optind < argc)
usage();
if (redirected) {
char *name = getenv("TERM");
if (name == 0
|| newterm(name, ofp, ifp) == 0) {
fprintf(stderr, "cannot open terminal\n");
ExitProgram(EXIT_FAILURE);
}
} else {
initscr();
}
cbreak();
noecho();
nodelay(stdscr, 1);
curs_set(0);
hascolor = has_colors();
if (hascolor) {
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
init_pair(1, COLOR_BLACK, COLOR_RED);
init_pair(2, COLOR_RED, bg);
init_pair(3, COLOR_WHITE, bg);
attrset(COLOR_PAIR(2));
}
restart:
for (j = 0; j < 5; j++)
older[j] = newer[j] = next[j] = 0;
clear();
drawbox();
do {
char buf[30];
time(&now);
tm = localtime(&now);
mask = 0;
set(tm->tm_sec % 10, 0);
set(tm->tm_sec / 10, 4);
set(tm->tm_min % 10, 10);
set(tm->tm_min / 10, 14);
set(tm->tm_hour % 10, 20);
set(tm->tm_hour / 10, 24);
set(10, 7);
set(10, 17);
for (k = 0; k < 6; k++) {
if (scrol) {
for (i = 0; i < 5; i++)
newer[i] = (newer[i] & ~mask) | (newer[i + 1] & mask);
newer[5] = (newer[5] & ~mask) | (next[k] & mask);
} else
newer[k] = (newer[k] & ~mask) | (next[k] & mask);
next[k] = 0;
for (s = 1; s >= 0; s--) {
standt(s);
for (i = 0; i < 6; i++) {
if ((a = (newer[i] ^ older[i]) & (s ? newer : older)[i])
!= 0) {
for (j = 0, t = 1 << 26; t; t >>= 1, j++) {
if (a & t) {
if (!(a & (t << 1))) {
move(YBASE + i, XBASE + 2 * j);
}
addstr(" ");
}
}
}
if (!s) {
older[i] = newer[i];
}
}
if (!s) {
if (scrol)
drawbox();
refresh();
/*
* If we're scrolling, space out the refreshes to fake
* movement. That's 7 frames, or 6 intervals, which would
* be 166 msec if we spread it out over a second. It looks
* better (but will well on a slow terminal, e.g., less
* than 9600bd) to squeeze that into a half-second, and use
* half of 170 msec to ensure that the program doesn't eat
* a lot of time when asking what time it is, at the top of
* this loop -TD
*/
if (scrol)
napms(85);
}
}
}
/* this depends on the detailed format of ctime(3) */
(void) strcpy(buf, ctime(&now));
(void) strcpy(buf + 10, buf + 19);
mvaddstr(16, 30, buf);
move(6, 0);
drawbox();
refresh();
/*
* If we're not scrolling, wait 1000 msec (1 sec). Use napms() rather
* than sleep() because the latter does odd things on some systems,
* e.g., suspending output as well.
*/
if (scrol)
napms(500);
else
napms(1000);
/*
* This is a safe way to check if we're interrupted - making the signal
* handler set a flag that we can check. Since we're running
* nodelay(), the wgetch() call returns immediately, and in particular
* will return an error if interrupted. This works only if we can
* read from the input, of course.
*/
switch (wgetch(stdscr)) {
case 'q':
count = 1;
break;
case 's':
nodelay(stdscr, FALSE);
break;
case ' ':
nodelay(stdscr, TRUE);
break;
#ifdef KEY_RESIZE
case KEY_RESIZE:
#endif
case '?':
goto restart;
case ERR:
if (sigtermed) {
standend();
endwin();
fprintf(stderr, "gdc terminated by signal %d\n", sigtermed);
ExitProgram(EXIT_FAILURE);
}
/* FALLTHRU */
default:
continue;
}
} while (--count);
standend();
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,301 +0,0 @@
/*
* Name: Towers of Hanoi.
*
* Desc:
* This is a playable copy of towers of hanoi.
* Its sole purpose is to demonstrate my Amiga Curses package.
* This program should compile on any system that has Curses.
* 'hanoi' will give a manual game with 7 playing pieces.
* 'hanoi n' will give a manual game with n playing pieces.
* 'hanoi n a' will give an auto solved game with n playing pieces.
*
* Author: Simon J Raybould (sie@fulcrum.bt.co.uk).
* (This version has been slightly modified by the ncurses maintainers.)
*
* Date: 05.Nov.90
*
* $Id: hanoi.c,v 1.23 2002/03/24 00:40:01 tom Exp $
*/
#include <test.priv.h>
#define NPEGS 3 /* This is not configurable !! */
#define MINTILES 3
#define MAXTILES 9
#define DEFAULTTILES 7
#define TOPLINE 6
#define BASELINE 16
#define STATUSLINE (LINES-3)
#define LEFTPEG 19
#define MIDPEG 39
#define RIGHTPEG 59
#define LENTOIND(x) (((x)-1)/2)
#define OTHER(a,b) (3-((a)+(b)))
struct Peg {
size_t Length[MAXTILES];
int Count;
};
static struct Peg Pegs[NPEGS];
static int PegPos[] =
{LEFTPEG, MIDPEG, RIGHTPEG};
static int TileColour[] =
{
COLOR_GREEN, /* Length 3 */
COLOR_MAGENTA, /* Length 5 */
COLOR_RED, /* Length 7 */
COLOR_BLUE, /* Length 9 */
COLOR_CYAN, /* Length 11 */
COLOR_YELLOW, /* Length 13 */
COLOR_GREEN, /* Length 15 */
COLOR_MAGENTA, /* Length 17 */
COLOR_RED, /* Length 19 */
};
static int NMoves = 0;
static void InitTiles(int NTiles);
static void DisplayTiles(void);
static void MakeMove(int From, int To);
static void AutoMove(int From, int To, int Num);
static void Usage(void);
static int Solved(int NumTiles);
static int GetMove(int *From, int *To);
static int InvalidMove(int From, int To);
int
main(int argc, char **argv)
{
int NTiles, FromCol, ToCol;
bool AutoFlag = 0;
switch (argc) {
case 1:
NTiles = DEFAULTTILES;
break;
case 2:
NTiles = atoi(argv[1]);
if (NTiles > MAXTILES || NTiles < MINTILES) {
fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
ExitProgram(EXIT_FAILURE);
}
break;
case 3:
if (strcmp(argv[2], "a")) {
Usage();
ExitProgram(EXIT_FAILURE);
}
NTiles = atoi(argv[1]);
if (NTiles > MAXTILES || NTiles < MINTILES) {
fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
ExitProgram(EXIT_FAILURE);
}
AutoFlag = TRUE;
break;
default:
Usage();
ExitProgram(EXIT_FAILURE);
}
#ifdef TRACE
trace(TRACE_MAXIMUM);
#endif
initscr();
if (has_colors()) {
int i;
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
for (i = 0; i < 9; i++)
init_pair(i + 1, bg, TileColour[i]);
}
cbreak();
if (LINES < 24) {
endwin();
fprintf(stderr, "Min screen length 24 lines\n");
ExitProgram(EXIT_FAILURE);
}
if (AutoFlag) {
curs_set(0);
leaveok(stdscr, TRUE); /* Attempt to remove cursor */
}
InitTiles(NTiles);
DisplayTiles();
if (AutoFlag) {
do {
noecho();
AutoMove(0, 2, NTiles);
} while (!Solved(NTiles));
sleep(2);
} else {
echo();
for (;;) {
if (GetMove(&FromCol, &ToCol))
break;
if (InvalidMove(FromCol, ToCol)) {
mvaddstr(STATUSLINE, 0, "Invalid Move !!");
refresh();
beep();
continue;
}
MakeMove(FromCol, ToCol);
if (Solved(NTiles)) {
mvprintw(STATUSLINE, 0,
"Well Done !! You did it in %d moves", NMoves);
refresh();
sleep(5);
break;
}
}
}
endwin();
ExitProgram(EXIT_SUCCESS);
}
static int
InvalidMove(int From, int To)
{
if (From >= NPEGS)
return TRUE;
if (From < 0)
return TRUE;
if (To >= NPEGS)
return TRUE;
if (To < 0)
return TRUE;
if (From == To)
return TRUE;
if (!Pegs[From].Count)
return TRUE;
if (Pegs[To].Count &&
Pegs[From].Length[Pegs[From].Count - 1] >
Pegs[To].Length[Pegs[To].Count - 1])
return TRUE;
return FALSE;
}
static void
InitTiles(int NTiles)
{
int Size, SlotNo;
for (Size = NTiles * 2 + 1, SlotNo = 0; Size >= 3; Size -= 2)
Pegs[0].Length[SlotNo++] = Size;
Pegs[0].Count = NTiles;
Pegs[1].Count = 0;
Pegs[2].Count = 0;
}
static void
DisplayTiles(void)
{
int Line, peg, SlotNo;
char TileBuf[BUFSIZ];
erase();
mvaddstr(1, 24, "T O W E R S O F H A N O I");
mvaddstr(3, 34, "SJR 1990");
mvprintw(19, 5, "Moves : %d", NMoves);
attrset(A_REVERSE);
mvaddstr(BASELINE, 8,
" ");
for (Line = TOPLINE; Line < BASELINE; Line++) {
mvaddch(Line, LEFTPEG, ' ');
mvaddch(Line, MIDPEG, ' ');
mvaddch(Line, RIGHTPEG, ' ');
}
mvaddch(BASELINE, LEFTPEG, '1');
mvaddch(BASELINE, MIDPEG, '2');
mvaddch(BASELINE, RIGHTPEG, '3');
attrset(A_NORMAL);
/* Draw tiles */
for (peg = 0; peg < NPEGS; peg++) {
for (SlotNo = 0; SlotNo < Pegs[peg].Count; SlotNo++) {
memset(TileBuf, ' ', Pegs[peg].Length[SlotNo]);
TileBuf[Pegs[peg].Length[SlotNo]] = '\0';
if (has_colors())
attrset(COLOR_PAIR(LENTOIND(Pegs[peg].Length[SlotNo])));
else
attrset(A_REVERSE);
mvaddstr(BASELINE - (SlotNo + 1),
(int) (PegPos[peg] - Pegs[peg].Length[SlotNo] / 2),
TileBuf);
}
}
attrset(A_NORMAL);
refresh();
}
static int
GetMove(int *From, int *To)
{
mvaddstr(STATUSLINE, 0, "Next move ('q' to quit) from ");
clrtoeol();
refresh();
if ((*From = getch()) == 'q')
return TRUE;
*From -= ('0' + 1);
addstr(" to ");
clrtoeol();
refresh();
if ((*To = getch()) == 'q')
return TRUE;
*To -= ('0' + 1);
refresh();
napms(500);
move(STATUSLINE, 0);
clrtoeol();
refresh();
return FALSE;
}
static void
MakeMove(int From, int To)
{
Pegs[From].Count--;
Pegs[To].Length[Pegs[To].Count] = Pegs[From].Length[Pegs[From].Count];
Pegs[To].Count++;
NMoves++;
DisplayTiles();
}
static void
AutoMove(int From, int To, int Num)
{
if (Num == 1) {
MakeMove(From, To);
napms(500);
return;
}
AutoMove(From, OTHER(From, To), Num - 1);
MakeMove(From, To);
napms(500);
AutoMove(OTHER(From, To), To, Num - 1);
}
static int
Solved(int NumTiles)
{
int i;
for (i = 1; i < NPEGS; i++)
if (Pegs[i].Count == NumTiles)
return TRUE;
return FALSE;
}
static void
Usage(void)
{
fprintf(stderr, "Usage: hanoi [<No Of Tiles>] [a]\n");
fprintf(stderr,
"The 'a' option causes the tower to be solved automatically\n");
}

View File

@ -1,226 +0,0 @@
/*
* hashtest.c -- test hash mapping
*
* Generate timing statistics for vertical-motion optimization.
*
* $Id: hashtest.c,v 1.21 2002/03/23 22:17:24 tom Exp $
*/
#ifdef TRACE
#define Trace(p) _tracef p
#define USE_TRACE 1
#else
#define Trace(p) /* nothing */
#define USE_TRACE 0
#endif
#include <ctype.h>
#include <test.priv.h>
#define LO_CHAR ' '
#define HI_CHAR '~'
static bool continuous = FALSE;
static bool reverse_loops = FALSE;
static bool single_step = FALSE;
static bool extend_corner = FALSE;
static int foot_lines = 0;
static int head_lines = 0;
static void
cleanup(void)
{
move(LINES - 1, 0);
clrtoeol();
refresh();
endwin();
}
static RETSIGTYPE
finish(int sig GCC_UNUSED)
{
cleanup();
ExitProgram(EXIT_FAILURE);
}
static void
genlines(int base)
{
int i, j;
#if USE_TRACE
if (base == 'a')
Trace(("Resetting screen"));
else
Trace(("Painting `%c' screen", base));
#endif
/* Do this so writes to lower-right corner don't cause a spurious
* scrolling operation. This _shouldn't_ break the scrolling
* optimization, since that's computed in the refresh() call.
*/
scrollok(stdscr, FALSE);
move(0, 0);
for (i = 0; i < head_lines; i++)
for (j = 0; j < COLS; j++)
addch((j % 8 == 0) ? ('A' + j / 8) : '-');
move(head_lines, 0);
for (i = head_lines; i < LINES - foot_lines; i++) {
int c = (base - LO_CHAR + i) % (HI_CHAR - LO_CHAR + 1) + LO_CHAR;
int hi = (extend_corner || (i < LINES - 1)) ? COLS : COLS - 1;
for (j = 0; j < hi; j++)
addch(c);
}
for (i = LINES - foot_lines; i < LINES; i++) {
move(i, 0);
for (j = 0; j < (extend_corner ? COLS : COLS - 1); j++)
addch((j % 8 == 0) ? ('A' + j / 8) : '-');
}
scrollok(stdscr, TRUE);
if (single_step) {
move(LINES - 1, 0);
getch();
} else
refresh();
}
static void
one_cycle(int ch)
{
if (continuous) {
genlines(ch);
} else if (ch != 'a') {
genlines('a');
genlines(ch);
}
}
static void
run_test(bool optimized GCC_UNUSED)
{
char ch;
int lo = continuous ? LO_CHAR : 'a' - LINES;
int hi = continuous ? HI_CHAR : 'a' + LINES;
if (lo < LO_CHAR)
lo = LO_CHAR;
if (hi > HI_CHAR)
hi = HI_CHAR;
#if defined(TRACE) || defined(NCURSES_TEST)
if (optimized) {
Trace(("With hash mapping"));
_nc_optimize_enable |= OPTIMIZE_HASHMAP;
} else {
Trace(("Without hash mapping"));
_nc_optimize_enable &= ~OPTIMIZE_HASHMAP;
}
#endif
if (reverse_loops)
for (ch = hi; ch >= lo; ch--)
one_cycle(ch);
else
for (ch = lo; ch <= hi; ch++)
one_cycle(ch);
}
static void
usage(void)
{
static const char *const tbl[] =
{
"Usage: hashtest [options]"
,""
,"Options:"
," -c continuous (don't reset between refresh's)"
," -f num leave 'num' lines constant for footer"
," -h num leave 'num' lines constant for header"
," -l num repeat test 'num' times"
," -n test the normal optimizer"
," -o test the hashed optimizer"
," -r reverse the loops"
," -s single-step"
," -x assume lower-right corner extension"
};
size_t n;
for (n = 0; n < SIZEOF(tbl); n++)
fprintf(stderr, "%s\n", tbl[n]);
ExitProgram(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
int c;
int test_loops = 1;
int test_normal = FALSE;
int test_optimize = FALSE;
while ((c = getopt(argc, argv, "cf:h:l:norsx")) != EOF) {
switch (c) {
case 'c':
continuous = TRUE;
break;
case 'f':
foot_lines = atoi(optarg);
break;
case 'h':
head_lines = atoi(optarg);
break;
case 'l':
test_loops = atoi(optarg);
break;
case 'n':
test_normal = TRUE;
break;
case 'o':
test_optimize = TRUE;
break;
case 'r':
reverse_loops = TRUE;
break;
case 's':
single_step = TRUE;
break;
case 'x':
extend_corner = TRUE;
break;
default:
usage();
}
}
if (!test_normal && !test_optimize) {
test_normal = TRUE;
test_optimize = TRUE;
}
#if USE_TRACE
trace(TRACE_TIMES);
#endif
(void) signal(SIGINT, finish); /* arrange interrupts to terminate */
(void) initscr(); /* initialize the curses library */
keypad(stdscr, TRUE); /* enable keyboard mapping */
(void) nonl(); /* tell curses not to do NL->CR/NL on output */
(void) cbreak(); /* take input chars one at a time, no wait for \n */
(void) noecho(); /* don't echo input */
scrollok(stdscr, TRUE);
while (test_loops-- > 0) {
if (test_normal)
run_test(FALSE);
if (test_optimize)
run_test(TRUE);
}
cleanup(); /* we're done */
ExitProgram(EXIT_SUCCESS);
}
/* hashtest.c ends here */

View File

@ -1,15 +0,0 @@
/*
* $Id: keynames.c,v 1.3 2001/09/15 21:46:34 tom Exp $
*/
#include <test.priv.h>
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
int n;
for (n = -1; n < 512; n++) {
printf("%d(%5o):%s\n", n, n, keyname(n));
}
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,700 +0,0 @@
/*
* Knight's Tour - a brain game
*
* The original of this game was anonymous. It had an unbelievably bogus
* interface, you actually had to enter square coordinates! Redesign by
* Eric S. Raymond <esr@snark.thyrsus.com> July 22 1995. Mouse support
* added September 20th 1995.
*
* $Id: knight.c,v 1.24 2002/03/23 22:17:24 tom Exp $
*/
#include <ctype.h>
#include <test.priv.h>
/* board size */
#define BDEPTH 8
#define BWIDTH 8
/* where to start the instructions */
#define INSTRY 2
#define INSTRX 35
/* corner of board */
#define BOARDY 2
#define BOARDX 0
/* notification line */
#define NOTIFYY 21
/* virtual color values */
#define TRAIL_COLOR 1
#define PLUS_COLOR 2
#define MINUS_COLOR 3
#define CX(x) (2 + 4 * (x))
#define CY(y) (1 + 2 * (y))
#define cellmove(y, x) wmove(boardwin, CY(y), CX(x))
#define CXINV(x) (((x) - 1) / 4)
#define CYINV(y) (((y) - 2) / 2)
typedef struct {
short x, y;
} cell;
static WINDOW *boardwin; /* the board window */
static WINDOW *helpwin; /* the help window */
static WINDOW *msgwin; /* the message window */
static cell history[BDEPTH * BWIDTH + 1]; /* choice history */
static chtype minus = '-'; /* possible-move character */
static chtype oldch;
static chtype plus = '+'; /* cursor hot-spot character */
static chtype trail = '#'; /* trail character */
static int movecount; /* count of moves so far */
static int trialcount; /* count of trials so far */
static short board[BDEPTH][BWIDTH]; /* the squares */
/* *INDENT-OFF* */
static const struct {
int y;
int x;
} offsets[] = {
{ 2, 1 },
{ 1, 2 },
{ -1, 2 },
{ -2, 1 },
{ -2, -1 },
{ -1, -2 },
{ 1, -2 },
{ 2, -1 },
};
/* *INDENT-ON* */
static void
init_program(void)
{
srand((unsigned) getpid());
initscr();
cbreak(); /* immediate char return */
noecho(); /* no immediate echo */
boardwin = newwin(BDEPTH * 2 + 1, BWIDTH * 4 + 1, BOARDY, BOARDX);
helpwin = newwin(0, 0, INSTRY, INSTRX);
msgwin = newwin(1, INSTRX - 1, NOTIFYY, 0);
scrollok(msgwin, TRUE);
keypad(boardwin, TRUE);
if (has_colors()) {
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
(void) init_pair(TRAIL_COLOR, COLOR_CYAN, bg);
(void) init_pair(PLUS_COLOR, COLOR_RED, bg);
(void) init_pair(MINUS_COLOR, COLOR_GREEN, bg);
trail |= COLOR_PAIR(TRAIL_COLOR);
plus |= COLOR_PAIR(PLUS_COLOR);
minus |= COLOR_PAIR(MINUS_COLOR);
}
#ifdef NCURSES_MOUSE_VERSION
(void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL);
#endif /* NCURSES_MOUSE_VERSION */
oldch = minus;
}
static void
help1(void)
/* game explanation -- initial help screen */
{
(void) waddstr(helpwin, "Knight's move is a solitaire puzzle. Your\n");
(void) waddstr(helpwin, "objective is to visit each square of the \n");
(void) waddstr(helpwin, "chessboard exactly once by making knight's\n");
(void) waddstr(helpwin, "moves (one square right or left followed \n");
(void) waddstr(helpwin, "by two squares up or down, or two squares \n");
(void) waddstr(helpwin, "right or left followed by one square up or\n");
(void) waddstr(helpwin, "down). You may start anywhere.\n\n");
(void) waddstr(helpwin, "Use arrow keys to move the cursor around.\n");
(void) waddstr(helpwin, "When you want to move your knight to the \n");
(void) waddstr(helpwin, "cursor location, press <space> or Enter.\n");
(void) waddstr(helpwin, "Illegal moves will be rejected with an \n");
(void) waddstr(helpwin, "audible beep.\n\n");
(void) waddstr(helpwin, "The program will detect if you solve the\n");
(void) waddstr(helpwin, "puzzle; also inform you when you run out\n");
(void) waddstr(helpwin, "of legal moves.\n\n");
(void) mvwaddstr(helpwin, NOTIFYY - INSTRY, 0,
"Press `?' to go to keystroke help.");
}
static void
help2(void)
/* keystroke help screen */
{
(void) waddstr(helpwin, "Possible moves are shown with `-'.\n\n");
(void) waddstr(helpwin, "You can move around with the arrow keys or\n");
(void) waddstr(helpwin, "with the rogue/hack movement keys. Other\n");
(void) waddstr(helpwin, "commands allow you to undo moves or redraw.\n");
(void) waddstr(helpwin, "Your mouse may work; try left-button to\n");
(void) waddstr(helpwin, "move to the square under the pointer.\n\n");
(void) waddstr(helpwin, "x,q -- exit y k u 7 8 9\n");
(void) waddstr(helpwin, "r -- redraw screen \\|/ \\|/ \n");
(void) waddstr(helpwin, "bksp -- undo move h-+-l 4-+-6\n");
(void) waddstr(helpwin, "a -- autojump /|\\ /|\\ \n");
(void) waddstr(helpwin, " b j n 1 2 3\n");
(void) waddstr(helpwin, "\nYou can place your knight on the selected\n");
(void) waddstr(helpwin, "square with spacebar, Enter, or the keypad\n");
(void) waddstr(helpwin, "center key. Use F/B to review the path.\n");
(void) mvwaddstr(helpwin, NOTIFYY - INSTRY, 0,
"Press `?' to go to game explanation");
}
static void
show_help(bool * keyhelp)
{
werase(helpwin);
if (*keyhelp) {
help1();
*keyhelp = FALSE;
} else {
help2();
*keyhelp = TRUE;
}
wrefresh(helpwin);
}
static bool
chksqr(int r1, int c1)
{
if ((r1 < 0) || (r1 > BDEPTH - 1))
return (FALSE);
if ((c1 < 0) || (c1 > BWIDTH - 1))
return (FALSE);
return ((!board[r1][c1]) ? TRUE : FALSE);
}
static bool
chkmoves(int rw, int col)
/* check to see if valid moves are available */
{
unsigned n;
for (n = 0; n < SIZEOF(offsets); n++)
if (chksqr(rw + offsets[n].y, col + offsets[n].x))
return (TRUE);
return (FALSE);
}
static void
dosquares(void)
{
int i, j;
mvaddstr(0, 20, "KNIGHT'S MOVE -- a logical solitaire");
move(BOARDY, BOARDX);
waddch(boardwin, ACS_ULCORNER);
for (j = 0; j < 7; j++) {
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_TTEE);
}
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_URCORNER);
for (i = 1; i < BDEPTH; i++) {
move(BOARDY + i * 2 - 1, BOARDX);
waddch(boardwin, ACS_VLINE);
for (j = 0; j < BWIDTH; j++) {
waddch(boardwin, ' ');
waddch(boardwin, ' ');
waddch(boardwin, ' ');
waddch(boardwin, ACS_VLINE);
}
move(BOARDY + i * 2, BOARDX);
waddch(boardwin, ACS_LTEE);
for (j = 0; j < BWIDTH - 1; j++) {
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_PLUS);
}
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_RTEE);
}
move(BOARDY + i * 2 - 1, BOARDX);
waddch(boardwin, ACS_VLINE);
for (j = 0; j < BWIDTH; j++) {
waddch(boardwin, ' ');
waddch(boardwin, ' ');
waddch(boardwin, ' ');
waddch(boardwin, ACS_VLINE);
}
move(BOARDY + i * 2, BOARDX);
waddch(boardwin, ACS_LLCORNER);
for (j = 0; j < BWIDTH - 1; j++) {
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_BTEE);
}
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_HLINE);
waddch(boardwin, ACS_LRCORNER);
}
static void
mark_possibles(int prow, int pcol, chtype mark)
{
unsigned n;
for (n = 0; n < SIZEOF(offsets); n++) {
if (chksqr(prow + offsets[n].y, pcol + offsets[n].x)) {
cellmove(prow + offsets[n].y, pcol + offsets[n].x);
waddch(boardwin, mark);
}
}
}
static void
find_next_move(int *y, int *x)
{
unsigned j, k;
int found = -1;
int first = -1;
int next = 0;
int oldy, oldx;
int newy, newx;
if (movecount > 1) {
oldy = history[movecount - 1].y;
oldx = history[movecount - 1].x;
for (j = 0; j < SIZEOF(offsets) * 2; j++) {
k = j % SIZEOF(offsets);
newy = oldy + offsets[k].y;
newx = oldx + offsets[k].x;
if (chksqr(newy, newx)) {
if (first < 0)
first = k;
if (newy == *y
&& newx == *x) {
found = k;
} else if (found >= 0) {
next = k;
break;
}
}
}
if (found < 0)
next = first;
if (next >= 0) {
*y = oldy + offsets[next].y;
*x = oldx + offsets[next].x;
}
} else {
beep();
}
}
static void
unmarkcell(int row, int column)
{
cellmove(row, column);
waddch(boardwin, '\b');
waddch(boardwin, ' ');
waddch(boardwin, minus);
waddch(boardwin, ' ');
}
static void
markcell(chtype tchar, int row, int column)
{
cellmove(row, column);
waddch(boardwin, '\b');
waddch(boardwin, tchar);
waddch(boardwin, tchar);
waddch(boardwin, tchar);
}
static void
drawmove(chtype tchar, int oldy, int oldx, int row, int column)
/* place the stars, update board & currents */
{
if (movecount <= 1) {
int i, j;
for (i = 0; i < BDEPTH; i++) {
for (j = 0; j < BWIDTH; j++) {
if (movecount == 0) {
unmarkcell(i, j);
} else {
cellmove(i, j);
if (winch(boardwin) == minus)
waddch(boardwin, movecount ? ' ' : minus);
}
}
}
} else {
markcell(tchar, oldy, oldx);
mark_possibles(oldy, oldx, ' ');
}
if (row != -1 && column != -1) {
markcell(trail, row, column);
mark_possibles(row, column, minus);
board[row][column] = TRUE;
}
wprintw(msgwin, "\nMove %d", movecount);
if (trialcount != movecount)
wprintw(msgwin, " (%d tries)", trialcount);
wclrtoeol(msgwin);
}
static int
iabs(int num)
{
if (num < 0)
return (-num);
else
return (num);
}
static bool
evalmove(int row, int column)
/* evaluate move */
{
if (movecount == 1)
return (TRUE);
else if (board[row][column] == TRUE) {
waddstr(msgwin, "\nYou've already been there.");
return (FALSE);
} else {
int rdif = iabs(row - history[movecount - 1].y);
int cdif = iabs(column - history[movecount - 1].x);
if (!((rdif == 1) && (cdif == 2)) && !((rdif == 2) && (cdif == 1))) {
waddstr(msgwin, "\nThat's not a legal knight's move.");
return (FALSE);
}
}
return (TRUE);
}
static int
completed(void)
{
int i, j, count = 0;
for (i = 0; i < BDEPTH; i++)
for (j = 0; j < BWIDTH; j++)
if (board[i][j] != 0)
count += 1;
return (count == (BWIDTH * BDEPTH) ? -1 : count);
}
static void
no_previous_move(void)
{
waddstr(msgwin, "\nNo previous move.");
beep();
}
static void
play(void)
/* play the game */
{
bool keyhelp; /* TRUE if keystroke help is up */
int i, j, count;
int lastcol = 0; /* last location visited */
int lastrow = 0;
int ny = 0, nx = 0;
int review = 0; /* review history */
int rw = 0, col = 0; /* current row and column */
do {
/* clear screen and draw board */
werase(boardwin);
werase(helpwin);
werase(msgwin);
dosquares();
help1();
wnoutrefresh(stdscr);
wnoutrefresh(helpwin);
wnoutrefresh(msgwin);
wnoutrefresh(boardwin);
doupdate();
movecount = 0;
for (i = 0; i < BDEPTH; i++) {
for (j = 0; j < BWIDTH; j++) {
board[i][j] = FALSE;
unmarkcell(i, j);
}
}
memset(history, 0, sizeof(history));
history[0].y = history[0].x = -1;
history[1].y = history[1].x = -1;
lastrow = lastcol = -2;
movecount = 1;
trialcount = 1;
keyhelp = FALSE;
show_help(&keyhelp);
for (;;) {
if (rw != lastrow || col != lastcol) {
if (lastrow >= 0 && lastcol >= 0) {
cellmove(lastrow, lastcol);
if (board[lastrow][lastcol])
waddch(boardwin, trail);
else
waddch(boardwin, oldch);
}
cellmove(rw, col);
oldch = winch(boardwin);
lastrow = rw;
lastcol = col;
}
cellmove(rw, col);
waddch(boardwin, plus);
cellmove(rw, col);
wrefresh(msgwin);
switch (wgetch(boardwin)) {
case 'k':
case '8':
case KEY_UP:
ny = rw + BDEPTH - 1;
nx = col;
break;
case 'j':
case '2':
case KEY_DOWN:
ny = rw + 1;
nx = col;
break;
case 'h':
case '4':
case KEY_LEFT:
ny = rw;
nx = col + BWIDTH - 1;
break;
case 'l':
case '6':
case KEY_RIGHT:
ny = rw;
nx = col + 1;
break;
case 'y':
case '7':
case KEY_A1:
ny = rw + BDEPTH - 1;
nx = col + BWIDTH - 1;
break;
case 'b':
case '1':
case KEY_C1:
ny = rw + 1;
nx = col + BWIDTH - 1;
break;
case 'u':
case '9':
case KEY_A3:
ny = rw + BDEPTH - 1;
nx = col + 1;
break;
case 'n':
case '3':
case KEY_C3:
ny = rw + 1;
nx = col + 1;
break;
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE:
{
MEVENT myevent;
getmouse(&myevent);
if (myevent.y >= CY(0) && myevent.y <= CY(BDEPTH)
&& myevent.x >= CX(0) && myevent.x <= CX(BWIDTH)) {
nx = CXINV(myevent.x);
ny = CYINV(myevent.y);
ungetch('\n');
break;
} else {
beep();
continue;
}
}
#endif /* NCURSES_MOUSE_VERSION */
case KEY_B2:
case '\n':
case ' ':
review = 0;
if (evalmove(rw, col)) {
drawmove(trail,
history[movecount - 1].y,
history[movecount - 1].x,
rw, col);
history[movecount].y = rw;
history[movecount].x = col;
movecount++;
trialcount++;
if (!chkmoves(rw, col)) {
if (completed() < 0) {
waddstr(msgwin, "\nYou won.");
} else {
waddstr(msgwin,
"\nNo further moves are possible.");
}
}
} else {
beep();
}
break;
case KEY_UNDO:
case KEY_BACKSPACE:
case '\b':
review = 0;
if (movecount <= 0) {
no_previous_move();
} else if (movecount <= 1) {
ny = history[movecount].y;
nx = history[movecount].x;
if (nx < 0 || ny < 0) {
ny = lastrow;
nx = lastcol;
}
movecount = 0;
board[ny][nx] = FALSE;
oldch = minus;
drawmove(' ', ny, nx, -1, -1);
movecount = 1;
trialcount = 1;
no_previous_move();
} else {
int oldy = history[movecount - 1].y;
int oldx = history[movecount - 1].x;
if (!board[rw][col]) {
cellmove(rw, col);
waddch(boardwin, ' ');
}
board[oldy][oldx] = FALSE;
--movecount;
ny = history[movecount - 1].y;
nx = history[movecount - 1].x;
if (nx < 0 || ny < 0) {
ny = oldy;
nx = oldx;
}
drawmove(' ', oldy, oldx, ny, nx);
/* avoid problems if we just changed the current cell */
cellmove(lastrow, lastcol);
oldch = winch(boardwin);
}
break;
case 'a':
nx = col;
ny = rw;
find_next_move(&ny, &nx);
break;
case 'F':
if (review > 0) {
review--;
ny = history[movecount - review - 1].y;
nx = history[movecount - review - 1].x;
} else {
beep();
}
break;
case 'B':
if (review < movecount - 2) {
review++;
ny = history[movecount - review - 1].y;
nx = history[movecount - review - 1].x;
} else {
beep();
}
break;
case KEY_REDO:
case '\f':
case 'r':
clearok(curscr, TRUE);
wnoutrefresh(stdscr);
wnoutrefresh(boardwin);
wnoutrefresh(msgwin);
wnoutrefresh(helpwin);
doupdate();
break;
case 'q':
case 'x':
goto dropout;
case '?':
show_help(&keyhelp);
break;
default:
beep();
break;
}
col = nx % BWIDTH;
rw = ny % BDEPTH;
}
dropout:
if ((count = completed()) < 0)
wprintw(msgwin, "\nYou won. Care to try again? ");
else
wprintw(msgwin, "\n%d squares filled. Try again? ", count);
wclrtoeol(msgwin);
} while
(tolower(wgetch(msgwin)) == 'y');
}
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
init_program();
play();
endwin();
ExitProgram(EXIT_SUCCESS);
}
/* knight.c ends here */

View File

@ -1,144 +0,0 @@
/*
* Test lower-right-hand corner access
*
* originally by Eric S. Raymond <esr@thyrsus.com>, written for animation
* and resizing -TD
*
* This can't be part of the ncurses test-program, because ncurses rips off the
* bottom line to do labels.
*
* $Id: lrtest.c,v 0.17 2002/04/06 20:45:22 tom Exp $
*/
#include <test.priv.h>
typedef struct {
int y, x, mode, dir, inc;
chtype value;
} MARK;
/*
* Make a couple of markers go 'round the border to demonstrate that we can
* really write to all positions properly.
*/
static void
show(MARK * m)
{
mvaddch(m->y, m->x, m->value);
if (m->mode == 0) { /* along the x-direction */
m->x += m->inc;
if (m->x >= COLS) {
m->x = COLS - 1;
m->inc = -m->dir * m->inc;
m->y += m->inc;
m->mode = 1;
} else if (m->x < 0) {
m->x = 0;
m->inc = -m->dir * m->inc;
m->y += m->inc;
m->mode = 1;
}
} else { /* along the y-direction */
m->y += m->inc;
if (m->y >= LINES) {
m->y = LINES - 1;
m->inc = m->dir * m->inc;
m->x += m->inc;
m->mode = 0;
} else if (m->y < 0) {
m->y = 0;
m->inc = m->dir * m->inc;
m->x += m->inc;
m->mode = 0;
}
}
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
static MARK marks[] =
{
{0, 0, 0, -1, 1, '+' | A_BOLD},
{0, 0, 1, 1, 2, 'X'},
{0, 0, 1, -1, 3, 'Y'},
{0, 8, 0, -1, 1, '+' | A_BOLD},
{0, 9, 0, -1, 1, '+' | A_BOLD},
{1, 0, 1, 1, 1, '*' | A_REVERSE},
{2, 0, 1, 1, 1, '*' | A_REVERSE}
};
initscr();
noecho();
cbreak();
nodelay(stdscr, TRUE);
curs_set(0);
#ifdef KEY_RESIZE
keypad(stdscr, TRUE);
restart:
#endif
move(LINES / 2 - 1, 4);
if (!(has_ic()
/* see PutCharLR() */
|| auto_right_margin
|| (enter_am_mode && exit_am_mode))) {
addstr("Your terminal lacks the capabilities needed to address the\n");
move(LINES / 2, 4);
addstr("lower-right-hand corner of the screen.\n");
} else {
addstr("This is a test of access to the lower right corner.\n");
move(LINES / 2, 4);
addstr("If the top of the box is missing, the test failed.\n");
move(LINES / 2 + 1, 4);
addstr("Please report this (with a copy of your terminfo entry).\n");
move(LINES / 2 + 2, 4);
addstr("to the ncurses maintainers, at bug-ncurses@gnu.org.\n");
}
for (;;) {
int ch;
unsigned n;
box(stdscr, 0, 0);
for (n = 0; n < SIZEOF(marks); n++) {
show(&marks[n]);
}
if ((ch = getch()) > 0) {
if (ch == 'q')
break;
else if (ch == 's')
nodelay(stdscr, FALSE);
else if (ch == ' ')
nodelay(stdscr, TRUE);
#ifdef KEY_RESIZE
else if (ch == KEY_RESIZE) {
for (n = 0; n < SIZEOF(marks); n++) {
if (marks[n].mode == 0) { /* moving along x-direction */
if (marks[n].y)
marks[n].y = LINES - 1;
} else {
if (marks[n].x)
marks[n].x = COLS - 1;
}
}
flash();
erase();
wrefresh(curscr);
goto restart;
}
#endif
}
napms(50);
refresh();
}
curs_set(1);
endwin();
ExitProgram(EXIT_SUCCESS);
}
/* lrtest.c ends here */

View File

@ -1,59 +0,0 @@
# Test-Program modules
# $Id: modules,v 1.13 2000/02/13 01:05:13 tom Exp $
##############################################################################
# Copyright (c) 1998,1999,2000 Free Software Foundation, Inc. #
# #
# Permission is hereby granted, free of charge, to any person obtaining a #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation #
# the rights to use, copy, modify, merge, publish, distribute, distribute #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the #
# following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
# DEALINGS IN THE SOFTWARE. #
# #
# Except as contained in this notice, the name(s) of the above copyright #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
#
# Author: Thomas E. Dickey <dickey@clark.net> 1997
#
@ base
blue progs $(srcdir) ../include/term.h
bs progs $(srcdir)
cardfile progs $(srcdir) ../include/panel.h ../include/menu.h ../include/form.h
ditto progs $(srcdir)
dots progs $(srcdir) ../include/term.h
filter progs $(srcdir)
firework progs $(srcdir) ../include/term.h
firstlast progs $(srcdir)
gdc progs $(srcdir)
hanoi progs $(srcdir)
hashtest progs $(srcdir)
keynames progs $(srcdir)
knight progs $(srcdir)
lrtest progs $(srcdir)
ncurses progs $(srcdir) ../include/panel.h ../include/menu.h ../include/form.h
newdemo progs $(srcdir)
rain progs $(srcdir) ../include/term.h
railroad progs $(srcdir) ../include/termcap.h
tclock progs $(srcdir)
testaddch progs $(srcdir)
testcurs progs $(srcdir)
testscanw progs $(srcdir)
view progs $(srcdir)
worm progs $(srcdir)
xmas progs $(srcdir)

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +0,0 @@
/****************************************************************************
* Copyright (c) 1998 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Thomas E. Dickey <dickey@clark.net> 1998 *
****************************************************************************/
/*
* $Id: ncurses_tst.hin,v 1.2 1998/02/11 12:14:05 tom Exp $
*
* This is a template-file used to generate the "ncurses_cfg.h" file.
*
* Rather than list every definition, the configuration script substitutes
* the definitions that it finds using 'sed'. You need a patch (971222)
* to autoconf 2.12 to do this.
*/
#ifndef NC_CONFIG_H
#define NC_CONFIG_H
@DEFS@
/* The C compiler may not treat these properly but C++ has to */
#ifdef __cplusplus
#undef const
#undef inline
#else
#if defined(lint) || defined(TRACE)
#undef inline
#define inline /* nothing */
#endif
#endif
#endif /* NC_CONFIG_H */

View File

@ -1,356 +0,0 @@
/*
* newdemo.c - A demo program using PDCurses. The program illustrate
* the use of colours for text output.
*
* $Id: newdemo.c,v 1.23 2002/03/23 22:17:24 tom Exp $
*/
#include <time.h>
#include <test.priv.h>
#define delay_output(x) napms(x)
/*
* The Australian map
*/
const char *AusMap[16] =
{
" A A ",
" N.T. AAAAA AAAA ",
" AAAAAAAAAAA AAAAAAAA ",
" AAAAAAAAAAAAAAAAAAAAAAAAA Qld.",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
" AAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
" AAAAAAAAAAAAAAAAAAAAAAAAA N.S.W.",
"W.A. AAAAAAAAA AAAAAA Vic.",
" AAA S.A. AA",
" A Tas.",
""
};
/*
* Funny messages
*/
#define NMESSAGES 6
NCURSES_CONST char *messages[] =
{
"Hello from the Land Down Under",
"The Land of crocs. and a big Red Rock",
"Where the sunflower runs along the highways",
"the dusty red roads lead one to loneliness",
"Blue sky in the morning and",
"freezing nights and twinkling stars",
""
};
/*
* Trap interrupt
*/
static RETSIGTYPE
trap(int sig GCC_UNUSED)
{
endwin();
ExitProgram(EXIT_FAILURE);
}
/*
* Wait for user
*/
static int
WaitForUser(WINDOW *win)
{
time_t t;
chtype key;
nodelay(win, TRUE);
t = time((time_t *) 0);
while (1) {
if ((int) (key = wgetch(win)) != ERR) {
if (key == 'q' || key == 'Q')
return 1;
else
return 0;
}
if (time((time_t *) 0) - t > 5)
return 0;
}
}
static void
set_colors(WINDOW *win, int pair, int foreground, int background)
{
if (has_colors()) {
if (pair > COLOR_PAIRS)
pair = COLOR_PAIRS;
init_pair(pair, foreground, background);
wattrset(win, COLOR_PAIR(pair));
}
}
static int
use_colors(WINDOW *win, int pair, int attrs)
{
if (has_colors()) {
if (pair > COLOR_PAIRS)
pair = COLOR_PAIRS;
attrs |= COLOR_PAIR(pair);
}
wattrset(win, attrs);
return attrs;
}
/*
* Test sub windows
*/
static int
SubWinTest(WINDOW *win)
{
int w, h, sw, sh, bx, by;
WINDOW *swin1, *swin2, *swin3;
getmaxyx(win, h, w);
getbegyx(win, by, bx);
sw = w / 3;
sh = h / 3;
if ((swin1 = subwin(win, sh, sw, by + 3, bx + 5)) == NULL)
return 1;
if ((swin2 = subwin(win, sh, sw, by + 4, bx + 8)) == NULL)
return 1;
if ((swin3 = subwin(win, sh, sw, by + 5, bx + 11)) == NULL)
return 1;
set_colors(swin1, 8, COLOR_RED, COLOR_BLUE);
werase(swin1);
mvwaddstr(swin1, 0, 3, "Sub-window 1");
wrefresh(swin1);
set_colors(swin2, 9, COLOR_CYAN, COLOR_MAGENTA);
werase(swin2);
mvwaddstr(swin2, 0, 3, "Sub-window 2");
wrefresh(swin2);
set_colors(swin3, 10, COLOR_YELLOW, COLOR_GREEN);
werase(swin3);
mvwaddstr(swin3, 0, 3, "Sub-window 3");
wrefresh(swin3);
delwin(swin1);
delwin(swin2);
delwin(swin3);
WaitForUser(win);
return 0;
}
static int
bounce(int n, int *dir, int len)
{
if (*dir > 0)
++n;
else
--n;
if (n <= 1 || n >= len - 2)
*dir = *dir ? 0 : 1;
return n;
}
/*
* Bouncing balls
*/
static int
BouncingBalls(WINDOW *win)
{
int w, h;
int x1, y1, xd1, yd1;
int x2, y2, xd2, yd2;
int x3, y3, xd3, yd3;
getmaxyx(win, h, w);
x1 = 2 + rand() % (w - 4);
y1 = 2 + rand() % (h - 4);
x2 = 2 + rand() % (w - 4);
y2 = 2 + rand() % (h - 4);
x3 = 2 + rand() % (w - 4);
y3 = 2 + rand() % (h - 4);
xd1 = 1;
yd1 = 1;
xd2 = 1;
yd2 = 0;
xd3 = 0;
yd3 = 1;
nodelay(win, TRUE);
while (wgetch(win) == ERR) {
x1 = bounce(x1, &xd1, w);
y1 = bounce(y1, &yd1, h);
x2 = bounce(x2, &xd2, w);
y2 = bounce(y2, &yd2, h);
x3 = bounce(x3, &xd3, w);
y3 = bounce(y3, &yd3, h);
set_colors(win, 11, COLOR_RED, COLOR_BLUE);
mvwaddch(win, y1, x1, 'O');
set_colors(win, 12, COLOR_BLUE, COLOR_RED);
mvwaddch(win, y2, x2, '*');
set_colors(win, 13, COLOR_YELLOW, COLOR_WHITE);
mvwaddch(win, y3, x3, '@');
wmove(win, 0, 0);
wrefresh(win);
delay_output(100);
}
return 0;
}
/*
* Main driver
*/
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
WINDOW *win;
int w, x, y, i, j, k;
char buffer[200];
const char *message;
int width, height;
chtype save[80];
chtype c;
initscr();
if (has_colors())
start_color();
cbreak();
curs_set(0);
signal(SIGINT, trap);
width = 48;
height = 14; /* Create a drawing window */
win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2);
if (win == NULL) {
endwin();
ExitProgram(EXIT_FAILURE);
}
while (1) {
set_colors(win, 1, COLOR_WHITE, COLOR_BLUE);
werase(win);
set_colors(win, 2, COLOR_RED, COLOR_RED);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
/* Do ramdom output of a character */
use_colors(win, 1, A_NORMAL);
c = 'a';
for (i = 0; i < 5000; ++i) {
x = rand() % (width - 2) + 1;
y = rand() % (height - 2) + 1;
mvwaddch(win, y, x, c);
wrefresh(win);
nodelay(win, TRUE);
if (wgetch(win) != ERR)
break;
if (i == 2000) {
c = 'b';
set_colors(win, 3, COLOR_CYAN, COLOR_YELLOW);
}
}
SubWinTest(win);
/* Erase and draw green window */
set_colors(win, 4, COLOR_YELLOW, COLOR_GREEN);
wbkgd(win, use_colors(win, 4, A_BOLD));
werase(win);
wrefresh(win);
/* Draw RED bounding box */
use_colors(win, 2, A_NORMAL);
box(win, ' ', ' ');
wrefresh(win);
/* Display Australia map */
use_colors(win, 4, A_BOLD);
i = 0;
while (*AusMap[i]) {
mvwaddstr(win, i + 1, 8, AusMap[i]);
wrefresh(win);
delay_output(50);
++i;
}
set_colors(win, 5, COLOR_BLUE, COLOR_WHITE);
use_colors(win, 5, A_BLINK);
mvwaddstr(win, height - 2, 6, " PDCurses 2.1 for DOS, OS/2 and Unix");
wrefresh(win);
/* Draw running messages */
set_colors(win, 6, COLOR_YELLOW, COLOR_WHITE);
message = messages[j = 0];
i = 1;
w = width - 2;
strcpy(buffer, message);
while (j < NMESSAGES) {
while ((int) strlen(buffer) < w) {
strcat(buffer, " ... ");
strcat(buffer, messages[++j % NMESSAGES]);
}
if (i < w)
mvwaddnstr(win, height / 2, w - i, buffer, i);
else
mvwaddnstr(win, height / 2, 1, buffer, w);
wrefresh(win);
nodelay(win, TRUE);
if (wgetch(win) != ERR) {
flushinp();
break;
}
if (i++ >= w) {
for (k = 0; (buffer[k] = buffer[k + 1]) != '\0'; k++) ;
}
delay_output(100);
}
j = 0;
/* Draw running As across in RED */
set_colors(win, 7, COLOR_RED, COLOR_GREEN);
for (i = 2; i < width - 4; ++i) {
k = mvwinch(win, 4, i);
if (k == ERR)
break;
save[j++] = c = k;
c &= A_CHARTEXT;
mvwaddch(win, 4, i, c);
}
wrefresh(win);
/* Put a message up wait for a key */
i = height - 2;
use_colors(win, 5, A_NORMAL);
mvwaddstr(win, i, 5, " Type a key to continue or 'Q' to quit ");
wrefresh(win);
if (WaitForUser(win) == 1)
break;
j = 0; /* Restore the old line */
for (i = 2; i < width - 4; ++i)
mvwaddch(win, 4, i, save[j++]);
wrefresh(win);
BouncingBalls(win);
/* Put a message up wait for a key */
i = height - 2;
use_colors(win, 5, A_NORMAL);
mvwaddstr(win, i, 5, " Type a key to continue or 'Q' to quit ");
wrefresh(win);
if (WaitForUser(win) == 1)
break;
}
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,242 +0,0 @@
/****************************************************************************
* Copyright (c) 2000-2001,2002 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/*
* Author: Thomas E. Dickey <dickey@clark.net> 2000
*
* $Id: railroad.c,v 1.10 2002/04/06 20:45:22 tom Exp $
*
* A simple demo of the termcap interface.
*/
#include <test.priv.h>
#include <ctype.h>
static char *wipeit;
static char *moveit;
static int length;
static int height;
static char *finisC;
static char *finisS;
static char *finisU;
static char *startC;
static char *startS;
static char *startU;
static char *backup;
static bool interrupted = FALSE;
static int
outc(int c)
{
if (interrupted) {
char tmp = c;
write(STDOUT_FILENO, &tmp, 1);
} else {
putc(c, stdout);
}
return 0;
}
static void
PutChar(int ch)
{
putchar(ch);
fflush(stdout);
napms(moveit ? 10 : 50); /* not really termcap... */
}
static void
Backup(void)
{
tputs(backup != 0 ? backup : "\b", 1, outc);
}
static void
ShowCursor(int flag)
{
if (startC != 0 && finisC != 0) {
tputs(flag ? startC : finisC, 1, outc);
}
}
static void
StandOut(int flag)
{
if (startS != 0 && finisS != 0) {
tputs(flag ? startS : finisS, 1, outc);
}
}
static void
Underline(int flag)
{
if (startU != 0 && finisU != 0) {
tputs(flag ? startU : finisU, 1, outc);
}
}
static void
ShowSign(char *string)
{
char *base = string;
int ch, first, last;
if (moveit != 0) {
tputs(tgoto(moveit, 0, height - 1), 1, outc);
tputs(wipeit, 1, outc);
}
while (*string != 0) {
ch = *string;
if (ch != ' ') {
if (moveit != 0) {
for (first = length - 2; first >= (string - base); first--) {
if (first < length - 1) {
tputs(tgoto(moveit, first + 1, height - 1), 1, outc);
PutChar(' ');
}
tputs(tgoto(moveit, first, height - 1), 1, outc);
PutChar(ch);
}
} else {
last = ch;
if (isalpha(ch)) {
first = isupper(ch) ? 'A' : 'a';
} else if (isdigit(ch)) {
first = '0';
} else {
first = ch;
}
if (first < last) {
Underline(1);
while (first < last) {
PutChar(first);
Backup();
first++;
}
Underline(0);
}
}
if (moveit != 0)
Backup();
}
StandOut(1);
PutChar(ch);
StandOut(0);
fflush(stdout);
string++;
}
if (moveit != 0)
tputs(wipeit, 1, outc);
putchar('\n');
}
static void
cleanup(void)
{
Underline(0);
StandOut(0);
ShowCursor(1);
}
static void
onsig(int n GCC_UNUSED)
{
interrupted = TRUE;
cleanup();
ExitProgram(EXIT_FAILURE);
}
static void
railroad(char **args)
{
NCURSES_CONST char *name = getenv("TERM");
char buffer[1024];
char area[1024], *ap = area;
int j;
if (name == 0)
name = "dumb";
if (tgetent(buffer, name)) {
wipeit = tgetstr("ce", &ap);
height = tgetnum("li");
length = tgetnum("co");
moveit = tgetstr("cm", &ap);
if (wipeit == 0
|| moveit == 0
|| height <= 0
|| length <= 0) {
wipeit = 0;
moveit = 0;
height = 0;
length = 0;
}
startS = tgetstr("so", &ap);
finisS = tgetstr("se", &ap);
startU = tgetstr("us", &ap);
finisU = tgetstr("ue", &ap);
backup = tgetstr("le", &ap);
startC = tgetstr("ve", &ap);
finisC = tgetstr("vi", &ap);
ShowCursor(0);
for (j = SIGHUP; j <= SIGTERM; j++)
if (signal(j, SIG_IGN) != SIG_IGN)
signal(j, onsig);
while (*args) {
ShowSign(*args++);
}
ShowCursor(1);
}
}
int
main(int argc, char *argv[])
{
if (argc > 1) {
railroad(argv + 1);
} else {
static char world[] = "Hello World";
static char *hello[] =
{world, 0};
railroad(hello);
}
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,134 +0,0 @@
/*
* $Id: rain.c,v 1.19 2002/04/06 20:45:22 tom Exp $
*/
#include <test.priv.h>
/* rain 11/3/1980 EPS/CITHEP */
static float ranf(void);
static void onsig(int sig);
static int
next_j(int j)
{
if (j == 0)
j = 4;
else
--j;
if (has_colors()) {
int z = (int) (3 * ranf());
chtype color = COLOR_PAIR(z);
if (z)
color |= A_BOLD;
attrset(color);
}
return j;
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
int x, y, j;
static int xpos[5], ypos[5];
float r;
float c;
for (j = SIGHUP; j <= SIGTERM; j++)
if (signal(j, SIG_IGN) != SIG_IGN)
signal(j, onsig);
initscr();
if (has_colors()) {
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
init_pair(1, COLOR_BLUE, bg);
init_pair(2, COLOR_CYAN, bg);
}
nl();
noecho();
curs_set(0);
timeout(0);
r = (float) (LINES - 4);
c = (float) (COLS - 4);
for (j = 5; --j >= 0;) {
xpos[j] = (int) (c * ranf()) + 2;
ypos[j] = (int) (r * ranf()) + 2;
}
for (j = 0;;) {
x = (int) (c * ranf()) + 2;
y = (int) (r * ranf()) + 2;
mvaddch(y, x, '.');
mvaddch(ypos[j], xpos[j], 'o');
j = next_j(j);
mvaddch(ypos[j], xpos[j], 'O');
j = next_j(j);
mvaddch(ypos[j] - 1, xpos[j], '-');
mvaddstr(ypos[j], xpos[j] - 1, "|.|");
mvaddch(ypos[j] + 1, xpos[j], '-');
j = next_j(j);
mvaddch(ypos[j] - 2, xpos[j], '-');
mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\");
mvaddstr(ypos[j], xpos[j] - 2, "| O |");
mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
mvaddch(ypos[j] + 2, xpos[j], '-');
j = next_j(j);
mvaddch(ypos[j] - 2, xpos[j], ' ');
mvaddstr(ypos[j] - 1, xpos[j] - 1, " ");
mvaddstr(ypos[j], xpos[j] - 2, " ");
mvaddstr(ypos[j] + 1, xpos[j] - 1, " ");
mvaddch(ypos[j] + 2, xpos[j], ' ');
xpos[j] = x;
ypos[j] = y;
switch (getch()) {
case ('q'):
case ('Q'):
curs_set(1);
endwin();
ExitProgram(EXIT_SUCCESS);
case 's':
nodelay(stdscr, FALSE);
break;
case ' ':
nodelay(stdscr, TRUE);
break;
#ifdef KEY_RESIZE
case (KEY_RESIZE):
r = (float) (LINES - 4);
c = (float) (COLS - 4);
break;
#endif
}
napms(50);
}
}
static void
onsig(int n GCC_UNUSED)
{
curs_set(1);
endwin();
ExitProgram(EXIT_FAILURE);
}
static float
ranf(void)
{
long r = (rand() & 077777);
return ((float) r / 32768.);
}

View File

@ -1,246 +0,0 @@
#include "test.priv.h"
#include <math.h>
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
/*
tclock - analog/digital clock for curses.
If it gives you joy, then
(a) I'm glad
(b) you need to get out more :-)
This program is copyright Howard Jones, September 1994
(ha.jones@ic.ac.uk). It may be freely distributed as
long as this copyright message remains intact, and any
modifications are clearly marked as such. [In fact, if
you modify it, I wouldn't mind the modifications back,
especially if they add any nice features. A good one
would be a precalc table for the 60 hand positions, so
that the floating point stuff can be ditched. As I said,
it was a 20 hackup minute job.]
COMING SOON: tfishtank. Be the envy of your mac-owning
colleagues.
*/
/* To compile: cc -o tclock tclock.c -lcurses -lm */
#ifndef PI
#define PI 3.141592654
#endif
#define sign(_x) (_x<0?-1:1)
#define ASPECT 2.2
#define ROUND(value) ((int)((value) + 0.5))
#define A2X(angle,radius) ROUND(ASPECT * radius * sin(angle))
#define A2Y(angle,radius) ROUND(radius * cos(angle))
/* Plot a point */
static void
plot(int x, int y, char col)
{
mvaddch(y, x, (chtype) col);
}
/* Draw a diagonal(arbitrary) line using Bresenham's alogrithm. */
static void
dline(int pair, int from_x, int from_y, int x2, int y2, char ch)
{
int dx, dy;
int ax, ay;
int sx, sy;
int x, y;
int d;
if (has_colors())
attrset(COLOR_PAIR(pair));
dx = x2 - from_x;
dy = y2 - from_y;
ax = abs(dx * 2);
ay = abs(dy * 2);
sx = sign(dx);
sy = sign(dy);
x = from_x;
y = from_y;
if (ax > ay) {
d = ay - (ax / 2);
while (1) {
plot(x, y, ch);
if (x == x2)
return;
if (d >= 0) {
y += sy;
d -= ax;
}
x += sx;
d += ay;
}
} else {
d = ax - (ay / 2);
while (1) {
plot(x, y, ch);
if (y == y2)
return;
if (d >= 0) {
x += sx;
d -= ay;
}
y += sy;
d += ax;
}
}
}
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
int i, cx, cy;
double cr, mradius, hradius, mangle, hangle;
double sangle, sradius, hours;
int hdx, hdy;
int mdx, mdy;
int sdx, sdy;
int ch;
int lastbeep = -1;
time_t tim;
struct tm *t;
char szChar[10];
int my_bg = COLOR_BLACK;
#if HAVE_GETTIMEOFDAY
struct timeval current;
double fraction = 0.0;
#endif
initscr();
noecho();
cbreak();
nodelay(stdscr, TRUE);
curs_set(0);
if (has_colors()) {
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
my_bg = -1;
#endif
init_pair(1, COLOR_RED, my_bg);
init_pair(2, COLOR_MAGENTA, my_bg);
init_pair(3, COLOR_GREEN, my_bg);
}
#ifdef KEY_RESIZE
keypad(stdscr, TRUE);
restart:
#endif
cx = (COLS - 1) / 2; /* 39 */
cy = LINES / 2; /* 12 */
if (cx / ASPECT < cy)
cr = cx / ASPECT;
else
cr = cy;
sradius = (5 * cr) / 6; /* 10 */
mradius = (3 * cr) / 4; /* 9 */
hradius = cr / 2; /* 6 */
for (i = 0; i < 12; i++) {
sangle = (i + 1) * (2.0 * PI) / 12.0;
sdx = A2X(sangle, sradius);
sdy = A2Y(sangle, sradius);
sprintf(szChar, "%d", i + 1);
mvaddstr(cy - sdy, cx + sdx, szChar);
}
mvaddstr(0, 0, "ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994");
sradius = (4 * sradius) / 5;
for (;;) {
napms(100);
tim = time(0);
t = localtime(&tim);
hours = (t->tm_hour + (t->tm_min / 60.0));
if (hours > 12.0)
hours -= 12.0;
mangle = ((t->tm_min + (t->tm_sec / 60.0)) * (2 * PI) / 60.0);
mdx = A2X(mangle, mradius);
mdy = A2Y(mangle, mradius);
hangle = ((hours) * (2.0 * PI) / 12.0);
hdx = A2X(hangle, hradius);
hdy = A2Y(hangle, hradius);
#if HAVE_GETTIMEOFDAY
gettimeofday(&current, 0);
fraction = (current.tv_usec / 1.0e6);
#endif
sangle = ((t->tm_sec + fraction) * (2.0 * PI) / 60.0);
sdx = A2X(sangle, sradius);
sdy = A2Y(sangle, sradius);
dline(3, cx, cy, cx + mdx, cy - mdy, '#');
attrset(A_REVERSE);
dline(2, cx, cy, cx + hdx, cy - hdy, '.');
attroff(A_REVERSE);
if (has_colors())
attrset(COLOR_PAIR(1));
dline(1, cx, cy, cx + sdx, cy - sdy, 'O');
if (has_colors())
attrset(COLOR_PAIR(0));
mvaddstr(LINES - 2, 0, ctime(&tim));
refresh();
if ((t->tm_sec % 5) == 0
&& t->tm_sec != lastbeep) {
lastbeep = t->tm_sec;
beep();
}
if ((ch = getch()) != ERR) {
#ifdef KEY_RESIZE
if (ch == KEY_RESIZE) {
flash();
erase();
wrefresh(curscr);
goto restart;
}
#endif
break;
}
dline(0, cx, cy, cx + hdx, cy - hdy, ' ');
dline(0, cx, cy, cx + mdx, cy - mdy, ' ');
dline(0, cx, cy, cx + sdx, cy - sdy, ' ');
}
curs_set(1);
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,212 +0,0 @@
/****************************************************************************
* Copyright (c) 1998,2000 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Thomas E. Dickey <dickey@clark.net> 1996 *
****************************************************************************/
/* $Id: test.priv.h,v 1.34 2002/04/06 23:32:15 tom Exp $ */
#if HAVE_CONFIG_H
#include <ncurses_cfg.h>
#else
#define HAVE_CURSES_VERSION 0
#define HAVE_RESIZETERM 0
#define HAVE_USE_DEFAULT_COLORS 0
#define HAVE_WRESIZE 0
#endif
#ifndef HAVE_CURSES_VERSION
#define HAVE_CURSES_VERSION 0
#endif
#ifndef HAVE_FORM_H
#define HAVE_FORM_H 0
#endif
#ifndef HAVE_LIBFORM
#define HAVE_LIBFORM 0
#endif
#ifndef HAVE_LIBMENU
#define HAVE_LIBMENU 0
#endif
#ifndef HAVE_LIBPANEL
#define HAVE_LIBPANEL 0
#endif
#ifndef HAVE_LOCALE_H
#define HAVE_LOCALE_H 0
#endif
#ifndef HAVE_MENU_H
#define HAVE_MENU_H 0
#endif
#ifndef HAVE_NAPMS
#define HAVE_NAPMS 1
#endif
#ifndef HAVE_NC_ALLOC_H
#define HAVE_NC_ALLOC_H 0
#endif
#ifndef HAVE_PANEL_H
#define HAVE_PANEL_H 0
#endif
#ifndef HAVE_WRESIZE
#define HAVE_WRESIZE 0
#endif
#ifndef NCURSES_NOMACROS
#define NCURSES_NOMACROS 0
#endif
#ifndef NEED_PTEM_H
#define NEED_PTEM_H 0
#endif
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <signal.h> /* include before curses.h to work around glibc bug */
#include <curses.h>
#include <term.h>
#if NCURSES_NOMACROS
#include <nomacros.h>
#endif
#if HAVE_GETOPT_H
#include <getopt.h>
#else
/* 'getopt()' may be prototyped in <stdlib.h>, but declaring its variables
* doesn't hurt.
*/
extern char *optarg;
extern int optind;
#endif /* HAVE_GETOPT_H */
#ifndef GCC_NORETURN
#define GCC_NORETURN /* nothing */
#endif
#ifndef GCC_UNUSED
#define GCC_UNUSED /* nothing */
#endif
#ifndef HAVE_GETNSTR
#define getnstr(s,n) getstr(s)
#endif
#ifndef USE_WIDEC_SUPPORT
#if defined(_XOPEN_SOURCE_EXTENDED) && defined(WACS_ULCORNER)
#define USE_WIDEC_SUPPORT 1
#else
#define USE_WIDEC_SUPPORT 0
#endif
#endif
#ifndef HAVE_TYPE_ATTR_T
#if !USE_WIDEC_SUPPORT
#define attr_t long
#endif
#endif
#ifndef NCURSES_CH_T
#if !USE_WIDEC_SUPPORT
#define NCURSES_CH_T chtype
#else
#define NCURSES_CH_T cchar_t
#endif
#endif
#ifndef CCHARW_MAX
#define CCHARW_MAX 5
#endif
#ifndef KEY_MIN
#define KEY_MIN 256 /* not defined in Solaris 8 */
#endif
#ifndef getcurx
#define getcurx(win) ((win)?(win)->_curx:ERR)
#define getcury(win) ((win)?(win)->_cury:ERR)
#endif
#ifndef getbegx
#define getbegx(win) ((win)?(win)->_begx:ERR)
#define getbegy(win) ((win)?(win)->_begy:ERR)
#endif
#ifndef getmaxx
#define getmaxx(win) ((win)?((win)->_maxx + 1):ERR)
#define getmaxy(win) ((win)?((win)->_maxy + 1):ERR)
#endif
/* ncurses implements tparm() with varargs, X/Open with a fixed-parameter list
* (which is incompatible with legacy usage, doesn't solve any problems).
*/
#define tparm3(a,b,c) tparm(a,b,c,0,0,0,0,0,0,0)
#define tparm2(a,b) tparm(a,b,0,0,0,0,0,0,0,0)
#define UChar(c) ((unsigned char)(c))
#define SIZEOF(table) (sizeof(table)/sizeof(table[0]))
#if defined(NCURSES_VERSION) && HAVE_NC_ALLOC_H
#include <nc_alloc.h>
#else
#define typeMalloc(type,n) (type *) malloc((n) * sizeof(type))
#define typeRealloc(type,n,p) (type *) realloc(p, (n) * sizeof(type))
#endif
#ifndef ExitProgram
#define ExitProgram(code) exit(code)
#endif
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
/* Use this to quiet gcc's -Wwrite-strings warnings, but accommodate SVr4
* curses which doesn't have const parameters declared (so far) in the places
* that XSI shows.
*/
#ifndef NCURSES_CONST
#define NCURSES_CONST /* nothing */
#endif

View File

@ -1,59 +0,0 @@
/*
* This is an example written by Alexander V. Lukyanov <lav@yars.free.net>,
* to demonstrate an inconsistency between ncurses and SVr4 curses.
*
* $Id: testaddch.c,v 1.4 2001/09/15 21:46:34 tom Exp $
*/
#include <test.priv.h>
static void
attr_addstr(const char *s, chtype a)
{
while (*s)
addch(((unsigned char) (*s++)) | a);
}
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
unsigned i;
chtype back, set, attr;
initscr();
start_color();
init_pair(1, COLOR_WHITE, COLOR_BLUE);
init_pair(2, COLOR_WHITE, COLOR_RED);
init_pair(3, COLOR_BLACK, COLOR_MAGENTA);
init_pair(4, COLOR_BLACK, COLOR_GREEN);
init_pair(5, COLOR_BLACK, COLOR_CYAN);
init_pair(6, COLOR_BLACK, COLOR_YELLOW);
init_pair(7, COLOR_BLACK, COLOR_WHITE);
for (i = 0; i < 8; i++) {
back = (i & 1) ? A_BOLD | 'B' : ' ';
set = (i & 2) ? A_REVERSE : 0;
attr = (i & 4) ? COLOR_PAIR(4) : 0;
bkgdset(back);
attrset(set);
attr_addstr("Test string with spaces -> <-\n", attr);
}
addch('\n');
for (i = 0; i < 8; i++) {
back = (i & 1) ? A_BOLD | 'B' | COLOR_PAIR(1) : ' ';
set = (i & 2) ? A_REVERSE | COLOR_PAIR(2) : 0;
attr = (i & 4) ? COLOR_PAIR(4) : 0;
bkgdset(back);
attrset(set);
attr_addstr("Test string with spaces -> <-\n", attr);
}
getch();
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,694 +0,0 @@
/*
*
* This is a test program for the PDCurses screen package for IBM PC type
* machines.
*
* This program was written by John Burnell (johnb@kea.am.dsir.govt.nz)
* wrs(5/28/93) -- modified to be consistent (perform identically) with either
* PDCurses or under Unix System V, R4
*
* $Id: testcurs.c,v 1.29 2002/06/01 16:17:52 tom Exp $
*/
#include <test.priv.h>
#include <ctype.h>
#if defined(XCURSES)
char *XCursesProgramName = "testcurs";
#endif
static int initTest(WINDOW **);
static void display_menu(int, int);
static void inputTest(WINDOW *);
static void introTest(WINDOW *);
static void outputTest(WINDOW *);
static void padTest(WINDOW *);
static void scrollTest(WINDOW *);
#if defined(PDCURSES) && !defined(XCURSES)
static void resizeTest(WINDOW *);
#endif
struct commands {
NCURSES_CONST char *text;
void (*function) (WINDOW *);
};
typedef struct commands COMMAND;
const COMMAND command[] =
{
{"General Test", introTest},
{"Pad Test", padTest},
#if defined(PDCURSES) && !defined(XCURSES)
{"Resize Test", resizeTest},
#endif
{"Scroll Test", scrollTest},
{"Input Test", inputTest},
{"Output Test", outputTest}
};
#define MAX_OPTIONS SIZEOF(command)
int width, height;
int
main(
int argc GCC_UNUSED,
char *argv[]GCC_UNUSED)
{
WINDOW *win;
int key;
int old_option = (-1);
int new_option = 0;
bool quit = FALSE;
unsigned n;
#ifdef PDCDEBUG
PDC_debug("testcurs started\n");
#endif
if (!initTest(&win))
ExitProgram(EXIT_FAILURE);
erase();
display_menu(old_option, new_option);
for (;;) {
#ifdef A_COLOR
if (has_colors()) {
init_pair(1, COLOR_WHITE, COLOR_BLUE);
wbkgd(win, COLOR_PAIR(1));
} else
wbkgd(win, A_REVERSE);
#else
wbkgd(win, A_REVERSE);
#endif
werase(win);
noecho();
keypad(stdscr, TRUE);
raw();
key = getch();
if (key < KEY_MIN && key > 0 && isalpha(key)) {
if (islower(key))
key = toupper(key);
for (n = 0; n < MAX_OPTIONS; ++n) {
if (key == command[n].text[0]) {
display_menu(old_option, new_option = n);
key = ' ';
break;
}
}
}
switch (key) {
case 10:
case 13:
case KEY_ENTER:
erase();
refresh();
(*command[new_option].function) (win);
erase();
display_menu(old_option, new_option);
break;
case KEY_UP:
new_option = (new_option == 0) ? new_option : new_option - 1;
display_menu(old_option, new_option);
break;
case KEY_DOWN:
new_option = (new_option == MAX_OPTIONS - 1) ? new_option :
new_option + 1;
display_menu(old_option, new_option);
break;
case 'Q':
case 'q':
quit = TRUE;
break;
default:
beep();
break;
case ' ':
break;
}
if (quit == TRUE)
break;
}
delwin(win);
endwin();
#ifdef XCURSES
XCursesExit();
#endif
ExitProgram(EXIT_SUCCESS);
}
static void
Continue(WINDOW *win)
{
int y1 = getmaxy(win);
int x1 = getmaxx(win);
int y0 = y1 < 10 ? y1 : 10;
int x0 = 1;
long save;
save = mvwinch(win, y0, x1 - 1);
mvwaddstr(win, y0, x0, " Press any key to continue");
wclrtoeol(win);
getyx(win, y0, x0);
mvwaddch(win, y0, x1 - 1, save);
wmove(win, y0, x0);
raw();
wgetch(win);
}
static int
initTest(WINDOW **win)
{
#ifdef PDCDEBUG
PDC_debug("initTest called\n");
#endif
#ifdef TRACE
trace(TRACE_MAXIMUM);
#endif
initscr();
#ifdef PDCDEBUG
PDC_debug("after initscr()\n");
#endif
#ifdef A_COLOR
if (has_colors())
start_color();
#endif
width = 60;
height = 13; /* Create a drawing window */
*win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2);
if (*win == NULL) {
endwin();
return 0;
}
return 1;
}
static void
introTest(WINDOW *win)
{
wmove(win, height / 2 - 5, width / 2);
wvline(win, ACS_VLINE, 10);
wmove(win, height / 2, width / 2 - 10);
whline(win, ACS_HLINE, 20);
Continue(win);
beep();
werase(win);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
cbreak();
mvwaddstr(win, 1, 1,
"You should have rectangle in the middle of the screen");
mvwaddstr(win, 2, 1, "You should have heard a beep");
Continue(win);
return;
}
static void
scrollTest(WINDOW *win)
{
int i;
int half;
int OldY;
NCURSES_CONST char *Message = "The window will now scroll slowly";
wclear(win);
OldY = getmaxy(win);
half = OldY / 2;
mvwprintw(win, OldY - 2, 1, Message);
wrefresh(win);
scrollok(win, TRUE);
for (i = 1; i <= OldY; i++) {
napms(600);
scroll(win);
wrefresh(win);
}
werase(win);
for (i = 1; i < OldY; i++) {
mvwprintw(win, i, 1, "Line %d", i);
}
mvwprintw(win, OldY - 2, 1, "The top of the window will scroll");
wmove(win, 1, 1);
wsetscrreg(win, 0, half - 1);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
for (i = 1; i <= half; i++) {
napms(600);
scroll(win);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
}
werase(win);
for (i = 1; i < OldY; i++) {
mvwprintw(win, i, 1, "Line %d", i);
}
mvwprintw(win, 1, 1, "The bottom of the window will scroll");
wmove(win, OldY - 2, 1);
wsetscrreg(win, half, --OldY);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
for (i = half; i <= OldY; i++) {
napms(600);
wscrl(win, -1);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
}
wsetscrreg(win, 0, OldY);
}
static void
inputTest(WINDOW *win)
{
int answered;
int repeat;
int w, h, bx, by, sw, sh, i, c, num;
char buffer[80];
WINDOW *subWin;
wclear(win);
getmaxyx(win, h, w);
getbegyx(win, by, bx);
sw = w / 3;
sh = h / 3;
if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == NULL)
return;
#ifdef A_COLOR
if (has_colors()) {
init_pair(2, COLOR_WHITE, COLOR_RED);
wbkgd(subWin, COLOR_PAIR(2) | A_BOLD);
} else
wbkgd(subWin, A_BOLD);
#else
wbkgd(subWin, A_BOLD);
#endif
box(subWin, ACS_VLINE, ACS_HLINE);
wrefresh(win);
nocbreak();
mvwaddstr(win, 2, 1, "Press some keys for 5 seconds");
mvwaddstr(win, 1, 1, "Pressing ^C should do nothing");
wrefresh(win);
werase(subWin);
box(subWin, ACS_VLINE, ACS_HLINE);
for (i = 0; i < 5; i++) {
mvwprintw(subWin, 1, 1, "Time = %d", i);
wrefresh(subWin);
napms(1000);
flushinp();
}
delwin(subWin);
werase(win);
flash();
wrefresh(win);
napms(500);
mvwaddstr(win, 2, 1, "Press a key, followed by ENTER");
wmove(win, 9, 10);
wrefresh(win);
echo();
noraw();
wgetch(win);
flushinp();
wmove(win, 9, 10);
wdelch(win);
mvwaddstr(win, 4, 1, "The character should now have been deleted");
Continue(win);
wclear(win);
mvwaddstr(win, 1, 1, "Press keys (or mouse buttons) to show their names");
mvwaddstr(win, 2, 1, "Press spacebar to finish");
wrefresh(win);
keypad(win, TRUE);
raw();
noecho();
typeahead(-1);
#if defined(PDCURSES)
mouse_set(ALL_MOUSE_EVENTS);
#endif
for (;;) {
wmove(win, 3, 5);
c = wgetch(win);
wclrtobot(win);
if (c >= KEY_MIN)
wprintw(win, "Key Pressed: %s", keyname(c));
else if (isprint(c))
wprintw(win, "Key Pressed: %c", c);
else
wprintw(win, "Key Pressed: %s", unctrl(c));
#if defined(PDCURSES)
if (c == KEY_MOUSE) {
int button = 0;
request_mouse_pos();
if (BUTTON_CHANGED(1))
button = 1;
else if (BUTTON_CHANGED(2))
button = 2;
else if (BUTTON_CHANGED(3))
button = 3;
else
button = 0;
wmove(win, 4, 18);
wprintw(win, "Button %d: ", button);
if (MOUSE_MOVED)
wprintw(win, "moved: ");
else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_PRESSED)
wprintw(win, "pressed: ");
else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_DOUBLE_CLICKED)
wprintw(win, "double: ");
else
wprintw(win, "released: ");
wprintw(win, " Position: Y: %d X: %d", MOUSE_Y_POS, MOUSE_X_POS);
}
#endif
wrefresh(win);
if (c == ' ')
break;
}
#if 0
nodelay(win, TRUE);
wgetch(win);
nodelay(win, FALSE);
#endif
#if defined(PDCURSES)
mouse_set(0L);
#endif
refresh();
repeat = 0;
do {
static const char *fmt[] = {
"%d %10s",
"%d %[a-zA-Z]s",
"%d %[][a-zA-Z]s",
"%d %[^0-9]"
};
const char *format = fmt[repeat % SIZEOF(fmt)];
wclear(win);
mvwaddstr(win, 3, 2, "The window should have moved");
mvwaddstr(win, 4, 2,
"This text should have appeared without you pressing a key");
mvwprintw(win, 6, 2,
"Scanning with format \"%s\"", format);
mvwin(win, 2 + 2 * (repeat % 4), 1 + 2 * (repeat % 4));
erase();
refresh();
wrefresh(win);
echo();
noraw();
num = 0;
*buffer = 0;
answered = mvwscanw(win, 7, 6, format, &num, buffer);
mvwprintw(win, 8, 6,
"String: %s Number: %d (%d values read)",
buffer, num, answered);
Continue(win);
++repeat;
} while (answered > 0);
}
static void
outputTest(WINDOW *win)
{
WINDOW *win1;
char Buffer[80];
chtype ch;
int by, bx;
nl();
wclear(win);
mvwaddstr(win, 1, 1,
"You should now have a screen in the upper left corner, and this text should have wrapped");
mvwin(win, 2, 1);
waddstr(win, "\nThis text should be down\n");
waddstr(win, "and broken into two here ^");
Continue(win);
wclear(win);
wattron(win, A_BOLD);
mvwaddstr(win, 1, 1, "A new window will appear with this text in it");
mvwaddstr(win, 8, 1, "Press any key to continue");
wrefresh(win);
wgetch(win);
getbegyx(win, by, bx);
if (LINES < 24 || COLS < 75) {
mvwaddstr(win, 5, 1,
"Some tests have been skipped as they require a");
mvwaddstr(win, 6, 1, "display of at least 24 LINES by 75 COLUMNS");
Continue(win);
} else {
win1 = newwin(10, 50, 14, 25);
if (win1 == NULL) {
endwin();
return;
}
#ifdef A_COLOR
if (has_colors()) {
init_pair(3, COLOR_BLUE, COLOR_WHITE);
wbkgd(win1, COLOR_PAIR(3));
} else
wbkgd(win1, A_NORMAL);
#else
wbkgd(win1, A_NORMAL);
#endif
wclear(win1);
mvwaddstr(win1, 5, 1,
"This text should appear; using overlay option");
copywin(win, win1, 0, 0, 0, 0, 9, 49, TRUE);
#if defined(PDCURSES) && !defined(XCURSES)
box(win1, 0xb3, 0xc4);
#else
box(win1, ACS_VLINE, ACS_HLINE);
#endif
wmove(win1, 8, 26);
wrefresh(win1);
wgetch(win1);
wclear(win1);
wattron(win1, A_BLINK);
mvwaddstr(win1, 4, 1,
"This blinking text should appear in only the second window");
wattroff(win1, A_BLINK);
mvwin(win1, by, bx);
overlay(win, win1);
mvwin(win1, 14, 25);
wmove(win1, 8, 26);
wrefresh(win1);
wgetch(win1);
delwin(win1);
}
clear();
wclear(win);
wrefresh(win);
mvwaddstr(win, 6, 2, "This line shouldn't appear");
mvwaddstr(win, 4, 2, "Only half of the next line is visible");
mvwaddstr(win, 5, 2, "Only half of the next line is visible");
wmove(win, 6, 1);
wclrtobot(win);
wmove(win, 5, 20);
wclrtoeol(win);
mvwaddstr(win, 8, 2, "This line also shouldn't appear");
wmove(win, 8, 1);
wdeleteln(win);
Continue(win);
wmove(win, 5, 9);
ch = winch(win);
wclear(win);
wmove(win, 6, 2);
waddstr(win, "The next char should be l: ");
winsch(win, ch);
Continue(win);
mvwinsstr(win, 6, 2, "A1B2C3D4E5");
Continue(win);
wmove(win, 5, 1);
winsertln(win);
mvwaddstr(win, 5, 2, "The lines below should have moved down");
Continue(win);
wclear(win);
wmove(win, 2, 2);
wprintw(win, "This is a formatted string in a window: %d %s\n", 42,
"is it");
mvwaddstr(win, 10, 1, "Enter a string: ");
wrefresh(win);
noraw();
echo();
*Buffer = 0;
wscanw(win, "%s", Buffer);
printw("This is a formatted string in stdscr: %d %s\n", 42, "is it");
mvaddstr(10, 1, "Enter a string: ");
*Buffer = 0;
scanw("%s", Buffer);
if (tigetstr("cvvis") != 0) {
wclear(win);
curs_set(2);
mvwaddstr(win, 1, 1, "The cursor should appear as a block (visible)");
Continue(win);
}
if (tigetstr("civis") != 0) {
wclear(win);
curs_set(0);
mvwaddstr(win, 1, 1,
"The cursor should have disappeared (invisible)");
Continue(win);
}
if (tigetstr("cnorm") != 0) {
wclear(win);
curs_set(1);
mvwaddstr(win, 1, 1, "The cursor should be an underline (normal)");
Continue(win);
}
#ifdef A_COLOR
if (has_colors()) {
wclear(win);
mvwaddstr(win, 1, 1, "Colors should change after you press a key");
Continue(win);
init_pair(1, COLOR_RED, COLOR_WHITE);
wrefresh(win);
}
#endif
werase(win);
mvwaddstr(win, 1, 1, "Information About Your Terminal");
mvwaddstr(win, 3, 1, termname());
mvwaddstr(win, 4, 1, longname());
if (termattrs() & A_BLINK)
mvwaddstr(win, 5, 1, "This terminal supports blinking.");
else
mvwaddstr(win, 5, 1, "This terminal does NOT support blinking.");
mvwaddnstr(win, 7, 5, "Have a nice day!ok", 16);
wrefresh(win);
mvwinnstr(win, 7, 5, Buffer, 18);
mvaddstr(LINES - 2, 10, Buffer);
refresh();
Continue(win);
}
#if defined(PDCURSES) && !defined(XCURSES)
static void
resizeTest(WINDOW *dummy GCC_UNUSED)
{
WINDOW *win1;
savetty();
clear();
refresh();
# if defined(OS2)
resize_term(50, 120);
# else
resize_term(50, 80);
# endif
win1 = newwin(10, 50, 14, 25);
if (win1 == NULL) {
endwin();
return;
}
#ifdef A_COLOR
if (has_colors()) {
init_pair(3, COLOR_BLUE, COLOR_WHITE);
wattrset(win1, COLOR_PAIR(3));
}
#endif
wclear(win1);
mvwaddstr(win1, 1, 1, "The screen may now have 50 lines");
Continue(win1);
wclear(win1);
resetty();
mvwaddstr(win1, 1, 1, "The screen should now be reset");
Continue(win1);
delwin(win1);
clear();
refresh();
}
#endif
static void
padTest(WINDOW *dummy GCC_UNUSED)
{
WINDOW *pad, *spad;
pad = newpad(50, 100);
wattron(pad, A_REVERSE);
mvwaddstr(pad, 5, 2, "This is a new pad");
wattrset(pad, A_NORMAL);
mvwaddstr(pad, 8, 0,
"The end of this line should be truncated here:except now");
mvwaddstr(pad, 11, 1, "This line should not appear.It will now");
wmove(pad, 10, 1);
wclrtoeol(pad);
mvwaddstr(pad, 10, 1, " Press any key to continue");
prefresh(pad, 0, 0, 0, 0, 10, 45);
keypad(pad, TRUE);
raw();
wgetch(pad);
spad = subpad(pad, 12, 25, 6, 52);
mvwaddstr(spad, 2, 2, "This is a new subpad");
box(spad, 0, 0);
prefresh(pad, 0, 0, 0, 0, 15, 75);
keypad(pad, TRUE);
raw();
wgetch(pad);
mvwaddstr(pad, 35, 2, "This is displayed at line 35 in the pad");
mvwaddstr(pad, 40, 1, " Press any key to continue");
prefresh(pad, 30, 0, 0, 0, 10, 45);
keypad(pad, TRUE);
raw();
wgetch(pad);
delwin(pad);
}
static void
display_menu(int old_option, int new_option)
{
register size_t i;
attrset(A_NORMAL);
mvaddstr(3, 20, "PDCurses Test Program");
for (i = 0; i < MAX_OPTIONS; i++)
mvaddstr(5 + i, 25, command[i].text);
if (old_option != (-1))
mvaddstr(5 + old_option, 25, command[old_option].text);
attrset(A_REVERSE);
mvaddstr(5 + new_option, 25, command[new_option].text);
attrset(A_NORMAL);
mvaddstr(13, 3,
"Use Up and Down Arrows to select - Enter to run - Q to quit");
refresh();
}

View File

@ -1,39 +0,0 @@
/* gleaned from a web-search, shows a bug combining scanw and implicit scroll.
* Date: 1997/03/17
* From: bayern@morpheus.cis.yale.edu
*
* $Id: testscanw.c,v 1.8 2001/09/15 21:41:45 tom Exp $
*/
#include <test.priv.h>
#include <ctype.h>
int
main(int argc, char *argv[])
{
long badanswer = 1;
long *response = &badanswer;
initscr();
scrollok(stdscr, TRUE);
idlok(stdscr, TRUE);
echo();
#if 0
trace(TRACE_UPDATE | TRACE_CALLS);
#endif
while (argc > 1) {
if (isdigit(UChar(*argv[1])))
move(atoi(argv[1]), 0);
else if (!strcmp(argv[1], "-k"))
keypad(stdscr, TRUE);
argc--, argv++;
}
while (badanswer) {
printw("Enter a number (0 to quit):\n");
printw("--> ");
scanw("%20ld", response); /* yes, it's a pointer */
}
endwin();
ExitProgram(EXIT_SUCCESS);
}

View File

@ -1,98 +0,0 @@
#!/usr/bin/perl
#
# tracemunch -- compactify ncurses trace logs
#
# The error logs produced by ncurses with tracing enabled can be very tedious
# to wade through. This script helps by compacting runs of log lines that
# can be conveniently expressed as higher-level operations.
#
# ($Id: tracemunch,v 1.2 1995/10/06 15:02:37 esr Exp $)
$putattr="PutAttrChar\\('(.)' = 0x.., {A_NORMAL}\\) at \\(([0-9]+), ([0-9]+)\\)";
$waddnstr="waddnstr\\(0x([0-9a-f]+),\"([^\"]+)\",[0-9]+\\) called {A_NORMAL}";
sub transaddr
{
$arg = $_[0];
$arg =~ s/$curscr/curscr/ if ($curscr);
$arg =~ s/$newscr/newscr/ if ($newscr);
$arg =~ s/$stdscr/stdscr/ if ($stdscr);
return $arg;
}
while (<STDIN>)
{
CLASSIFY: {
# Transform window pointer addresses so it's easier to compare logs
$awaiting = "curscr" if ($_ =~ /creating curscr/);
$awaiting = "newscr" if ($_ =~ /creating newscr/);
$awaiting = "stdscr" if ($_ =~ /creating stdscr/);
if ($awaiting && $_ =~ /newwin: returned window is 0x([0-9a-f]+)/)
{
$curscr = "0x$1" if ($awaiting eq "curscr");
$newscr = "0x$1" if ($awaiting eq "newscr");
$stdscr = "0x$1" if ($awaiting eq "stdscr");
$awaiting = "";
}
# Compactify runs of PutAttrChar calls (TR_CHARPUT)
if ($_ =~ /$putattr/)
{
$putattr_chars = $1;
$starty = $2;
$startx = $3;
while (<STDIN>)
{
if ($_ =~ /$putattr/) {
$putattr_chars .= $1;
} else {
last;
}
}
print "RUN of PutAttrChar()s: \"$putattr_chars\" from ${starty}, ${startx}\n";
redo CLASSIFY;
}
# Compactify runs of waddnstr calls (TR_CALLS)
if ($_ =~ /$waddnstr/)
{
$waddnstr_chars = $2;
$winaddr = $1;
while (<STDIN>)
{
if ($_ =~ /$waddnstr/ && $1 eq $winaddr) {
$waddnstr_chars .= $2;
} else {
last;
}
}
$winaddstr = &transaddr($winaddr);
print "RUN of waddnstr()s: $winaddr, \"$waddnstr_chars\"\n";
redo CLASSIFY;
}
# More transformations can go here
# Repeated runs of anything
$anyline = &transaddr($_);
$repeatcount = 1;
while (<STDIN>) {
if (&transaddr($_) eq $anyline) {
$repeatcount++;
} else {
last;
}
}
if ($repeatcount > 1) {
print "${repeatcount} REPEATS OF $anyline";
} else {
print $anyline
}
redo CLASSIFY if $_;
} # :CLASSIFY
}
# tracemunch ends here

View File

@ -1,513 +0,0 @@
/*
* view.c -- a silly little viewer program
*
* written by Eric S. Raymond <esr@snark.thyrsus.com> December 1994
* to test the scrolling code in ncurses.
*
* modified by Thomas Dickey <dickey@clark.net> July 1995 to demonstrate
* the use of 'resizeterm()', and May 2000 to illustrate wide-character
* handling.
*
* Takes a filename argument. It's a simple file-viewer with various
* scroll-up and scroll-down commands.
*
* n -- scroll one line forward
* p -- scroll one line back
*
* Either command accepts a numeric prefix interpreted as a repeat count.
* Thus, typing `5n' should scroll forward 5 lines in the file.
*
* The way you can tell this is working OK is that, in the trace file,
* there should be one scroll operation plus a small number of line
* updates, as opposed to a whole-page update. This means the physical
* scroll operation worked, and the refresh() code only had to do a
* partial repaint.
*
* $Id: view.c,v 1.52 2002/04/27 22:37:39 tom Exp $
*/
#include <ctype.h>
#include <time.h>
#include <locale.h>
#include <test.priv.h>
#if HAVE_TERMIOS_H
# include <termios.h>
#else
# include <sgtty.h>
#endif
#if !defined(sun) || !HAVE_TERMIOS_H
# if HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
# endif
#endif
#define my_pair 1
/* This is needed to compile 'struct winsize' */
#if NEED_PTEM_H
#include <sys/stream.h>
#include <sys/ptem.h>
#endif
static RETSIGTYPE finish(int sig) GCC_NORETURN;
static void show_all(const char *tag);
#if defined(SIGWINCH) && defined(TIOCGWINSZ) && HAVE_RESIZETERM
#define CAN_RESIZE 1
#else
#define CAN_RESIZE 0
#endif
#if CAN_RESIZE
static RETSIGTYPE adjust(int sig);
static int interrupted;
#endif
static bool waiting = FALSE;
static int shift = 0;
static bool try_color = FALSE;
static char *fname;
static NCURSES_CH_T **my_lines;
static NCURSES_CH_T **lptr;
static void
usage(void)
{
static const char *msg[] =
{
"Usage: view [options] file"
,""
,"Options:"
," -c use color if terminal supports it"
," -i ignore INT, QUIT, TERM signals"
," -n NUM specify maximum number of lines (default 1000)"
#if defined(KEY_RESIZE)
," -r use old-style sigwinch handler rather than KEY_RESIZE"
#endif
#ifdef TRACE
," -t trace screen updates"
," -T NUM specify trace mask"
#endif
};
size_t n;
for (n = 0; n < SIZEOF(msg); n++)
fprintf(stderr, "%s\n", msg[n]);
ExitProgram(EXIT_FAILURE);
}
static int
ch_len(NCURSES_CH_T * src)
{
int result = 0;
#if USE_WIDEC_SUPPORT
#endif
#if USE_WIDEC_SUPPORT
while (getcchar(src++, NULL, NULL, NULL, NULL) > 0)
result++;
#else
while (*src++)
result++;
#endif
return result;
}
/*
* Allocate a string into an array of chtype's. If UTF-8 mode is
* active, translate the string accordingly.
*/
static NCURSES_CH_T *
ch_dup(char *src)
{
unsigned len = strlen(src);
NCURSES_CH_T *dst = typeMalloc(NCURSES_CH_T, len + 1);
unsigned j, k;
#if USE_WIDEC_SUPPORT
wchar_t wstr[CCHARW_MAX + 1];
wchar_t wch;
int l = 0;
mbstate_t state;
size_t rc;
int width;
#endif
#if USE_WIDEC_SUPPORT
memset(&state, 0, sizeof(state));
#endif
for (j = k = 0; j < len; j++) {
#if USE_WIDEC_SUPPORT
rc = mbrtowc(&wch, src + j, len - j, &state);
if (rc == (size_t) -1 || rc == (size_t) -2)
break;
j += rc - 1;
if ((width = wcwidth(wch)) < 0)
break;
if ((width > 0 && l > 0) || l == CCHARW_MAX) {
wstr[l] = L'\0';
l = 0;
if (setcchar(dst + k, wstr, 0, 0, NULL) != OK)
break;
++k;
}
if (width == 0 && l == 0)
wstr[l++] = L' ';
wstr[l++] = wch;
#else
dst[k++] = src[j];
#endif
}
#if USE_WIDEC_SUPPORT
if (l > 0) {
wstr[l] = L'\0';
if (setcchar(dst + k, wstr, 0, 0, NULL) == OK)
++k;
}
setcchar(dst + k, L"", 0, 0, NULL);
#else
dst[k] = 0;
#endif
return dst;
}
int
main(int argc, char *argv[])
{
int MAXLINES = 1000;
FILE *fp;
char buf[BUFSIZ];
int i;
int my_delay = 0;
NCURSES_CH_T **olptr;
int length = 0;
int value = 0;
bool done = FALSE;
bool got_number = FALSE;
#if CAN_RESIZE
bool nonposix_resize = FALSE;
#endif
const char *my_label = "Input";
setlocale(LC_ALL, "");
#ifndef NCURSES_VERSION
/*
* We know ncurses will catch SIGINT if we don't establish our own handler.
* Other versions of curses may/may not catch it.
*/
(void) signal(SIGINT, finish); /* arrange interrupts to terminate */
#endif
while ((i = getopt(argc, argv, "cin:rtT:")) != EOF) {
switch (i) {
case 'c':
try_color = TRUE;
break;
case 'i':
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
break;
case 'n':
if ((MAXLINES = atoi(optarg)) < 1)
usage();
break;
#if CAN_RESIZE
case 'r':
nonposix_resize = TRUE;
break;
#endif
#ifdef TRACE
case 'T':
trace(atoi(optarg));
break;
case 't':
trace(TRACE_CALLS);
break;
#endif
default:
usage();
}
}
if (optind + 1 != argc)
usage();
if ((my_lines = typeMalloc(NCURSES_CH_T *, MAXLINES + 2)) == 0)
usage();
fname = argv[optind];
if ((fp = fopen(fname, "r")) == 0) {
perror(fname);
ExitProgram(EXIT_FAILURE);
}
#if CAN_RESIZE
if (nonposix_resize)
(void) signal(SIGWINCH, adjust); /* arrange interrupts to resize */
#endif
/* slurp the file */
for (lptr = &my_lines[0]; (lptr - my_lines) < MAXLINES; lptr++) {
char temp[BUFSIZ], *s, *d;
int col;
if (fgets(buf, sizeof(buf), fp) == 0)
break;
/* convert tabs so that shift will work properly */
for (s = buf, d = temp, col = 0; (*d = *s) != '\0'; s++) {
if (*d == '\n') {
*d = '\0';
break;
} else if (*d == '\t') {
col = (col | 7) + 1;
while ((d - temp) != col)
*d++ = ' ';
} else
#if USE_WIDEC_SUPPORT
col++, d++;
#else
if (isprint(UChar(*d))) {
col++;
d++;
} else {
sprintf(d, "\\%03o", UChar(*s));
d += strlen(d);
col = (d - temp);
}
#endif
}
*lptr = ch_dup(temp);
}
(void) fclose(fp);
length = lptr - my_lines;
(void) initscr(); /* initialize the curses library */
keypad(stdscr, TRUE); /* enable keyboard mapping */
(void) nonl(); /* tell curses not to do NL->CR/NL on output */
(void) cbreak(); /* take input chars one at a time, no wait for \n */
(void) noecho(); /* don't echo input */
nodelay(stdscr, TRUE);
idlok(stdscr, TRUE); /* allow use of insert/delete line */
if (try_color) {
if (has_colors()) {
start_color();
init_pair(my_pair, COLOR_WHITE, COLOR_BLUE);
bkgd(COLOR_PAIR(my_pair));
} else {
try_color = FALSE;
}
}
lptr = my_lines;
while (!done) {
int n, c;
if (!got_number)
show_all(my_label);
n = 0;
for (;;) {
#if CAN_RESIZE
if (interrupted) {
adjust(0);
my_label = "interrupt";
}
#endif
waiting = TRUE;
c = getch();
waiting = FALSE;
if ((c < 127) && isdigit(c)) {
if (!got_number) {
mvprintw(0, 0, "Count: ");
clrtoeol();
}
addch(c);
value = 10 * value + (c - '0');
got_number = TRUE;
} else
break;
}
if (got_number && value) {
n = value;
} else {
n = 1;
}
if (c != ERR)
my_label = keyname(c);
switch (c) {
case KEY_DOWN:
case 'n':
olptr = lptr;
for (i = 0; i < n; i++)
if ((lptr - my_lines) < (length - LINES + 1))
lptr++;
else
break;
wscrl(stdscr, lptr - olptr);
break;
case KEY_UP:
case 'p':
olptr = lptr;
for (i = 0; i < n; i++)
if (lptr > my_lines)
lptr--;
else
break;
wscrl(stdscr, lptr - olptr);
break;
case 'h':
case KEY_HOME:
lptr = my_lines;
break;
case 'e':
case KEY_END:
if (length > LINES)
lptr = my_lines + length - LINES + 1;
else
lptr = my_lines;
break;
case 'r':
case KEY_RIGHT:
shift += n;
break;
case 'l':
case KEY_LEFT:
shift -= n;
if (shift < 0) {
shift = 0;
beep();
}
break;
case 'q':
done = TRUE;
break;
#ifdef KEY_RESIZE
case KEY_RESIZE: /* ignore this; ncurses will repaint */
break;
#endif
case 's':
if (got_number) {
halfdelay(my_delay = n);
} else {
nodelay(stdscr, FALSE);
my_delay = -1;
}
break;
case ' ':
nodelay(stdscr, TRUE);
my_delay = 0;
break;
case ERR:
if (!my_delay)
napms(50);
break;
default:
beep();
break;
}
if (c >= KEY_MIN || (c > 0 && !isdigit(c))) {
got_number = FALSE;
value = 0;
}
}
finish(0); /* we're done */
}
static RETSIGTYPE
finish(int sig)
{
endwin();
ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
}
#if CAN_RESIZE
/*
* This uses functions that are "unsafe", but it seems to work on SunOS and
* Linux. Usually: the "unsafe" refers to the functions that POSIX lists
* which may be called from a signal handler. Those do not include buffered
* I/O, which is used for instance in wrefresh(). To be really portable, you
* should use the KEY_RESIZE return (which relies on ncurses' sigwinch
* handler).
*
* The 'wrefresh(curscr)' is needed to force the refresh to start from the top
* of the screen -- some xterms mangle the bitmap while resizing.
*/
static RETSIGTYPE
adjust(int sig)
{
if (waiting || sig == 0) {
struct winsize size;
if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) {
resize_term(size.ws_row, size.ws_col);
wrefresh(curscr); /* Linux needs this */
show_all(sig ? "SIGWINCH" : "interrupt");
}
interrupted = FALSE;
} else {
interrupted = TRUE;
}
(void) signal(SIGWINCH, adjust); /* some systems need this */
}
#endif /* CAN_RESIZE */
static void
show_all(const char *tag)
{
int i;
char temp[BUFSIZ];
NCURSES_CH_T *s;
time_t this_time;
#if CAN_RESIZE
sprintf(temp, "%s (%3dx%3d) col %d ", tag, LINES, COLS, shift);
i = strlen(temp);
sprintf(temp + i, "view %.*s", (int) (sizeof(temp) - 7 - i), fname);
#else
sprintf(temp, "view %.*s", (int) sizeof(temp) - 7, fname);
#endif
move(0, 0);
printw("%.*s", COLS, temp);
clrtoeol();
this_time = time((time_t *) 0);
strcpy(temp, ctime(&this_time));
if ((i = strlen(temp)) != 0) {
temp[--i] = 0;
if (move(0, COLS - i - 2) != ERR)
printw(" %s", temp);
}
scrollok(stdscr, FALSE); /* prevent screen from moving */
for (i = 1; i < LINES; i++) {
move(i, 0);
printw("%3ld:", (long) (lptr + i - my_lines));
clrtoeol();
if ((s = lptr[i - 1]) != 0) {
int len = ch_len(s);
if (len > shift)
#if USE_WIDEC_SUPPORT
add_wchstr(s + shift);
#else
addchstr(s + shift);
#endif
if (try_color)
wchgat(stdscr, -1, A_NORMAL, my_pair, NULL);
}
}
setscrreg(1, LINES - 1);
scrollok(stdscr, TRUE);
refresh();
}

View File

@ -1,425 +0,0 @@
/*
@@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@
@@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@
@@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@
@@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@
@@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@
@@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@
@@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@
Eric P. Scott
Caltech High Energy Physics
October, 1980
Hacks to turn this into a test frame for cursor movement:
Eric S. Raymond <esr@snark.thyrsus.com>
January, 1995
July 1995 (esr): worms is now in living color! :-)
Options:
-f fill screen with copies of 'WORM' at start.
-l <n> set worm length
-n <n> set number of worms
-t make worms leave droppings
-T <start> <end> set trace interval
-S set single-stepping during trace interval
-N suppress cursor-movement optimization
This program makes a good torture-test for the ncurses cursor-optimization
code. You can use -T to set the worm move interval over which movement
traces will be dumped. The program stops and waits for one character of
input at the beginning and end of the interval.
$Id: worm.c,v 1.36 2002/03/23 21:46:54 tom Exp $
*/
#include <test.priv.h>
static chtype flavor[] =
{
'O', '*', '#', '$', '%', '0', '@',
};
static const short xinc[] =
{
1, 1, 1, 0, -1, -1, -1, 0
}, yinc[] =
{
-1, 0, 1, 1, 1, 0, -1, -1
};
static struct worm {
int orientation, head;
short *xpos, *ypos;
} worm[40];
static const char *field;
static int length = 16, number = 3;
static chtype trail = ' ';
#ifdef TRACE
int generation, trace_start, trace_end, singlestep;
#endif /* TRACE */
/* *INDENT-OFF* */
static const struct options {
int nopts;
int opts[3];
} normal[8]={
{ 3, { 7, 0, 1 } },
{ 3, { 0, 1, 2 } },
{ 3, { 1, 2, 3 } },
{ 3, { 2, 3, 4 } },
{ 3, { 3, 4, 5 } },
{ 3, { 4, 5, 6 } },
{ 3, { 5, 6, 7 } },
{ 3, { 6, 7, 0 } }
}, upper[8]={
{ 1, { 1, 0, 0 } },
{ 2, { 1, 2, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 2, { 4, 5, 0 } },
{ 1, { 5, 0, 0 } },
{ 2, { 1, 5, 0 } }
}, left[8]={
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 2, { 2, 3, 0 } },
{ 1, { 3, 0, 0 } },
{ 2, { 3, 7, 0 } },
{ 1, { 7, 0, 0 } },
{ 2, { 7, 0, 0 } }
}, right[8]={
{ 1, { 7, 0, 0 } },
{ 2, { 3, 7, 0 } },
{ 1, { 3, 0, 0 } },
{ 2, { 3, 4, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 2, { 6, 7, 0 } }
}, lower[8]={
{ 0, { 0, 0, 0 } },
{ 2, { 0, 1, 0 } },
{ 1, { 1, 0, 0 } },
{ 2, { 1, 5, 0 } },
{ 1, { 5, 0, 0 } },
{ 2, { 5, 6, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } }
}, upleft[8]={
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 1, { 3, 0, 0 } },
{ 2, { 1, 3, 0 } },
{ 1, { 1, 0, 0 } }
}, upright[8]={
{ 2, { 3, 5, 0 } },
{ 1, { 3, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 1, { 5, 0, 0 } }
}, lowleft[8]={
{ 3, { 7, 0, 1 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 1, { 1, 0, 0 } },
{ 2, { 1, 7, 0 } },
{ 1, { 7, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } }
}, lowright[8]={
{ 0, { 0, 0, 0 } },
{ 1, { 7, 0, 0 } },
{ 2, { 5, 7, 0 } },
{ 1, { 5, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } }
};
/* *INDENT-ON* */
static void
cleanup(void)
{
standend();
refresh();
curs_set(1);
endwin();
}
static RETSIGTYPE
onsig(int sig GCC_UNUSED)
{
cleanup();
ExitProgram(EXIT_FAILURE);
}
static float
ranf(void)
{
long r = (rand() & 077777);
return ((float) r / 32768.);
}
int
main(int argc, char *argv[])
{
short **ref;
int x, y;
int n;
struct worm *w;
const struct options *op;
int h;
short *ip;
int last, bottom;
for (x = 1; x < argc; x++) {
char *p;
p = argv[x];
if (*p == '-')
p++;
switch (*p) {
case 'f':
field = "WORM";
break;
case 'l':
if (++x == argc)
goto usage;
if ((length = atoi(argv[x])) < 2 || length > 1024) {
fprintf(stderr, "%s: Invalid length\n", *argv);
ExitProgram(EXIT_FAILURE);
}
break;
case 'n':
if (++x == argc)
goto usage;
if ((number = atoi(argv[x])) < 1 || number > 40) {
fprintf(stderr, "%s: Invalid number of worms\n", *argv);
ExitProgram(EXIT_FAILURE);
}
break;
case 't':
trail = '.';
break;
#ifdef TRACE
case 'S':
singlestep = TRUE;
break;
case 'T':
trace_start = atoi(argv[++x]);
trace_end = atoi(argv[++x]);
break;
case 'N':
_nc_optimize_enable ^= OPTIMIZE_ALL; /* declared by ncurses */
break;
#endif /* TRACE */
default:
usage:
fprintf(stderr,
"usage: %s [-field] [-length #] [-number #] [-trail]\n", *argv);
ExitProgram(EXIT_FAILURE);
}
}
signal(SIGINT, onsig);
initscr();
noecho();
cbreak();
nonl();
curs_set(0);
bottom = LINES - 1;
last = COLS - 1;
#ifdef A_COLOR
if (has_colors()) {
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
#define SET_COLOR(num, fg) \
init_pair(num+1, fg, bg); \
flavor[num] |= COLOR_PAIR(num+1) | A_BOLD
SET_COLOR(0, COLOR_GREEN);
SET_COLOR(1, COLOR_RED);
SET_COLOR(2, COLOR_CYAN);
SET_COLOR(3, COLOR_WHITE);
SET_COLOR(4, COLOR_MAGENTA);
SET_COLOR(5, COLOR_BLUE);
SET_COLOR(6, COLOR_YELLOW);
}
#endif /* A_COLOR */
ref = typeMalloc(short *, LINES);
for (y = 0; y < LINES; y++) {
ref[y] = typeMalloc(short, COLS);
for (x = 0; x < COLS; x++) {
ref[y][x] = 0;
}
}
#ifdef BADCORNER
/* if addressing the lower right corner doesn't work in your curses */
ref[bottom][last] = 1;
#endif /* BADCORNER */
for (n = number, w = &worm[0]; --n >= 0; w++) {
w->orientation = w->head = 0;
if (!(ip = typeMalloc(short, (length + 1)))) {
fprintf(stderr, "%s: out of memory\n", *argv);
ExitProgram(EXIT_FAILURE);
}
w->xpos = ip;
for (x = length; --x >= 0;)
*ip++ = -1;
if (!(ip = typeMalloc(short, (length + 1)))) {
fprintf(stderr, "%s: out of memory\n", *argv);
ExitProgram(EXIT_FAILURE);
}
w->ypos = ip;
for (y = length; --y >= 0;)
*ip++ = -1;
}
if (field) {
const char *p;
p = field;
for (y = bottom; --y >= 0;) {
for (x = COLS; --x >= 0;) {
addch((chtype) (*p++));
if (!*p)
p = field;
}
}
}
napms(10);
refresh();
#ifndef TRACE
nodelay(stdscr, TRUE);
#endif
for (;;) {
#ifdef TRACE
if (trace_start || trace_end) {
if (generation == trace_start) {
trace(TRACE_CALLS);
getch();
} else if (generation == trace_end) {
trace(0);
getch();
}
if (singlestep && generation > trace_start && generation < trace_end)
getch();
generation++;
}
#else
int ch;
if ((ch = getch()) > 0) {
#ifdef KEY_RESIZE
if (ch == KEY_RESIZE) {
if (last != COLS - 1) {
for (y = 0; y <= bottom; y++) {
ref[y] = typeRealloc(short, COLS, ref[y]);
for (x = last + 1; x < COLS; x++)
ref[y][x] = 0;
}
last = COLS - 1;
}
if (bottom != LINES - 1) {
for (y = LINES; y <= bottom; y++)
free(ref[y]);
ref = typeRealloc(short *, LINES, ref);
for (y = bottom + 1; y < LINES; y++) {
ref[y] = typeMalloc(short, COLS);
for (x = 0; x < COLS; x++)
ref[y][x] = 0;
}
bottom = LINES - 1;
}
}
#endif
/*
* Make it simple to put this into single-step mode, or resume
* normal operation -TD
*/
if (ch == 'q') {
cleanup();
ExitProgram(EXIT_SUCCESS);
} else if (ch == 's') {
nodelay(stdscr, FALSE);
} else if (ch == ' ') {
nodelay(stdscr, TRUE);
}
}
#endif /* TRACE */
for (n = 0, w = &worm[0]; n < number; n++, w++) {
if ((x = w->xpos[h = w->head]) < 0) {
move(y = w->ypos[h] = bottom, x = w->xpos[h] = 0);
addch(flavor[n % SIZEOF(flavor)]);
ref[y][x]++;
} else {
y = w->ypos[h];
}
if (x > last)
x = last;
if (y > bottom)
y = bottom;
if (++h == length)
h = 0;
if (w->xpos[w->head = h] >= 0) {
int x1, y1;
x1 = w->xpos[h];
y1 = w->ypos[h];
if (y1 < LINES
&& x1 < COLS
&& --ref[y1][x1] == 0) {
move(y1, x1);
addch(trail);
}
}
op = &(x == 0 ? (y == 0 ? upleft : (y == bottom ? lowleft :
left)) :
(x == last ? (y == 0 ? upright : (y == bottom ? lowright :
right)) :
(y == 0 ? upper : (y == bottom ? lower : normal))))[w->orientation];
switch (op->nopts) {
case 0:
cleanup();
ExitProgram(EXIT_SUCCESS);
case 1:
w->orientation = op->opts[0];
break;
default:
w->orientation = op->opts[(int) (ranf() * (float) op->nopts)];
}
move(y += yinc[w->orientation], x += xinc[w->orientation]);
if (y < 0)
y = 0;
addch(flavor[n % SIZEOF(flavor)]);
ref[w->ypos[h] = y][w->xpos[h] = x]++;
}
napms(10);
refresh();
}
}

File diff suppressed because it is too large Load Diff