bvi/bm_unix.c

242 lines
3.9 KiB
C
Raw Normal View History

2001-01-15 00:00:00 +00:00
/* BM_UNIX.C - Unix specific subroutines for BMORE
*
* 2000-05-31 V 1.3.0 beta
* 2000-10-12 V 1.3.0 final
2002-02-18 00:00:00 +00:00
* 2002-02-10 V 1.3.1
2001-01-15 00:00:00 +00:00
*
* NOTE: Edit this file with tabstop=4 !
*
2002-02-18 00:00:00 +00:00
* Copyright 1996-2002 by Gerhard Buergmann
2001-01-15 00:00:00 +00:00
* Gerhard.Buergmann@altavista.net
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* This program 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
* General Public License for more details.
*
* See file COPYING for information on distribution conditions.
*/
#include "bmore.h"
#include <termios.h>
#define TBUFSIZ 1024
#define stty(fd,argp) tcsetattr(fd,TCSAFLUSH,argp)
struct termios ostate, nstate;
2002-02-18 00:00:00 +00:00
char *rev_start, *rev_end; /* enter and exit standout mode */
char *Home; /* go to home */
char *clear_sc; /* clear screen */
char *erase_ln; /* erase line */
2001-01-15 00:00:00 +00:00
extern off_t bytepos, screen_home;
extern FILE *curr_file;
int got_int;
int fnum, no_intty, no_tty, slow_tty;
int dum_opt, dlines;
2002-02-18 00:00:00 +00:00
#ifdef HAVE_NCURSES_H
# undef NEED_PUTC_CHAR
#endif
2001-01-15 00:00:00 +00:00
/*
* A real function, for the tputs routine
*/
#ifdef NEED_PUTC_CHAR
int
putchr(char ch)
{return putchar((int)ch);}
#else
int
putchr(ch)
int ch;
{return putchar(ch);}
#endif
void
initterm()
{
char buf[TBUFSIZ];
static char clearbuf[TBUFSIZ];
char *term;
char *clearptr;
struct termios nstate;
no_tty = tcgetattr(fileno(stdout), &ostate);
2002-02-18 00:00:00 +00:00
if (!no_tty) {
nstate = ostate;
nstate.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL);
nstate.c_cc[VMIN] = 1;
nstate.c_cc[VTIME] = 0;
tcsetattr(fileno(stdin), TCSADRAIN, &nstate);
}
2001-01-15 00:00:00 +00:00
if ((term = getenv("TERM")) == 0 || tgetent(buf, term) <= 0) {
printf("Dumb terminal\n");
maxx = 80;
maxy = 24;
} else {
maxy = tgetnum("li");
maxx = tgetnum("co");
}
clearptr = clearbuf;
erase_ln = tgetstr("ce", &clearptr);
clear_sc = tgetstr("cl", &clearptr);
rev_start = tgetstr("so", &clearptr);
rev_end = tgetstr("se", &clearptr);
no_intty = tcgetattr(fileno(stdin), &ostate);
tcgetattr(fileno(stderr), &ostate);
2002-02-18 00:00:00 +00:00
nstate = ostate;
if (!no_tty) {
ostate.c_lflag &= ~(ICANON|ECHO);
}
2001-01-15 00:00:00 +00:00
}
void
set_tty()
{
2002-02-18 00:00:00 +00:00
if (no_tty) return;
ostate.c_lflag &= ~(ICANON|ECHO);
stty(fileno(stderr), &ostate);
2001-01-15 00:00:00 +00:00
}
void
reset_tty()
{
if (no_tty) return;
ostate.c_lflag |= ICANON|ECHO;
stty(fileno(stderr), &ostate);
}
void
sig()
{
signal(SIGINT, sig);
signal(SIGQUIT, sig);
got_int = TRUE;
}
/*
* doshell() - run a command or an interactive shell
*/
void
doshell(cmd)
char *cmd;
{
char *getenv();
2002-02-18 00:00:00 +00:00
char *shell;
2001-01-15 00:00:00 +00:00
char cline[128];
2002-02-18 00:00:00 +00:00
printf("\n");
if ((shell = getenv("SHELL")) == NULL) shell = "sh";
else if(strrchr(shell,'/')) shell=(char *)(strrchr(shell,'/')+1);
2001-01-15 00:00:00 +00:00
2002-02-18 00:00:00 +00:00
if (cmd[0] == '\0') {
sprintf(cline, "%s -i", shell);
cmd = cline;
} else {
sprintf(cline, "%s -c \"%s\"", shell, cmd);
2001-01-15 00:00:00 +00:00
cmd = cline;
}
reset_tty();
system(cmd);
set_tty();
printf("\r");
home();
fseek(curr_file, screen_home, SEEK_SET);
bytepos = screen_home;
}
void
highvideo()
{
if (rev_start && rev_end)
tputs(rev_start, 1, putchr);
}
void
normvideo()
{
if (rev_start && rev_end)
tputs(rev_end, 1, putchr);
}
void
clrscr()
{
tputs(clear_sc, 1, putchr);
}
void
home()
{
tputs(Home, 1, putchr);
}
/* force clear to end of line */
void
clreol()
{
tputs(erase_ln, 1, putchr);
}
int
vgetc()
{
char cha;
extern int errno;
errno = 0;
if (read(2, &cha, 1) <= 0) {
if (errno != EINTR)
exit(2);
}
return (cha);
}
#ifndef HAVE_MEMMOVE
/*
* Copy contents of memory (with possible overlapping).
*/
char *
memmove(s1, s2, n)
char *s1;
char *s2;
size_t n;
{
bcopy(s2, s1, n);
return(s1);
}
#endif