home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 531.lha / Less_v1.4Z / src.LZH / src / screen.c < prev    next >
C/C++ Source or Header  |  1991-07-03  |  20KB  |  815 lines

  1. /*
  2.  * Routines which deal with the characteristics of the terminal.
  3.  * Uses termcap to be as terminal-independent as possible.
  4.  *
  5.  * {{ Someday this should be rewritten to use curses. }}
  6.  */
  7.  
  8. #ifdef AMIGA
  9. /* Compile with -HPreHeader.q to get "less.h"! */
  10. #else
  11. #include "less.h"
  12. #endif
  13.  
  14. #if XENIX
  15. #include <sys/types.h>
  16. #include <sys/ioctl.h>
  17. #endif
  18.  
  19. #ifdef AMIGA
  20. extern int sc_window_spec;   /* user's requested -z */
  21. extern int scroll; /* half-page scroll length */
  22. extern int nrow, ncol;
  23. #else
  24. #if TERMIO
  25. #include <termio.h>
  26. #else
  27. #include <sgtty.h>
  28. #endif
  29. #endif
  30.  
  31. #ifdef TIOCGWINSZ
  32. #include <sys/ioctl.h>
  33. #else
  34. /*
  35.  * For the Unix PC (ATT 7300 & 3B1):
  36.  * Since WIOCGETD is defined in sys/window.h, we can't use that to decide
  37.  * whether to include sys/window.h.  Use SIGWIND from sys/signal.h instead.
  38.  */
  39. #include <signal.h>
  40. #ifdef SIGWIND
  41. #include <sys/window.h>
  42. #endif
  43. #endif
  44.  
  45.  
  46. /*
  47.  * Strings passed to tputs() to do various terminal functions.
  48.  */
  49. static char
  50.         *sc_pad,                /* Pad string */
  51.         *sc_home,               /* Cursor home */
  52.         *sc_addline,            /* Add line, scroll down following lines */
  53.         *sc_lower_left,         /* Cursor to last line, first column */
  54.         *sc_move,               /* General cursor positioning */
  55.         *sc_clear,              /* Clear screen */
  56.         *sc_eol_clear,          /* Clear to end of line */
  57.         *sc_s_in,               /* Enter standout (highlighted) mode */
  58.         *sc_s_out,              /* Exit standout mode */
  59.         *sc_u_in,               /* Enter underline mode */
  60.         *sc_u_out,              /* Exit underline mode */
  61.         *sc_b_in,               /* Enter bold mode */
  62.         *sc_b_out,              /* Exit bold mode */
  63. #ifdef AMIGA
  64.         *sc_it_in,              /* Enter italic mode */
  65.         *sc_it_out,             /* Exit italic mode */
  66.         *sc_nv_in,              /* Enter inverse video mode */
  67.         *sc_nv_out,             /* Exit inverse video mode */
  68. #endif
  69.         *sc_visual_bell,        /* Visual bell (flash screen) sequence */
  70.         *sc_backspace,          /* Backspace cursor */
  71.         *sc_init,               /* Startup terminal initialization */
  72.         *sc_deinit;             /* Exit terminal de-intialization */
  73. #ifdef DUMBTERM
  74. static int dumb;
  75. #endif
  76. static int hard;
  77.  
  78. public int auto_wrap;           /* Terminal does \r\n when write past margin */
  79. public int ignaw;               /* Terminal ignores \n immediately after wrap */
  80. public int erase_char, kill_char; /* The user's erase and line-kill chars */
  81. public int sc_width, sc_height; /* Height & width of screen */
  82. public int sc_window = -1;      /* window size for forward and backward */
  83. public int bo_width, be_width;  /* Printing width of boldface sequences */
  84. public int ul_width, ue_width;  /* Printing width of underline sequences */
  85. public int so_width, se_width;  /* Printing width of standout sequences */
  86. public int it_width, ie_width;  /* Printing width of italic sequences */
  87. public int nv_width, ne_width;  /* Printing width of inv video sequences */
  88.  
  89. /*
  90.  * These two variables are sometimes defined in,
  91.  * and needed by, the termcap library.
  92.  * It may be necessary on some systems to declare them extern here.
  93.  */
  94. /*extern*/ short ospeed;        /* Terminal output baud rate */
  95. /*extern*/ char PC;             /* Pad character */
  96.  
  97. extern int quiet;               /* If VERY_QUIET, use visual bell for bell */
  98. #ifdef DUMBTERM
  99. extern int know_dumb;           /* Don't complain about a dumb terminal */
  100. #endif
  101. extern int back_scroll;
  102. char *tgetstr();
  103. char *tgoto();
  104.  
  105. /*
  106.  * Change terminal to "raw mode", or restore to "normal" mode.
  107.  * "Raw mode" means
  108.  *      1. An outstanding read will complete on receipt of a single keystroke.
  109.  *      2. Input is not echoed.
  110.  *      3. On output, \n is mapped to \r\n.
  111.  *      4. \t is NOT expanded into spaces.
  112.  *      5. Signal-causing characters such as ctrl-C (interrupt),
  113.  *         etc. are NOT disabled.
  114.  * It doesn't matter whether an input \n is mapped to \r, or vice versa.
  115.  */
  116. #ifdef __STDC__
  117. void raw_mode (int on)
  118. #else
  119.         public void
  120. raw_mode(on)
  121.         int on;
  122. #endif
  123. {
  124. #ifdef AMIGA
  125.         extern int do_echo;
  126.  
  127.         if (on)
  128.                 do_echo = 0;
  129.         else
  130.                 do_echo = 1;
  131.         erase_char = 8; /* ^H */
  132.         kill_char = 24; /* ^X */
  133. #else
  134. #if TERMIO
  135.         struct termio s;
  136.         static struct termio save_term;
  137.  
  138.         if (on)
  139.         {
  140.                 /*
  141.                  * Get terminal modes.
  142.                  */
  143.                 ioctl(2, TCGETA, &s);
  144.  
  145.                 /*
  146.                  * Save modes and set certain variables dependent on modes.
  147.                  */
  148.                 save_term = s;
  149.                 ospeed = s.c_cflag & CBAUD;
  150.                 erase_char = s.c_cc[VERASE];
  151.                 kill_char = s.c_cc[VKILL];
  152.  
  153.                 /*
  154.                  * Set the modes to the way we want them.
  155.                  */
  156.                 s.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL);
  157.                 s.c_oflag |=  (OPOST|ONLCR|TAB3);
  158.                 s.c_oflag &= ~(OCRNL|ONOCR|ONLRET);
  159.                 s.c_cc[VMIN] = 1;
  160.                 s.c_cc[VTIME] = 0;
  161.         } else
  162.         {
  163.                 /*
  164.                  * Restore saved modes.
  165.                  */
  166.                 s = save_term;
  167.         }
  168.         ioctl(2, TCSETAW, &s);
  169. #else
  170.         struct sgttyb s;
  171.         static struct sgttyb save_term;
  172.  
  173.         if (on)
  174.         {
  175.                 /*
  176.                  * Get terminal modes.
  177.                  */
  178.                 ioctl(2, TIOCGETP, &s);
  179.  
  180.                 /*
  181.                  * Save modes and set certain variables dependent on modes.
  182.                  */
  183.                 save_term = s;
  184.                 ospeed = s.sg_ospeed;
  185.                 erase_char = s.sg_erase;
  186.                 kill_char = s.sg_kill;
  187.  
  188.                 /*
  189.                  * Set the modes to the way we want them.
  190.                  */
  191.                 s.sg_flags |= CBREAK;
  192.                 s.sg_flags &= ~(ECHO|XTABS);
  193.         } else
  194.         {
  195.                 /*
  196.                  * Restore saved modes.
  197.                  */
  198.                 s = save_term;
  199.         }
  200.         ioctl(2, TIOCSETN, &s);
  201. #endif
  202. #endif
  203. }
  204.  
  205. #ifdef DUMBTERM
  206.         static void
  207. cannot(s)
  208.         char *s;
  209. {
  210.         char message[100];
  211.  
  212.         if (know_dumb)
  213.                 /*
  214.                  * He knows he has a dumb terminal, so don't tell him.
  215.                  */
  216.                 return;
  217.  
  218.         sprintf(message, "WARNING: terminal cannot \"%s\"", s);
  219.         error(message);
  220. }
  221. #endif
  222.  
  223. #ifdef AMIGA
  224. /*
  225.  * Set forward and backward scrolling limits based upon user's requests
  226.  * and screen size
  227.  */
  228. #ifdef __STDC__
  229. void set_scroll (void)
  230. #else
  231.         public void
  232. set_scroll()
  233. #endif
  234. {
  235.         if (sc_window_spec > 0)
  236.             sc_window = (sc_window_spec < nrow? sc_window_spec: nrow - 1);
  237.         else
  238.             sc_window = nrow - 1;
  239. }
  240. #endif
  241.  
  242. /*
  243.  * Get terminal capabilities via termcap.
  244.  */
  245. #ifdef __STDC__
  246. void get_term (void)
  247. #else
  248.         public void
  249. get_term()
  250. #endif
  251. {
  252. #ifdef AMIGA
  253.         static char go_to_home[10];
  254.  
  255.         getrowcol(); /* find out window size */
  256.         scroll = nrow/2;
  257.         set_scroll();
  258.  
  259. /* I didn't want to port termcap for now, but there is a version
  260.  on fish #14 that someone might want to use */
  261.         sc_pad = "";                /* Pad string */
  262.         sc_home = "\x9b\x31;1H";           /* Cursor home */
  263.         sc_addline = "\x9bL";       /* Add line, scroll down following lines */
  264.         sprintf(go_to_home, "\x9b%d;1H", nrow);
  265.         sc_lower_left = go_to_home;     /* Cursor to last line, first column */
  266.         sc_move = "";               /* General cursor positioning */
  267.         sc_clear = "\f";            /* Clear screen */
  268.         sc_eol_clear = "\x9bK";     /* Clear to end of line */
  269.         sc_s_in = "\x9b\x37m";   /* Enter standout (highlighted) mode */
  270.         sc_s_out = "\x9b\x30m";         /* Exit standout mode */
  271.         sc_u_in = "\x9b\x34m";         /* Enter underline mode */
  272.         sc_u_out = "\x9b\x30m";         /* Exit underline mode */
  273.         sc_b_in = "\x9b\x31m";         /* Enter bold mode */
  274.         sc_b_out = "\x9b\x30m";       /* Exit bold mode */
  275.         sc_it_in = "\x9b\x33m";     /* Enter italic mode */
  276.         sc_it_out = "\x9b\x30m";    /* Exit italic mode */
  277.         sc_nv_in = "\x9b\x37m";     /* Enter inverse video mode */
  278.         sc_nv_out = "\x9b\x30m";    /* Exit inverse video mode */
  279.         /* We define visual_bell to be null, because on the Amiga the
  280.            ordinary BELL signal (^G) does a visual bell.  Thus, in the
  281.            Amiga version of Less, the user's choice is between a visual
  282.            bell (not quiet) and no indicator at all (quiet)
  283.         */
  284.         sc_visual_bell = NULL;    /* Visual bell (flash screen) sequence */
  285.         sc_backspace = "\b";      /* Backspace cursor */
  286.         sc_init = "";               /* Startup terminal initialization */
  287.         sc_deinit = "";             /* Exit terminal de-intialization */
  288.         sc_height = nrow;
  289.         sc_width = ncol;
  290.  
  291.         so_width = 0;
  292.         it_width = ie_width = nv_width = ne_width =
  293.         be_width = bo_width = ue_width = ul_width = se_width = so_width;
  294.  
  295. #else
  296.         char termbuf[2048];
  297.         char *sp;
  298. #ifdef TIOCGWINSZ
  299.         struct winsize w;
  300. #else
  301. #ifdef WIOCGETD
  302.         struct uwdata w;
  303. #endif
  304. #endif
  305.         static char sbuf[1024];
  306.  
  307.         char *getenv();
  308.  
  309.         /*
  310.          * Find out what kind of terminal this is.
  311.          */
  312.         if (tgetent(termbuf, getenv("TERM")) <= 0)
  313.                 dumb = 1;
  314.  
  315.         /*
  316.          * Get size of the screen.
  317.          */
  318. #ifdef TIOCGWINSZ
  319.         if (ioctl(2, TIOCGWINSZ, &w) == 0 && w.ws_row)
  320.                 sc_height = w.ws_row;
  321.         else
  322. #else
  323. #ifdef WIOCGETD
  324.         if (ioctl(2, WIOCGETD, &w) == 0 && w.uw_height)
  325.                 sc_height = w.uw_height/w.uw_vs;
  326.         else
  327. #endif
  328. #endif
  329.                 sc_height = tgetnum("li");
  330.         if (dumb || sc_height < 0 || tgetflag("hc"))
  331.         {
  332.                 /* Oh no, this is a hardcopy terminal. */
  333.                 hard = 1;
  334.                 sc_height = 24;
  335.         }
  336.         /*
  337.          * This is terrible - the following if "knows" that it is being
  338.          * executed *after* command line and environment options have
  339.          * already been parsed.  Should it be executed in the main program
  340.          * instead?
  341.          */
  342.         if ((sc_window <= 0) || (sc_window >= sc_height))
  343.                 sc_window = sc_height-1;
  344.  
  345. #ifdef TIOCGWINSZ
  346.         if (ioctl(2, TIOCGWINSZ, &w) == 0 && w.ws_col)
  347.                 sc_width = w.ws_col;
  348.         else
  349. #ifdef WIOCGETD
  350.         if (ioctl(2, WIOCGETD, &w) == 0 && w.uw_width)
  351.                 sc_width = w.uw_width/w.uw_hs;
  352.         else
  353. #endif
  354. #endif
  355.                 sc_width = tgetnum("co");
  356.         if (dumb || sc_width < 0)
  357.                 sc_width = 80;
  358.  
  359.         auto_wrap = tgetflag("am");
  360.         ignaw = tgetflag("xn");
  361.  
  362.         /*
  363.          * Assumes termcap variable "sg" is the printing width of
  364.          * the standout sequence, the end standout sequence,
  365.          * the underline sequence, the end underline sequence,
  366.          * the boldface sequence, and the end boldface sequence.
  367.          */
  368.         if ((so_width = tgetnum("sg")) < 0)
  369.                 so_width = 0;
  370.         be_width = bo_width = ue_width = ul_width = se_width = so_width;
  371.  
  372.         /*
  373.          * Get various string-valued capabilities.
  374.          */
  375.         sp = sbuf;
  376.  
  377.         sc_pad = (dumb) ? NULL : tgetstr("pc", &sp);
  378.         if (sc_pad != NULL)
  379.                 PC = *sc_pad;
  380.  
  381.         sc_init = (dumb) ? NULL : tgetstr("ti", &sp);
  382.         if (sc_init == NULL)
  383.                 sc_init = "";
  384.  
  385.         sc_deinit= (dumb) ? NULL : tgetstr("te", &sp);
  386.         if (sc_deinit == NULL)
  387.                 sc_deinit = "";
  388.  
  389.         sc_eol_clear = (dumb) ? NULL : tgetstr("ce", &sp);
  390.         if (hard || sc_eol_clear == NULL || *sc_eol_clear == '\0')
  391.         {
  392.                 cannot("clear to end of line");
  393.                 sc_eol_clear = "";
  394.         }
  395.  
  396.         sc_clear = (dumb) ? NULL : tgetstr("cl", &sp);
  397.         if (hard || sc_clear == NULL || *sc_clear == '\0')
  398.         {
  399.                 cannot("clear screen");
  400.                 sc_clear = "\n\n";
  401.         }
  402.  
  403.         sc_move = (dumb) ? NULL : tgetstr("cm", &sp);
  404.         if (hard || sc_move == NULL || *sc_move == '\0')
  405.         {
  406.                 /*
  407.                  * This is not an error here, because we don't
  408.                  * always need sc_move.
  409.                  * We need it only if we don't have home or lower-left.
  410.                  */
  411.                 sc_move = "";
  412.         }
  413.  
  414.         sc_s_in = (dumb) ? NULL : tgetstr("so", &sp);
  415.         if (hard || sc_s_in == NULL)
  416.                 sc_s_in = "";
  417.  
  418.         sc_s_out = (dumb) ? NULL : tgetstr("se", &sp);
  419.         if (hard || sc_s_out == NULL)
  420.                 sc_s_out = "";
  421.  
  422.         sc_u_in = (dumb) ? NULL : tgetstr("us", &sp);
  423.         if (hard || sc_u_in == NULL)
  424.                 sc_u_in = sc_s_in;
  425.  
  426.         sc_u_out = (dumb) ? NULL : tgetstr("ue", &sp);
  427.         if (hard || sc_u_out == NULL)
  428.                 sc_u_out = sc_s_out;
  429.  
  430.         sc_b_in = (dumb) ? NULL : tgetstr("md", &sp);
  431.         if (hard || sc_b_in == NULL)
  432.         {
  433.                 sc_b_in = sc_s_in;
  434.                 sc_b_out = sc_s_out;
  435.         } else
  436.         {
  437.                 sc_b_out = (dumb) ? NULL : tgetstr("me", &sp);
  438.                 if (hard || sc_b_out == NULL)
  439.                         sc_b_out = "";
  440.         }
  441.  
  442.         sc_visual_bell = (dumb) ? NULL : tgetstr("vb", &sp);
  443.         if (hard || sc_visual_bell == NULL)
  444.                 sc_visual_bell = "";
  445.  
  446.         sc_home = (dumb) ? NULL : tgetstr("ho", &sp);
  447.         if (hard || sc_home == NULL || *sc_home == '\0')
  448.         {
  449.                 if (*sc_move == '\0')
  450.                 {
  451.                         cannot("home cursor");
  452.                         /*
  453.                          * This last resort for sc_home is supposed to
  454.                          * be an up-arrow suggesting moving to the
  455.                          * top of the "virtual screen". (The one in
  456.                          * your imagination as you try to use this on
  457.                          * a hard copy terminal.)
  458.                          */
  459.                         sc_home = "|\b^";
  460.                 } else
  461.                 {
  462.                         /*
  463.                          * No "home" string,
  464.                          * but we can use "move(0,0)".
  465.                          */
  466.                         strcpy(sp, tgoto(sc_move, 0, 0));
  467.                         sc_home = sp;
  468.                         sp += strlen(sp) + 1;
  469.                 }
  470.         }
  471.  
  472.         sc_lower_left = (dumb) ? NULL : tgetstr("ll", &sp);
  473.         if (hard || sc_lower_left == NULL || *sc_lower_left == '\0')
  474.         {
  475.                 if (*sc_move == '\0')
  476.                 {
  477.                         cannot("move cursor to lower left of screen");
  478.                         sc_lower_left = "\r";
  479.                 } else
  480.                 {
  481.                         /*
  482.                          * No "lower-left" string,
  483.                          * but we can use "move(0,last-line)".
  484.                          */
  485.                         strcpy(sp, tgoto(sc_move, 0, sc_height-1));
  486.                         sc_lower_left = sp;
  487.                         sp += strlen(sp) + 1;
  488.                 }
  489.         }
  490.  
  491.         /*
  492.          * To add a line at top of screen and scroll the display down,
  493.          * we use "al" (add line) or "sr" (scroll reverse).
  494.          */
  495.         if (dumb)
  496.                 sc_addline = NULL;
  497.         else if ((sc_addline = tgetstr("al", &sp)) == NULL ||
  498.                  *sc_addline == '\0')
  499.                 sc_addline = tgetstr("sr", &sp);
  500.  
  501.         if (hard || sc_addline == NULL || *sc_addline == '\0')
  502.         {
  503.                 cannot("scroll backwards");
  504.                 sc_addline = "";
  505.                 /* Force repaint on any backward movement */
  506.                 back_scroll = 0;
  507.         }
  508.  
  509.         if (dumb || tgetflag("bs"))
  510.                 sc_backspace = "\b";
  511.         else
  512.         {
  513.                 sc_backspace = tgetstr("bc", &sp);
  514.                 if (sc_backspace == NULL || *sc_backspace == '\0')
  515.                         sc_backspace = "\b";
  516.         }
  517. #endif
  518. }
  519.  
  520.  
  521. /*
  522.  * Below are the functions which perform all the
  523.  * terminal-specific screen manipulation.
  524.  */
  525.  
  526.  
  527. /*
  528.  * Initialize terminal
  529.  */
  530. #ifdef __STDC__
  531. void init (void)
  532. #else
  533.         public void
  534. init()
  535. #endif
  536. {
  537.         tputs(sc_init, sc_height, putchr);
  538. }
  539.  
  540. /*
  541.  * Deinitialize terminal
  542.  */
  543. #ifdef __STDC__
  544. void deinit (void)
  545. #else
  546.         public void
  547. deinit()
  548. #endif
  549. {
  550.         tputs(sc_deinit, sc_height, putchr);
  551. }
  552.  
  553. /*
  554.  * Home cursor (move to upper left corner of screen).
  555.  */
  556. #ifdef __STDC__
  557. void home (void)
  558. #else
  559.         public void
  560. home()
  561. #endif
  562. {
  563.         tputs(sc_home, 1, putchr);
  564. }
  565.  
  566. /*
  567.  * Add a blank line (called with cursor at home).
  568.  * Should scroll the display down.
  569.  */
  570. #ifdef __STDC__
  571. void add_line (void)
  572. #else
  573.         public void
  574. add_line()
  575. #endif
  576. {
  577.         tputs(sc_addline, sc_height, putchr);
  578. }
  579.  
  580. /*
  581.  * Move cursor to lower left corner of screen.
  582.  */
  583. #ifdef __STDC__
  584. void lower_left (void)
  585. #else
  586.         public void
  587. lower_left()
  588. #endif
  589. {
  590.         tputs(sc_lower_left, 1, putchr);
  591. }
  592.  
  593. /*
  594.  * Ring the terminal bell.
  595.  */
  596. #ifdef __STDC__
  597. void bell (void)
  598. #else
  599.         public void
  600. bell()
  601. #endif
  602. {
  603.         if (quiet == VERY_QUIET)
  604.                 vbell();
  605.         else
  606.                 putchr('\7');
  607. }
  608.  
  609. /*
  610.  * Output the "visual bell", if there is one.
  611.  */
  612. #ifdef __STDC__
  613. void vbell (void)
  614. #else
  615.         public void
  616. vbell()
  617. #endif
  618. {
  619.         if (*sc_visual_bell == '\0')
  620.                 return;
  621.         tputs(sc_visual_bell, sc_height, putchr);
  622. }
  623.  
  624. /*
  625.  * Clear the screen.
  626.  */
  627. #ifdef __STDC__
  628. void clear (void)
  629. #else
  630.         public void
  631. clear()
  632. #endif
  633. {
  634.         tputs(sc_clear, sc_height, putchr);
  635. }
  636.  
  637. /*
  638.  * Clear from the cursor to the end of the cursor's line.
  639.  * {{ This must not move the cursor. }}
  640.  */
  641. #ifdef __STDC__
  642. void clear_eol (void)
  643. #else
  644.         public void
  645. clear_eol()
  646. #endif
  647. {
  648.         tputs(sc_eol_clear, 1, putchr);
  649. }
  650.  
  651. /*
  652.  * Begin "standout" (bold, underline, or whatever).
  653.  */
  654. #ifdef __STDC__
  655. void so_enter (void)
  656. #else
  657.         public void
  658. so_enter()
  659. #endif
  660. {
  661.         tputs(sc_s_in, 1, putchr);
  662. }
  663.  
  664. /*
  665.  * End "standout".
  666.  */
  667. #ifdef __STDC__
  668. void so_exit (void)
  669. #else
  670.         public void
  671. so_exit()
  672. #endif
  673. {
  674.         tputs(sc_s_out, 1, putchr);
  675. }
  676.  
  677. /*
  678.  * Begin "underline" (hopefully real underlining,
  679.  * otherwise whatever the terminal provides).
  680.  */
  681. #ifdef __STDC__
  682. void ul_enter (void)
  683. #else
  684.         public void
  685. ul_enter()
  686. #endif
  687. {
  688.         tputs(sc_u_in, 1, putchr);
  689. }
  690.  
  691. /*
  692.  * End "underline".
  693.  */
  694. #ifdef __STDC__
  695. void ul_exit (void)
  696. #else
  697.         public void
  698. ul_exit()
  699. #endif
  700. {
  701.         tputs(sc_u_out, 1, putchr);
  702. }
  703.  
  704. /*
  705.  * Begin "bold"
  706.  */
  707. #ifdef __STDC__
  708. void bo_enter (void)
  709. #else
  710.         public void
  711. bo_enter()
  712. #endif
  713. {
  714.         tputs(sc_b_in, 1, putchr);
  715. }
  716.  
  717. /*
  718.  * End "bold".
  719.  */
  720. #ifdef __STDC__
  721. void bo_exit (void)
  722. #else
  723.         public void
  724. bo_exit()
  725. #endif
  726. {
  727.         tputs(sc_b_out, 1, putchr);
  728. }
  729.  
  730. #ifdef AMIGA
  731. /*
  732.  * Begin "italic" mode
  733.  */
  734. #ifdef __STDC__
  735. void it_enter (void)
  736. #else
  737.         public void
  738. it_enter()
  739. #endif
  740. {
  741.         tputs(sc_it_in, 1, putchr);
  742. }
  743.  
  744. /*
  745.  * End "italic"
  746.  */
  747. #ifdef __STDC__
  748. void it_exit (void)
  749. #else
  750.         public void
  751. it_exit()
  752. #endif
  753. {
  754.         tputs(sc_it_out, 1, putchr);
  755. }
  756.  
  757. /*
  758.  * Begin "inverse video"
  759.  */
  760. #ifdef __STDC__
  761. void nv_enter (void)
  762. #else
  763.         public void
  764. nv_enter()
  765. #endif
  766. {
  767.         tputs(sc_nv_in, 1, putchr);
  768. }
  769.  
  770. /*
  771.  * End "inverse video"
  772.  */
  773. #ifdef __STDC__
  774. void nv_exit (void)
  775. #else
  776.         public void
  777. nv_exit()
  778. #endif
  779. {
  780.         tputs(sc_nv_out, 1, putchr);
  781. }
  782. #endif
  783.  
  784. /*
  785.  * Erase the character to the left of the cursor
  786.  * and move the cursor left.
  787.  */
  788. #ifdef __STDC__
  789. void backspace (void)
  790. #else
  791.         public void
  792. backspace()
  793. #endif
  794. {
  795.         /*
  796.          * Try to erase the previous character by overstriking with a space.
  797.          */
  798.         tputs(sc_backspace, 1, putchr);
  799.         putchr(' ');
  800.         tputs(sc_backspace, 1, putchr);
  801. }
  802.  
  803. /*
  804.  * Output a plain backspace, without erasing the previous char.
  805.  */
  806. #ifdef __STDC__
  807. void putbs (void)
  808. #else
  809.         public void
  810. putbs()
  811. #endif
  812. {
  813.         tputs(sc_backspace, 1, putchr);
  814. }
  815.