void __FTermDLL( void ) { //================================== #if defined( __NT__ ) { if( __ASTACKPTR != NULL ) { RMemFree( __ASTACKPTR - __ASTACKSIZ ); } } #endif __FiniFThreadProcessing(); }
static void ThreadHelper( void *arg_fti ) //=========================================== { fthread_info *fti = arg_fti; FThreadInit(); __FTHREADDATAPTR->__rtn = fti->rtn; __FTHREADDATAPTR->__arglist = fti->arglist; RMemFree( fti ); RTSpawn( ThreadStarter ); FThreadFini(); __EndThread(); }
static void SysIOInfo( ftnfile *fcb ) { //========================================= // Get system file information. struct stat info; char *sys_name; bool exist = true; if( fcb->bufflen == 0 ) { fcb->bufflen = SYS_DFLT_RECSIZE; } if( fcb->blocksize == 0 ) { fcb->blocksize = IO_BUFFER; } fcb->device = 0; if( fcb->fileptr != NULL ) { // file is open #if defined( __NETWARE__ ) if( ( ((a_file *)(fcb->fileptr))->handle == STDIN_FILENO ) || ( ((a_file *)(fcb->fileptr))->handle == STDOUT_FILENO ) || ( ((a_file *)(fcb->fileptr))->handle == STDERR_FILENO ) ) { fcb->device |= INFO_DEV; } else { #endif // for stdin, don't use file name "CON" since information will always // indicate it's a device even if stdin is redirected if( fstat( ((a_file *)(fcb->fileptr))->handle, &info ) == -1 ) { FSetSysErr( fcb->fileptr ); IOErr( IO_FILE_PROBLEM ); return; } if( S_ISCHR( info.st_mode ) ) { fcb->device |= INFO_DEV; #if defined( __DOS__ ) || defined( __WINDOWS__ ) } else { fcb->device |= INFO_VALID_DRIVE; #endif } #if defined( __NETWARE__ ) } #endif } else { if( stat( fcb->filename, &info ) == -1 ) { // if we are trying to open a file in a non-existent // directory we don't want to issue an error if( fcb->flags & FTN_FSEXIST ) { FSetSysErr( fcb->fileptr ); IOErr( IO_FILE_PROBLEM ); return; } exist = false; } else if( S_ISCHR( info.st_mode ) ) { fcb->device |= INFO_DEV; // devices always exist fcb->flags |= FTN_FSEXIST; #if !defined( __UNIX__ ) } else { fcb->device |= INFO_VALID_DRIVE; #endif } } if( ( fcb->flags & FTN_FSEXIST ) && !IsDevice( fcb ) ) { #if !defined( __UNIX__ ) // Assume the two most significant bits contain no useful information fcb->device = INFO_DRIVE & info.st_dev; // save drive letter #endif if( ( info.st_mode & S_IRUSR ) && ( info.st_mode & S_IWUSR ) ) { fcb->action = ACTION_RW; } else if( info.st_mode & S_IRUSR ) { fcb->action = ACTION_READ; } else if( info.st_mode & S_IWUSR ) { fcb->action = ACTION_WRITE; } else { // if none of the above are set, // assume read/write fcb->action = ACTION_RW; } } sys_name = GetSysName( fcb ); if( sys_name == NULL ) { if( exist ) { FSetSysErr( fcb->fileptr ); IOErr( IO_FILE_PROBLEM ); } return; } RMemFree( fcb->filename ); fcb->filename = sys_name; }
static void FOHex( uint width ) { //=============================== uint len; int trunc; ftnfile *fcb; PTYPE typ; char *buff; fcb = IOCB->fileinfo; typ = IOCB->typ; len = GetLen(); trunc = 0; // Use this method when real and imaginary parts are formatted using // one edit descriptor: /* if( ( IOCB->typ == PT_CPLX_8 ) || ( IOCB->typ == PT_CPLX_16 ) ) { len *= 2; IOCB->flags &= ~IOF_FMTREALPART; // we'll print both parts at once } */ // Use this method when real and imaginary parts each require an // edit descriptor: if( IOCB->typ == PT_CPLX_8 ) { if( !(IOCB->flags & IOF_FMTREALPART) ) { IORslt.scomplex.realpart = IORslt.scomplex.imagpart; } } else if( IOCB->typ == PT_CPLX_16 ) { if( !(IOCB->flags & IOF_FMTREALPART) ) { IORslt.dcomplex.realpart = IORslt.dcomplex.imagpart; } } else if( IOCB->typ == PT_CPLX_32 ) { if( !(IOCB->flags & IOF_FMTREALPART) ) { IORslt.xcomplex.realpart = IORslt.xcomplex.imagpart; } } if( width == 0 ) { width = 2*len; } trunc = ( len * 2 ) - width; if( trunc < 0 ) { SendChar( ' ', -trunc ); } if( trunc <= 0 ) { trunc = 0; } if( typ != PT_CHAR ) { len *= 2; HexFlip( (char *)&IORslt, len ); BToHS( (char *)&IORslt , len, IOCB->buffer ); strupr( IOCB->buffer ); SendStr( IOCB->buffer + trunc, len - trunc ); } else { buff = IOCB->buffer; len *= 2; if( len > IO_FIELD_BUFF ) { buff = RChkAlloc( len + 1 ); } pgm_BToHS( IORslt.string.strptr, len, buff ); strupr( buff ); SendStr( buff + trunc, len - trunc ); if( len > IO_FIELD_BUFF ) { RMemFree( buff ); } } }