📄 fs31fwrite.c
字号:
#ifdef FSS_FTR#define ACCESS_RIGHTS_INTERNAL_FS#define FS31FWRITE_C#include "Fs.h"#undef FILE_NUMBER#define FILE_NUMBER 31 #undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 1void Fs31_01Fwrite( void * pp_Param ){ s32 vl_NewFileSize; s32 vl_SizeToWrite, vl_WritenSize;#ifdef SYNCHRONOUS_FILE_SYSTEM_FTR u8 vl_NoDelayFlag; t_ProcessIdentity vl_ProcessIdentity;#endif register t_FsCmdFWrite * pl_Param = ( t_FsCmdFWrite *) pp_Param; register t_fsFILE * pl_Stream = pl_Param->p_Stream;/* #ifdef FS_DEBUG */ /* Verify if vp_Stream point on a stream if not OK enter an exception */ MC_FS_CO_VERIFY_IF_IS_FILE_OF_ENTITY( pl_Param, pl_Stream ); if ( MC_FS_STATUS(pl_Param) != FS_OK ) return;/* #endif */ /* Verify if file would open in write */ if ( pl_Stream->s_OpenMode.v_WriteEnabled == FALSE ) { /* Err -> File not open for write */ MC_FS_STATUS(pl_Param) = FS_EBADF; return; } /* If size of the elements < 0 or number of elements < 0 return no write to made */ if ( ( pl_Param->v_ElementSize < 0 ) || ( pl_Param->v_NumberOfElements < 0 ) ) { /* Input parameters are uncoherent */ MC_FS_STATUS(pl_Param) = FS_EINVAL; return; } /* Calculate size to read and verify if != 0 */ vl_SizeToWrite = pl_Param->v_ElementSize * pl_Param->v_NumberOfElements; if ( vl_SizeToWrite == 0 ) { /* Nothing to write return 0 elements writen */ pl_Param->v_NumbOfElementsWritten = 0; return; }#ifdef SYNCHRONOUS_FILE_SYSTEM_FTR /* Copy the NoDelayFlag */ vl_NoDelayFlag = pl_Param->v_NoDelayFlag; /* Get the tranmitter process ID */ vl_ProcessIdentity = pl_Param->s_FssMsgHeader.s_KernelMsgHeader.s_Transmitter; /* Set the error 'Delay' if erase is on going */ if ( (v_FssNoDelay) && (vl_NoDelayFlag)) { MC_FS_STATUS(pl_Param) = FS_ERR_DELAY_OPER; Fs87_33StoreProcessNumber( vl_ProcessIdentity ); return; }#endif /* Is file in the appropriate state or if in write state is position at end of file */ if ( ( pl_Stream->v_StreamState == FS_SSTATE_IN_WRITE ) || ( pl_Stream->v_StreamState == FS_SSTATE_READ_OR_WRITE ) || ( ( pl_Stream->v_StreamState == FS_SSTATE_IN_READ ) && ( pl_Stream->v_FilePosition >= pl_Stream->v_FileSize) ) ) { /* File enter write state */ pl_Stream->v_StreamState = FS_SSTATE_IN_WRITE; } else { /* We make like we are at end of file set number of elements readen to 0 */ pl_Param->v_NumbOfElementsWritten = 0; /* Set an incoherent command order error */ MC_FS_STATUS(pl_Param) = FS_ERR_INCOHERENT_CMD_ORDER; return; } /* Note that an operation would executed on the file */ pl_Stream->v_OperationExecuted = TRUE; /* Set the interlayer table pointer on new volume */ MC_FS_LL_SET_NEW_VOL(MC_FS_VD_GET_VOL_PTR_OF_FILE( pl_Stream )); /* If file was opened in append mode write is to made at end of file, so force file position at end of file regardless of current position */ if ( pl_Stream->s_OpenMode.v_OpenAppend == TRUE ) pl_Stream->v_FilePosition = pl_Stream->v_FileSize; /* Calculate new file size */ if ( pl_Stream->v_FilePosition + vl_SizeToWrite > pl_Stream->v_FileSize ) vl_NewFileSize = pl_Stream->v_FilePosition + vl_SizeToWrite; else vl_NewFileSize = pl_Stream->v_FileSize; /* Write it in the IO buffer ( write only the totality of the size or if not enough place write nothing */#ifdef SYNCHRONOUS_FILE_SYSTEM_FTR vl_WritenSize = MC_FS_BF_WRITE_DATA( pl_Stream, ( ascii *) (pl_Param->p_SrceBuff), vl_SizeToWrite, vl_NewFileSize, vl_NoDelayFlag, &MC_FS_STATUS(pl_Param));#else vl_WritenSize = MC_FS_BF_WRITE_DATA( pl_Stream, ( ascii *) (pl_Param->p_SrceBuff), vl_SizeToWrite, vl_NewFileSize, &MC_FS_STATUS(pl_Param));#endif /* SYNCHRONOUS_FILE_SYSTEM_FTR */ if ( vl_WritenSize != 0) { /* Update file size */ pl_Stream->v_FileSize = vl_NewFileSize; /* Updates file position */ pl_Stream->v_FilePosition += vl_WritenSize; /* Updates number of elements writen */ pl_Param->v_NumbOfElementsWritten = pl_Param->v_NumberOfElements; } else { pl_Param->v_NumbOfElementsWritten = 0;#ifdef SYNCHRONOUS_FILE_SYSTEM_FTR /* Store the process id if Delay error is occured */ if ( pl_Param->s_FssMsgHeader.v_ErrNumber == FS_ERR_DELAY_OPER) Fs87_33StoreProcessNumber( vl_ProcessIdentity );#endif }}#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 2u32 Fs31_02ProcessFWrite( u8 vp_Behaviour, const void * pp_Buff, t_fs_size_t vp_ElementSize, t_fs_size_t vp_NumberOfElements, t_fsFILE * pp_Stream){ /* Reserve message space */ t_FsCmdFWrite * pl_FWrite = (t_FsCmdFWrite * ) MC_FS_GET_MEMORY(sizeof(t_FsCmdFWrite)); /* Fill message with input parameters */ pl_FWrite->p_Stream = pp_Stream; pl_FWrite->p_SrceBuff = pp_Buff; pl_FWrite->v_ElementSize = vp_ElementSize; pl_FWrite->v_NumberOfElements = vp_NumberOfElements;#ifdef SYNCHRONOUS_FILE_SYSTEM_FTR pl_FWrite->v_NoDelayFlag = FALSE; /* Delay error is not expected if erase is ongoing */#endif /* Send message by setting operation and return command identifier */ return( MC_FS_MA_SEND_CMD_MSG_TO_FS(vp_Behaviour, (void*)pl_FWrite,FS_CMD_FWRITE_REQ));}#endif /* FSS_FTR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -