home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / k95source / ckoqnx.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  21KB  |  728 lines

  1. /*  C K O Q N X . C  --  QNX Emulation  */
  2.  
  3. /*
  4.   Author: Jeffrey Altman <jaltman@secure-endpoints.com>,
  5.             Secure Endpoints Inc., New York City.
  6.  
  7.   Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New
  8.   York.
  9. */
  10.  
  11. #include "ckcdeb.h"
  12. #ifndef NOTERM
  13. #ifdef NT
  14. #include <windows.h>
  15. #else /* NT */
  16. #include <os2.h>
  17. #undef COMMENT
  18. #endif /* NT */
  19.  
  20. #include "ckcker.h"
  21. #include "ckcasc.h"
  22. #include "ckuusr.h"
  23. #include "ckocon.h"
  24. #include "ckoqnx.h"
  25.  
  26. extern bool keyclick ;
  27. extern int  cursorena[], keylock, duplex, duplex_sav, screenon ;
  28. extern int  printon, aprint, cprint, uprint, xprint, seslog ;
  29. extern int  insertmode, tnlm, decssdt ;
  30. extern int  escstate, debses, decscnm, tt_cursor ;
  31. extern int  tt_type, tt_type_mode, tt_max, tt_answer, tt_status[VNUM], tt_szchng[] ;
  32. extern int  tt_cols[], tt_rows[], tt_wrap, tt_modechg ;
  33. extern int  wherex[], wherey[], margintop, marginbot, marginleft, marginright ;
  34. extern int  marginbell, marginbellcol ;
  35. extern char answerback[], htab[] ;
  36. extern struct tt_info_rec tt_info[] ;
  37. extern vtattrib attrib, savedattrib[] ;
  38. extern unsigned char attribute, defaultattribute;
  39. extern unsigned char savedattribute[], saveddefaultattribute[];
  40. extern char * udkfkeys[];
  41. extern int tt_senddata;
  42. extern struct _vtG G[4];
  43. extern struct _vtG *GL,*GR;
  44. extern int tt_hidattr;
  45.  
  46. extern int protect ;
  47. extern int autoscroll ;
  48. extern int writeprotect ;
  49. extern int linelock ;
  50. extern int attrmode ;
  51. extern int wy_keymode ;
  52. extern int wy_enhanced ;
  53. extern int wy_widthclr ;
  54. extern int wy_autopage ;
  55. extern int wy_nullsuppress ;
  56. extern int wy_monitor ;
  57.  
  58. int
  59. qnxinc(void)
  60. {
  61.     extern int pmask, cmask;
  62.     extern int tt_utf8;
  63.     int ch;
  64.  
  65.   loop:
  66.     ch = ttinc(0);
  67.     if ( ch < 0 )
  68.         return ch;
  69.  
  70.     if ( seslog )
  71.         logchar(ch);
  72.  
  73.     /* Handle the UTF8 conversion if we are in that mode */
  74.     if ( tt_utf8 ) {
  75.         USHORT * ucs2 = NULL;
  76.         int rc = utf8_to_ucs2( (CHAR)(ch & 0xFF), &ucs2 );
  77.         if ( rc > 0 )
  78.             goto loop;
  79.         else if ( rc < 0 )
  80.             ch = 0xfffd;
  81.         else
  82.             ch = *ucs2;
  83.     }
  84.  
  85.     if ( !xprint ) {
  86. #ifndef NOXFER
  87.         autodown(ch);
  88. #endif /* NOXFER */
  89.         autoexitchk(ch);
  90.     }
  91.     ch = ch & pmask & cmask;
  92.     debugses(ch);
  93.     if (printon && (is_xprint() || is_uprint()))
  94.         prtchar(ch);
  95.     return ch;
  96. }
  97.  
  98. void
  99. qnxattroff( void )
  100. {
  101.     attrib.blinking = FALSE;            /* No blink */
  102.     attrib.bold = FALSE;                /* No bold */
  103.     attrib.invisible = FALSE;           /* Visible */
  104.     attrib.underlined = FALSE;          /* No underline */
  105.     attrib.reversed = FALSE;            /* No reverse video */
  106.     attrib.unerasable = FALSE;          /* Erasable */
  107.     attrib.graphic = FALSE ;            /* Not graphic character */
  108.     attrib.dim = FALSE ;                /* No dim */
  109. }
  110.  
  111. void
  112. qnxctrl( int ch )
  113. {
  114.     int i,j,x,y;
  115.  
  116.     switch ( ch ) {
  117.     case ETX:
  118.         if ( debses )
  119.             break;
  120.         break;
  121.     case EOT:
  122.         if ( debses )
  123.             break;
  124.         break;
  125.     case ENQ:
  126.         if ( debses )
  127.             break;
  128.         break;
  129.     case ACK:
  130.         if ( debses )
  131.             break;
  132.         break;
  133.     case BEL:
  134.         if ( debses )
  135.             break;
  136.         bleep(BP_BEL);
  137.         break;
  138.     case BS:
  139.         if ( debses )
  140.             break;
  141.         /* wraps to previous line from left margin */
  142.         /* wraps to bottom right from upper left */
  143.         wrtch(BS);
  144.         break;
  145.     case HT:
  146.         if ( debses )
  147.             break;
  148.  
  149.         i = wherex[VTERM];
  150.         if (i < marginright)
  151.         {
  152.             do {
  153.                 i++;
  154.                 cursorright(0);
  155.             } while ((htab[i] != 'T') &&
  156.                       (i <= marginright-1));
  157.         }
  158.         if ( i == marginright ) {
  159.             wrtch(CR);
  160.             wrtch(LF);
  161.         }
  162.         VscrnIsDirty(VTERM);
  163.         break;
  164.     case LF:
  165.         if ( debses )
  166.             break;
  167.         wrtch(LF);
  168.         break;
  169.     case VT:
  170.         if ( debses )
  171.             break;
  172.         break;
  173.     case FF:
  174.         if ( debses )
  175.             break;
  176.         /* clear screen to Fill color and home cursor */
  177.         clrscreen(VTERM,SP);
  178.         lgotoxy(VTERM,1,1);       /* and home the cursor */
  179.         break;
  180.     case CR:
  181.         if ( debses )
  182.             break;
  183.         wrtch(CR);
  184.         break;
  185.     case SO:
  186.         if ( debses )
  187.             break;
  188.         break;
  189.     case SI:
  190.         if ( debses )
  191.             break;
  192.         break;
  193.     case DLE:
  194.         if ( debses )
  195.             break;
  196.         break;
  197.     case DC1:
  198.         break;
  199.     case DC2:
  200.         if ( debses )
  201.         break;
  202.     case DC3:
  203.         break;
  204.     case DC4:
  205.         if ( debses )
  206.             break;
  207.         break;
  208.     case NAK:
  209.         if ( debses )
  210.             break;
  211.         break;
  212.     case SYN:
  213.         if ( debses )
  214.             break;
  215.         break;
  216.     case ETB:
  217.         if ( debses )
  218.             break;
  219.         break;
  220.     case CAN:
  221.         if ( debses )
  222.             break;
  223.         break;
  224.     case XEM:
  225.         break;
  226.     case SUB:
  227.         if ( debses )
  228.             break;
  229.         break;
  230.     case ESC:
  231.         /* initiate escape sequence */
  232.         escstate = ES_GOTESC ;
  233.         break;
  234.     case XRS:
  235.         if ( debses )
  236.             break;
  237.         break;
  238.     case US:
  239.         if ( debses )
  240.             break;
  241.         break;
  242.     }
  243. }
  244.  
  245. void
  246. qnxascii( int ch )
  247. {
  248.     int i,j,k,n,x,y,z;
  249.     vtattrib attr={0,0,0,0,0,0,0,0,0,0,0} ;
  250.     viocell blankvcell;
  251.  
  252.     if (printon && (is_xprint() || is_uprint()))
  253.         prtchar(ch);
  254.  
  255.     if ( escstate == ES_GOTESC )/* Process character as part of an escstate sequence */
  256.     {
  257.         if ( ch <= SP ) {
  258.             /* Print character as graphic */
  259.             escstate = ES_NORMAL ;
  260.             debug(F111,"QNX","Display character as graphic",ch);
  261.             wrtch(ch);
  262.         }
  263.         else
  264.         {
  265.             escstate = ES_ESCSEQ ;
  266.             switch ( ch ) {
  267.             case '!': {
  268.                 /* Set the fill color used for blank lines when scrolling   */
  269.                 /* and for clearscreen when FF is received.                 */
  270.                 /* '0'=black, blue, green, cyan, red, magenta, brown, white */
  271.                 int fg = qnxinc();
  272.                 int bg = qnxinc();
  273.                 debug(F110,"QNX","Set the Fill Color",0);
  274.                 if ( debses )
  275.                     break;
  276.                 if ( bg < '0' || bg >= '8' || fg < '0' || fg >= '8' )
  277.                     break;
  278.                 defaultattribute = ((bg-'0')<<4) | (fg-'0');
  279.                 break;
  280.             }
  281.             case '"':
  282.                 break;
  283.             case '#':
  284.                 break;
  285.             case '$':
  286.                 break;
  287.             case '%':
  288.                 break;
  289.             case '&':
  290.                 break;
  291.             case '\'':
  292.                 break;
  293.             case '(':
  294.                 /* Turn on Reverse attribute */
  295.                 debug(F110,"QNX","Turn on Reverse attribute",0);
  296.                 if ( debses )
  297.                     break;
  298.                 attrib.reversed = TRUE;
  299.                 break;
  300.             case ')':
  301.                 /* Turn off Reverse Attribute */
  302.                 debug(F110,"QNX","Turn off Reverse attribute",0);
  303.                 if ( debses )
  304.                     break;
  305.                 attrib.reversed = FALSE;
  306.                 break;
  307.             case '*':
  308.                 break;
  309.             case '+':
  310.                 break;
  311.             case ',':
  312.                 break;
  313.             case '-':
  314.                 break;
  315.             case '.':
  316.                 break;
  317.             case '/':
  318.                 break;
  319.             case '0':
  320.                 break;
  321.             case '1':
  322.                 break;
  323.             case '2':
  324.                 break;
  325.             case '3':
  326.                 break;
  327.             case '4':
  328.                 break;
  329.             case '5':
  330.                 break;
  331.             case '6':
  332.                 break;
  333.             case '7':
  334.                 break;
  335.             case '8':
  336.                 break;
  337.             case '9':
  338.                 break;
  339.             case ':':
  340.                 break;
  341.             case ';':
  342.                 break;
  343.             case '<':
  344.                 /* Turn on Bold */
  345.                 debug(F110,"QNX","Turn on Bold",0);
  346.                 if ( debses )
  347.                     break;
  348.                 attrib.bold = TRUE;
  349.                 break;
  350.             case '=': {
  351.                 /* Position Cursor */
  352.                 int row = qnxinc() - 31;
  353.                 int col = qnxinc() - 31;
  354.                 debug(F110,"QNX","Address cursor to row col",0);
  355.                 if ( debses )
  356.                     break;
  357.                 lgotoxy(VTERM,col,row);
  358.                 break;
  359.             }
  360.             case '>':
  361.                 /* Turn off Bold */
  362.                 debug(F110,"QNX","Turn off Bold",0);
  363.                 if ( debses )
  364.                     break;
  365.                 attrib.bold = FALSE;
  366.                 break;
  367.             case '?':
  368.                 break;
  369.             case '@': {
  370.                 /* Define fg,bg colors of the display characters */
  371.                 int fg = qnxinc();
  372.                 int bg = qnxinc();
  373.                 debug(F110,"QNX","Set the Display Colors",0);
  374.                 if ( debses )
  375.                     break;
  376.                 if ( fg < '0' || fg >= '8' || bg < '0' || bg >= '8' )
  377.                     break;
  378.                 attribute = ((bg-'0')<<4) | (fg-'0');
  379.                 break;
  380.             }
  381.             case 'A':
  382.                 /* Cursor Up */
  383.                 debug(F110,"QNX","Cursor Up (no wrap)",0);
  384.                 if ( debses )
  385.                     break;
  386.                 cursorup(0);
  387.                 break;
  388.             case 'B':
  389.                 /* Cursor Down */
  390.                 debug(F110,"QNX","Cursor Down (no wrap)",0);
  391.                 if ( debses )
  392.                     break;
  393.                 cursordown(0);
  394.                 break;
  395.             case 'C':
  396.                 /* Cursor Right (no wrap)*/
  397.                 debug(F110,"QNX","Cursor Right (no wrap)",0);
  398.                 if ( debses )
  399.                     break;
  400.                 cursorright(0);
  401.                 break;
  402.             case 'D':
  403.                 /* Cursor Left (no wrap)*/
  404.                 debug(F110,"QNX","Cursor Left (no wrap)",0);
  405.                 if ( debses )
  406.                     break;
  407.                 cursorleft(0);
  408.                 break;
  409.             case 'E':
  410.                 /* Insert Line */
  411.                 debug(F110,"QNX","Insert Line",0);
  412.                 if ( debses )
  413.                     break;
  414.                 VscrnScroll(VTERM,
  415.                              DOWNWARD,
  416.                              wherey[VTERM] - 1,
  417.                              marginbot - 1,
  418.                              1,
  419.                              FALSE,
  420.                              SP);
  421.                 break;
  422.             case 'F':
  423.                 /* Delete Line */
  424.                 debug(F110,"QNX","Delete Line",0);
  425.                 if ( debses )
  426.                     break;
  427.                 VscrnScroll(VTERM,
  428.                              UPWARD,
  429.                              wherey[VTERM] - 1,
  430.                              marginbot - 1,
  431.                                  1,
  432.                                  FALSE,
  433.                                  SP);
  434.                 break;
  435.             case 'G':
  436.                 break;
  437.             case 'H':
  438.                 /* Cursor Home */
  439.                 debug(F110,"QNX","Home Cursor",0);
  440.                 if ( debses )
  441.                     break;
  442.                 lgotoxy(VTERM,1,1);
  443.                 break;
  444.             case 'I':
  445.                 /* Reverse Line Feed */
  446.                 debug(F110,"QNX","Reverse Line Feed",0);
  447.                 if ( debses )
  448.                     break;
  449.                 if (margintop == wherey[VTERM])
  450.                     VscrnScroll(VTERM,
  451.                                  DOWNWARD,
  452.                                  margintop - 1,
  453.                                  marginbot - 1,
  454.                                  1,
  455.                                   FALSE,
  456.                                   SP
  457.                                   );
  458.                 else
  459.                     cursorup(0);
  460.                 break;
  461.             case 'J':
  462.                 /* Clear Display with SP */
  463.                 /* use Fill Color */
  464.                 debug(F110,"QNX","Clear to EOS",0);
  465.                 clreoscr_escape(VTERM,SP);
  466.                 break;
  467.             case 'K':
  468.                 /* Erase to End of Line with SP */
  469.                 /* use Fill Color */
  470.                 debug(F110,"QNX","Clear to EOL",0);
  471.                 if ( debses )
  472.                     break;
  473.                 clrtoeoln(VTERM,SP);
  474.                 break;
  475.             case 'L':
  476.                 break;
  477.             case 'M':
  478.                 break;
  479.             case 'N':
  480.                 break;
  481.             case 'O':
  482.                 break;
  483.             case 'P':
  484.                 break;
  485.             case 'Q':
  486.                 break;
  487.             case 'R':
  488.                 /* Restore Color and Attribute Information */
  489.                 debug(F110,"QNX","Restore Colors and Attributes",0);
  490.                 if ( debses )
  491.                     break;
  492.                 attrib = savedattrib[VTERM];
  493.                 attribute = savedattribute[VTERM];
  494.                 defaultattribute = saveddefaultattribute[VTERM];
  495.                 break;
  496.             case 'S':
  497.                 /* Save Color and Attribute Information   */
  498.                 /* save attribute, fill color, and attrib */
  499.                 debug(F110,"QNX","Save Colors and Attributes",0);
  500.                 if ( debses )
  501.                     break;
  502.                 savedattrib[VTERM] = attrib;
  503.                 savedattribute[VTERM] = attribute;
  504.                 saveddefaultattribute[VTERM] = defaultattribute;
  505.                 break;
  506.             case 'T':
  507.                 break;
  508.             case 'U':
  509.                 break;
  510.             case 'V':
  511.                 break;
  512.             case 'W':
  513.                 /* From Relisys terminals */
  514.                 debug(F110,"QNX","Transparent Print On",0);
  515.                 if ( debses )
  516.                     break;
  517.                 xprint = TRUE ;
  518.                 if ( !printon )
  519.                     printeron() ;
  520.                 break;
  521.             case 'X':
  522.                 /* From Relisys terminals */
  523.                 debug(F110,"QNX","Print Off",0);
  524.                 if ( debses )
  525.                     break;
  526.                 xprint = cprint = FALSE ;
  527.                 setaprint(FALSE);
  528.                 if ( !uprint && !xprint && !cprint && !aprint && printon )
  529.                     printeroff();
  530.                 break;
  531.             case 'Y': {
  532.                 /* Position Cursor */
  533.                 int row = qnxinc() - 31;
  534.                 int col = qnxinc() - 31;
  535.                 debug(F110,"QNX","Address cursor to row col",0);
  536.                 if ( debses )
  537.                     break;
  538.                 lgotoxy(VTERM,col,row);
  539.                 break;
  540.             }
  541.             case 'Z':
  542.                 break;
  543.             case '[':
  544.                 /* Turn on underline */
  545.                 debug(F110,"QNX","Turn on Underline",0);
  546.                 if ( debses )
  547.                     break;
  548.                 attrib.underlined = TRUE;
  549.                 break;
  550.             case '\\':
  551.                 break;
  552.             case ']':
  553.                 /* Turn off underline */
  554.                 debug(F110,"QNX","Turn off Underline",0);
  555.                 if ( debses )
  556.                     break;
  557.                 attrib.underlined = FALSE;
  558.                 break;
  559.             case '^':
  560.                 break;
  561.             case '_':
  562.                 break;
  563.             case '`':
  564.                 break;
  565.             case 'a':
  566.                 /* Cursor Up with wrap */
  567.                 debug(F110,"QNX","Cursor Up (wrap)",0);
  568.                 if ( debses )
  569.                     break;
  570.                 cursorup(1);
  571.                 break;
  572.             case 'b':
  573.                 /* Cursor Down with wrap */
  574.                 debug(F110,"QNX","Cursor Down (wrap)",0);
  575.                 if ( debses )
  576.                     break;
  577.                 cursordown(1);
  578.                 break;
  579.             case 'c':
  580.                 /* Cursor Right with wrap */
  581.                 debug(F110,"QNX","Cursor Right (wrap)",0);
  582.                 if ( debses )
  583.                     break;
  584.                 cursorright(1);
  585.                 break;
  586.             case 'd':
  587.                 /* Cursor Left with wrap */
  588.                 debug(F110,"QNX","Cursor Left (wrap)",0);
  589.                 if ( debses )
  590.                     break;
  591.                 cursorleft(1);
  592.                 break;
  593.             case 'e':
  594.                 /* Inserts a space. */
  595.                 debug(F110,"QNX","Insert SP",0);
  596.                 if ( debses )
  597.                     break;
  598.                 blankvcell.c = SP;
  599.                 blankvcell.a = attribute;
  600.                 VscrnScrollRt(VTERM, wherey[VTERM] - 1,
  601.                                wherex[VTERM] - 1, wherey[VTERM] - 1,
  602.                                VscrnGetWidth(VTERM) - 1, 1, blankvcell);
  603.                 break;
  604.             case 'f':
  605.                 /* Deletes a character */
  606.                 debug(F110,"QNX","Delete a char",0);
  607.                 if ( debses )
  608.                     break;
  609.                 blankvcell.c = SP;
  610.                 blankvcell.a = attribute;
  611.                 VscrnScrollLf(VTERM, wherey[VTERM] - 1,
  612.                                wherex[VTERM] - 1,
  613.                                wherey[VTERM] - 1,
  614.                                VscrnGetWidth(VTERM) - 1,
  615.                                1, blankvcell) ;
  616.                 break;
  617.             case 'g': {
  618.                 /* Repeat character */
  619.                 int n = qnxinc() - SP;
  620.                 int c = rtolxlat(qnxinc());
  621.                 debug(F110,"QNX","Repeat character",0);
  622.                 if ( debses )
  623.                     break;
  624.                 while ( n-- )
  625.                     wrtch(c);
  626.                 break;
  627.             }
  628.             case 'h':
  629.                 /* Auto wrap on */
  630.                 debug(F110,"QNX","Auto wrap on",0);
  631.                 if ( debses )
  632.                     break;
  633.                 tt_wrap = TRUE;
  634.                 break;
  635.             case 'i':
  636.                 /* Auto wrap off */
  637.                 debug(F110,"QNX","Auto wrap off",0);
  638.                 if ( debses )
  639.                     break;
  640.                 tt_wrap = FALSE;
  641.                 break;
  642.             case 'j':
  643.                 break;
  644.             case 'k':
  645.                 break;
  646.             case 'l':
  647.                 break;
  648.             case 'm':
  649.                 break;
  650.             case 'n':
  651.                 break;
  652.             case 'o':
  653.                 break;
  654.             case 'p':
  655.             case 'q':
  656.             case 'r':
  657.             case 's':
  658.             case 't':
  659.             case 'u':
  660.             case 'v':
  661.             case 'w':
  662.             case 'x':
  663.                 break;
  664.             case 'y': {
  665.                 /* set cursor type */
  666.                 int c = qnxinc();
  667.                 debug(F110,"QNX","Define cursor type",0);
  668.                 if ( debses )
  669.                     break;
  670.                 switch ( c ) {
  671.                 case '0':
  672.                     /* no cursor */
  673.                     cursorena[VTERM] = FALSE ;
  674.                     break;
  675.                 case '1':
  676.                     /* line cursor */
  677.                     tt_cursor = TTC_ULINE ;
  678.                     setcursormode() ;
  679.                     cursorena[VTERM] = TRUE ;
  680.                     break;
  681.                 case '2':
  682.                     /* block cursor */
  683.                     tt_cursor = TTC_BLOCK ;
  684.                     setcursormode() ;
  685.                     cursorena[VTERM] = TRUE ;
  686.                     break;
  687.                 }
  688.                 break;
  689.             }
  690.             case 'z':
  691.                 break;
  692.             case '{':
  693.                 /* Turn blinking on */
  694.                 debug(F110,"QNX","Turn blinking on",0);
  695.                 if ( debses )
  696.                     break;
  697.                 attrib.blinking = TRUE;
  698.                 break;
  699.             case '|':
  700.                 break;
  701.             case '}':
  702.                 /* Turn blinking off */
  703.                 debug(F110,"QNX","Turn blinking off",0);
  704.                 if ( debses )
  705.                     break;
  706.                 attrib.blinking = FALSE;
  707.                 break;
  708.             case '~':
  709.                 break;
  710.             case DEL:
  711.                 break;
  712.             }
  713.             escstate = ES_NORMAL ;      /* Done parsing escstate sequence */
  714.         }
  715.     }
  716.     else                /* Handle as a normal character */
  717.     {
  718.         if ( ch < SP || ch == DEL )
  719.             qnxctrl(ch) ;
  720.         else if ( !debses ) {
  721.             /* Display the character */
  722.             wrtch(ch);
  723.         }
  724.     }
  725.     VscrnIsDirty(VTERM) ;
  726. }
  727. #endif /* NOTERM */
  728.