/* * demonstration/test code for GT keyboard input * * Copyright 2007 Przemyslaw Czerpak * */ #include "inkey.ch" #ifdef __HARBOUR__ #include "hbgtinfo.ch" REQUEST HB_CODEPAGE_PLMAZ REQUEST HB_CODEPAGE_PLISO REQUEST HB_CODEPAGE_PL852 REQUEST HB_CODEPAGE_PLWIN REQUEST HB_CODEPAGE_UTF8EX #else #xtranslate hb_keyStd( ) => ( ) #xtranslate hb_keyCode( ) => Asc( ) #xtranslate hb_keyChar( ) => iif( >= 32 .AND. <= 255 .AND. != 127, Chr( ), "" ) #xtranslate hb_ntos( ) => LTrim( Str( ) ) #endif #ifndef HB_K_RESIZE #define HB_K_RESIZE 1101 #endif PROCEDURE Main( cTermCP, cHostCP, lBoxChar, lRawKey ) LOCAL k, kX, i, s LOCAL aKeys := { ; { "K_UP", 5, "Up arrow, Ctrl-E" }, ; { "K_DOWN", 24, "Down arrow, Ctrl-X" }, ; { "K_LEFT", 19, "Left arrow, Ctrl-S" }, ; { "K_RIGHT", 4, "Right arrow, Ctrl-D" }, ; { "K_HOME", 1, "Home, Ctrl-A" }, ; { "K_END", 6, "End, Ctrl-F" }, ; { "K_PGUP", 18, "PgUp, Ctrl-R" }, ; { "K_PGDN", 3, "PgDn, Ctrl-C" }, ; { "K_CTRL_UP", 397, "Ctrl-Up arrow" }, ; { "K_CTRL_DOWN", 401, "Ctrl-Down arrow" }, ; { "K_CTRL_LEFT", 26, "Ctrl-Left arrow, Ctrl-Z" }, ; { "K_CTRL_RIGHT", 2, "Ctrl-Right arrow, Ctrl-B" }, ; { "K_CTRL_HOME", 29, "Ctrl-Home, Ctrl-]" }, ; { "K_CTRL_END", 23, "Ctrl-End, Ctrl-W" }, ; { "K_CTRL_PGUP", 31, "Ctrl-PgUp, Ctrl-Hyphen" }, ; { "K_CTRL_PGDN", 30, "Ctrl-PgDn, Ctrl-^" }, ; { "K_ALT_UP", 408, "Alt-Up arrow" }, ; { "K_ALT_DOWN", 416, "Alt-Down arrow" }, ; { "K_ALT_LEFT", 411, "Alt-Left arrow" }, ; { "K_ALT_RIGHT", 413, "Alt-Right arrow" }, ; { "K_ALT_HOME", 407, "Alt-Home" }, ; { "K_ALT_END", 415, "Alt-End" }, ; { "K_ALT_PGUP", 409, "Alt-PgUp" }, ; { "K_ALT_PGDN", 417, "Alt-PgDn" }, ; { "K_ENTER", 13, "Enter, Ctrl-M" }, ; { "K_RETURN", 13, "Return, Ctrl-M" }, ; { "K_SPACE", 32, "Space bar" }, ; { "K_ESC", 27, "Esc, Ctrl-[" }, ; { "K_CTRL_ENTER", 10, "Ctrl-Enter, Ctrl-J" }, ; { "K_CTRL_RETURN", 10, "Ctrl-Return, Ctrl-J" }, ; { "K_CTRL_RET", 10, "Ctrl-Return (Compat.)" }, ; { "K_CTRL_PRTSCR", 379, "Ctrl-Print Screen, Alt-4" }, ; { "K_ALT_COMMA", 307, "Alt-," }, ; { "K_ALT_PERIOD", 308, "Alt-." }, ; { "K_CTRL_QUESTION", 309, "Ctrl-?, Alt-Slash" }, ; { "K_ALT_SLASH", 309, "Alt-Slash" }, ; { "K_ALT_BACKSLASH", 299, "Alt-Backslash" }, ; { "K_ALT_ENTER", 284, "Alt-Enter" }, ; { "K_ALT_RETURN", 284, "Alt-Return" }, ; { "K_ALT_MINUS", 386, "Alt-Minus" }, ; { "K_ALT_EQUALS", 387, "Alt-Equals" }, ; { "K_ALT_ESC", 257, "Alt-Esc" }, ; { "K_ALT_BACKQUOTE", 297, "Alt-backquote" }, ; { "K_ALT_OSB", 282, "Alt-[" }, ; { "K_ALT_CSB", 283, "Alt-]" }, ; { "K_ALT_SC", 295, "Alt-;" }, ; { "K_ALT_QUOTE", 296, "Alt-'" }, ; { "KP_CENTER", 332, "Keypad CENTER (5)" }, ; { "KP_ALT_ENTER", 422, "Keypad Alt-Enter" }, ; { "KP_CTRL_5", 399, "Keypad Ctrl-5" }, ; { "KP_CTRL_SLASH", 405, "Keypad Ctrl-/" }, ; { "KP_CTRL_ASTERISK", 406, "Keypad Ctrl-*" }, ; { "KP_CTRL_MINUS", 398, "Keypad Ctrl--" }, ; { "KP_CTRL_PLUS", 400, "Keypad Ctrl-+" }, ; { "KP_ALT_5", 5, "Keypad Alt-5" }, ; { "KP_ALT_SLASH", 420, "Keypad Alt-/" }, ; { "KP_ALT_ASTERISK", 311, "Keypad Alt-*" }, ; { "KP_ALT_MINUS", 330, "Keypad Alt--" }, ; { "KP_ALT_PLUS", 334, "Keypad Alt-+" }, ; { "K_INS", 22, "Ins, Ctrl-V" }, ; { "K_DEL", 7, "Del, Ctrl-G" }, ; { "K_BS", 8, "Backspace, Ctrl-H" }, ; { "K_SH_BS", 423, "Shift-Backspace, Ctrl-Shift-Tab" }, ; { "K_CTRL_SH_TAB", 423, "Ctrl-Shift-Tab" }, ; { "K_TAB", 9, "Tab, Ctrl-I" }, ; { "K_SH_TAB", 271, "Shift-Tab" }, ; { "K_CTRL_INS", 402, "Ctrl-Ins" }, ; { "K_CTRL_DEL", 403, "Ctrl-Del" }, ; { "K_CTRL_BS", 127, "Ctrl-Backspace" }, ; { "K_CTRL_TAB", 404, "Ctrl-Tab" }, ; { "K_ALT_INS", 418, "Alt-Ins" }, ; { "K_ALT_DEL", 419, "Alt-Del" }, ; { "K_ALT_BS", 270, "Alt-Backspace" }, ; { "K_ALT_TAB", 421, "Alt-Tab" } } AAdd( aKeys, { "K_CTRL_A", 1, "Ctrl-A, Home" } ) AAdd( aKeys, { "K_CTRL_B", 2, "Ctrl-B, Ctrl-Right arrow" } ) AAdd( aKeys, { "K_CTRL_C", 3, "Ctrl-C, PgDn, Ctrl-ScrollLock" } ) AAdd( aKeys, { "K_CTRL_D", 4, "Ctrl-D, Right arrow" } ) AAdd( aKeys, { "K_CTRL_E", 5, "Ctrl-E, Up arrow" } ) AAdd( aKeys, { "K_CTRL_F", 6, "Ctrl-F, End" } ) AAdd( aKeys, { "K_CTRL_G", 7, "Ctrl-G, Del" } ) AAdd( aKeys, { "K_CTRL_H", 8, "Ctrl-H, Backspace" } ) AAdd( aKeys, { "K_CTRL_I", 9, "Ctrl-I, Tab" } ) AAdd( aKeys, { "K_CTRL_J", 10, "Ctrl-J" } ) AAdd( aKeys, { "K_CTRL_K", 11, "Ctrl-K" } ) AAdd( aKeys, { "K_CTRL_L", 12, "Ctrl-L" } ) AAdd( aKeys, { "K_CTRL_M", 13, "Ctrl-M, Return" } ) AAdd( aKeys, { "K_CTRL_N", 14, "Ctrl-N" } ) AAdd( aKeys, { "K_CTRL_O", 15, "Ctrl-O" } ) AAdd( aKeys, { "K_CTRL_P", 16, "Ctrl-P" } ) AAdd( aKeys, { "K_CTRL_Q", 17, "Ctrl-Q" } ) AAdd( aKeys, { "K_CTRL_R", 18, "Ctrl-R, PgUp" } ) AAdd( aKeys, { "K_CTRL_S", 19, "Ctrl-S, Left arrow" } ) AAdd( aKeys, { "K_CTRL_T", 20, "Ctrl-T" } ) AAdd( aKeys, { "K_CTRL_U", 21, "Ctrl-U" } ) AAdd( aKeys, { "K_CTRL_V", 22, "Ctrl-V, Ins" } ) AAdd( aKeys, { "K_CTRL_W", 23, "Ctrl-W, Ctrl-End" } ) AAdd( aKeys, { "K_CTRL_X", 24, "Ctrl-X, Down arrow" } ) AAdd( aKeys, { "K_CTRL_Y", 25, "Ctrl-Y" } ) AAdd( aKeys, { "K_CTRL_Z", 26, "Ctrl-Z, Ctrl-Left arrow" } ) AAdd( aKeys, { "K_ALT_A", 286, "Alt-A" } ) AAdd( aKeys, { "K_ALT_B", 304, "Alt-B" } ) AAdd( aKeys, { "K_ALT_C", 302, "Alt-C" } ) AAdd( aKeys, { "K_ALT_D", 288, "Alt-D" } ) AAdd( aKeys, { "K_ALT_E", 274, "Alt-E" } ) AAdd( aKeys, { "K_ALT_F", 289, "Alt-F" } ) AAdd( aKeys, { "K_ALT_G", 290, "Alt-G" } ) AAdd( aKeys, { "K_ALT_H", 291, "Alt-H" } ) AAdd( aKeys, { "K_ALT_I", 279, "Alt-I" } ) AAdd( aKeys, { "K_ALT_J", 292, "Alt-J" } ) AAdd( aKeys, { "K_ALT_K", 293, "Alt-K" } ) AAdd( aKeys, { "K_ALT_L", 294, "Alt-L" } ) AAdd( aKeys, { "K_ALT_M", 306, "Alt-M" } ) AAdd( aKeys, { "K_ALT_N", 305, "Alt-N" } ) AAdd( aKeys, { "K_ALT_O", 280, "Alt-O" } ) AAdd( aKeys, { "K_ALT_P", 281, "Alt-P" } ) AAdd( aKeys, { "K_ALT_Q", 272, "Alt-Q" } ) AAdd( aKeys, { "K_ALT_R", 275, "Alt-R" } ) AAdd( aKeys, { "K_ALT_S", 287, "Alt-S" } ) AAdd( aKeys, { "K_ALT_T", 276, "Alt-T" } ) AAdd( aKeys, { "K_ALT_U", 278, "Alt-U" } ) AAdd( aKeys, { "K_ALT_V", 303, "Alt-V" } ) AAdd( aKeys, { "K_ALT_W", 273, "Alt-W" } ) AAdd( aKeys, { "K_ALT_X", 301, "Alt-X" } ) AAdd( aKeys, { "K_ALT_Y", 277, "Alt-Y" } ) AAdd( aKeys, { "K_ALT_Z", 300, "Alt-Z" } ) AAdd( aKeys, { "K_ALT_1", 376, "Alt-1" } ) AAdd( aKeys, { "K_ALT_2", 377, "Alt-2" } ) AAdd( aKeys, { "K_ALT_3", 378, "Alt-3" } ) AAdd( aKeys, { "K_ALT_4", 379, "Alt-4" } ) AAdd( aKeys, { "K_ALT_5", 380, "Alt-5" } ) AAdd( aKeys, { "K_ALT_6", 381, "Alt-6" } ) AAdd( aKeys, { "K_ALT_7", 382, "Alt-7" } ) AAdd( aKeys, { "K_ALT_8", 383, "Alt-8" } ) AAdd( aKeys, { "K_ALT_9", 384, "Alt-9" } ) AAdd( aKeys, { "K_ALT_0", 385, "Alt-0" } ) AAdd( aKeys, { "K_F1", 28, "F1, Ctrl-Backslash" } ) AAdd( aKeys, { "K_F2", -1, "F2" } ) AAdd( aKeys, { "K_F3", -2, "F3" } ) AAdd( aKeys, { "K_F4", -3, "F4" } ) AAdd( aKeys, { "K_F5", -4, "F5" } ) AAdd( aKeys, { "K_F6", -5, "F6" } ) AAdd( aKeys, { "K_F7", -6, "F7" } ) AAdd( aKeys, { "K_F8", -7, "F8" } ) AAdd( aKeys, { "K_F9", -8, "F9" } ) AAdd( aKeys, { "K_F10", -9, "F10" } ) AAdd( aKeys, { "K_F11", -40, "F11" } ) AAdd( aKeys, { "K_F12", -41, "F12" } ) AAdd( aKeys, { "K_CTRL_F1", -20, "Ctrl-F1" } ) AAdd( aKeys, { "K_CTRL_F2", -21, "Ctrl-F2" } ) AAdd( aKeys, { "K_CTRL_F3", -22, "Ctrl-F4" } ) AAdd( aKeys, { "K_CTRL_F4", -23, "Ctrl-F3" } ) AAdd( aKeys, { "K_CTRL_F5", -24, "Ctrl-F5" } ) AAdd( aKeys, { "K_CTRL_F6", -25, "Ctrl-F6" } ) AAdd( aKeys, { "K_CTRL_F7", -26, "Ctrl-F7" } ) AAdd( aKeys, { "K_CTRL_F8", -27, "Ctrl-F8" } ) AAdd( aKeys, { "K_CTRL_F9", -28, "Ctrl-F9" } ) AAdd( aKeys, { "K_CTRL_F10", -29, "Ctrl-F10" } ) AAdd( aKeys, { "K_CTRL_F11", -44, "Ctrl-F11" } ) AAdd( aKeys, { "K_CTRL_F12", -45, "Ctrl-F12" } ) AAdd( aKeys, { "K_ALT_F1", -30, "Alt-F1" } ) AAdd( aKeys, { "K_ALT_F2", -31, "Alt-F2" } ) AAdd( aKeys, { "K_ALT_F3", -32, "Alt-F3" } ) AAdd( aKeys, { "K_ALT_F4", -33, "Alt-F4" } ) AAdd( aKeys, { "K_ALT_F5", -34, "Alt-F5" } ) AAdd( aKeys, { "K_ALT_F6", -35, "Alt-F6" } ) AAdd( aKeys, { "K_ALT_F7", -36, "Alt-F7" } ) AAdd( aKeys, { "K_ALT_F8", -37, "Alt-F8" } ) AAdd( aKeys, { "K_ALT_F9", -38, "Alt-F9" } ) AAdd( aKeys, { "K_ALT_F10", -39, "Alt-F10" } ) AAdd( aKeys, { "K_ALT_F11", -46, "Alt-F11" } ) AAdd( aKeys, { "K_ALT_F12", -47, "Alt-F12" } ) AAdd( aKeys, { "K_SH_F1", -10, "Shift-F1" } ) AAdd( aKeys, { "K_SH_F2", -11, "Shift-F2" } ) AAdd( aKeys, { "K_SH_F3", -12, "Shift-F3" } ) AAdd( aKeys, { "K_SH_F4", -13, "Shift-F4" } ) AAdd( aKeys, { "K_SH_F5", -14, "Shift-F5" } ) AAdd( aKeys, { "K_SH_F6", -15, "Shift-F6" } ) AAdd( aKeys, { "K_SH_F7", -16, "Shift-F7" } ) AAdd( aKeys, { "K_SH_F8", -17, "Shift-F8" } ) AAdd( aKeys, { "K_SH_F9", -18, "Shift-F9" } ) AAdd( aKeys, { "K_SH_F10", -19, "Shift-F10" } ) AAdd( aKeys, { "K_SH_F11", -42, "Shift-F11" } ) AAdd( aKeys, { "K_SH_F12", -43, "Shift-F12" } ) AAdd( aKeys, { "K_MOUSEMOVE", 1001, "mouse move" } ) AAdd( aKeys, { "K_LBUTTONDOWN", 1002, "mouse left button down" } ) AAdd( aKeys, { "K_LBUTTONUP", 1003, "mouse left button up" } ) AAdd( aKeys, { "K_RBUTTONDOWN", 1004, "mouse right button down" } ) AAdd( aKeys, { "K_RBUTTONUP", 1005, "mouse right button up" } ) AAdd( aKeys, { "K_LDBLCLK", 1006, "mouse left button double click" } ) AAdd( aKeys, { "K_RDBLCLK", 1007, "mouse right button double click" } ) AAdd( aKeys, { "K_MBUTTONDOWN", 1008, "mouse middle button down" } ) AAdd( aKeys, { "K_MBUTTONUP", 1009, "mouse middle button up" } ) AAdd( aKeys, { "K_MDBLCLK", 1010, "mouse middle button double click" } ) AAdd( aKeys, { "K_MMLEFTDOWN", 1011, "Mouse Move Left Down" } ) AAdd( aKeys, { "K_MMRIGHTDOWN", 1012, "Mouse Move Right Down" } ) AAdd( aKeys, { "K_MMMIDDLEDOWN", 1013, "Mouse Move Middle Down" } ) AAdd( aKeys, { "K_MWFORWARD", 1014, "Mouse Wheel Forward" } ) AAdd( aKeys, { "K_MWBACKWARD", 1015, "Mouse Wheel Backward" } ) AAdd( aKeys, { "K_NCMOUSEMOVE", 1016, "Non-Client Area Mouse Movement" } ) AAdd( aKeys, { "HB_K_RESIZE", 1101, "screen dimension changed" } ) AAdd( aKeys, { "HB_K_CLOSE", 1102, "close button hit" } ) AAdd( aKeys, { "HB_K_GOTFOCUS", 1103, "focus restored" } ) AAdd( aKeys, { "HB_K_LOSTFOCUS", 1104, "focus lost" } ) AAdd( aKeys, { "HB_K_CONNECT", 1105, "remote terminal connected" } ) AAdd( aKeys, { "HB_K_DISCONNECT", 1106, "remote terminal disconnected" } ) AAdd( aKeys, { "HB_K_TERMINATE", 1107, "terminate signal from system" } ) AAdd( aKeys, { "HB_K_MENU", 1108, "MENU key pressed" } ) #ifdef __HARBOUR__ Set( _SET_EVENTMASK, HB_INKEY_ALL + HB_INKEY_EXT ) hb_gtInfo( HB_GTI_CURSORBLINKRATE, 1000 ) hb_gtInfo( HB_GTI_ESCDELAY, 50 ) // hb_gtInfo( HB_GTI_FONTATTRIBUTE, 0 ) // hb_gtInfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_DRAWBOX, hb_gtInfo( HB_GTI_FONTATTRIBUTE ) ) ) // hb_gtInfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_CTRLCHARS, hb_gtInfo( HB_GTI_FONTATTRIBUTE ) ) ) // hb_gtInfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_FIXMETRIC, hb_gtInfo( HB_GTI_FONTATTRIBUTE ) ) ) // hb_gtInfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_CLRBKG, hb_gtInfo( HB_GTI_FONTATTRIBUTE ) ) ) // hb_gtInfo( HB_GTI_RESIZABLE, .F. ) // hb_gtInfo( HB_GTI_RESIZEMODE, HB_GTI_RESIZEMODE_ROWS ) // hb_gtInfo( HB_GTI_RESIZEMODE, HB_GTI_RESIZEMODE_FONT ) // hb_gtInfo( HB_GTI_MAXIMIZED, .T. ) // hb_gtInfo( HB_GTI_ISFULLSCREEN, .T. ) // hb_gtInfo( HB_GTI_ALTENTER, .T. ) hb_gtInfo( HB_GTI_CLOSABLE, .F. ) hb_gtInfo( HB_GTI_SELECTCOPY, .T. ) IF PCount() >= 4 lRawKey := !Empty( lRawKey ) ELSEIF ! Empty( cTermCP ) .AND. Upper( cTermCP ) = "X" lRawKey := .T. cTermCP := NIL ELSE lRawKey := .F. ENDIF IF Empty( cTermCP ) cTermCP := "UTF8" ELSE cTermCP := Upper( cTermCP ) ENDIF IF Empty( cHostCP ) cHostCP := "UTF8" ELSE cHostCP := Upper( cHostCP ) ENDIF lBoxChar := ! Empty( lBoxChar ) hb_cdpSelect( cHostCP ) hb_SetTermCP( cTermCP, cHostCP, lBoxChar ) #else #ifdef _SET_EVENTMASK Set( _SET_EVENTMASK, INKEY_ALL ) #endif lRawKey := .f. #endif MDblClk( 250 ) SetCancel( .F. ) // AltD(0) ? OS(), Version(), Date(), Time() #ifdef __HARBOUR__ ? hb_gtVersion( 1 ), "GT" + hb_gtVersion() ? "Host codpage: " + hb_cdpSelect() + ", terminal codepage: " + cTermCP #endif ? "@ - interrupt, keycodes checking: " ? WHILE .T. kX := Inkey( 0 ) k := hb_keyStd( kX ) IF ( i := AScan( aKeys, {| x | x[ 2 ] == k } ) ) != 0 ? " key:" + Str( aKeys[ i, 2 ], 7 ) + " " + PadR( aKeys[ i, 1 ], 18 ) + aKeys[ i, 3 ] #ifdef __HARBOUR__ IF kX != k ?? " ext: 0x" + hb_numToHex( kX, 8 ) + " -> " + ; hb_numToHex( hb_keyMod( kX ), 2 ) + ":" + hb_numToHex( hb_keyVal( kX ), 8 ) + ; " [" + hb_keyChar( k ) + "]" ENDIF #endif ELSEIF ( k >= 32 .AND. k <= 126 ) .OR. ( k >= 160 .AND. k <= 255 ) .OR. ; Len( hb_keyChar( k ) ) > 0 #ifdef __HARBOUR__ ? "char:" + iif( k > 256, " U+" + hb_numToHex( hb_keyVal( k ), 4 ), Str( k, 7 ) ) + ; " " + hb_keyChar( k ) IF kX != k .or. k > 256 ?? " ext: 0x" + hb_numToHex( kX, 8 ) + " -> " + ; hb_numToHex( hb_keyMod( kX ), 2 ) + ":" + hb_numToHex( hb_keyVal( kX ), 8 ) + ; " [" + hb_keyChar( k ) + "]" ENDIF #else ? "char:" + Str( k, 7 ) + " " + hb_keyChar( k ) #endif ELSE #ifdef __HARBOUR__ ? " key:" + Str( k, 7 ) + " ext: 0x" + hb_numToHex( kX, 8 ) + " -> " + ; hb_numToHex( hb_keyMod( kX ), 2 ) + ":" + hb_numToHex( hb_keyVal( kX ), 8 ) + ; " [" + hb_keyChar( k ) + "]" #else ? " key:" + Str( k, 7 ) #endif ENDIF // ?? " (" + hb_ntos( MaxRow() ) + ":" + hb_ntos( MaxCol() ) + ")" IF k == hb_keyCode( "@" ) .AND. NextKey() == 0 EXIT ELSEIF k == K_INS .AND. ! lRawKey Set( _SET_CURSOR, ( Set( _SET_CURSOR ) + 1 ) % 5 ) ?? " cursor:" + hb_ntos( Set( _SET_CURSOR ) ) ELSEIF k == HB_K_RESIZE ?? " (" + hb_ntos( MaxRow() + 1 ) + "," + hb_ntos( MaxCol() + 1 ) + ")" ELSEIF k >= 1000 .AND. k < 1100 ?? " mpos(" + hb_ntos( MRow() ) + "," + hb_ntos( MCol() ) + ")" #ifdef __HARBOUR__ ELSEIF k == K_CTRL_INS .AND. ! lRawKey IF Alert( "Would you like to show clipboard text?", { "YES", "NO" } ) == 1 s := hb_gtInfo( HB_GTI_CLIPBOARDDATA ) ? "Clipboard text: [" + s + "]" ENDIF ELSEIF k == K_CTRL_END .AND. ! lRawKey IF Alert( "Would you like to set clipboard text?", { "YES", "NO" } ) == 1 s := hb_TSToStr( hb_DateTime() ) + hb_eol() + ; "Harbour GT" + hb_gtVersion() + " clipboard test" + hb_eol() ? "New clipboard text: [" + s + "]" hb_gtInfo( HB_GTI_CLIPBOARDDATA, s ) ENDIF #endif ENDIF ENDDO ? RETURN