home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / language / slperl / acurses.mus < prev    next >
Encoding:
Text File  |  1993-10-23  |  13.2 KB  |  710 lines

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