. abandons mixer, gomoku, talk, talkd, top from base system . compile top with clang so no ack-compiled program needs -lcurses any more
		
			
				
	
	
		
			209 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
.\"	$NetBSD: ex2.c,v 1.7 2003/08/07 16:44:27 agc Exp $
 | 
						|
.\"
 | 
						|
.\" Copyright (c) 1992, 1993
 | 
						|
.\"	 The Regents of the University of California.  All rights reserved.
 | 
						|
.\"
 | 
						|
.\" Redistribution and use in source and binary forms, with or without
 | 
						|
.\" modification, are permitted provided that the following conditions
 | 
						|
.\" are met:
 | 
						|
.\" 1. Redistributions of source code must retain the above copyright
 | 
						|
.\"    notice, this list of conditions and the following disclaimer.
 | 
						|
.\" 2. Redistributions in binary form must reproduce the above copyright
 | 
						|
.\"    notice, this list of conditions and the following disclaimer in the
 | 
						|
.\"    documentation and/or other materials provided with the distribution.
 | 
						|
.\" 3. Neither the name of the University nor the names of its contributors
 | 
						|
.\"    may be used to endorse or promote products derived from this software
 | 
						|
.\"    without specific prior written permission.
 | 
						|
.\"
 | 
						|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
						|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
						|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
						|
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
						|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
						|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
						|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
						|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
						|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
						|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
						|
.\" SUCH DAMAGE.
 | 
						|
.\"
 | 
						|
.\"     @(#)ex2.c	8.1 (Berkeley) 6/8/93
 | 
						|
.\"
 | 
						|
#include <curses.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <signal.h>
 | 
						|
 | 
						|
#define YSIZE LINES
 | 
						|
#define XSIZE COLS
 | 
						|
 | 
						|
static int quit();
 | 
						|
 | 
						|
/*
 | 
						|
 * This program fills the screen up with characters and the allows the user to
 | 
						|
 * manipulate the text on the screen using some basic commands.
 | 
						|
 * Nothing fancy, just a demonstration of the elementary features of the
 | 
						|
 * curses(3) package.
 | 
						|
 */
 | 
						|
