📄 ttfile.c
字号:
* filepathname pathname of the file to open * stream address of target TT_Stream structure * * Output : SUCCESS on sucess, FAILURE on error. * The target stream is set to -1 in case of failure. * ******************************************************************/ LOCAL_FUNC TT_Error TT_Open_Stream( const TT_Text* filepathname, TT_Stream* stream ) { Int len; TT_Error error; PStream_Rec stream_rec; if ( ALLOC( *stream, sizeof ( TStream_Rec ) ) ) return error; stream_rec = STREAM2REC( *stream ); stream_rec->file = NULL; stream_rec->size = -1L; 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( 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). * ******************************************************************/ LOCAL_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()! * ******************************************************************/ 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. * ******************************************************************/ EXPORT_FUNC TT_Error TT_Seek_File( STREAM_ARGS Long position ) { position += CUR_Stream->base; if ( fseek( CUR_Stream->file, position, SEEK_SET ) ) 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() * ******************************************************************/ EXPORT_FUNC TT_Error TT_Skip_File( STREAM_ARGS Long distance ) { return TT_Seek_File( STREAM_VARS ftell( CUR_Stream->file ) - 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. * ******************************************************************/ EXPORT_FUNC TT_Error TT_Read_File( STREAM_ARGS void* buffer, Long count ) { if ( fread( buffer, 1, count, CUR_Stream->file ) != (ULong)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. * ******************************************************************/ 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 )) != TT_Err_Ok || (error = TT_Read_File( STREAM_VARS buffer, count )) != TT_Err_Ok ) return error; return TT_Err_Ok; }/******************************************************************* * * Function : TT_File_Pos * * Description : Returns current file seek pointer. * * Input : none * * Output : Current file position. * ******************************************************************/ EXPORT_FUNC Long TT_File_Pos( STREAM_ARG ) { return ftell( CUR_Stream->file ) - 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 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. * ******************************************************************/ 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. * ******************************************************************/ EXPORT_FUNC Short TT_Get_Short( FRAME_ARG ) { Short getshort; CHECK_FRAME( CUR_Frame, 2 ); getshort = (Short)((CUR_Frame.cursor[0] << 8) | 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 EXPORT_FUNC UShort TT_Get_UShort( FRAME_ARG ) { UShort getshort; CHECK_FRAME( CUR_Frame, 2 ); getshort = (UShort)((CUR_Frame.cursor[0] << 8) | 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. * ******************************************************************/ 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 or current frame * * Output : Extracted ulong. * ******************************************************************/#if 0 EXPORT_FUNC ULong TT_Get_ULong( FRAME_ARG ) { ULong getlong; CHECK_FRAME( CUR_Frame, 4 ); getlong = ( ((ULong)CUR_Frame.cursor[0] << 24) | ((ULong)CUR_Frame.cursor[1] << 16) | ((ULong)CUR_Frame.cursor[2] << 8 ) | (ULong)CUR_Frame.cursor[3] ); CUR_Frame.cursor += 4; return getlong; }#endif/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -