diff options
author | delphij <delphij@FreeBSD.org> | 2009-05-08 23:34:35 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2009-05-08 23:34:35 +0000 |
commit | d069efd47cacc3156036ed37d5532d6a1d4f55c3 (patch) | |
tree | 2526f6b109843b646672c1537476dc51e56c0454 /contrib/less/output.c | |
parent | 6aa3e25391d160482339ee072c010bcd22dfbbd1 (diff) | |
download | FreeBSD-src-d069efd47cacc3156036ed37d5532d6a1d4f55c3.zip FreeBSD-src-d069efd47cacc3156036ed37d5532d6a1d4f55c3.tar.gz |
Flatten all tags of the dist tree of less.
Diffstat (limited to 'contrib/less/output.c')
-rw-r--r-- | contrib/less/output.c | 615 |
1 files changed, 0 insertions, 615 deletions
diff --git a/contrib/less/output.c b/contrib/less/output.c deleted file mode 100644 index 9c9d4ac..0000000 --- a/contrib/less/output.c +++ /dev/null @@ -1,615 +0,0 @@ -/* - * Copyright (C) 1984-2007 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ - - -/* - * High level routines dealing with the output to the screen. - */ - -#include "less.h" -#if MSDOS_COMPILER==WIN32C -#include "windows.h" -#endif - -public int errmsgs; /* Count of messages displayed by error() */ -public int need_clr; -public int final_attr; -public int at_prompt; - -extern int sigs; -extern int sc_width; -extern int so_s_width, so_e_width; -extern int screen_trashed; -extern int any_display; -extern int is_tty; -extern int oldbot; - -#if MSDOS_COMPILER==BORLANDC || MSDOS_COMPILER==DJGPPC -extern int ctldisp; -extern int nm_fg_color, nm_bg_color; -extern int bo_fg_color, bo_bg_color; -extern int ul_fg_color, ul_bg_color; -extern int so_fg_color, so_bg_color; -extern int bl_fg_color, bl_bg_color; -#endif - -/* - * Display the line which is in the line buffer. - */ - public void -put_line() -{ - register int c; - register int i; - int a; - - if (ABORT_SIGS()) - { - /* - * Don't output if a signal is pending. - */ - screen_trashed = 1; - return; - } - - final_attr = AT_NORMAL; - - for (i = 0; (c = gline(i, &a)) != '\0'; i++) - { - at_switch(a); - final_attr = a; - if (c == '\b') - putbs(); - else - putchr(c); - } - - at_exit(); -} - -static char obuf[OUTBUF_SIZE]; -static char *ob = obuf; - -/* - * Flush buffered output. - * - * If we haven't displayed any file data yet, - * output messages on error output (file descriptor 2), - * otherwise output on standard output (file descriptor 1). - * - * This has the desirable effect of producing all - * error messages on error output if standard output - * is directed to a file. It also does the same if - * we never produce any real output; for example, if - * the input file(s) cannot be opened. If we do - * eventually produce output, code in edit() makes - * sure these messages can be seen before they are - * overwritten or scrolled away. - */ - public void -flush() -{ - register int n; - register int fd; - - n = ob - obuf; - if (n == 0) - return; -#if MSDOS_COMPILER==WIN32C - if (is_tty && any_display) - { - char *op; - DWORD nwritten = 0; - CONSOLE_SCREEN_BUFFER_INFO scr; - int row; - int col; - int olen; - extern HANDLE con_out; - - olen = ob - obuf; - /* - * There is a bug in Win32 WriteConsole() if we're - * writing in the last cell with a different color. - * To avoid color problems in the bottom line, - * we scroll the screen manually, before writing. - */ - GetConsoleScreenBufferInfo(con_out, &scr); - col = scr.dwCursorPosition.X; - row = scr.dwCursorPosition.Y; - for (op = obuf; op < obuf + olen; op++) - { - if (*op == '\n') - { - col = 0; - row++; - } else if (*op == '\r') - { - col = 0; - } else - { - col++; - if (col >= sc_width) - { - col = 0; - row++; - } - } - } - if (row > scr.srWindow.Bottom) - win32_scroll_up(row - scr.srWindow.Bottom); - WriteConsole(con_out, obuf, olen, &nwritten, NULL); - ob = obuf; - return; - } -#else -#if MSDOS_COMPILER==MSOFTC - if (is_tty && any_display) - { - *ob = '\0'; - _outtext(obuf); - ob = obuf; - return; - } -#else -#if MSDOS_COMPILER==BORLANDC || MSDOS_COMPILER==DJGPPC - if (is_tty && any_display) - { - *ob = '\0'; - if (ctldisp != OPT_ONPLUS) - cputs(obuf); - else - { - /* - * Look for SGR escape sequences, and convert them - * to color commands. Replace bold, underline, - * and italic escapes into colors specified via - * the -D command-line option. - */ - char *anchor, *p, *p_next; - int buflen = ob - obuf; - unsigned char fg, bg, norm_attr; - /* - * Only dark colors mentioned here, so that - * bold has visible effect. - */ - static enum COLORS screen_color[] = { - BLACK, RED, GREEN, BROWN, - BLUE, MAGENTA, CYAN, LIGHTGRAY - }; - - /* Normal text colors are used as baseline. */ - bg = nm_bg_color & 0xf; - fg = nm_fg_color & 0xf; - norm_attr = (bg << 4) | fg; - for (anchor = p_next = obuf; - (p_next = memchr (p_next, ESC, - buflen - (p_next - obuf))) - != NULL; ) - { - p = p_next; - - /* - * Handle the null escape sequence - * (ESC-[m), which is used to restore - * the original color. - */ - if (p[1] == '[' && is_ansi_end(p[2])) - { - textattr(norm_attr); - p += 3; - anchor = p_next = p; - continue; - } - - if (p[1] == '[') /* "Esc-[" sequence */ - { - /* - * If some chars seen since - * the last escape sequence, - * write it out to the screen - * using current text attributes. - */ - if (p > anchor) - { - *p = '\0'; - cputs (anchor); - *p = ESC; - anchor = p; - } - p += 2; - p_next = p; - while (!is_ansi_end(*p)) - { - char *q; - long code = strtol(p, &q, 10); - - if (!*q) - { - /* - * Incomplete sequence. - * Leave it unprocessed - * in the buffer. - */ - int slop = q - anchor; - strcpy(obuf, anchor); - ob = &obuf[slop]; - return; - } - - if (q == p - || code > 49 || code < 0 - || (!is_ansi_end(*q) - && *q != ';')) - { - p_next = q; - break; - } - if (*q == ';') - q++; - - switch (code) - { - case 1: /* bold on */ - fg = bo_fg_color; - bg = bo_bg_color; - break; - case 3: /* italic on */ - fg = so_fg_color; - bg = so_bg_color; - break; - case 4: /* underline on */ - fg = ul_fg_color; - bg = ul_bg_color; - break; - case 8: /* concealed on */ - fg = (bg & 7) | 8; - break; - case 0: /* all attrs off */ - case 22:/* bold off */ - case 23:/* italic off */ - case 24:/* underline off */ - fg = nm_fg_color; - bg = nm_bg_color; - break; - case 30: case 31: case 32: - case 33: case 34: case 35: - case 36: case 37: - fg = (fg & 8) | (screen_color[code - 30]); - break; - case 39: /* default fg */ - fg = nm_fg_color; - break; - case 40: case 41: case 42: - case 43: case 44: case 45: - case 46: case 47: - bg = (bg & 8) | (screen_color[code - 40]); - break; - case 49: /* default fg */ - bg = nm_bg_color; - break; - } - p = q; - } - if (is_ansi_end(*p) && p > p_next) - { - bg &= 15; - fg &= 15; - textattr ((bg << 4)| fg); - p_next = anchor = p + 1; - } else - break; - } else - p_next++; - } - - /* Output what's left in the buffer. */ - cputs (anchor); - } - ob = obuf; - return; - } -#endif -#endif -#endif - fd = (any_display) ? 1 : 2; - if (write(fd, obuf, n) != n) - screen_trashed = 1; - ob = obuf; -} - -/* - * Output a character. - */ - public int -putchr(c) - int c; -{ -#if 0 /* fake UTF-8 output for testing */ - extern int utf_mode; - if (utf_mode) - { - static char ubuf[MAX_UTF_CHAR_LEN]; - static int ubuf_len = 0; - static int ubuf_index = 0; - if (ubuf_len == 0) - { - ubuf_len = utf_len(c); - ubuf_index = 0; - } - ubuf[ubuf_index++] = c; - if (ubuf_index < ubuf_len) - return c; - c = get_wchar(ubuf) & 0xFF; - ubuf_len = 0; - } -#endif - if (need_clr) - { - need_clr = 0; - clear_bot(); - } -#if MSDOS_COMPILER - if (c == '\n' && is_tty) - { - /* remove_top(1); */ - putchr('\r'); - } -#else -#ifdef _OSK - if (c == '\n' && is_tty) /* In OS-9, '\n' == 0x0D */ - putchr(0x0A); -#endif -#endif - /* - * Some versions of flush() write to *ob, so we must flush - * when we are still one char from the end of obuf. - */ - if (ob >= &obuf[sizeof(obuf)-1]) - flush(); - *ob++ = c; - at_prompt = 0; - return (c); -} - -/* - * Output a string. - */ - public void -putstr(s) - register char *s; -{ - while (*s != '\0') - putchr(*s++); -} - - -/* - * Convert an integral type to a string. - */ -#define TYPE_TO_A_FUNC(funcname, type) \ -void funcname(num, buf) \ - type num; \ - char *buf; \ -{ \ - int neg = (num < 0); \ - char tbuf[INT_STRLEN_BOUND(num)+2]; \ - register char *s = tbuf + sizeof(tbuf); \ - if (neg) num = -num; \ - *--s = '\0'; \ - do { \ - *--s = (num % 10) + '0'; \ - } while ((num /= 10) != 0); \ - if (neg) *--s = '-'; \ - strcpy(buf, s); \ -} - -TYPE_TO_A_FUNC(postoa, POSITION) -TYPE_TO_A_FUNC(linenumtoa, LINENUM) -TYPE_TO_A_FUNC(inttoa, int) - -/* - * Output an integer in a given radix. - */ - static int -iprint_int(num) - int num; -{ - char buf[INT_STRLEN_BOUND(num)]; - - inttoa(num, buf); - putstr(buf); - return (strlen(buf)); -} - -/* - * Output a line number in a given radix. - */ - static int -iprint_linenum(num) - LINENUM num; -{ - char buf[INT_STRLEN_BOUND(num)]; - - linenumtoa(num, buf); - putstr(buf); - return (strlen(buf)); -} - -/* - * This function implements printf-like functionality - * using a more portable argument list mechanism than printf's. - */ - static int -less_printf(fmt, parg) - register char *fmt; - PARG *parg; -{ - register char *s; - register int col; - - col = 0; - while (*fmt != '\0') - { - if (*fmt != '%') - { - putchr(*fmt++); - col++; - } else - { - ++fmt; - switch (*fmt++) - { - case 's': - s = parg->p_string; - parg++; - while (*s != '\0') - { - putchr(*s++); - col++; - } - break; - case 'd': - col += iprint_int(parg->p_int); - parg++; - break; - case 'n': - col += iprint_linenum(parg->p_linenum); - parg++; - break; - } - } - } - return (col); -} - -/* - * Get a RETURN. - * If some other non-trivial char is pressed, unget it, so it will - * become the next command. - */ - public void -get_return() -{ - int c; - -#if ONLY_RETURN - while ((c = getchr()) != '\n' && c != '\r') - bell(); -#else - c = getchr(); - if (c != '\n' && c != '\r' && c != ' ' && c != READ_INTR) - ungetcc(c); -#endif -} - -/* - * Output a message in the lower left corner of the screen - * and wait for carriage return. - */ - public void -error(fmt, parg) - char *fmt; - PARG *parg; -{ - int col = 0; - static char return_to_continue[] = " (press RETURN)"; - - errmsgs++; - - if (any_display && is_tty) - { - if (!oldbot) - squish_check(); - at_exit(); - clear_bot(); - at_enter(AT_STANDOUT); - col += so_s_width; - } - - col += less_printf(fmt, parg); - - if (!(any_display && is_tty)) - { - putchr('\n'); - return; - } - - putstr(return_to_continue); - at_exit(); - col += sizeof(return_to_continue) + so_e_width; - - get_return(); - lower_left(); - - if (col >= sc_width) - /* - * Printing the message has probably scrolled the screen. - * {{ Unless the terminal doesn't have auto margins, - * in which case we just hammered on the right margin. }} - */ - screen_trashed = 1; - - flush(); -} - -static char intr_to_abort[] = "... (interrupt to abort)"; - -/* - * Output a message in the lower left corner of the screen - * and don't wait for carriage return. - * Usually used to warn that we are beginning a potentially - * time-consuming operation. - */ - public void -ierror(fmt, parg) - char *fmt; - PARG *parg; -{ - at_exit(); - clear_bot(); - at_enter(AT_STANDOUT); - (void) less_printf(fmt, parg); - putstr(intr_to_abort); - at_exit(); - flush(); - need_clr = 1; -} - -/* - * Output a message in the lower left corner of the screen - * and return a single-character response. - */ - public int -query(fmt, parg) - char *fmt; - PARG *parg; -{ - register int c; - int col = 0; - - if (any_display && is_tty) - clear_bot(); - - (void) less_printf(fmt, parg); - c = getchr(); - - if (!(any_display && is_tty)) - { - putchr('\n'); - return (c); - } - - lower_left(); - if (col >= sc_width) - screen_trashed = 1; - flush(); - - return (c); -} |