diff options
Diffstat (limited to 'irc/screen.c')
-rw-r--r-- | irc/screen.c | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/irc/screen.c b/irc/screen.c new file mode 100644 index 0000000..01afa11 --- /dev/null +++ b/irc/screen.c @@ -0,0 +1,287 @@ +/************************************************************************ + * IRC - Internet Relay Chat, irc/screen.c + * Copyright (C) 1990 Jarkko Oikarinen and + * University of Oulu, Computing Center + * + * 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 1, 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef lint +static char rcsid[] = "@(#)$Id: screen.c,v 1.2 1997/09/03 17:45:42 kalt Exp $"; +#endif + +#include "os.h" +#include "c_defines.h" +#define SCREEN_C +#include "c_externs.h" +#undef SCREEN_C + +#define SBUFSIZ 240 + +#define FROM_START 0 +#define FROM_END 1 +#define RELATIVE 2 + +#define HIST_SIZ 1000 + +static char last_line[SBUFSIZ+1]; +static char yank_buffer[SBUFSIZ+1]; +static char history[HIST_SIZ][SBUFSIZ+1]; +static int position = 0; +static int pos_in_history = 0; + +int insert = 1; /* default to insert mode */ + /* I want insert mode, thazwhat emacs does ! //jkp */ + +int get_char(pos) +int pos; +{ + if (pos>=SBUFSIZ || pos<0) + return 0; + return (int)last_line[pos]; +} + +void set_char(pos, ch) +int pos, ch; +{ + if (pos<0 || pos>=SBUFSIZ) + return; + if (ch<0) + ch=0; + last_line[pos]=(char)ch; +} + +int get_yank_char(pos) +int pos; +{ + if (pos>=SBUFSIZ || pos<0) + return 0; + return (int)yank_buffer[pos]; +} + +void set_yank_char(pos, ch) +int pos, ch; +{ + if (pos<0 || pos>=SBUFSIZ) + return; + if (ch<0) + ch=0; + yank_buffer[pos]=(char)ch; +} + +void set_position(disp, from) +int disp, from; +{ + int i1; + + switch (from) { + case FROM_START: + position=disp; + break; + case RELATIVE: + position+=disp; + break; + case FROM_END: + for (i1=0; get_char(i1); i1++); + position=i1-1; + break; + default: + position=0; + break; + } +} + +int get_position() +{ + return position; +} + +void toggle_ins() +{ + insert = !insert; +#ifdef DOCURSES + if (termtype == CURSES_TERM) { + standout(); + if (insert) + mvaddstr(LINES-2, 75, "INS"); + else + mvaddstr(LINES-2, 75, "OWR"); + standend(); + } +#endif +#ifdef DOTERMCAP + if (termtype == TERMCAP_TERM) + put_insflag(insert); +#endif +} + +int in_insert_mode() +{ + return insert; +} + +void send_this_line() +{ + record_line(); + sendit(last_line); + clear_last_line(); + bol(); + tulosta_viimeinen_rivi(); +#ifdef DOCURSES + if (termtype == CURSES_TERM) + refresh(); +#endif +} + +void record_line() +{ + static int place=0; + int i1; + + for(i1=0; i1<SBUFSIZ; i1++) + history[place][i1]=get_char(i1); + place++; + if (place==HIST_SIZ) + place=0; + pos_in_history=place; +} + +void clear_last_line() +{ + int i1; + + for(i1=0; i1<SBUFSIZ; i1++) + set_char(i1,(int)'\0'); +} + +void kill_eol() +{ + int i1, i2, i3; + + i1=get_position(); + set_position(0, FROM_END); + i2=get_position(); + for(i3=0; i3<SBUFSIZ; i3++) + set_yank_char(i3,(int)'\0'); + for(i3=0; i3<=(i2-i1); i3++) { + set_yank_char(i3,get_char(i1+i3)); + set_char(i1+i3, 0); + } + set_position(i1, FROM_START); +} + +void next_in_history() +{ + int i1; + + pos_in_history++; + if (pos_in_history==HIST_SIZ) + pos_in_history=0; + clear_last_line(); + + for (i1 = 0; history[pos_in_history][i1]; i1++) + set_char(i1, history[pos_in_history][i1]); + + set_position(0, FROM_START); +} + +void previous_in_history() +{ + int i1; + + pos_in_history--; + if (pos_in_history<0) + pos_in_history=HIST_SIZ-1; + clear_last_line(); + for (i1=0; history[pos_in_history][i1]; i1++) + set_char(i1, history[pos_in_history][i1]); + + set_position(0, FROM_START); +} + +void kill_whole_line() +{ + clear_last_line(); + set_position(0, FROM_START); +} + +void yank() +{ + int i1, i2, i3; + + i1=get_position(); + i2=0; + while (get_yank_char(i2)) + i2++; + + for(i3=SBUFSIZ-1; i3>=i1+i2; i3--) + set_char(i3, get_char(i3-i2)); + for(i3=0; i3<i2; i3++) + set_char(i1+i3, get_yank_char(i3)); +} + +int tulosta_viimeinen_rivi() +{ + static int paikka=0; + int i1, i2, i3; + + i1=get_position(); + /* taytyyko siirtaa puskuria */ + if (i1<(get_disp(paikka)+10) && paikka) { + paikka--; + i2=get_disp(paikka); + } else if (i1>(get_disp(paikka)+70)) { + paikka++; + i2=get_disp(paikka); + } else { + i2=get_disp(paikka); + } + +#ifdef DOCURSES + if (termtype == CURSES_TERM) { + move(LINES-1,0); + for(i3=0; i3<78; i3++) + if (get_char(i2+i3)) + mvaddch(LINES-1, i3, get_char(i2+i3)); + clrtoeol(); + move(LINES-1, i1-get_disp(paikka)); + refresh(); + } +#endif +#ifdef DOTERMCAP + if (termtype == TERMCAP_TERM) { + tcap_move(-1, 0); + for(i3=0; i3<78; i3++) + if (get_char(i2+i3)) +/* tcap_putch(LINES-1, i3, get_char(i2+i3)); */ + tcap_putch(-1, i3, get_char(i2+i3)); +/* clear_to_eol(); */ + clear_to_eol(-1, 78); + tcap_move(-1, i1-get_disp(paikka)); +/* refresh(); */ + } +#endif + return (i1-get_disp(paikka)); +} + +int get_disp(paikka) +int paikka; +{ + static int place[]={0,55,110,165,220}; + + if (paikka>4 || paikka<0) + return 0; + return place[paikka]; +} |