/* * output.c: handles a variety of tasks dealing with the output from the irc * program * * Written By Michael Sandrof * * Copyright (c) 1990 Michael Sandrof. * Copyright (c) 1991, 1992 Troy Rollo. * Copyright (c) 1992-2004 Matthew R. Green. * 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. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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. */ #include "irc.h" IRCII_RCSID("@(#)$eterna: output.c,v 1.49 2004/01/07 23:30:00 gkm Exp $"); #ifdef HAVE_SYS_IOCTL_H # include #endif /* HAVE_SYS_IOCTL_H */ #include "output.h" #include "vars.h" #include "input.h" #include "ircterm.h" #include "ircaux.h" #include "lastlog.h" #include "window.h" #include "screen.h" #include "hook.h" #include "ctcp.h" #include "log.h" #include "alias.h" #include "buffer.h" #ifdef NEED_PUTBUF_DECLARED /* * put_it has to be reentrant - this works because the text is used before * it's overwritten by the reentering, but it's not The Right Thing ... */ static u_char FAR putbuf[4*BIG_BUFFER_SIZE] = ""; #endif int in_help = 0; int do_refresh_screen; /* * refresh_screen: Whenever the REFRESH_SCREEN function is activated, this * swoops into effect */ /*ARGSUSED*/ void refresh_screen(key, ptr) u_int key; u_char *ptr; { term_clear_screen(); if (term_resize()) recalculate_windows(); else redraw_all_windows(); update_all_windows(); update_input(UPDATE_ALL); } /* init_windows: */ void init_screen() { new_window(); term_init(); term_clear_screen(); term_resize(); recalculate_windows(); update_all_windows(); init_input(); term_move_cursor(0, 0); } /* put_file: uses put_it() to display the contents of a file to the display */ void put_file(filename) u_char *filename; { FILE *fp; char line[1024]; /* too big? too small? who cares? */ size_t len; if ((fp = fopen(CP(filename), "r")) != (FILE *) 0) { while (fgets(line, 1024, fp)) { if (line && *line) { if ((len = my_strlen(line))) { if (*(line + len - 1) == '\n') *(line + len - 1) = (u_char) 0; } put_it("%s", line); } else put_it(" "); } fclose(fp); } } /* * put_it: the irc display routine. Use this routine to display anything to * the main irc window. It handles sending text to the display or stdout as * needed, add stuff to the lastlog and log file, etc. Things NOT to do: * Dont send any text that contains \n, very unpredictable. Tabs will also * screw things up. The calling routing is responsible for not overwriting * the 1K buffer allocated. * * For Ultrix machines, you can't call put_it() with floating point arguements. * It just doesn't work. - phone, jan 1993. */ /*VARARGS*/ void put_it(char *format, ...) { va_list vl; if (window_display) { PUTBUF_INIT va_start(vl, format); PUTBUF_SPRINTF(format, vl) va_end(vl); add_to_log(irclog_fp, putbuf); add_to_screen(putbuf); PUTBUF_END } } /* This is an alternative form of put_it which writes three asterisks * before actually putting things out. */ void say(char *format, ...) { va_list vl; if (window_display) { u_char *fmt = (u_char *) 0; PUTBUF_INIT if (get_int_var(SHOW_STARS_VAR)) { u_char *s; int flag = 0; s = expand_alias((u_char *) 0, get_string_var(STAR_PREFIX_VAR), empty_string, &flag, (u_char **) 0); if (s) { malloc_strcpy(&fmt, s); new_free(&s); } malloc_strcat(&fmt, UP(format)); format = CP(fmt); } va_start(vl, format); PUTBUF_SPRINTF(format, vl) va_end(vl); add_to_log(irclog_fp, putbuf); add_to_screen(putbuf); PUTBUF_END if (fmt) new_free(&fmt); } } void yell(char *format, ...) { va_list vl; PUTBUF_INIT va_start(vl, format); PUTBUF_SPRINTF(format, vl) va_end(vl); add_to_log(irclog_fp, putbuf); add_to_screen(putbuf); PUTBUF_END } /* help_put_it: works just like put_it, but is specially used by help */ void help_put_it(u_char *topic, char *format, ...) { va_list vl; PUTBUF_INIT int lastlog_level; va_start(vl, format); PUTBUF_SPRINTF(format, vl) va_end(vl); in_help = 1; lastlog_level = set_lastlog_msg_level(LOG_HELP); if (do_hook(HELP_LIST, "%s %s", topic, putbuf)) { if (window_display) { add_to_log(irclog_fp, putbuf); add_to_screen(putbuf); } } (void) set_lastlog_msg_level(lastlog_level); in_help = 0; PUTBUF_END }