home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / src / perl / usub / curses.mus < prev    next >
Text File  |  1992-04-11  |  16KB  |  879 lines

  1. /* $RCSfile: curses.mus,v $$Revision: 4.0.1.1 $$Date: 91/11/05 19:06:19 $
  2.  *
  3.  * $Log:    curses.mus,v $
  4.  * Revision 4.0.1.1  91/11/05  19:06:19  lwall
  5.  * patch11: usub/curses.mus now supports SysV curses
  6.  * 
  7.  * Revision 4.0  91/03/20  01:56:13  lwall
  8.  * 4.0 baseline.
  9.  * 
  10.  * Revision 3.0.1.1  90/08/09  04:05:21  lwall
  11.  * patch19: Initial revision
  12.  * 
  13.  */
  14.  
  15. #include "EXTERN.h"
  16. #include "perl.h"
  17.  
  18. char *savestr();
  19.  
  20. #undef bool
  21. #include <curses.h>
  22.  
  23. #ifndef A_UNDERLINE
  24. #define NOSETATTR
  25. #define A_STANDOUT  0x0200
  26. #define A_UNDERLINE 0x0100
  27. #define A_REVERSE   0x0200
  28. #define A_BLINK     0x0400
  29. #define A_BOLD      0x0800
  30. #define A_ALTCHARSET 0x1000    
  31. #define A_NORMAL    0
  32. #endif
  33.  
  34. #ifdef USG
  35. static char *tcbuf = NULL;
  36. #endif
  37.  
  38. #ifdef NOSETATTR
  39. static unsigned curattr = NORMAL;
  40. #endif
  41.  
  42. static enum uservars {
  43.     UV_curscr,
  44.     UV_stdscr,
  45.     UV_ttytype,
  46.     UV_LINES,
  47.     UV_COLS,
  48.     UV_ERR,
  49.     UV_OK,
  50. #ifdef BSD
  51.     UV_Def_term,
  52.     UV_My_term,
  53. #endif    
  54.     UV_A_STANDOUT,
  55.     UV_A_UNDERLINE,
  56.     UV_A_REVERSE,
  57.     UV_A_BLINK,
  58.     UV_A_DIM,
  59.     UV_A_BOLD,
  60.     UV_A_NORMAL,
  61. };
  62.  
  63. static enum usersubs {
  64.     US_addch,
  65.     US_waddch,
  66.     US_addstr,
  67.     US_waddstr,
  68.     US_box,
  69.     US_clear,
  70.     US_wclear,
  71.     US_clearok,
  72.     US_clrtobot,
  73.     US_wclrtobot,
  74.     US_clrtoeol,
  75.     US_wclrtoeol,
  76.     US_delch,
  77.     US_wdelch,
  78.     US_deleteln,
  79.     US_wdeleteln,
  80.     US_erase,
  81.     US_werase,
  82.     US_idlok,
  83.     US_insch,
  84.     US_winsch,
  85.     US_insertln,
  86.     US_winsertln,
  87.     US_move,
  88.     US_wmove,
  89.     US_overlay,
  90.     US_overwrite,
  91.     US_refresh,
  92.     US_wrefresh,
  93.     US_standout,
  94.     US_wstandout,
  95.     US_standend,
  96.     US_wstandend,
  97.     US_cbreak,
  98.     US_nocbreak,
  99.     US_echo,
  100.     US_noecho,
  101.     US_getch,
  102.     US_wgetch,
  103.     US_getstr,
  104.     US_wgetstr,
  105.     US_raw,
  106.     US_noraw,
  107.     US_baudrate,
  108.     US_delwin,
  109.     US_endwin,
  110.     US_erasechar,
  111.     US_getyx,
  112.     US_inch,
  113.     US_winch,
  114.     US_initscr,
  115.     US_killchar,
  116.     US_leaveok,
  117.     US_longname,
  118.     US_mvwin,
  119.     US_newwin,
  120.     US_nl,
  121.     US_nonl,
  122.     US_scrollok,
  123.     US_subwin,
  124.     US_touchline,
  125.     US_touchwin,
  126.     US_unctrl,
  127.     US_gettmode,
  128.     US_mvcur,
  129.     US_scroll,
  130.     US_savetty,
  131.     US_resetty,
  132.     US_setterm,
  133.     US_attroff,
  134.     US_wattroff,
  135.     US_attron,
  136.     US_wattron,
  137.     US_attrset,
  138.     US_wattrset,
  139. #ifdef CURSEFMT
  140.     US_printw, /* remove */
  141.     US_wprintw, /* remove */
  142.     US_scanw,     /* delete */
  143.     US_wscanw,     /* delete */
  144. #endif
  145.     US_getcap,
  146. #ifdef BSD
  147.     US_flushok,
  148.     US_fullname,
  149.     US_touchoverlap,
  150.     US_tstp,
  151.     US__putchar,
  152. #endif
  153.     US_mysub,
  154.     US_testcallback,
  155. };
  156.  
  157. static int usersub();
  158. static int userset();
  159. static int userval();
  160.  
  161. int
  162. init_curses()
  163. {
  164.     struct ufuncs uf;
  165.     char *filename = "curses.c";
  166.  
  167.     uf.uf_set = userset;
  168.     uf.uf_val = userval;
  169.  
  170. #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
  171.  
  172.     MAGICVAR("curscr",    UV_curscr);
  173.     MAGICVAR("stdscr",    UV_stdscr);
  174.     MAGICVAR("ttytype",    UV_ttytype);
  175.     MAGICVAR("LINES",    UV_LINES);
  176.     MAGICVAR("COLS",    UV_COLS);
  177.     MAGICVAR("ERR",    UV_ERR);
  178.     MAGICVAR("OK",    UV_OK);
  179. #ifdef BSD
  180.     MAGICVAR("Def_term",UV_Def_term);
  181.     MAGICVAR("My_term",    UV_My_term);
  182. #endif
  183.     MAGICVAR("A_STANDOUT", UV_A_STANDOUT);
  184.     MAGICVAR("A_UNDERLINE", UV_A_UNDERLINE);
  185.     MAGICVAR("A_REVERSE", UV_A_REVERSE);
  186.     MAGICVAR("A_BLINK", UV_A_BLINK);
  187.     MAGICVAR("A_DIM", UV_A_DIM);
  188.     MAGICVAR("A_BOLD", UV_A_BOLD);
  189.     MAGICVAR("A_NORMAL", UV_A_NORMAL);
  190.  
  191.     make_usub("addch",        US_addch,    usersub, filename);
  192.     make_usub("waddch",        US_waddch,    usersub, filename);
  193.     make_usub("addstr",        US_addstr,    usersub, filename);
  194.     make_usub("waddstr",    US_waddstr,    usersub, filename);
  195.     make_usub("box",        US_box,        usersub, filename);
  196.     make_usub("clear",        US_clear,    usersub, filename);
  197.     make_usub("wclear",        US_wclear,    usersub, filename);
  198.     make_usub("clearok",    US_clearok,    usersub, filename);
  199.     make_usub("clrtobot",    US_clrtobot,    usersub, filename);
  200.     make_usub("wclrtobot",    US_wclrtobot,    usersub, filename);
  201.     make_usub("clrtoeol",    US_clrtoeol,    usersub, filename);
  202.     make_usub("wclrtoeol",    US_wclrtoeol,    usersub, filename);
  203.     make_usub("delch",        US_delch,    usersub, filename);
  204.     make_usub("wdelch",        US_wdelch,    usersub, filename);
  205.     make_usub("deleteln",    US_deleteln,    usersub, filename);
  206.     make_usub("wdeleteln",    US_wdeleteln,    usersub, filename);
  207.     make_usub("erase",        US_erase,    usersub, filename);
  208.     make_usub("werase",        US_werase,    usersub, filename);
  209.     make_usub("idlok",        US_idlok,    usersub, filename);
  210.     make_usub("insch",        US_insch,    usersub, filename);
  211.     make_usub("winsch",        US_winsch,    usersub, filename);
  212.     make_usub("insertln",    US_insertln,    usersub, filename);
  213.     make_usub("winsertln",    US_winsertln,    usersub, filename);
  214.     make_usub("move",        US_move,    usersub, filename);
  215.     make_usub("wmove",        US_wmove,    usersub, filename);
  216.     make_usub("overlay",    US_overlay,    usersub, filename);
  217.     make_usub("overwrite",    US_overwrite,    usersub, filename);
  218.     make_usub("refresh",    US_refresh,    usersub, filename);
  219.     make_usub("wrefresh",    US_wrefresh,    usersub, filename);
  220.     make_usub("standout",    US_standout,    usersub, filename);
  221.     make_usub("wstandout",    US_wstandout,    usersub, filename);
  222.     make_usub("standend",    US_standend,    usersub, filename);
  223.     make_usub("wstandend",    US_wstandend,    usersub, filename);
  224.     make_usub("cbreak",        US_cbreak,    usersub, filename);
  225.     make_usub("nocbreak",    US_nocbreak,    usersub, filename);
  226.     make_usub("echo",        US_echo,    usersub, filename);
  227.     make_usub("noecho",        US_noecho,    usersub, filename);
  228.     make_usub("getch",        US_getch,    usersub, filename);
  229.     make_usub("wgetch",        US_wgetch,    usersub, filename);
  230.     make_usub("getstr",        US_getstr,    usersub, filename);
  231.     make_usub("wgetstr",    US_wgetstr,    usersub, filename);
  232.     make_usub("raw",        US_raw,        usersub, filename);
  233.     make_usub("noraw",        US_noraw,    usersub, filename);
  234.     make_usub("baudrate",    US_baudrate,    usersub, filename);
  235.     make_usub("delwin",        US_delwin,    usersub, filename);
  236.     make_usub("endwin",        US_endwin,    usersub, filename);
  237.     make_usub("erasechar",    US_erasechar,    usersub, filename);
  238.     make_usub("getyx",        US_getyx,    usersub, filename);
  239.     make_usub("inch",        US_inch,    usersub, filename);
  240.     make_usub("winch",        US_winch,    usersub, filename);
  241.     make_usub("initscr",    US_initscr,    usersub, filename);
  242.     make_usub("killchar",    US_killchar,    usersub, filename);
  243.     make_usub("leaveok",    US_leaveok,    usersub, filename);
  244.     make_usub("longname",    US_longname,    usersub, filename);
  245.     make_usub("mvwin",        US_mvwin,    usersub, filename);
  246.     make_usub("newwin",        US_newwin,    usersub, filename);
  247.     make_usub("nl",        US_nl,        usersub, filename);
  248.     make_usub("nonl",        US_nonl,    usersub, filename);
  249.     make_usub("scrollok",    US_scrollok,    usersub, filename);
  250.     make_usub("subwin",        US_subwin,    usersub, filename);
  251.     make_usub("touchline",    US_touchline,    usersub, filename);
  252.     make_usub("touchwin",    US_touchwin,    usersub, filename);
  253.     make_usub("unctrl",        US_unctrl,    usersub, filename);
  254.     make_usub("gettmode",    US_gettmode,    usersub, filename);
  255.     make_usub("mvcur",        US_mvcur,    usersub, filename);
  256.     make_usub("scroll",        US_scroll,    usersub, filename);
  257.     make_usub("savetty",    US_savetty,    usersub, filename);
  258.     make_usub("resetty",    US_resetty,    usersub, filename);
  259.     make_usub("setterm",    US_setterm,    usersub, filename);
  260.     make_usub("getcap",        US_getcap,    usersub, filename);
  261.     make_usub("attroff",        US_attroff,    usersub, filename);
  262.     make_usub("wattroff",       US_wattroff,    usersub, filename);
  263.     make_usub("attron",         US_attron,    usersub, filename);
  264.     make_usub("wattron",        US_wattron,    usersub, filename);
  265.     make_usub("attrset",        US_attrset,    usersub, filename);
  266.     make_usub("wattrset",       US_wattrset,    usersub, filename);
  267. #ifdef CURSEFMT
  268.     make_usub("printw",        US_printw,    usersub, filename);
  269.     make_usub("wprintw",    US_wprintw,    usersub, filename);
  270.     make_usub("scanw",        US_scanw,    usersub, filename);
  271.     make_usub("wscanw",        US_wscanw,    usersub, filename);
  272. #endif
  273. #ifdef BSD
  274.     make_usub("flushok",    US_flushok,    usersub, filename);
  275.     make_usub("fullname",    US_fullname,    usersub, filename);
  276.     make_usub("touchoverlap",    US_touchoverlap,usersub, filename);
  277.     make_usub("tstp",        US_tstp,    usersub, filename);
  278.     make_usub("_putchar",    US__putchar,    usersub, filename);
  279. #endif
  280.     make_usub("testcallback",    US_testcallback,usersub, filename);
  281.   };
  282.   
  283. #ifdef USG
  284. static char
  285. *getcap(cap)
  286. register char *cap;
  287. {
  288.     static char nocaperr[] = "Cannot read termcap entry.";
  289.  
  290.     extern char *tgetstr();
  291.  
  292.     if (tcbuf == NULL) {
  293.     if ((tcbuf = malloc(1024)) == NULL) {
  294.         fatal(nocaperr);
  295.     }
  296.     if (tgetent(tcbuf, ttytype) == -1) {
  297.         fatal(nocaperr);
  298.     }
  299.     }
  300.  
  301.     return (tgetstr(cap, NULL));
  302. }
  303. #endif
  304.  
  305. #ifdef NOSETATTR
  306. #define attron(attr)    wattron(stdscr, attr)
  307. #define attroff(attr)   wattroff(stdscr, attr)
  308. #define attset(attr)    wattset(stdscr, attr)
  309.  
  310. int
  311. wattron(win, attr)
  312. WINDOW *win;
  313. chtype attr;
  314. {
  315.     curattr |= attr;
  316.     if (curattr & A_STANDOUT) {
  317.     return(wstandout(win));
  318.     } else {
  319.     return(wstandend(win));
  320.     }
  321. }
  322.  
  323. int
  324. wattroff(win, attr)
  325. WINDOW *win;
  326. chtype attr;
  327. {
  328.     curattr &= (~attr);
  329.     if (curattr & A_STANDOUT) {
  330.     return(wstandout(win));
  331.     } else {
  332.     return(wstandend(win));
  333.     }
  334. }
  335.  
  336. int
  337. wattrset(win, attr)
  338. WINDOW *win;
  339. chtype attr;
  340. {
  341.     curattr = attr;
  342.     if (curattr & A_STANDOUT) {
  343.     return(wstandout(win));
  344.     } else {
  345.     return(wstandend(win));
  346.     }
  347. }
  348.  
  349. #endif
  350.     
  351. static int
  352. usersub(ix, sp, items)
  353. int ix;
  354. register int sp;
  355. register int items;
  356. {
  357.     STR **st = stack->ary_array + sp;
  358.     register int i;
  359.     register char *tmps;
  360.     register STR *Str;        /* used in str_get and str_gnum macros */
  361.  
  362.     switch (ix) {
  363. CASE int addch
  364. I    char        ch
  365. END
  366.  
  367. CASE int waddch
  368. I    WINDOW*        win
  369. I    char        ch
  370. END
  371.  
  372. CASE int addstr
  373. I    char*        str
  374. END
  375.  
  376. CASE int waddstr
  377. I    WINDOW*        win
  378. I    char*        str
  379. END
  380.  
  381. CASE int box
  382. I    WINDOW*        win
  383. I    char        vert
  384. I    char        hor
  385. END
  386.  
  387. CASE int clear
  388. END
  389.  
  390. CASE int wclear
  391. I    WINDOW*        win
  392. END
  393.  
  394. CASE int clearok
  395. I    WINDOW*        win
  396. I    bool        boolf
  397. END
  398.  
  399. CASE int clrtobot
  400. END
  401.  
  402. CASE int wclrtobot
  403. I    WINDOW*        win
  404. END
  405.  
  406. CASE int clrtoeol
  407. END
  408.  
  409. CASE int wclrtoeol
  410. I    WINDOW*        win
  411. END
  412.  
  413. CASE int delch
  414. END
  415.  
  416. CASE int wdelch
  417. I    WINDOW*        win
  418. END
  419.  
  420. CASE int deleteln
  421. END
  422.  
  423. CASE int wdeleteln
  424. I    WINDOW*        win
  425. END
  426.  
  427. CASE int erase
  428. END
  429.  
  430. CASE int werase
  431. I    WINDOW*        win
  432. END
  433.  
  434. CASE int idlok
  435. I    WINDOW*        win
  436. I    bool        boolf
  437. END
  438.  
  439. CASE int insch
  440. I    char        c
  441. END
  442.  
  443. CASE int winsch
  444. I    WINDOW*        win
  445. I    char        c
  446. END
  447.  
  448. CASE int insertln
  449. END
  450.  
  451. CASE int winsertln
  452. I    WINDOW*        win
  453. END
  454.  
  455. CASE int move
  456. I    int        y
  457. I    int        x
  458. END
  459.  
  460. CASE int wmove
  461. I    WINDOW*        win
  462. I    int        y
  463. I    int        x
  464. END
  465.  
  466. CASE int overlay
  467. I    WINDOW*        win1
  468. I    WINDOW*        win2
  469. END
  470.  
  471. CASE int overwrite
  472. I    WINDOW*        win1
  473. I    WINDOW*        win2
  474. END
  475.  
  476. CASE int refresh
  477. END
  478.  
  479. CASE int wrefresh
  480. I    WINDOW*        win
  481. END
  482.  
  483. CASE int standout
  484. END
  485.  
  486. CASE int wstandout
  487. I    WINDOW*        win
  488. END
  489.  
  490. CASE int standend
  491. END
  492.  
  493. CASE int wstandend
  494. I    WINDOW*        win
  495. END
  496.  
  497. CASE int cbreak
  498. END
  499.  
  500. CASE int nocbreak
  501. END
  502.  
  503. CASE int echo
  504. END
  505.  
  506. CASE int noecho
  507. END
  508.  
  509.     case US_getch:
  510.     if (items != 0)
  511.         fatal("Usage: &getch()");
  512.     else {
  513.         int retval;
  514.         char retch;
  515.  
  516.         retval = getch();
  517.         if (retval == EOF)
  518.         st[0] = &str_undef;
  519.         else {
  520.         retch = retval;
  521.         str_nset(st[0], &retch, 1);
  522.         }
  523.     }
  524.     return sp;
  525.  
  526.     case US_wgetch:
  527.     if (items != 1)
  528.         fatal("Usage: &wgetch($win)");
  529.     else {
  530.         int retval;
  531.         char retch;
  532.         WINDOW*     win =           *(WINDOW**)     str_get(st[1]);
  533.  
  534.         retval = wgetch(win);
  535.         if (retval == EOF)
  536.         st[0] = &str_undef;
  537.         else {
  538.         retch = retval;
  539.         str_nset(st[0], &retch, 1);
  540.         }
  541.     }
  542.     return sp;
  543.  
  544. CASE int getstr
  545. O    char*        str
  546. END
  547.  
  548. CASE int wgetstr
  549. I    WINDOW*        win
  550. O    char*        str
  551. END
  552.  
  553. CASE int raw
  554. END
  555.  
  556. CASE int noraw
  557. END
  558.  
  559. CASE int baudrate
  560. END
  561.  
  562. CASE int delwin
  563. I    WINDOW*        win
  564. END
  565.  
  566. CASE int endwin
  567. END
  568.  
  569. CASE int erasechar
  570. END
  571.  
  572.     case US_getyx:
  573.     if (items != 3)
  574.         fatal("Usage: &getyx($win, $y, $x)");
  575.     else {
  576.         int retval;
  577.         STR*    str =        str_new(0);
  578.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  579.         int        y;
  580.         int        x;
  581.  
  582.         do_sprintf(str, items - 1, st + 1);
  583.         retval = getyx(win, y, x);
  584.         str_numset(st[2], (double)y);
  585.         str_numset(st[3], (double)x);
  586.         str_numset(st[0], (double) retval);
  587.         str_free(str);
  588.     }
  589.     return sp;
  590.     
  591. CASE int inch
  592. END
  593.  
  594. CASE int winch
  595. I    WINDOW*        win
  596. END
  597.  
  598. CASE WINDOW* initscr
  599. END
  600.  
  601. CASE int killchar
  602. END
  603.  
  604. CASE int leaveok
  605. I    WINDOW*        win
  606. I    bool        boolf
  607. END
  608.  
  609. #ifdef BSD
  610. CASE char* longname
  611. I    char*        termbuf
  612. IO    char*        name
  613. END
  614. #else
  615. CASE char* longname
  616. I    char*        termbug
  617. I    char*        name
  618. END
  619. #endif
  620.  
  621. CASE int mvwin
  622. I    WINDOW*        win
  623. I    int        y
  624. I    int        x
  625. END
  626.  
  627. CASE WINDOW* newwin
  628. I    int        lines
  629. I    int        cols
  630. I    int        begin_y
  631. I    int        begin_x
  632. END
  633.  
  634. CASE int nl
  635. END
  636.  
  637. CASE int nonl
  638. END
  639.  
  640. CASE int scrollok
  641. I    WINDOW*        win
  642. I    bool        boolf
  643. END
  644.  
  645. CASE WINDOW* subwin
  646. I    WINDOW*        win
  647. I    int        lines
  648. I    int        cols
  649. I    int        begin_y
  650. I    int        begin_x
  651. END
  652.  
  653. CASE int touchline
  654. I    WINDOW*        win
  655. I    int        y
  656. I    int        startx
  657. I    int        endx
  658. END
  659.  
  660. CASE int touchwin
  661. I    WINDOW*        win
  662. END
  663.  
  664. CASE char* unctrl
  665. I    char        ch
  666. END
  667.  
  668. CASE int gettmode
  669. END
  670.  
  671. CASE int mvcur
  672. I    int        lasty
  673. I    int        lastx
  674. I    int        newy
  675. I    int        newx
  676. END
  677.  
  678. CASE int scroll
  679. I    WINDOW*        win
  680. END
  681.  
  682. CASE int savetty
  683. END
  684.  
  685. CASE void resetty
  686. END
  687.  
  688. CASE int setterm
  689. I    char*        name
  690. END
  691.  
  692. CASE int attroff
  693. I       chtype          str
  694. END
  695.  
  696. CASE int wattroff
  697. I       chtype          str
  698. END
  699.  
  700. CASE int wattron
  701. I       chtype          str
  702. END
  703.  
  704. CASE int attron
  705. I       chtype          str
  706. END
  707.  
  708. CASE int attrset
  709. I       chtype          str
  710. END
  711.  
  712. CASE int wattrset
  713. I       chtype          str
  714. END
  715.  
  716. #ifdef    CURSEFMT
  717.     case US_printw:
  718.     if (items < 1)
  719.         fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
  720.     else {
  721.         int retval;
  722.         STR*    str =        str_new(0);
  723.  
  724.         do_sprintf(str, items - 1, st + 1);
  725.         retval = addstr(str->str_ptr);
  726.         str_numset(st[0], (double) retval);
  727.         str_free(str);
  728.     }
  729.     return sp;
  730.  
  731.     case US_wprintw:
  732.     if (items < 2)
  733.         fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
  734.     else {
  735.         int retval;
  736.         STR*    str =        str_new(0);
  737.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  738.  
  739.         do_sprintf(str, items - 1, st + 1);
  740.         retval = waddstr(win, str->str_ptr);
  741.         str_numset(st[0], (double) retval);
  742.         str_free(str);
  743.     }
  744.     return sp;
  745.  
  746. #endif
  747.  
  748. CASE char* getcap
  749. I    char*        str
  750. END
  751.  
  752. #ifdef BSD
  753. CASE int flushok
  754. I    WINDOW*        win
  755. I    bool        boolf
  756. END
  757.  
  758. CASE int fullname
  759. I    char*        termbuf
  760. IO    char*        name
  761. END
  762.  
  763. CASE int touchoverlap
  764. I    WINDOW*        win1
  765. I    WINDOW*        win2
  766. END
  767.  
  768. CASE int tstp
  769. END
  770.  
  771. CASE int _putchar
  772. I    char        ch
  773. END
  774.  
  775.     case US_testcallback:
  776.     sp = callback("callback", sp + items, curcsv->wantarray, 1, items);
  777.     break;
  778.  
  779. #endif
  780.  
  781.     default:
  782.     fatal("Unimplemented user-defined subroutine");
  783.     }
  784.     return sp;
  785. }
  786.  
  787. static int
  788. userval(ix, str)
  789. int ix;
  790. STR *str;
  791. {
  792.     switch (ix) {
  793.     case UV_COLS:
  794.     str_numset(str, (double)COLS);
  795.     break;
  796.     case UV_ERR:
  797.     str_numset(str, (double)ERR);
  798.     break;
  799.     case UV_LINES:
  800.     str_numset(str, (double)LINES);
  801.     break;
  802.     case UV_OK:
  803.     str_numset(str, (double)OK);
  804.     break;
  805.     case UV_curscr:
  806.     str_nset(str, &curscr, sizeof(WINDOW*));
  807.     break;
  808.     case UV_stdscr:
  809.     str_nset(str, &stdscr, sizeof(WINDOW*));
  810.     break;
  811.     case UV_ttytype:
  812.     str_set(str, ttytype);
  813.     break;
  814. #ifdef BSD
  815.     case UV_Def_term:
  816.     str_set(str, Def_term);
  817.     break;
  818.     case UV_My_term:
  819.     str_numset(str, (double)My_term);
  820.     break;
  821. #endif
  822.     case UV_A_STANDOUT:
  823.     str_numset(str, (double)A_STANDOUT);
  824.     break;
  825.     case UV_A_UNDERLINE:
  826.     str_numset(str, (double)A_UNDERLINE);
  827.     break;
  828.     case UV_A_REVERSE:
  829.     str_numset(str, (double)A_REVERSE);
  830.     break;
  831.     case UV_A_BLINK:
  832.     str_numset(str, (double)A_BLINK);
  833.     break;
  834.     case UV_A_DIM:
  835.     str_numset(str, (double)A_DIM);
  836.     break;
  837.     case UV_A_BOLD:
  838.     str_numset(str, (double)A_BOLD);
  839.     break;
  840.     case UV_A_NORMAL:
  841.     str_numset(str, (double)A_NORMAL);
  842.     break;
  843.     }
  844.     return 0;
  845. }
  846.  
  847. static int
  848. userset(ix, str)
  849. int ix;
  850. STR *str;
  851. {
  852.     switch (ix) {
  853.     case UV_COLS:
  854.     COLS = (int)str_gnum(str);
  855.     break;
  856.     case UV_LINES:
  857.     LINES = (int)str_gnum(str);
  858.     break;
  859.     case UV_ttytype:
  860.     strcpy(ttytype, str_get(str));        /* hope it fits */
  861. #ifdef USG
  862.     if (tcbuf != NULL) {
  863.         free(tcbuf);
  864.         tcbuf = NULL;
  865.     }
  866. #endif    
  867.     break;
  868. #ifdef BSD
  869.     case UV_Def_term:
  870.     Def_term = savestr(str_get(str));    /* never freed */
  871.     break;
  872.     case UV_My_term:
  873.     My_term = (bool)str_gnum(str);
  874.     break;
  875. #endif
  876.     }
  877.     return 0;
  878. }
  879.