void hb_conInit( void ) { HB_TRACE( HB_TR_DEBUG, ( "hb_conInit()" ) ); #if ! defined( HB_OS_WIN ) /* On Windows file handles with numbers 0, 1, 2 are transalted inside filesys to: GetStdHandle( STD_INPUT_HANDLE ), GetStdHandle( STD_OUTPUT_HANDLE ), GetStdHandle( STD_ERROR_HANDLE ) */ s_hFilenoStdin = fileno( stdin ); s_hFilenoStdout = fileno( stdout ); s_hFilenoStderr = fileno( stderr ); #endif #ifdef HB_CLP_UNDOC { /* Undocumented CA-Cl*pper switch //STDERR:x */ int iStderr = hb_cmdargNum( "STDERR" ); if( iStderr == 0 || iStderr == 1 ) /* //STDERR with no parameter or 0 */ s_hFilenoStderr = s_hFilenoStdout; /* disabled in default builds. It's not multiplatform and very * dangerous because it can redirect error messages to data files * [druzus] */ #ifdef HB_CLP_STRICT else if( iStderr > 0 ) /* //STDERR:x */ s_hFilenoStderr = ( HB_FHANDLE ) iStderr; #endif } #endif /* * Some compilers open stdout and stderr in text mode, but * Harbour needs them to be open in binary mode. */ hb_fsSetDevMode( s_hFilenoStdin, FD_BINARY ); hb_fsSetDevMode( s_hFilenoStdout, FD_BINARY ); hb_fsSetDevMode( s_hFilenoStderr, FD_BINARY ); if( hb_gtInit( s_hFilenoStdin, s_hFilenoStdout, s_hFilenoStderr ) != HB_SUCCESS ) hb_errInternal( 9995, "Harbour terminal (GT) initialization failure", NULL, NULL ); if( hb_cmdargCheck( "INFO" ) ) { hb_conOutErr( hb_gtVersion( 1 ), 0 ); hb_conOutErr( hb_conNewLine(), 0 ); } }
static void hb_gt_cgi_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTCGI pGTCGI; HB_TRACE( HB_TR_DEBUG, ( "hb_gt_cgi_Init(%p,%p,%p,%p)", ( void * ) pGT, ( void * ) ( HB_PTRUINT ) hFilenoStdin, ( void * ) ( HB_PTRUINT ) hFilenoStdout, ( void * ) ( HB_PTRUINT ) hFilenoStderr ) ); HB_GTLOCAL( pGT ) = pGTCGI = ( PHB_GTCGI ) hb_xgrabz( sizeof( HB_GTCGI ) ); pGTCGI->pGT = pGT; pGTCGI->hStdout = hFilenoStdout; pGTCGI->szCrLf = hb_strdup( hb_conNewLine() ); pGTCGI->nCrLf = strlen( pGTCGI->szCrLf ); #ifdef HB_GT_CGI_WIN { DWORD dwMode; pGTCGI->fIsConsole = GetConsoleMode( DosToWinHandle( pGTCGI->hStdout ), &dwMode ); if( pGTCGI->fIsConsole ) HB_GTSELF_SETDISPCP( pGT, "UTF8", NULL, HB_FALSE ); } #endif hb_fsSetDevMode( pGTCGI->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, HB_TRUE ); }
static void hb_gt_cgi_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTCGI pGTCGI; HB_TRACE( HB_TR_DEBUG, ( "hb_gt_cgi_Init(%p,%p,%p,%p)", pGT, ( void * ) ( HB_PTRDIFF ) hFilenoStdin, ( void * ) ( HB_PTRDIFF ) hFilenoStdout, ( void * ) ( HB_PTRDIFF ) hFilenoStderr ) ); pGTCGI = ( PHB_GTCGI ) hb_xgrab( sizeof( HB_GTCGI ) ); memset( pGTCGI, 0, sizeof( HB_GTCGI ) ); HB_GTLOCAL( pGT ) = pGTCGI; pGTCGI->hStdout = hFilenoStdout; #if defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE ) if( IsValidCodePage( CP_UTF8 ) ) { pGTCGI->uiOldCP = GetConsoleOutputCP(); SetConsoleOutputCP( CP_UTF8 ); HB_GTSELF_SETDISPCP( pGT, "UTF8", NULL, HB_FALSE ); } #endif pGTCGI->szCrLf = hb_strdup( hb_conNewLine() ); pGTCGI->nCrLf = strlen( pGTCGI->szCrLf ); hb_fsSetDevMode( pGTCGI->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, HB_TRUE ); }
void hb_conRelease( void ) { HB_TRACE( HB_TR_DEBUG, ( "hb_conRelease()" ) ); /* * Clipper does not restore screen size on exit so I removed the code with: * hb_gtSetMode( s_originalMaxRow + 1, s_originalMaxCol + 1 ); * If the low level GT drive change some video adapter parameters which * have to be restored on exit then it should does it in its Exit() * method. Here we cannot force any actions because it may cause bad * results in some GTs, f.e. when the screen size is controlled by remote * user and not Harbour application (some terminal modes), [Druzus] */ hb_gtExit(); hb_fsSetDevMode( s_hFilenoStdin, FD_TEXT ); hb_fsSetDevMode( s_hFilenoStdout, FD_TEXT ); hb_fsSetDevMode( s_hFilenoStderr, FD_TEXT ); }
static void hb_gt_cgi_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTCGI pGTCGI; HB_TRACE( HB_TR_DEBUG, ( "hb_gt_cgi_Init(%p,%p,%p,%p)", pGT, ( void * ) ( HB_PTRUINT ) hFilenoStdin, ( void * ) ( HB_PTRUINT ) hFilenoStdout, ( void * ) ( HB_PTRUINT ) hFilenoStderr ) ); HB_GTLOCAL( pGT ) = pGTCGI = ( PHB_GTCGI ) hb_xgrabz( sizeof( HB_GTCGI ) ); pGTCGI->hStdout = hFilenoStdout; pGTCGI->szCrLf = hb_strdup( hb_conNewLine() ); pGTCGI->nCrLf = strlen( pGTCGI->szCrLf ); hb_fsSetDevMode( pGTCGI->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, HB_TRUE ); }
static void hb_gt_std_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTSTD pGTSTD; HB_TRACE(HB_TR_DEBUG, ("hb_gt_std_Init(%p,%p,%p,%p)", pGT, ( void * ) ( HB_PTRDIFF ) hFilenoStdin, ( void * ) ( HB_PTRDIFF ) hFilenoStdout, ( void * ) ( HB_PTRDIFF ) hFilenoStderr)); pGTSTD = ( PHB_GTSTD ) hb_xgrab( sizeof( HB_GTSTD ) ); memset( pGTSTD, 0, sizeof( HB_GTSTD ) ); HB_GTLOCAL( pGT ) = pGTSTD; pGTSTD->hStdin = hFilenoStdin; pGTSTD->hStdout = hFilenoStdout; pGTSTD->hStderr = hFilenoStderr; pGTSTD->fStdinConsole = hb_fsIsDevice( pGTSTD->hStdin ); pGTSTD->fStdoutConsole = hb_fsIsDevice( pGTSTD->hStdout ); pGTSTD->fStderrConsole = hb_fsIsDevice( pGTSTD->hStderr ); hb_gt_std_setKeyTrans( pGTSTD, NULL, NULL ); pGTSTD->szCrLf = hb_strdup( hb_conNewLine() ); pGTSTD->ulCrLf = strlen( pGTSTD->szCrLf ); hb_fsSetDevMode( pGTSTD->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); /* SA_NOCLDSTOP in #if is a hack to detect POSIX compatible environment */ #if ( defined( HB_OS_UNIX_COMPATIBLE ) || defined( __DJGPP__ ) ) && \ defined( SA_NOCLDSTOP ) if( pGTSTD->fStdinConsole ) { #if defined( SIGTTOU ) struct sigaction act, old; /* if( pGTSTD->saved_TIO.c_lflag & TOSTOP ) != 0 */ sigaction( SIGTTOU, NULL, &old ); memcpy( &act, &old, sizeof( struct sigaction ) ); act.sa_handler = sig_handler; /* do not use SA_RESTART - new Linux kernels will repeat the operation */ #if defined( SA_ONESHOT ) act.sa_flags = SA_ONESHOT; #elif defined( SA_RESETHAND ) act.sa_flags = SA_RESETHAND; #else act.sa_flags = 0; #endif sigaction( SIGTTOU, &act, 0 ); #endif s_fRestTTY = TRUE; tcgetattr( pGTSTD->hStdin, &pGTSTD->saved_TIO ); memcpy( &pGTSTD->curr_TIO, &pGTSTD->saved_TIO, sizeof( struct termios ) ); /* atexit( restore_input_mode ); */ pGTSTD->curr_TIO.c_lflag &= ~( ICANON | ECHO ); pGTSTD->curr_TIO.c_iflag &= ~ICRNL; pGTSTD->curr_TIO.c_cc[ VMIN ] = 0; pGTSTD->curr_TIO.c_cc[ VTIME ] = 0; tcsetattr( pGTSTD->hStdin, TCSAFLUSH, &pGTSTD->curr_TIO ); #if defined( SIGTTOU ) act.sa_handler = SIG_DFL; sigaction( SIGTTOU, &old, NULL ); #endif pGTSTD->fRestTTY = s_fRestTTY; } #ifdef TIOCGWINSZ if( pGTSTD->fStdoutConsole ) { struct winsize win; if( ioctl( pGTSTD->hStdout, TIOCGWINSZ, ( char * ) &win ) != -1 ) { HB_GTSELF_RESIZE( pGT, win.ws_row, win.ws_col ); } } #endif #elif defined( HB_WIN32_IO ) && ! defined( HB_WINCE ) if( pGTSTD->fStdinConsole ) { SetConsoleMode( ( HANDLE ) hb_fsGetOsHandle( pGTSTD->hStdin ), 0x0000 ); } #endif HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, pGTSTD->fStdoutConsole ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDERRCON, pGTSTD->fStderrConsole ); }
static void hb_gt_std_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTSTD pGTSTD; HB_TRACE( HB_TR_DEBUG, ( "hb_gt_std_Init(%p,%p,%p,%p)", pGT, ( void * ) ( HB_PTRUINT ) hFilenoStdin, ( void * ) ( HB_PTRUINT ) hFilenoStdout, ( void * ) ( HB_PTRUINT ) hFilenoStderr ) ); HB_GTLOCAL( pGT ) = pGTSTD = ( PHB_GTSTD ) hb_xgrabz( sizeof( HB_GTSTD ) ); pGTSTD->hStdin = hFilenoStdin; pGTSTD->hStdout = hFilenoStdout; pGTSTD->hStderr = hFilenoStderr; pGTSTD->fStdinConsole = hb_fsIsDevice( pGTSTD->hStdin ); pGTSTD->fStdoutConsole = hb_fsIsDevice( pGTSTD->hStdout ); pGTSTD->fStderrConsole = hb_fsIsDevice( pGTSTD->hStderr ); pGTSTD->szCrLf = hb_strdup( hb_conNewLine() ); pGTSTD->nCrLf = strlen( pGTSTD->szCrLf ); hb_fsSetDevMode( pGTSTD->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); /* SA_NOCLDSTOP in #if is a hack to detect POSIX compatible environment */ #if defined( HB_HAS_TERMIOS ) && \ defined( SA_NOCLDSTOP ) if( pGTSTD->fStdinConsole ) { #if defined( SIGTTOU ) struct sigaction act, old; /* if( pGTSTD->saved_TIO.c_lflag & TOSTOP ) != 0 */ sigaction( SIGTTOU, NULL, &old ); memcpy( &act, &old, sizeof( struct sigaction ) ); act.sa_handler = sig_handler; /* do not use SA_RESTART - new Linux kernels will repeat the operation */ #if defined( SA_ONESHOT ) act.sa_flags = SA_ONESHOT; #elif defined( SA_RESETHAND ) act.sa_flags = SA_RESETHAND; #else act.sa_flags = 0; #endif sigaction( SIGTTOU, &act, 0 ); #endif s_fRestTTY = HB_TRUE; tcgetattr( pGTSTD->hStdin, &pGTSTD->saved_TIO ); memcpy( &pGTSTD->curr_TIO, &pGTSTD->saved_TIO, sizeof( struct termios ) ); /* atexit( restore_input_mode ); */ pGTSTD->curr_TIO.c_lflag &= ~( ICANON | ECHO ); pGTSTD->curr_TIO.c_iflag &= ~ICRNL; #if 0 pGTSTD->curr_TIO.c_cc[ VMIN ] = 0; #else /* workaround for bug in some Linux kernels (i.e. 3.13.0-64-generic Ubuntu) in which select() unconditionally accepts stdin for reading if c_cc[ VMIN ] = 0 [druzus] */ pGTSTD->curr_TIO.c_cc[ VMIN ] = 1; #endif pGTSTD->curr_TIO.c_cc[ VTIME ] = 0; tcsetattr( pGTSTD->hStdin, TCSAFLUSH, &pGTSTD->curr_TIO ); #if defined( SIGTTOU ) act.sa_handler = SIG_DFL; sigaction( SIGTTOU, &old, NULL ); #endif pGTSTD->fRestTTY = s_fRestTTY; } #ifdef TIOCGWINSZ if( pGTSTD->fStdoutConsole ) { struct winsize win; if( ioctl( pGTSTD->hStdout, TIOCGWINSZ, ( char * ) &win ) != -1 ) { HB_GTSELF_RESIZE( pGT, win.ws_row, win.ws_col ); } } #endif #elif defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE ) if( pGTSTD->fStdinConsole ) { SetConsoleMode( ( HANDLE ) hb_fsGetOsHandle( pGTSTD->hStdin ), 0x0000 ); } #endif HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, pGTSTD->fStdoutConsole ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDERRCON, pGTSTD->fStderrConsole && pGTSTD->fStdoutConsole ); }