%{ #define NOKANJI #define NOATOM #define NOMINMAX #define NOSOUND #include #ifdef COLUMBIA #include "wktsmt.h" #include "wkt100.h" #else #include "smterm.h" #include "win600.h" #endif #ifdef WIN600 #include "grterm.h" #endif #undef YYLEX #define YYLEX vt100 #undef YYLMAX #define YYLMAX (BUFSIZE + 1) #define YY_PRESERVE #undef YY_INTERACTIVE #define YY_INTERACTIVE 0 #undef output #define output(c) #undef yygetc #define yygetc mygetc #undef YY_FATAL #define YY_FATAL(msg) {HWND hError = GetTopWindow(MWnd.hWnd); \ if (!hError) hError = MWnd.hWnd; \ MessageBox(hError,msg,szAppName, \ MB_OK | MB_ICONEXCLAMATION); \ PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);} static int accum; static int list[MAXPROTOLEN]; static int lptr, hptr; static int *pn; static int * NEAR getnextelement(BOOL corr); static int NEAR mygetc(void); static void NEAR doesc(register BYTE c); static void NEAR dosharp(register BYTE c); static void NEAR doscsl(register BYTE c); static void NEAR doscsr(register BYTE c); static void NEAR docsi(register BYTE c); static int NEAR doendnum(register BYTE c); static BOOL NEAR doquesendnum(register BYTE c); static int oldstate; %} ENQ [\005] BEL [\007] BS [\010] HT [\011] LF [\012] VT [\013] FF [\014] CR [\015] SO [\016] SI [\017] CAN [\030] EM [\031] SUB [\032] ESC [\033] FS [\034] GS [\035] RS [\036] US [\037] SPC [\040] DEL [\177] IND [\204] NEL [\205] HTS [\210] RI [\215] SS2 [\216] SS3 [\217] DCS [\220] CSI [\233] ST [\234] ANSI [\040-\176\221-\222\240-\377] CTRL [\000-\037\177\200-\220\223-\237] %p 3000 %s esc csi sharp lpr rpr innum endnum ques quesinnum quesendnum %x crep %% [\012-\014] { SendMessage(hWndText,SMT_STRINGINPUT,yyleng,(LONG)(LPSTR)yytext); SendMessage(hWndText, SMT_COMMAND, SM_NEXTLINE, (LONG)yyleng); } [\000-\011\015-\377]+ { SendMessage(hWndText,SMT_STRINGINPUT,yyleng,(LONG)(LPSTR)yytext); } {ENQ}+ { if (MWnd.AutoAnswer) { while (yyleng--) ShowAnswerBack(); } } {BEL}+ { if (MWnd.WarningBell) { while (yyleng--) MessageBeep(0); } } {BS}+ { SendMessage(hWndText, SMT_COMMAND, SM_BKSP, (LONG)yyleng); } {HT}+ { SendMessage(hWndText, SMT_COMMAND, SM_TAB, (LONG)yyleng); } [\012-\014]+ { SendMessage(hWndText, SMT_COMMAND, MWnd.LFCR ? SM_NEXTLINE : SM_INDEX, (LONG)yyleng); } {CR}+ { SendMessage(hWndText, SMT_COMMAND, SM_LEFTMARGIN, (LONG)yyleng); } {SO}+ { // select G1 character set into GL MWnd.ActiveCharSet = 1; SendMessage(hWndText,SMT_COMMAND,SM_SETCHARSET,(LONG)MWnd.CharSet[1]); } {SI}+ { // select G0 character set into GL MWnd.ActiveCharSet = 0; SendMessage(hWndText,SMT_COMMAND,SM_SETCHARSET,(LONG)MWnd.CharSet[0]); } {CAN}+ { BEGIN 0; } {SUB}+ { SendMessage(hWndText,SMT_STRINGINPUT,yyleng,(LONG)(LPSTR)yytext); BEGIN 0; } {IND}+ { SendMessage(hWndText, SMT_COMMAND, SM_INDEX, (LONG)yyleng); } {NEL}+ { SendMessage(hWndText, SMT_COMMAND, SM_NEXTLINE, (LONG)yyleng); } {HTS} { SendMessage(hWndText, SMT_COMMAND, SM_SETTAB, 1L); } {RI}+ { SendMessage(hWndText, SMT_COMMAND, SM_REVERSEINDEX, (LONG)yyleng); } {CSI} { memset((char *)list, 0, 2 * MAXPROTOLEN); lptr = hptr = -1; accum = 0; BEGIN csi; } {ESC} { BEGIN esc; } {CTRL} { ; } <0>{ANSI}+ { SendMessage(hWndText,SMT_STRINGINPUT,yyleng,(LONG)(LPSTR)yytext); } [#\(\)78=\>DEHMZ\[c] { doesc(*yytext); } [345678] { dosharp(*yytext); } [012AB\<] { doscsl(*yytext); } [012AB\<] { doscsr(*yytext); } [0-9] { accum = *yytext - '0'; BEGIN innum; } [\;\?ABCDHJKLMPcfgmr] { docsi(*yytext); } [0-9] { accum = 10 * accum + *yytext - '0'; } \; { if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN endnum; } {ANSI} { unput(*yytext); if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN endnum; } [0-9] { accum = 10 * accum + *yytext - '0'; BEGIN innum; } [\;ABCDHfJKLMPcghlmnr] { if (doendnum(*yytext)) return 1; } [0-9] { accum = *yytext - '0'; BEGIN quesinnum; } \; { if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN quesendnum; } [0-9] { accum = 10 * accum + *yytext - '0'; } \; { if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN quesendnum; } {ANSI} { unput(*yytext); if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN quesendnum; } [0-9] { accum = 10 * accum + *yytext - '0'; BEGIN quesinnum; } [\;hl] { if (doquesendnum(*yytext)) return 1; } {ANSI} { BEGIN 0; } %% static BOOL NEAR doquesendnum(register BYTE c) { switch(c) { case ';': if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN quesendnum; break; case 'h': while ((pn = getnextelement(FALSE)) != NULL) { switch(*pn) { case 1: MWnd.CurKeyMode = TRUE; break; case 3: SetCols(132); break; case 4: SendMessage(hWndText,SMT_SETATTRIBUTE,SM_SMOOTHSCROLL,(LONG)TRUE); break; case 5: if (!MWnd.Reverse) { MWnd.Reverse = TRUE; InvertScreen(TRUE); } break; case 6: SendMessage(hWndText, SMT_COMMAND, SM_ORIGINMODE, (LONG)TRUE); break; case 7: SendMessage(hWndText, SMT_SETATTRIBUTE, SM_AUTOWRAP,(LONG)TRUE); MWnd.Wrap = TRUE; break; case 25: if (!MWnd.Cursor) { MWnd.Cursor = TRUE; SendMessage(hWndText,SMT_CARETFUNCTION,SM_SHOWCARET,0L); } break; } } BEGIN 0; break; case 'l': while ((pn = getnextelement(FALSE)) != NULL) { switch(*pn) { case 1: MWnd.CurKeyMode = FALSE; break; case 2: SendMessage(hWndText,SMT_COMMAND,SM_SETCHARSET,(LONG)0); SetAlphaParams(52); if (input() != EOF) pushback(); return 1; case 3: SetCols(80); break; case 4: SendMessage(hWndText,SMT_SETATTRIBUTE,SM_SMOOTHSCROLL,(LONG)FALSE); break; case 5: if (MWnd.Reverse) { InvertScreen(FALSE); MWnd.Reverse = FALSE; } break; case 6: SendMessage(hWndText,SMT_COMMAND, SM_ORIGINMODE, (LONG)FALSE); break; case 7: SendMessage(hWndText, SMT_SETATTRIBUTE, SM_AUTOWRAP,(LONG)FALSE); MWnd.Wrap = FALSE; break; case 25: if (MWnd.Cursor) { MWnd.Cursor = FALSE; SendMessage(hWndText,SMT_CARETFUNCTION,SM_HIDECARET,0L); } break; } } BEGIN 0; break; } return 0; } static int NEAR doendnum(register BYTE c) { LONG lparam; switch (c) { case ';': if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; break; case 'A': SendMessage(hWndText, SMT_COMMAND, SM_CURSORUP, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'B': SendMessage(hWndText, SMT_COMMAND, SM_CURSORDOWN, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'C': SendMessage(hWndText, SMT_COMMAND, SM_CURSORRIGHT, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'D': SendMessage(hWndText, SMT_COMMAND, SM_CURSORLEFT, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'H': case 'f': SendMessage(hWndText, SMT_COMMAND, SM_POSITIONCURSOR, MAKELONG((list[0] ? list[0] : 1), (list[1] ? list[1] : 1))); BEGIN 0; break; case 'J': SendMessage(hWndText, SMT_COMMAND, list[0] == 0 ? SM_CLRTOENDOFPAGE : list[0] == 1 ? SM_CLEARTOTOPOFPAGE : list[0] == 2 ? SM_CLEARSCREEN : 0, 0L); BEGIN 0; break; case 'K': SendMessage(hWndText, SMT_COMMAND, list[0] == 0 ? SM_CLRTOENDOFLINE : list[0] == 1 ? SM_CLEARTOLINESTART : list[0] == 2 ? SM_CLEARLINE : 0, 0L); BEGIN 0; break; case 'L': SendMessage(hWndText, SMT_COMMAND, SM_INSERTLINE, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'M': SendMessage(hWndText, SMT_COMMAND, SM_DELETELINE, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'P': SendMessage(hWndText, SMT_COMMAND, SM_DELETECHAR, (LONG)(list[0] ? list[0] : 1)); BEGIN 0; break; case 'c': if (list[0] == 0) IdentifyTerm(100); BEGIN 0; break; case 'g': SendMessage(hWndText,SMT_COMMAND,SM_SETTAB,MAKELONG(0, list[0])); BEGIN 0; break; case 'h': while ((pn = getnextelement(FALSE)) != NULL) { switch(*pn) { case 3: SendMessage(hWndActive, SMT_SETATTRIBUTE, SM_AUTOWRAP, (LONG)TRUE); MWnd.ControlRep = TRUE; if (input() != EOF) pushback(); vt100SetState(-1); return 1; case 4: SendMessage(hWndText,SMT_SETATTRIBUTE,SM_INSERT,(LONG)TRUE); break; case 12: LocalEcho = 0; if (LineState != LOCAL_ON) LineState = LINE_ON + LocalEcho; break; case 20: MWnd.LFCR = TRUE; break; } } BEGIN 0; break; case 'l': while ((pn = getnextelement(FALSE)) != NULL) { switch(*pn) { case 4: SendMessage(hWndText,SMT_SETATTRIBUTE,SM_INSERT,(LONG)FALSE); break; case 12: LocalEcho = TRUE; if (LineState != LOCAL_ON) LineState = LINE_ON + LocalEcho; break; case 20: MWnd.LFCR = FALSE; break; } } BEGIN 0; break; case 'm': while ((pn = getnextelement(FALSE)) != NULL) SendMessage(hWndText, SMT_COMMAND, SM_VIDEOATTRIB, (LONG)*pn); BEGIN 0; break; case 'n': switch(list[0]) { case 5: WriteToComm("\033[0n",4); break; case 6: lparam = SendMessage(hWndText, SMT_CARETFUNCTION, SM_GETCARETPOS, 0L); ReportCursorPos(LOWORD(lparam), HIWORD(lparam)); break; } BEGIN 0; break; case 'r': SendMessage(hWndText, SMT_COMMAND, SM_SCROLLREGION, MAKELONG(list[0], list[1])); BEGIN 0; break; } return 0; } static void NEAR docsi(BYTE c) { switch(c) { case ';': if (lptr < (MAXPROTOLEN - 1)) list[++lptr] = accum; accum = 0; BEGIN endnum; break; case '?': BEGIN ques; break; case 'A': SendMessage(hWndText, SMT_COMMAND, SM_CURSORUP,1L); BEGIN 0; break; case 'B': SendMessage(hWndText, SMT_COMMAND, SM_CURSORDOWN,1L); BEGIN 0; break; case 'C': SendMessage(hWndText, SMT_COMMAND, SM_CURSORRIGHT,1L); BEGIN 0; break; case 'D': SendMessage(hWndText, SMT_COMMAND, SM_CURSORLEFT,1L); BEGIN 0; break; case 'H': case 'f': SendMessage(hWndText, SMT_COMMAND, SM_CURSORHOME,0L); BEGIN 0; break; case 'J': SendMessage(hWndText, SMT_COMMAND, SM_CLRTOENDOFPAGE,0L); BEGIN 0; break; case 'K': SendMessage(hWndText, SMT_COMMAND, SM_CLRTOENDOFLINE, 0L); BEGIN 0; break; case 'L': SendMessage(hWndText, SMT_COMMAND, SM_INSERTLINE, 1L); BEGIN 0; break; case 'M': SendMessage(hWndText, SMT_COMMAND, SM_DELETELINE, 1L); BEGIN 0; break; case 'P': SendMessage(hWndText, SMT_COMMAND, SM_DELETECHAR, 1L); BEGIN 0; break; case 'c': IdentifyTerm(100); BEGIN 0; break; case 'g': SendMessage(hWndText, SMT_COMMAND, SM_SETTAB,0L); BEGIN 0; break; case 'm': SendMessage(hWndText, SMT_COMMAND, SM_VIDEOATTRIB,0L); BEGIN 0; break; case 'r': SendMessage(hWndText, SMT_COMMAND, SM_SCROLLREGION,0L); BEGIN 0; break; } } static void NEAR doscsr(BYTE c) { switch(c) { case 'A': // Select UK National into G1 case 'B': // Select ASCII (default) into G1 case '1': // Select Alternate ROM set into G1 MWnd.CharSet[1] = 0; if (MWnd.ActiveCharSet == 1) SendMessage(hWndText,SMT_COMMAND, SM_SETCHARSET,(LONG)MWnd.CharSet[1]); break; case '0': // Select Dec special graphics into G1 case '2': // Select Alternate char ROM special graphics into G0 MWnd.CharSet[1] = SYMBOL_CHARSET; if (MWnd.ActiveCharSet == 1) SendMessage(hWndText,SMT_COMMAND, SM_SETCHARSET,(LONG)MWnd.CharSet[1]); break; case '<': // Select Dec supplemental into G1 break; } BEGIN 0; } static void NEAR doscsl(BYTE c) { switch(c) { case 'A': // Select UK National into G0 case 'B': // Select ASCII (default) into G0 case '1': // Select Alternate ROM set into G0 MWnd.CharSet[0] = 0; if (MWnd.ActiveCharSet == 0) SendMessage(hWndText,SMT_COMMAND, SM_SETCHARSET,(LONG)MWnd.CharSet[0]); break; case '0': // Select Dec special graphics into G0 case '2': // Select Alternate char ROM special graphics into G0 MWnd.CharSet[0] = SYMBOL_CHARSET; if (MWnd.ActiveCharSet == 0) SendMessage(hWndText,SMT_COMMAND, SM_SETCHARSET,(LONG)MWnd.CharSet[0]); break; case '<': // Select Dec supplemental into G0 break; } BEGIN 0; } static void NEAR dosharp(BYTE c) { switch(c) { case '3': // single high single width break; case '4': // single high double width break; case '5': // double high double width top line break; case '6': // double high double width bottom line break; case '7': SendMessage(hWndText, SMT_COMMAND, SM_FILLSCREEN, 0L); break; case '8': SendMessage(hWndText, SMT_COMMAND, SM_ALIGNSCREEN, 0L); break; } BEGIN 0; } static void NEAR doesc(BYTE c) { switch(c) { case '#': BEGIN sharp; break; case '(': BEGIN lpr; break; case ')': BEGIN rpr; break; case '7': SendMessage(hWndText, SMT_COMMAND, SM_SAVECURSOR, (LONG)TRUE); BEGIN 0; break; case '8': SendMessage(hWndText, SMT_COMMAND, SM_SAVECURSOR, (LONG)FALSE); BEGIN 0; break; case '=': MWnd.ApplMode = TRUE; BEGIN 0; break; case '>': MWnd.ApplMode = FALSE; BEGIN 0; break; case 'D': SendMessage(hWndText, SMT_COMMAND, SM_INDEX, 1L); BEGIN 0; break; case 'E': SendMessage(hWndText, SMT_COMMAND, SM_NEXTLINE, 1L); BEGIN 0; break; case 'H': SendMessage(hWndText, SMT_COMMAND, SM_SETTAB, 1L); BEGIN 0; break; case 'M': SendMessage(hWndText, SMT_COMMAND, SM_REVERSEINDEX, 1L); BEGIN 0; break; case 'Z': IdentifyTerm(100); BEGIN 0; break; case '[': memset((char *)list, 0, 2 * MAXPROTOLEN); lptr = hptr = -1; accum = 0; BEGIN csi; break; case 'c': // Hard reset BEGIN 0; break; } } void FAR vt100SetState(int state) { int temp = yy_start; if (state < 0) BEGIN crep; else BEGIN state; } static int * NEAR getnextelement(BOOL corr) { if (hptr++ < lptr) { if (corr) if (list[hptr] == 0) list[hptr] = 1; return(&list[hptr]); } else return(NULL); } static int NEAR mygetc() { if (pBuf->len > 0) { pBuf->len--; return (*pBuf->ptr++) & curproto.mask; } else return EOF; } void FAR ANSISpecialKeys(int item) { int index; static char *ANSIKeys[] = { "\033OA","\033[A", "\033OB","\033[B", "\033OC","\033[C", "\033OD","\033[D", "\033OH","\033[H", // 9 "\033OP","\033OQ","\033OR","\033OS", // 13 "\033Op","0", "\033Oq","1", "\033Or","2", "\033Os","3", "\033Ot","4", "\033Ou","5", "\033Ov","6", "\033Ow","7", "\033Ox","8", "\033Oy","9", // 33 "\033Ol","+", // 35 "\033Om","-", // 37 "\033On",".", // 39 "\033OM","*", // 41 }; switch(item) { case IDM_UP: case IDM_S_UP: case IDM_C_UP: case IDM_CS_UP: index = (MWnd.CurKeyMode ? 0 : 1); break; case IDM_DOWN: case IDM_S_DOWN: case IDM_C_DOWN: case IDM_CS_DOWN: index = (MWnd.CurKeyMode ? 2 : 3); break; case IDM_RIGHT: case IDM_S_RIGHT: case IDM_C_RIGHT: case IDM_CS_RIGHT: index = (MWnd.CurKeyMode ? 4 : 5); break; case IDM_LEFT: case IDM_S_LEFT: case IDM_C_LEFT: case IDM_CS_LEFT: index = (MWnd.CurKeyMode ? 6 : 7); break; case IDM_HOME: case IDM_S_HOME: case IDM_C_HOME: case IDM_CS_HOME: index = (MWnd.CurKeyMode ? 8 : 9); break; case IDM_F1: index = 10; break; case IDM_F2: index = 11; break; case IDM_F3: index = 12; break; case IDM_F4: index = 13; break; case IDM_NUM0: // case IDM_S_NUM0: case IDM_C_NUM0: // case IDM_CS_NUM0: index = (MWnd.ApplMode ? 14 : 15); break; case IDM_NUM1: // case IDM_S_NUM1: case IDM_C_NUM1: // case IDM_CS_NUM1: index = (MWnd.ApplMode ? 16 : 17); break; case IDM_NUM2: // case IDM_S_NUM2: case IDM_C_NUM2: // case IDM_CS_NUM2: index = (MWnd.ApplMode ? 18 : 19); break; case IDM_NUM3: // case IDM_S_NUM3: case IDM_C_NUM3: // case IDM_CS_NUM3: index = (MWnd.ApplMode ? 20 : 21); break; case IDM_NUM4: // case IDM_S_NUM4: case IDM_C_NUM4: // case IDM_CS_NUM4: index = (MWnd.ApplMode ? 22 : 23); break; case IDM_NUM5: // case IDM_S_NUM5: case IDM_C_NUM5: // case IDM_CS_NUM5: index = (MWnd.ApplMode ? 24 : 25); break; case IDM_NUM6: // case IDM_S_NUM6: case IDM_C_NUM6: // case IDM_CS_NUM6: index = (MWnd.ApplMode ? 26 : 27); break; case IDM_NUM7: // case IDM_S_NUM7: case IDM_C_NUM7: // case IDM_CS_NUM7: index = (MWnd.ApplMode ? 28 : 29); break; case IDM_NUM8: // case IDM_S_NUM8: case IDM_C_NUM8: // case IDM_CS_NUM8: index = (MWnd.ApplMode ? 30 : 31); break; case IDM_NUM9: // case IDM_S_NUM9: case IDM_C_NUM9: // case IDM_CS_NUM9: index = (MWnd.ApplMode ? 32 : 33); break; case IDM_ADD: // case IDM_S_ADD: case IDM_C_ADD: // case IDM_CS_ADD: index = (MWnd.ApplMode && (GetKeyState(VK_NUMLOCK) & 1) ? 34 : 35); break; case IDM_SUBTRACT: // case IDM_S_SUBTRACT: case IDM_C_SUBTRACT: // case IDM_CS_SUBTRACT: index = (MWnd.ApplMode && (GetKeyState(VK_NUMLOCK) & 1) ? 36 : 37); break; case IDM_DECIMAL: // case IDM_S_DECIMAL: case IDM_C_DECIMAL: // case IDM_CS_DECIMAL: index = (MWnd.ApplMode ? 38 : 39); break; case IDM_MULTIPLY: // case IDM_S_MULTIPLY: case IDM_C_MULTIPLY: // case IDM_CS_MULTIPLY: index = (MWnd.ApplMode && (GetKeyState(VK_NUMLOCK) & 1) ? 40 : 41); break; default: return; } WriteToComm(ANSIKeys[index], strlen(ANSIKeys[index])); }