main()
 | 
						|
{
 | 
						|
	int i, j, c, n, d = 0;
 | 
						|
	char id[100];
 | 
						|
	int hh = 0;
 | 
						|
	int curx, cury, base, arg;
 | 
						|
 | 
						|
	initscr();
 | 
						|
	signal(SIGINT, quit);
 | 
						|
	crmode();
 | 
						|
	noecho();
 | 
						|
	nonl();
 | 
						|
	delwin(stdscr);
 | 
						|
	stdscr = newwin(YSIZE, XSIZE, 0, 0);
 | 
						|
	flushok(stdscr, TRUE);
 | 
						|
	scrollok(stdscr, TRUE);
 | 
						|
	erase();
 | 
						|
	refresh();
 | 
						|
 | 
						|
	move(0,0);
 | 
						|
	refresh();
 | 
						|
	for (i = 0; i < YSIZE + 2; i++) {
 | 
						|
		(void)snprintf(id, sizeof id, "%d: ", i);
 | 
						|
		addstr(id);
 | 
						|
		for (j = 0; j < XSIZE - strlen(id); j++)
 | 
						|
			addch('0' + (i % 10));
 | 
						|
	}
 | 
						|
	c = getchar();
 | 
						|
	base = 2;
 | 
						|
	curx = cury = 0;
 | 
						|
	move(0, 0);
 | 
						|
	refresh();
 | 
						|
 | 
						|
	/*
 | 
						|
	 * The screen manipulator has the following commands:
 | 
						|
	 * 'D' - clear to the end of the current line.
 | 
						|
	 * 'B' - clear to the bottom of the screen.
 | 
						|
	 * 'E' - erase the screen.
 | 
						|
	 * 's' - enter standout mode.
 | 
						|
	 * 'e' - exit standout mode.
 | 
						|
	 * 'd' n - delete n lines below cursor line.
 | 
						|
	 * 'i' n - insert n lines below cursor line.
 | 
						|
	 * 'q' - quit.
 | 
						|
	 * 'f' - move cursor one position to the right.
 | 
						|
	 * 'b' - move cursor one position to the left.
 | 
						|
	 * 'n' - move cursor one line down.
 | 
						|
	 * 'p' - move cursor one line up.
 | 
						|
	 * 'h' - home cusor.
 | 
						|
	 * 'l' - force refresh.
 | 
						|
	 * 'r' - simulate a carriage return.
 | 
						|
	 *
 | 
						|
	 * All other characters are ignored.
 | 
						|
	 */
 | 
						|
	for(;;) {
 | 
						|
		switch(c = getchar()) {
 | 
						|
		case 'D':
 | 
						|
			clrtoeol();
 | 
						|
			refresh();
 | 
						|
			continue;
 | 
						|
		case 'B':
 | 
						|
			clrtobot();
 | 
						|
			refresh();
 | 
						|
			continue;
 | 
						|
		case 'E':
 | 
						|
			erase();
 | 
						|
			refresh();
 | 
						|
			continue;
 | 
						|
		case 's':
 | 
						|
			standout();
 | 
						|
			continue;
 | 
						|
		case 'e':
 | 
						|
			standend();
 | 
						|
			continue;
 | 
						|
		case 'd':
 | 
						|
			arg = getchar() - '0';
 | 
						|
			for (i = 0; i < arg; i++)
 | 
						|
				deleteln();
 | 
						|
			refresh();
 | 
						|
			continue;
 | 
						|
		case 'i':
 | 
						|
			arg = getchar() - '0';
 | 
						|
			for (i = 0; i < arg; i++)
 | 
						|
				insertln();
 | 
						|
			refresh();
 | 
						|
			continue;
 | 
						|
		case 'q':
 | 
						|
			quit();
 | 
						|
		case 'f':
 | 
						|
			if (curx < XSIZE - 1)
 | 
						|
				curx++;
 | 
						|
			else {
 | 
						|
				cury++;
 | 
						|
				curx = 0;
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		case 'b':
 | 
						|
			if (curx == 0) {
 | 
						|
				cury--;
 | 
						|
				curx = XSIZE - 1;
 | 
						|
			} else
 | 
						|
				curx--;
 | 
						|
			break;
 | 
						|
		case 'n':
 | 
						|
			cury++;
 | 
						|
			break;
 | 
						|
		case 'p':
 | 
						|
			cury--;
 | 
						|
			break;
 | 
						|
		case 'h':
 | 
						|
			curx = cury = 0;
 | 
						|
			break;
 | 
						|
		case 'l':
 | 
						|
			wrefresh(curscr);
 | 
						|
			continue;
 | 
						|
		case 'r':   /* return */
 | 
						|
		{
 | 
						|
			int x, y;
 | 
						|
			getyx(stdscr, y, x);
 | 
						|
			move(y+1, 0);
 | 
						|
			insertln();
 | 
						|
			move(y, x);
 | 
						|
			clrtoeol();
 | 
						|
			refresh();
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
		default:
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
 | 
						|
		if (cury < 0) {
 | 
						|
			base--;
 | 
						|
			move(0, 0);
 | 
						|
			insertln();
 | 
						|
			(void)snprintf(id, sizeof id, "%d: ", base);
 | 
						|
			addstr(id);
 | 
						|
			for (j = 0; j < XSIZE - strlen(id) - 2; j++)
 | 
						|
				addch('0' + (base % 10));
 | 
						|
			cury++;
 | 
						|
		} else if (cury >= YSIZE) {
 | 
						|
			move(0, 0);
 | 
						|
			deleteln();
 | 
						|
			move(YSIZE - 1, 0);
 | 
						|
			(void)snprintf(id, sizeof id, "%d: ", base + YSIZE);
 | 
						|
			addstr(id);
 | 
						|
			for (j = 0; j < XSIZE - strlen(id) - 2; j++)
 | 
						|
				addch('0' + ((base + YSIZE) % 10));
 | 
						|
			cury--;
 | 
						|
			base++;
 | 
						|
		}
 | 
						|
		move(cury, curx);
 | 
						|
		refresh();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
quit()
 | 
						|
{
 | 
						|
	erase();
 | 
						|
	refresh();
 | 
						|
	endwin();
 | 
						|
	exit(0);
 | 
						|
}
 |