|
|
1.1 ! root 1: #ifndef EMULATOR_DOT_H ! 2: #define EMULATOR_DOT_H ! 3: ! 4: /* ! 5: * EMULATOR.H 5.20A June 8, 1995 ! 6: * ! 7: * The Greenleaf Comm Library ! 8: * ! 9: * Copyright (C) 1985-1995 Greenleaf Software Inc. All Rights Reserved. ! 10: * ! 11: * NOTES ! 12: * ! 13: * This is the master include file for CommLib terminal emulation. ! 14: * The important thing needed here is the definiton of the EMULATOR ! 15: * structure, which carries around all of the information needed to ! 16: * run an emulator. ! 17: * ! 18: * MODIFICATIONS ! 19: * ! 20: * Jun 8, 1995 5.20A : Initial release ! 21: */ ! 22: ! 23: /* ! 24: * I need to include video.h in order to pick up the definitions ! 25: * of the VID_WINDOW objects for my function prototypes. Note that ! 26: * I also need definitions of HWND and HANDLE for my canned terminal ! 27: * objects I use under Windows and Win32 console mode. ! 28: */ ! 29: ! 30: #include "video.h" ! 31: ! 32: /* ! 33: * I do some funny things with structure definitions in order to ! 34: * make all this stuff work in a C++ like fashion. The basic deal ! 35: * is that is defined here a core structure called EMULATOR that contains ! 36: * all of the base class definitions used for terminal emulation. ! 37: * Derived classes, such as the Ansi emulation class, will define ! 38: * a copy of EMULATOR that starts with all the same data, but addes ! 39: * new data members onto the end. ! 40: * ! 41: * Here is the way you do it: ! 42: * ! 43: * #define EMULATOR struct _my_emulator ! 44: * struct _my_emulator; ! 45: * ! 46: * #include "emulator.h" ! 47: * #include "_emu.h" ! 48: * ! 49: * struct _my_emulator { ! 50: * EMULATOR_MEMBERS; ! 51: * int my_data_1; ! 52: * int ... ! 53: * }; ! 54: * ! 55: * The macro called EMULATOR_MEMBERS contains all of the members that ! 56: * have to be placed at the start of the structure. ! 57: * ! 58: * So this goofy arrangement means that inside my emulator code, I can ! 59: * do things like this: ! 60: * ! 61: * foo ( EMULATOR *e ) ! 62: * { ! 63: * ClearWindow( e ); ! 64: * ... ! 65: * ! 66: * Even though the structure I am using isn't exactly the same as the ! 67: * base version of EMULATOR, I can be secure in my knowledged that the ! 68: * pointer to the clear_window function is in the same place. ! 69: * ! 70: * I also let you play around with the members that point to the ! 71: * keyboard and video data. These have to be the same size as ! 72: * regular pointers, or the size of the EMULATOR structure ! 73: * will change, leading to disaster. ! 74: * ! 75: * The only reason I let you override these is to provide full ! 76: * type safety in Attach...() routines. A routine like ! 77: * VidPutc( VID_WINDOW *v ) can be safely assigned to emulator member ! 78: * vputc like this: ! 79: * ! 80: * #define VIDEO_TYPE VID_WINDOW * ! 81: * #include "emulator.h" ! 82: * ! 83: * Attach...() ! 84: * { ! 85: * emulator->vputc = VidPutc. ! 86: * ! 87: * This trick means I get the compiler to perform type checking when ! 88: * I do this assignement. Without it, I would have to use void pointers ! 89: * everywhere, and I would lose all my type safety that I worked so ! 90: * hard to gain. ! 91: * ! 92: * Unfortunately, things are quite this easy when I pass something funky ! 93: * like an HWND. In those cases, I had to resort to void pointers. ! 94: * ! 95: */ ! 96: ! 97: #if !defined( EMULATOR ) ! 98: #define EMULATOR struct _emulator ! 99: #endif ! 100: ! 101: #if !defined( VIDEO_TYPE ) ! 102: #define VIDEO_TYPE void GF_DLL_FAR * ! 103: #endif ! 104: ! 105: #if !defined( KEYBOARD_TYPE ) ! 106: #define KEYBOARD_TYPE void GF_DLL_FAR * ! 107: #endif ! 108: ! 109: /* ! 110: * The base class has built in support for keyboard macros and incoming ! 111: * triggers. They are both stored in linked lists of structures that ! 112: * are defined here. Note that derived classes are free to override ! 113: * these, but if I did my job correctly, they shouldn't have to. ! 114: */ ! 115: ! 116: struct _incoming_cmd_def { ! 117: struct _incoming_cmd_def GF_DLL_FAR *next_cmd; ! 118: int command; ! 119: char GF_DLL_FAR *string; ! 120: }; ! 121: ! 122: struct _kbd_macro_def { ! 123: struct _kbd_macro_def GF_DLL_FAR *next_macro; ! 124: int key; ! 125: char GF_DLL_FAR *s; ! 126: }; ! 127: ! 128: /* ! 129: * The members that show up at the start of the emulator ! 130: * structur, regardless of what follows. ! 131: */ ! 132: ! 133: #define EMULATOR_MEMBERS \ ! 134: PORT GF_DLL_FAR *port; \ ! 135: VIDEO_TYPE video; \ ! 136: KEYBOARD_TYPE keyboard; \ ! 137: char trace[ 16 ]; \ ! 138: int trace_index; \ ! 139: char triggers[ 256 ]; \ ! 140: struct _incoming_cmd_def GF_DLL_FAR *first_incoming_cmd_def; \ ! 141: struct _kbd_macro_def GF_DLL_FAR *first_kbd_macro; \ ! 142: int test_mode; \ ! 143: int input_mask; \ ! 144: char GF_DLL_FAR *current_key; \ ! 145: int ( GF_CONV *process_keyboard )( EMULATOR GF_DLL_FAR *emulator ); \ ! 146: int ( GF_CONV *process_input )( EMULATOR GF_DLL_FAR *emulator ); \ ! 147: void ( GF_CONV *destroy )( EMULATOR GF_DLL_FAR *emulator ); \ ! 148: int ( GF_CONV *read_raw_key )( EMULATOR GF_DLL_FAR *emulator ); \ ! 149: void ( GF_CONV *clear_window )( VIDEO_TYPE v ); \ ! 150: void ( GF_CONV *clear_to_eol )( VIDEO_TYPE v ); \ ! 151: void ( GF_CONV *goto_rc )( VIDEO_TYPE v, int row, int col ); \ ! 152: void ( GF_CONV *vputc )( VIDEO_TYPE v, int c ); \ ! 153: void ( GF_CONV *vputs )( VIDEO_TYPE v, char GF_DLL_FAR *s ); \ ! 154: void ( GF_CONV *vset_normal )( VIDEO_TYPE v ); \ ! 155: void ( GF_CONV *vset_reverse )( VIDEO_TYPE v ); \ ! 156: void ( GF_CONV *vset_bold )( VIDEO_TYPE v ); \ ! 157: void ( GF_CONV *vset_blink )( VIDEO_TYPE v ); \ ! 158: void ( GF_CONV *vset_underline )( VIDEO_TYPE v ); \ ! 159: void ( GF_CONV *vset_invisible )( VIDEO_TYPE v ); \ ! 160: void ( GF_CONV *vset_foreground )( VIDEO_TYPE v, int c ); \ ! 161: void ( GF_CONV *vset_background )( VIDEO_TYPE v, int c ); \ ! 162: void ( GF_CONV *vset_wrap )( VIDEO_TYPE v, int f ); \ ! 163: void ( GF_CONV *vbeep )( VIDEO_TYPE v ); \ ! 164: int ( GF_CONV *row )( VIDEO_TYPE v ); \ ! 165: int ( GF_CONV *col )( VIDEO_TYPE v ); \ ! 166: int ( GF_CONV *rows )( VIDEO_TYPE v ); \ ! 167: int ( GF_CONV *cols )( VIDEO_TYPE v ); \ ! 168: int ( GF_CONV *define_kbd_macro )( EMULATOR GF_DLL_FAR *e, int key, char GF_DLL_FAR *string ); \ ! 169: int ( GF_CONV *undefine_kbd_macro )( EMULATOR GF_DLL_FAR *e, int key ); \ ! 170: int ( GF_CONV *define_incoming_cmd )( EMULATOR GF_DLL_FAR *e, char GF_DLL_FAR *s, int cmd ); \ ! 171: int ( GF_CONV *undefine_incoming_cmd )( EMULATOR GF_DLL_FAR *e, char GF_DLL_FAR *s ); \ ! 172: void ( GF_CONV *debug_trace )( int c ) ! 173: ! 174: /* ! 175: * The default emulator structure. ! 176: */ ! 177: ! 178: struct _emulator { ! 179: EMULATOR_MEMBERS; ! 180: }; ! 181: ! 182: /* ! 183: * Here is how we call the virtual functions in ! 184: * an easier to read manner. Macros. ! 185: */ ! 186: ! 187: #define ProcessKeys( e ) e->process_keyboard( e ) /* Tag: Terminal Public */ ! 188: #define ReadRawKey( e ) e->read_raw_key( e ) /* Tag: Terminal Private */ ! 189: #define ProcessInput( e ) e->process_input( e ) /* Tag: Terminal Public */ ! 190: #define SetNormal( e ) e->vset_normal( e->video ) /* Tag: Terminal Private */ ! 191: #define SetReverse( e ) e->vset_reverse( e->video ) /* Tag: Terminal Private */ ! 192: #define SetBold( e ) e->vset_bold( e->video ) /* Tag: Terminal Private */ ! 193: #define SetBlink( e ) e->vset_blink( e->video ) /* Tag: Terminal Private */ ! 194: #define SetUnderline( e ) e->vset_underline( e->video ) /* Tag: Terminal Private */ ! 195: #define SetInvisible( e ) e->vset_invisible( e->video ) /* Tag: Terminal Private */ ! 196: #define SetBackground( e, c ) e->vset_background( e->video, c ) /* Tag: Terminal Private */ ! 197: #define SetForeground( e, c ) e->vset_foreground( e->video, c ) /* Tag: Terminal Private */ ! 198: #define ClearWindow( e ) e->clear_window( e->video ) /* Tag: Terminal Private */ ! 199: #define ClearToEol( e ) e->clear_to_eol( e->video ) /* Tag: Terminal Private */ ! 200: #define GotoRc( e, r, c ) e->goto_rc( e->video, r, c ) /* Tag: Terminal Private */ ! 201: #define Row( e ) e->row( e->video ) /* Tag: Terminal Private */ ! 202: #define Col( e ) e->col( e->video ) /* Tag: Terminal Private */ ! 203: #define Rows( e ) e->rows( e->video ) /* Tag: Terminal Private */ ! 204: #define Cols( e ) e->cols( e->video ) /* Tag: Terminal Private */ ! 205: #define SetWrap( e, f ) e->vset_wrap( e->video, f ) /* Tag: Terminal Private */ ! 206: #define Beep( e ) e->vbeep( e->video ) /* Tag: Terminal Private */ ! 207: #define DestroyEmulator( e ) e->destroy( e ) /* Tag: Terminal Public */ ! 208: #define Putc( e, c ) e->vputc( e->video, c ) /* Tag: Terminal Private */ ! 209: #define Puts( e, s ) e->vputs( e->video, s ) /* Tag: Terminal Private */ ! 210: #define DefineKeyboardMacroString( e, k, s ) e->define_kbd_macro( e, k, s ) /* Tag: Terminal Public */ ! 211: #define DefineKeyboardMacroCommand( e, k ) e->define_kbd_macro( e, k, 0 ) /* Tag: Terminal Public */ ! 212: #define UndefineKeyboardMacro( e, k ) e->undefine_kbd_macro( e, k ) /* Tag: Terminal Public */ ! 213: #define DefineIncomingCommand( e, s, c ) e->define_incoming_cmd( e, s, c ) /* Tag: Terminal Public */ ! 214: #define UndefineIncomingCommand( e, s ) e->undefine_incoming_cmd( e, s ) /* Tag: Terminal Public */ ! 215: /* ! 216: * This helps fix a documentation error. ! 217: */ ! 218: #define UndefineIncomingCmd( e, s ) e->undefine_incoming_cmd( e, s ) /* Tag: Terminal Public */ ! 219: ! 220: #ifdef __cplusplus ! 221: extern "C" { ! 222: #endif ! 223: ! 224: /* ! 225: * For right now, I am including all the prototypes for each ! 226: * and every derived class. When we have more video types and ! 227: * more emulators, some of these things will have to be broken ! 228: * out into separate header files. ! 229: */ ! 230: ! 231: /* ! 232: * All of the supported emulators: Just 1! We do need to add ! 233: * basic TTY emulation. A patch maybe? ! 234: */ ! 235: ! 236: EMULATOR GF_DLL_FAR * GF_CONV CreateAnsiEmulator( PORT GF_DLL_FAR *p ); ! 237: ! 238: /* ! 239: * The two functions for Greenleaf Text based Vid Windows. The generic attach ! 240: * function, and the shortcut function that creates *and* attaches. ! 241: */ ! 242: ! 243: void GF_CONV AttachVidToEmulator( EMULATOR GF_DLL_FAR *e, ! 244: VID_WINDOW GF_DLL_FAR *w ); ! 245: EMULATOR * GF_CONV CreateAnsiVidEmulator( PORT *p, VID_WINDOW *w ); ! 246: ! 247: /* ! 248: * The two functions for Greenleaf WinVid Windows for Win16 and Win32. ! 249: * The generic attach function, and the shortcut function that creates ! 250: * *and* attaches. ! 251: */ ! 252: ! 253: #ifdef GF_WINDOWS ! 254: EMULATOR GF_DLL_FAR * GF_CONV CreateAnsiGFTermEmulator( PORT GF_DLL_FAR *p, ! 255: HWND hWnd ); ! 256: void GF_CONV AttachGFTermToEmulator( EMULATOR GF_DLL_FAR *e, HWND hWnd ); ! 257: #endif ! 258: ! 259: /* ! 260: * The two functions for Greenleaf Win32 native console mode. ! 261: * The generic attach function, and the shortcut function that creates ! 262: * *and* attaches. Plus, one simple API function to help those ! 263: * Win32 programmers. ! 264: */ ! 265: ! 266: #ifdef GF_WIN32 ! 267: void GF_CONV AttachConsoleToEmulator( EMULATOR GF_DLL_FAR *e, ! 268: HANDLE hInput, ! 269: HANDLE hOutput ); ! 270: EMULATOR GF_DLL_FAR * GF_CONV ! 271: CreateAnsiConsoleEmulator( PORT GF_DLL_FAR *p, ! 272: HANDLE hInput, ! 273: HANDLE hOutput ); ! 274: void GF_CONV ConsumeAllConsoleInput( EMULATOR GF_DLL_FAR *e, ! 275: int flag ); ! 276: #endif ! 277: ! 278: #ifdef __cplusplus ! 279: } ! 280: #endif ! 281: ! 282: #endif /* #ifndef EMULATOR_DOT_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.