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 / bsdcurses.mus next >
Text File  |  1992-04-11  |  13KB  |  685 lines

  1. /* $RCSfile: bsdcurses.mus,v $$Revision: 4.0.1.1 $$Date: 91/11/05 19:04:53 $
  2.  *
  3.  * $Log:    bsdcurses.mus,v $
  4.  * Revision 4.0.1.1  91/11/05  19:04:53  lwall
  5.  * initial checkin
  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. #include <curses.h>
  21.  
  22. static enum uservars {
  23.     UV_curscr,
  24.     UV_stdscr,
  25.     UV_Def_term,
  26.     UV_My_term,
  27.     UV_ttytype,
  28.     UV_LINES,
  29.     UV_COLS,
  30.     UV_ERR,
  31.     UV_OK,
  32. };
  33.  
  34. static enum usersubs {
  35.     US_addch,
  36.     US_waddch,
  37.     US_addstr,
  38.     US_waddstr,
  39.     US_box,
  40.     US_clear,
  41.     US_wclear,
  42.     US_clearok,
  43.     US_clrtobot,
  44.     US_wclrtobot,
  45.     US_clrtoeol,
  46.     US_wclrtoeol,
  47.     US_delch,
  48.     US_wdelch,
  49.     US_deleteln,
  50.     US_wdeleteln,
  51.     US_erase,
  52.     US_werase,
  53.     US_flushok,
  54.     US_idlok,
  55.     US_insch,
  56.     US_winsch,
  57.     US_insertln,
  58.     US_winsertln,
  59.     US_move,
  60.     US_wmove,
  61.     US_overlay,
  62.     US_overwrite,
  63.     US_printw,
  64.     US_wprintw,
  65.     US_refresh,
  66.     US_wrefresh,
  67.     US_standout,
  68.     US_wstandout,
  69.     US_standend,
  70.     US_wstandend,
  71.     US_cbreak,
  72.     US_nocbreak,
  73.     US_echo,
  74.     US_noecho,
  75.     US_getch,
  76.     US_wgetch,
  77.     US_getstr,
  78.     US_wgetstr,
  79.     US_raw,
  80.     US_noraw,
  81.     US_scanw,
  82.     US_wscanw,
  83.     US_baudrate,
  84.     US_delwin,
  85.     US_endwin,
  86.     US_erasechar,
  87.     US_getcap,
  88.     US_getyx,
  89.     US_inch,
  90.     US_winch,
  91.     US_initscr,
  92.     US_killchar,
  93.     US_leaveok,
  94.     US_longname,
  95.     US_fullname,
  96.     US_mvwin,
  97.     US_newwin,
  98.     US_nl,
  99.     US_nonl,
  100.     US_scrollok,
  101.     US_subwin,
  102.     US_touchline,
  103.     US_touchoverlap,
  104.     US_touchwin,
  105.     US_unctrl,
  106.     US_gettmode,
  107.     US_mvcur,
  108.     US_scroll,
  109.     US_savetty,
  110.     US_resetty,
  111.     US_setterm,
  112.     US_tstp,
  113.     US__putchar,
  114.     US_testcallback,
  115. };
  116.  
  117. static int usersub();
  118. static int userset();
  119. static int userval();
  120.  
  121. int
  122. init_curses()
  123. {
  124.     struct ufuncs uf;
  125.     char *filename = "curses.c";
  126.  
  127.     uf.uf_set = userset;
  128.     uf.uf_val = userval;
  129.  
  130. #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
  131.  
  132.     MAGICVAR("curscr",    UV_curscr);
  133.     MAGICVAR("stdscr",    UV_stdscr);
  134.     MAGICVAR("Def_term",UV_Def_term);
  135.     MAGICVAR("My_term",    UV_My_term);
  136.     MAGICVAR("ttytype",    UV_ttytype);
  137.     MAGICVAR("LINES",    UV_LINES);
  138.     MAGICVAR("COLS",    UV_COLS);
  139.     MAGICVAR("ERR",    UV_ERR);
  140.     MAGICVAR("OK",    UV_OK);
  141.  
  142.     make_usub("addch",        US_addch,    usersub, filename);
  143.     make_usub("waddch",        US_waddch,    usersub, filename);
  144.     make_usub("addstr",        US_addstr,    usersub, filename);
  145.     make_usub("waddstr",    US_waddstr,    usersub, filename);
  146.     make_usub("box",        US_box,        usersub, filename);
  147.     make_usub("clear",        US_clear,    usersub, filename);
  148.     make_usub("wclear",        US_wclear,    usersub, filename);
  149.     make_usub("clearok",    US_clearok,    usersub, filename);
  150.     make_usub("clrtobot",    US_clrtobot,    usersub, filename);
  151.     make_usub("wclrtobot",    US_wclrtobot,    usersub, filename);
  152.     make_usub("clrtoeol",    US_clrtoeol,    usersub, filename);
  153.     make_usub("wclrtoeol",    US_wclrtoeol,    usersub, filename);
  154.     make_usub("delch",        US_delch,    usersub, filename);
  155.     make_usub("wdelch",        US_wdelch,    usersub, filename);
  156.     make_usub("deleteln",    US_deleteln,    usersub, filename);
  157.     make_usub("wdeleteln",    US_wdeleteln,    usersub, filename);
  158.     make_usub("erase",        US_erase,    usersub, filename);
  159.     make_usub("werase",        US_werase,    usersub, filename);
  160.     make_usub("flushok",    US_flushok,    usersub, filename);
  161.     make_usub("idlok",        US_idlok,    usersub, filename);
  162.     make_usub("insch",        US_insch,    usersub, filename);
  163.     make_usub("winsch",        US_winsch,    usersub, filename);
  164.     make_usub("insertln",    US_insertln,    usersub, filename);
  165.     make_usub("winsertln",    US_winsertln,    usersub, filename);
  166.     make_usub("move",        US_move,    usersub, filename);
  167.     make_usub("wmove",        US_wmove,    usersub, filename);
  168.     make_usub("overlay",    US_overlay,    usersub, filename);
  169.     make_usub("overwrite",    US_overwrite,    usersub, filename);
  170.     make_usub("printw",        US_printw,    usersub, filename);
  171.     make_usub("wprintw",    US_wprintw,    usersub, filename);
  172.     make_usub("refresh",    US_refresh,    usersub, filename);
  173.     make_usub("wrefresh",    US_wrefresh,    usersub, filename);
  174.     make_usub("standout",    US_standout,    usersub, filename);
  175.     make_usub("wstandout",    US_wstandout,    usersub, filename);
  176.     make_usub("standend",    US_standend,    usersub, filename);
  177.     make_usub("wstandend",    US_wstandend,    usersub, filename);
  178.     make_usub("cbreak",        US_cbreak,    usersub, filename);
  179.     make_usub("nocbreak",    US_nocbreak,    usersub, filename);
  180.     make_usub("echo",        US_echo,    usersub, filename);
  181.     make_usub("noecho",        US_noecho,    usersub, filename);
  182.     make_usub("getch",        US_getch,    usersub, filename);
  183.     make_usub("wgetch",        US_wgetch,    usersub, filename);
  184.     make_usub("getstr",        US_getstr,    usersub, filename);
  185.     make_usub("wgetstr",    US_wgetstr,    usersub, filename);
  186.     make_usub("raw",        US_raw,        usersub, filename);
  187.     make_usub("noraw",        US_noraw,    usersub, filename);
  188.     make_usub("scanw",        US_scanw,    usersub, filename);
  189.     make_usub("wscanw",        US_wscanw,    usersub, filename);
  190.     make_usub("baudrate",    US_baudrate,    usersub, filename);
  191.     make_usub("delwin",        US_delwin,    usersub, filename);
  192.     make_usub("endwin",        US_endwin,    usersub, filename);
  193.     make_usub("erasechar",    US_erasechar,    usersub, filename);
  194.     make_usub("getcap",        US_getcap,    usersub, filename);
  195.     make_usub("getyx",        US_getyx,    usersub, filename);
  196.     make_usub("inch",        US_inch,    usersub, filename);
  197.     make_usub("winch",        US_winch,    usersub, filename);
  198.     make_usub("initscr",    US_initscr,    usersub, filename);
  199.     make_usub("killchar",    US_killchar,    usersub, filename);
  200.     make_usub("leaveok",    US_leaveok,    usersub, filename);
  201.     make_usub("longname",    US_longname,    usersub, filename);
  202.     make_usub("fullname",    US_fullname,    usersub, filename);
  203.     make_usub("mvwin",        US_mvwin,    usersub, filename);
  204.     make_usub("newwin",        US_newwin,    usersub, filename);
  205.     make_usub("nl",        US_nl,        usersub, filename);
  206.     make_usub("nonl",        US_nonl,    usersub, filename);
  207.     make_usub("scrollok",    US_scrollok,    usersub, filename);
  208.     make_usub("subwin",        US_subwin,    usersub, filename);
  209.     make_usub("touchline",    US_touchline,    usersub, filename);
  210.     make_usub("touchoverlap",    US_touchoverlap,usersub, filename);
  211.     make_usub("touchwin",    US_touchwin,    usersub, filename);
  212.     make_usub("unctrl",        US_unctrl,    usersub, filename);
  213.     make_usub("gettmode",    US_gettmode,    usersub, filename);
  214.     make_usub("mvcur",        US_mvcur,    usersub, filename);
  215.     make_usub("scroll",        US_scroll,    usersub, filename);
  216.     make_usub("savetty",    US_savetty,    usersub, filename);
  217.     make_usub("resetty",    US_resetty,    usersub, filename);
  218.     make_usub("setterm",    US_setterm,    usersub, filename);
  219.     make_usub("tstp",        US_tstp,    usersub, filename);
  220.     make_usub("_putchar",    US__putchar,    usersub, filename);
  221.     make_usub("testcallback",    US_testcallback,usersub, filename);
  222. };
  223.  
  224. static int
  225. usersub(ix, sp, items)
  226. int ix;
  227. register int sp;
  228. register int items;
  229. {
  230.     STR **st = stack->ary_array + sp;
  231.     register int i;
  232.     register char *tmps;
  233.     register STR *Str;        /* used in str_get and str_gnum macros */
  234.  
  235.     switch (ix) {
  236. CASE int addch
  237. I    char        ch
  238. END
  239.  
  240. CASE int waddch
  241. I    WINDOW*        win
  242. I    char        ch
  243. END
  244.  
  245. CASE int addstr
  246. I    char*        str
  247. END
  248.  
  249. CASE int waddstr
  250. I    WINDOW*        win
  251. I    char*        str
  252. END
  253.  
  254. CASE int box
  255. I    WINDOW*        win
  256. I    char        vert
  257. I    char        hor
  258. END
  259.  
  260. CASE int clear
  261. END
  262.  
  263. CASE int wclear
  264. I    WINDOW*        win
  265. END
  266.  
  267. CASE int clearok
  268. I    WINDOW*        win
  269. I    bool        boolf
  270. END
  271.  
  272. CASE int clrtobot
  273. END
  274.  
  275. CASE int wclrtobot
  276. I    WINDOW*        win
  277. END
  278.  
  279. CASE int clrtoeol
  280. END
  281.  
  282. CASE int wclrtoeol
  283. I    WINDOW*        win
  284. END
  285.  
  286. CASE int delch
  287. END
  288.  
  289. CASE int wdelch
  290. I    WINDOW*        win
  291. END
  292.  
  293. CASE int deleteln
  294. END
  295.  
  296. CASE int wdeleteln
  297. I    WINDOW*        win
  298. END
  299.  
  300. CASE int erase
  301. END
  302.  
  303. CASE int werase
  304. I    WINDOW*        win
  305. END
  306.  
  307. CASE int flushok
  308. I    WINDOW*        win
  309. I    bool        boolf
  310. END
  311.  
  312. CASE int idlok
  313. I    WINDOW*        win
  314. I    bool        boolf
  315. END
  316.  
  317. CASE int insch
  318. I    char        c
  319. END
  320.  
  321. CASE int winsch
  322. I    WINDOW*        win
  323. I    char        c
  324. END
  325.  
  326. CASE int insertln
  327. END
  328.  
  329. CASE int winsertln
  330. I    WINDOW*        win
  331. END
  332.  
  333. CASE int move
  334. I    int        y
  335. I    int        x
  336. END
  337.  
  338. CASE int wmove
  339. I    WINDOW*        win
  340. I    int        y
  341. I    int        x
  342. END
  343.  
  344. CASE int overlay
  345. I    WINDOW*        win1
  346. I    WINDOW*        win2
  347. END
  348.  
  349. CASE int overwrite
  350. I    WINDOW*        win1
  351. I    WINDOW*        win2
  352. END
  353.  
  354.     case US_printw:
  355.     if (items < 1)
  356.         fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
  357.     else {
  358.         int retval;
  359.         STR*    str =        str_new(0);
  360.  
  361.         do_sprintf(str, items - 1, st + 1);
  362.         retval = addstr(str->str_ptr);
  363.         str_numset(st[0], (double) retval);
  364.         str_free(str);
  365.     }
  366.     return sp;
  367.  
  368.     case US_wprintw:
  369.     if (items < 2)
  370.         fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
  371.     else {
  372.         int retval;
  373.         STR*    str =        str_new(0);
  374.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  375.  
  376.         do_sprintf(str, items - 1, st + 1);
  377.         retval = waddstr(win, str->str_ptr);
  378.         str_numset(st[0], (double) retval);
  379.         str_free(str);
  380.     }
  381.     return sp;
  382.  
  383. CASE int refresh
  384. END
  385.  
  386. CASE int wrefresh
  387. I    WINDOW*        win
  388. END
  389.  
  390. CASE int standout
  391. END
  392.  
  393. CASE int wstandout
  394. I    WINDOW*        win
  395. END
  396.  
  397. CASE int standend
  398. END
  399.  
  400. CASE int wstandend
  401. I    WINDOW*        win
  402. END
  403.  
  404. CASE int cbreak
  405. END
  406.  
  407. CASE int nocbreak
  408. END
  409.  
  410. CASE int echo
  411. END
  412.  
  413. CASE int noecho
  414. END
  415.  
  416.     case US_getch:
  417.         if (items != 0)
  418.             fatal("Usage: &getch()");
  419.         else {
  420.             int retval;
  421.         char retch;
  422.  
  423.             retval = getch();
  424.         if (retval == EOF)
  425.         st[0] = &str_undef;
  426.         else {
  427.         retch = retval;
  428.         str_nset(st[0], &retch, 1);
  429.         }
  430.         }
  431.         return sp;
  432.  
  433.     case US_wgetch:
  434.         if (items != 1)
  435.             fatal("Usage: &wgetch($win)");
  436.         else {
  437.             int retval;
  438.         char retch;
  439.             WINDOW*     win =           *(WINDOW**)     str_get(st[1]);
  440.  
  441.             retval = wgetch(win);
  442.         if (retval == EOF)
  443.         st[0] = &str_undef;
  444.         else {
  445.         retch = retval;
  446.         str_nset(st[0], &retch, 1);
  447.         }
  448.         }
  449.         return sp;
  450.  
  451. CASE int getstr
  452. IO    char*        str
  453. END
  454.  
  455. CASE int wgetstr
  456. I    WINDOW*        win
  457. IO    char*        str
  458. END
  459.  
  460. CASE int raw
  461. END
  462.  
  463. CASE int noraw
  464. END
  465.  
  466. CASE int baudrate
  467. END
  468.  
  469. CASE int delwin
  470. I    WINDOW*        win
  471. END
  472.  
  473. CASE int endwin
  474. END
  475.  
  476. CASE int erasechar
  477. END
  478.  
  479. CASE char* getcap
  480. I    char*        str
  481. END
  482.  
  483.     case US_getyx:
  484.     if (items != 3)
  485.         fatal("Usage: &getyx($win, $y, $x)");
  486.     else {
  487.         int retval;
  488.         STR*    str =        str_new(0);
  489.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  490.         int        y;
  491.         int        x;
  492.  
  493.         do_sprintf(str, items - 1, st + 1);
  494.         retval = getyx(win, y, x);
  495.         str_numset(st[2], (double)y);
  496.         str_numset(st[3], (double)x);
  497.         str_numset(st[0], (double) retval);
  498.         str_free(str);
  499.     }
  500.     return sp;
  501.  
  502.     
  503. CASE int inch
  504. END
  505.  
  506. CASE int winch
  507. I    WINDOW*        win
  508. END
  509.  
  510. CASE WINDOW* initscr
  511. END
  512.  
  513. CASE int killchar
  514. END
  515.  
  516. CASE int leaveok
  517. I    WINDOW*        win
  518. I    bool        boolf
  519. END
  520.  
  521. CASE char* longname
  522. I    char*        termbuf
  523. IO    char*        name
  524. END
  525.  
  526. CASE int fullname
  527. I    char*        termbuf
  528. IO    char*        name
  529. END
  530.  
  531. CASE int mvwin
  532. I    WINDOW*        win
  533. I    int        y
  534. I    int        x
  535. END
  536.  
  537. CASE WINDOW* newwin
  538. I    int        lines
  539. I    int        cols
  540. I    int        begin_y
  541. I    int        begin_x
  542. END
  543.  
  544. CASE int nl
  545. END
  546.  
  547. CASE int nonl
  548. END
  549.  
  550. CASE int scrollok
  551. I    WINDOW*        win
  552. I    bool        boolf
  553. END
  554.  
  555. CASE WINDOW* subwin
  556. I    WINDOW*        win
  557. I    int        lines
  558. I    int        cols
  559. I    int        begin_y
  560. I    int        begin_x
  561. END
  562.  
  563. CASE int touchline
  564. I    WINDOW*        win
  565. I    int        y
  566. I    int        startx
  567. I    int        endx
  568. END
  569.  
  570. CASE int touchoverlap
  571. I    WINDOW*        win1
  572. I    WINDOW*        win2
  573. END
  574.  
  575. CASE int touchwin
  576. I    WINDOW*        win
  577. END
  578.  
  579. CASE char* unctrl
  580. I    char        ch
  581. END
  582.  
  583. CASE int gettmode
  584. END
  585.  
  586. CASE int mvcur
  587. I    int        lasty
  588. I    int        lastx
  589. I    int        newy
  590. I    int        newx
  591. END
  592.  
  593. CASE int scroll
  594. I    WINDOW*        win
  595. END
  596.  
  597. CASE int savetty
  598. END
  599.  
  600. CASE void resetty
  601. END
  602.  
  603. CASE int setterm
  604. I    char*        name
  605. END
  606.  
  607. CASE int tstp
  608. END
  609.  
  610. CASE int _putchar
  611. I    char        ch
  612. END
  613.  
  614.     case US_testcallback:
  615.     sp = callback("callback", sp + items, curcsv->wantarray, 1, items);
  616.     break;
  617.  
  618.     default:
  619.     fatal("Unimplemented user-defined subroutine");
  620.     }
  621.     return sp;
  622. }
  623.  
  624. static int
  625. userval(ix, str)
  626. int ix;
  627. STR *str;
  628. {
  629.     switch (ix) {
  630.     case UV_COLS:
  631.     str_numset(str, (double)COLS);
  632.     break;
  633.     case UV_Def_term:
  634.     str_set(str, Def_term);
  635.     break;
  636.     case UV_ERR:
  637.     str_numset(str, (double)ERR);
  638.     break;
  639.     case UV_LINES:
  640.     str_numset(str, (double)LINES);
  641.     break;
  642.     case UV_My_term:
  643.     str_numset(str, (double)My_term);
  644.     break;
  645.     case UV_OK:
  646.     str_numset(str, (double)OK);
  647.     break;
  648.     case UV_curscr:
  649.     str_nset(str, &curscr, sizeof(WINDOW*));
  650.     break;
  651.     case UV_stdscr:
  652.     str_nset(str, &stdscr, sizeof(WINDOW*));
  653.     break;
  654.     case UV_ttytype:
  655.     str_set(str, ttytype);
  656.     break;
  657.     }
  658.     return 0;
  659. }
  660.  
  661. static int
  662. userset(ix, str)
  663. int ix;
  664. STR *str;
  665. {
  666.     switch (ix) {
  667.     case UV_COLS:
  668.     COLS = (int)str_gnum(str);
  669.     break;
  670.     case UV_Def_term:
  671.     Def_term = savestr(str_get(str));    /* never freed */
  672.     break;
  673.     case UV_LINES:
  674.     LINES = (int)str_gnum(str);
  675.     break;
  676.     case UV_My_term:
  677.     My_term = (bool)str_gnum(str);
  678.     break;
  679.     case UV_ttytype:
  680.     strcpy(ttytype, str_get(str));        /* hope it fits */
  681.     break;
  682.     }
  683.     return 0;
  684. }
  685.