📄 os2file.c
字号:
int len; TT_Error error; PStream_Rec stream_rec; if ( ALLOC( *stream, sizeof ( TStream_Rec ) ) ) return error; stream_rec = STREAM2REC( *stream ); stream_rec->file = NULLHANDLE; /* !Mike! */ stream_rec->size = -1; stream_rec->base = 0; stream_rec->opened = FALSE; stream_rec->position = 0; len = strlen( filepathname ) + 1; if ( ALLOC( stream_rec->name, len ) ) goto Fail; strncpy( (String*)stream_rec->name, filepathname, len ); error = Stream_Activate( stream_rec ); if ( error ) goto Fail_Activate;#ifndef TT_CONFIG_OPTION_THREAD_SAFE CUR_Stream = stream_rec;#endif return TT_Err_Ok; Fail_Activate: FREE( stream_rec->name ); Fail: FREE( stream_rec ); return error; }/******************************************************************* * * Function : TT_Close_Stream * * Description : Closes a stream. * * Input : stream address of target TT_Stream structure * * Output : SUCCESS (always). * ******************************************************************/ FT_INTERNAL_FUNC( TT_Error ) TT_Close_Stream( TT_Stream* stream ) { PStream_Rec rec = STREAM2REC( *stream ); Stream_Deactivate( rec ); FREE( rec->name ); FREE( rec ); HANDLE_Set( *stream, NULL ); return TT_Err_Ok; }/******************************************************************* * * Function : TT_Flush_Stream * * Description : Flushes a stream, i.e., closes its file handle. * * Input : stream address of target TT_Stream structure * * Output : Error code * * NOTE : Never flush the current opened stream. This means that * you should _never_ call this function between a * TT_Use_Stream() and a TT_Done_Stream()! * ******************************************************************/ FT_EXPORT_FUNC( TT_Error ) TT_Flush_Stream( TT_Stream* stream ) { PStream_Rec rec = STREAM2REC( *stream ); if ( rec ) { Stream_Deactivate( rec ); return TT_Err_Ok; } else return TT_Err_Invalid_Argument; }/******************************************************************* * * Function : TT_Seek_File * * Description : Seeks the file cursor to a different position. * * Input : position new position in file * * Output : SUCCESS on success. FAILURE if out of range. * ******************************************************************/ FT_EXPORT_FUNC( TT_Error ) TT_Seek_File( STREAM_ARGS long position ) { ULONG ibActual; /* !Mike! */ position += CUR_Stream->base;#if 0 if ( fseek( CUR_Stream->file, position, SEEK_SET ) ) /* !Mike! */#endif if ( DosSetFilePtr( CUR_Stream->file, position, FILE_BEGIN , &ibActual ) ) return TT_Err_Invalid_File_Offset; return TT_Err_Ok; }/******************************************************************* * * Function : TT_Skip_File * * Description : Skips forward the file cursor. * * Input : distance number of bytes to skip * * Output : see TT_Seek_File() * ******************************************************************/ FT_EXPORT_FUNC( TT_Error ) TT_Skip_File( STREAM_ARGS long distance ) { ULONG ibActual; /* !Mike! */#if 0 return TT_Seek_File( STREAM_VARS ftell( CUR_Stream->file ) - CUR_Stream->base + distance ); /* !Mike! */#endif DosSetFilePtr( CUR_Stream->file, 0, FILE_CURRENT, &ibActual ); return TT_Seek_File( STREAM_VARS ibActual - CUR_Stream->base + distance ); }/******************************************************************* * * Function : TT_Read_File * * Description : Reads a chunk of the file and copies it to memory. * * Input : buffer target buffer * count length in bytes to read * * Output : SUCCESS on success. FAILURE if out of range. * ******************************************************************/ FT_EXPORT_FUNC( TT_Error ) TT_Read_File( STREAM_ARGS void* buffer, long count ) { ULONG cbActual; /* !Mike! */#if 0 /* !Mike! */ if ( fread( buffer, 1, count, CUR_Stream->file ) != (unsigned long)count )#endif DosRead( CUR_Stream->file, buffer, count, &cbActual ); if ( cbActual != (unsigned long)count ) return TT_Err_Invalid_File_Read; return TT_Err_Ok; }/******************************************************************* * * Function : TT_Read_At_File * * Description : Reads file at a specified position. * * Input : position position to seek to before read * buffer target buffer * count number of bytes to read * * Output : SUCCESS on success. FAILURE if error. * ******************************************************************/ FT_EXPORT_FUNC( TT_Error ) TT_Read_At_File( STREAM_ARGS long position, void* buffer, long count ) { TT_Error error; if ( ( error = TT_Seek_File( STREAM_VARS position ) ) || ( error = TT_Read_File( STREAM_VARS buffer, count ) ) ) return error; return TT_Err_Ok; }/******************************************************************* * * Function : TT_File_Pos * * Description : Returns current file seek pointer. * * Input : none * * Output : current file position * ******************************************************************/ FT_EXPORT_FUNC( Long ) TT_File_Pos( STREAM_ARG ) { ULONG ibActual; /* !Mike! */#if 0 return ftell( CUR_Stream->file ) - CUR_Stream->base; /* !Mike! */#endif DosSetFilePtr( CUR_Stream->file, 0, FILE_CURRENT, &ibActual ); return ibActual - CUR_Stream->base; }/******************************************************************* * * Function : GET_Byte * * Description : Extracts a byte from the current file frame. * * Input : None or current frame * * Output : Extracted Byte. * ******************************************************************/#if 0 FT_EXPORT_FUNC( Byte ) TT_Get_Byte( FRAME_ARG ) { CHECK_FRAME( CUR_Frame, 1 ); return (Byte)(*CUR_Frame.cursor++); }#endif/******************************************************************* * * Function : GET_Char * * Description : Extracts a signed byte from the current file frame. * * Input : None or current frame * * Output : Extracted char. * ******************************************************************/ FT_EXPORT_FUNC( Char ) TT_Get_Char( FRAME_ARG ) { CHECK_FRAME( CUR_Frame, 1 ); return (Char)(*CUR_Frame.cursor++); }/******************************************************************* * * Function : GET_Short * * Description : Extracts a short from the current file frame. * * Input : None or current frame * * Output : Extracted short. * ******************************************************************/ FT_EXPORT_FUNC( short ) TT_Get_Short( FRAME_ARG ) { short getshort; CHECK_FRAME( CUR_Frame, 2 ); getshort = ((short)CUR_Frame.cursor[0] << 8) | (short)CUR_Frame.cursor[1]; CUR_Frame.cursor += 2; return getshort; }/******************************************************************* * * Function : GET_UShort * * Description : Extracts an unsigned short from the frame. * * Input : None or current frame * * Output : Extracted ushort. * ******************************************************************/#if 0 FT_EXPORT_FUNC( unsigned ) short TT_Get_UShort( FRAME_ARG ) { unsigned short getshort; CHECK_FRAME( CUR_Frame, 2 ); getshort = ((unsigned short)CUR_Frame.cursor[0] << 8) | (unsigned short)CUR_Frame.cursor[1]; CUR_Frame.cursor += 2; return getshort; }#endif/******************************************************************* * * Function : GET_Long * * Description : Extracts a long from the frame. * * Input : None or current frame * * Output : Extracted long. * ******************************************************************/ FT_EXPORT_FUNC( long ) TT_Get_Long( FRAME_ARG ) { long getlong; CHECK_FRAME( CUR_Frame, 4 ); getlong = ((long)CUR_Frame.cursor[0] << 24) | ((long)CUR_Frame.cursor[1] << 16) | ((long)CUR_Frame.cursor[2] << 8 ) | (long)CUR_Frame.cursor[3]; CUR_Frame.cursor += 4; return getlong; }/******************************************************************* * * Function : GET_ULong * * Description : Extracts an unsigned long from the frame. * * Input : None * * Output : Extracted ulong. * ******************************************************************/#if 0 FT_EXPORT_FUNC( unsigned ) long TT_Get_ULong( FRAME_ARG ) { unsigned long getlong; CHECK_FRAME( CUR_Frame, 4 ); getlong = ( ((unsigned long)CUR_Frame.cursor[0] << 24) | ((unsigned long)CUR_Frame.cursor[1] << 16) | ((unsigned long)CUR_Frame.cursor[2] << 8 ) | (unsigned long)CUR_Frame.cursor[3] ); CUR_Frame.cursor += 4; return getlong; }#endif/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -