home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / PERL4036.ZIP / usub / bsdcurses.mus next >
Text File  |  1993-02-08  |  13KB  |  697 lines

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