home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
business
/
calend2.lzh
/
CALENDAR
/
CURSES.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-01
|
4KB
|
279 lines
/* curses.c */
#include <ctype.h>
/* small curses
Bob Leivian -- some of the curses routines are here
add to them as you see fit -- the basic I/O routines are from
the micro EMACS routines from FISH disk # 23
Bob Leivian
2702 W. Curry
Chandler Az 85224
602-820-6859 mot!dover!leivian
*/
/*
* Name: MicroEMACS
* AmigaDOS terminal I/O
* Version: 31
* Compiler: Manx Aztec C
* Created: 19-Apr-86 ...!ihnp4!seismo!ut-sally!ut-ngp!mic
*/
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#undef TRUE
#undef FALSE
#define NIBUF 128 /* Probably excessive. */
#define NOBUF 512 /* Not too big for 750/730. */
struct FileHandle *tty;
struct FileHandle *Open();
char obuf[NOBUF]; /* Output buffer */
int nobuf; /* # of bytes in above */
char ibuf[NIBUF]; /* Input buffer */
int nibuf; /* # of bytes in above */
int nrow; /* Terminal size, rows. */
int ncol; /* Terminal size, columns. */
#if MANX
extern int Enable_Abort;
#endif
extern char version[];
/*
* This routine gets called once, to set up the
* terminal channel.
*/
ttopen()
{
char WindowName[80];
nrow = 23;
ncol = 77;
nobuf = nibuf = 0;
#if MANX
Enable_Abort = 0; /* Disable ^C during file I/O */
#endif
strcpy(WindowName,"RAW:1/1/639/199/");
strcat(WindowName, version);
tty = Open(WindowName, MODE_NEWFILE);
if (tty == (struct FileHandle *) 0) {
printf("Can't open window!\n");
exit(200);
}
}
/*
* This function gets called just
* before we go back home to the command interpreter.
* On the Amiga it closes up the virtual terminal window.
*/
ttclose()
{
if (tty != (struct FileHandle *) 0L) {
ttflush();
Close(tty);
}
tty = /*(struct FileHandle *)*/ NULL;
#if MANX
Enable_Abort = 1;
#endif
}
/*
* Write a character to the display.
* On the Amiga, terminal output is buffered, and
* we just put the characters in the big array,
* after cheching for overflow.
*/
ttputc(c)
{
if (nobuf >= NOBUF)
ttflush();
obuf[nobuf++] = c;
}
/*
* This function does the real work of
* flushing out buffered I/O on the Amiga. All
* we do is blast out the block with a write call.
*/
ttflush()
{
if (nobuf > 0) {
Write(tty,obuf,(long) nobuf);
nobuf = 0;
}
}
/*
* Read a character from the terminal,
* performing no editing and doing conditional echo
*/
int do_echo = 1; /* echo flag */
ttgetc()
{
unsigned char c, ignore; /* must be unsigned! */
ttflush();
Read(tty,&c,1L);
if (c == '\x9b') {
Read(tty, &c, 1L);
/* was it a function key */
if (isdigit(c))
Read(tty, &ignore, 1L);
/* return the char with top bit set */
c |= 0x80;
} else
if (do_echo)
ttputc(c);
return ((int) c);
}
/*
* Write a string to the terminal
*/
ttputs(s)
char *s;
{
while(*s) ttputc(*s++);
ttflush();
}
char scr_buf[24][80];
int scr_row, scr_col;
/* this is some the curses routines */
standout()
{
/* standout (in this case by reverse vidio) */
ttputs("\x9b7m");
}
standend()
{
ttputs("\x9bm");
}
move(x,y)
{
char buf[32];
sprintf(buf, "\x9b%d;%dH", x+1, y+1);
ttputs(buf);
ttflush();
scr_row = x;
scr_col = y;
}
addstr(s)
char *s;
{
while(*s) {
ttputc(*s);
scr_buf[scr_row][scr_col++] = *s++;
if(scr_col >= 78)
break;
}
ttflush();
}
mvaddstr(x,y,s)
int x,y;
char *s;
{
move(x,y);
addstr(s);
}
addch(c)
char c;
{
ttputc(c);
scr_buf[scr_row][scr_col] = c;
scr_col++;
}
mvaddch(x,y,c)
int x,y;
char c;
{
move(x, y);
addch(c);
}
inch()
{
return scr_buf[scr_row] [scr_col];
}
refresh()
{
}
clrtobot()
{
int i,j;
ttputs("\x9bJ");
for (j = scr_col; j < 79; j++)
scr_buf[scr_row][j] = ' ';
for (i = scr_row++; i < 23; i++)
for (j = 0; j < 79; j++)
scr_buf[i][j] = ' ';
}
clrtoeol()
{
int i;
ttputs("\x9bK");
for (i = scr_col; i < 79; i++)
scr_buf[scr_row][i] = ' ';
}
clear()
{
int i,j;
ttputc('\f');
for (i = 0; i < 23; i++)
for (j = 0; j < 79; j++)
scr_buf[i][j] = ' ';
}
initscr()
{
ttopen();
clear();
}
crmode()
{
}
noecho()
{
do_echo = 0;
}
echo()
{
do_echo = 1;
}
endwin()
{
ttclose();
}