📄 mfm80mngtdirfile.c
字号:
/* If type of object is to place in destination buffer made it */ if ( ( ( vl_TypeOfObj == FS_OBJECT_DIR ) && ( vp_Which.v_TypeOfObj & FM_OBJ_DIR )) || ( ( vl_TypeOfObj == FS_OBJECT_FILE ) && ( vp_Which.v_TypeOfObj & FM_OBJ_FILE )) ) { if ( vp_Which.v_InfoType == FM_NAME ) { /* If enough place in destination buffer copy name in it */ if ( vp_SizeOfDestBuff >= vl_NameLength+1 ) { /* Copy name in destination buffer */ strncpy( pl_DestBuffPtr, &pl_ReadBuffPtr[FM_SIZE_OF_OBJ_ID], vp_SizeOfDestBuff ); /* Point in rest of destination buffer and update remaining buffer size */ pl_DestBuffPtr += vl_NameLength + 1; vp_SizeOfDestBuff -= vl_NameLength + 1; /* Increment number of elements read */ vl_NbrElemRead++; /* Request to point on next element in directory file */ vl_PointNextReq = TRUE; } /* Buffer full exit */ else vl_ExitReq = TRUE; } else { /* if enough place copy file ID in destination buffer */ if ( vp_SizeOfDestBuff >= sizeof(s32) ) { register u16 * pl_U16 = (u16*) pl_DestBuffPtr; /* Copy ID in destination buffer */ *pl_U16 = vl_IDType; /* printf ( "\n ID is : %d" , vl_IDType);*/ /* Point in rest of destination buffer and update remaining buffer size */ pl_U16++; pl_DestBuffPtr = (ascii*) pl_U16; vp_SizeOfDestBuff -= sizeof(u16); /* Increment number of elements read */ vl_NbrElemRead++; /* Request to point on next element in directory file */ vl_PointNextReq = TRUE; } /* Buffer full exit */ else vl_ExitReq = TRUE; } } else /* Request to point on next element in directory file */ vl_PointNextReq = TRUE; if ( vl_PointNextReq ) { /* Update position in directory context */ pp_DirCtx->v_Position += vl_NameLength + FM_SIZE_OF_OBJ_ID + 1; pl_ReadBuffPtr += vl_NameLength + FM_SIZE_OF_OBJ_ID + 1; /* If position point at end of file set end of file flag else update index */ if ( pp_DirCtx->v_Position >= pp_DirCtx->v_FileSize ) { pp_DirCtx->v_EndOfFile = TRUE; /* End of file reached -> exit */ vl_ExitReq = TRUE; } /* Clear request flag */ vl_PointNextReq = FALSE; } /* If enough elements read exit */ if ( vl_NbrElemRead >= vp_NbrElemToRead ) vl_ExitReq = TRUE; } while ( !vl_ExitReq ); } while ( !vl_ExitReq ); /* Return number of elements read */ return ( vl_NbrElemRead );}#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 5void mFm80_05InsertObjInDir( u16 vp_DirId, u16 vp_ObjId, ascii * pp_ObjName, u8 vp_NameLenght, u8 vp_TypeOfObj, t_DirFileInfo * sp_DirFileInfo, t_mFmLayerContext * pp_LayerCtx, s32 * pp_Status){ /* Final file size is: Size of header + size of name + size of '\0' */ u32 vl_EntryLenght = FM_SIZE_OF_OBJ_HEADER + vp_NameLenght + 1; u16 vl_IDType; ascii al_StrIDType[2]; /* Update Id type */ if ( vp_TypeOfObj == FS_OBJECT_DIR ) vl_IDType = vp_ObjId | FM_MASK_OBJ_TYPE_DIR; else vl_IDType = vp_ObjId; /* Encode Type ID ( to avoid mismatch with '\0' character from end of string */ vl_IDType = mFm80_01Encode(vl_IDType); /* Place ID type of obj on buffer to write */ al_StrIDType[0] = vl_IDType>>8; al_StrIDType[1] = vl_IDType & 0xff; /* Insert new object in dir file for this: - Write in same place beginning of file until insert index - write type of object and object ID - write name of object - write rest of file */ { t_WriteHeader sl_WriteHeader; t_WriteCmdStruct3 sl_CmdSet; /* Initialize write header */ sl_WriteHeader.v_FinalFileSize = sp_DirFileInfo->v_FileSize + vl_EntryLenght; sl_WriteHeader.v_DestFileId = vp_DirId; sl_WriteHeader.p_NextWriteCmdHeader = (t_WriteCmdHeader*)&sl_CmdSet; /* Begin initialization of write command header */ sl_CmdSet.s_WriteCmdHeader.p_NextWriteCmdHeader = NIL; sl_CmdSet.s_WriteCmdHeader.v_OffsetInFile = 0; /* Write header ( obj ID + ....) */ sl_CmdSet.s_WriteCmd[0].v_TypeOfCmd = FS_SRC_ADR_DST_INDEX; sl_CmdSet.s_WriteCmd[0].v_SizeCopied = 0; sl_CmdSet.s_WriteCmd[0].v_Size = FM_SIZE_OF_OBJ_HEADER; sl_CmdSet.s_WriteCmd[0].u_Srce.p_Srce = &al_StrIDType[0]; sl_CmdSet.s_WriteCmd[0].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile; sl_CmdSet.s_WriteCmd[0].v_SrceFileId = vp_DirId; /* Write name of object */ sl_CmdSet.s_WriteCmd[1].v_TypeOfCmd = FS_SRC_ADR_DST_INDEX; sl_CmdSet.s_WriteCmd[1].v_SizeCopied = 0; sl_CmdSet.s_WriteCmd[1].v_Size = vp_NameLenght+1; sl_CmdSet.s_WriteCmd[1].u_Srce.p_Srce = pp_ObjName; sl_CmdSet.s_WriteCmd[1].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile + FM_SIZE_OF_OBJ_HEADER; sl_CmdSet.s_WriteCmd[1].v_SrceFileId = vp_DirId; /* If insertion not at end of file write rest of file */ if ( sp_DirFileInfo->v_FileSize - sp_DirFileInfo->v_PositionInFile != 0 ) { sl_CmdSet.s_WriteCmd[2].v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; sl_CmdSet.s_WriteCmd[2].v_SizeCopied = 0; sl_CmdSet.s_WriteCmd[2].v_Size = sp_DirFileInfo->v_FileSize - sp_DirFileInfo->v_PositionInFile; sl_CmdSet.s_WriteCmd[2].u_Srce.v_SrceIndex = sp_DirFileInfo->v_PositionInFile; sl_CmdSet.s_WriteCmd[2].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile + vl_EntryLenght; sl_CmdSet.s_WriteCmd[2].v_SrceFileId = vp_DirId; sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 3; } else sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 2; /* Makes write in device */ MC_MFM_LL_WRITE_COMPLEX( &sl_WriteHeader, pp_Status ); /* If status not OK return */ if ( *pp_Status != FS_OK) return; } /* Directory content have change update all contextes opened for the same directory */ mFm80_08CorrectDirCtx( FM_INSERT, vp_DirId, pp_LayerCtx, 0, 0, sp_DirFileInfo->v_PositionInFile, vl_EntryLenght);}#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 6void mFm80_06RemoveObjFromDir( u16 vp_DirId, t_DirFileInfo * sp_DirFileInfo, t_mFmLayerContext * pp_LayerCtx, s32 * pp_Status ){ t_WriteHeader sl_WriteHeader; t_WriteCmdStruct1 sl_CmdSet; /* Initialize write header */ sl_WriteHeader.v_FinalFileSize = sp_DirFileInfo->v_FileSize - sp_DirFileInfo->v_EntryLenght; sl_WriteHeader.v_DestFileId = vp_DirId; sl_WriteHeader.p_NextWriteCmdHeader = (t_WriteCmdHeader*)&sl_CmdSet; /* Is this entry the last of the file ? */ if ( sp_DirFileInfo->v_PositionInFile != sl_WriteHeader.v_FinalFileSize ) { /* Update write command header */ sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 1; sl_CmdSet.s_WriteCmdHeader.p_NextWriteCmdHeader = NIL; sl_CmdSet.s_WriteCmdHeader.v_OffsetInFile = 0; /* Update command */ sl_CmdSet.s_WriteCmd[0].v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; sl_CmdSet.s_WriteCmd[0].v_SizeCopied = 0; sl_CmdSet.s_WriteCmd[0].v_Size = sp_DirFileInfo->v_FileSize - sp_DirFileInfo->v_EntryLenght - sp_DirFileInfo->v_PositionInFile; sl_CmdSet.s_WriteCmd[0].u_Srce.v_SrceIndex = sp_DirFileInfo->v_PositionInFile + sp_DirFileInfo->v_EntryLenght; sl_CmdSet.s_WriteCmd[0].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile; sl_CmdSet.s_WriteCmd[0].v_SrceFileId = vp_DirId; } else /* Number of commands is nul but size of file change */ sl_WriteHeader.p_NextWriteCmdHeader = NIL; /* Write it via lower layers */ MC_MFM_LL_WRITE_COMPLEX( &sl_WriteHeader, pp_Status ); /* If status not OK return */ if ( *pp_Status != FS_OK) return; /* Directory content have change update all contextes opened for the same directory */ mFm80_08CorrectDirCtx( FM_DELETE, vp_DirId, pp_LayerCtx, sp_DirFileInfo->v_PositionInFile, sp_DirFileInfo->v_EntryLenght, 0, 0 );}/* In a single command erase old entry and insert the new */#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 7void mFm80_07RenameObjFromDir( u16 vp_DirId, t_DirFileInfo * pp_DelDirFileInfo, t_DirFileInfo * pp_InsDirFileInfo, ascii * pp_ObjName, u8 vp_NameLenght, t_mFmLayerContext * pp_LayerCtx, s32 * pp_Status ){ s32 vl_InsEntryLenght = vp_NameLenght + FM_SIZE_OF_OBJ_HEADER + 1; t_WriteHeader sl_WriteHeader; t_WriteCmdStruct4 sl_CmdSet; /* Initialize write header */ sl_WriteHeader.v_FinalFileSize = pp_DelDirFileInfo->v_FileSize - pp_DelDirFileInfo->v_EntryLenght + vl_InsEntryLenght; sl_WriteHeader.v_DestFileId = vp_DirId; sl_WriteHeader.p_NextWriteCmdHeader = (t_WriteCmdHeader*)&sl_CmdSet; /* Update write command header */ sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 2; /* Write of inserted entry is always made */ sl_CmdSet.s_WriteCmdHeader.p_NextWriteCmdHeader = NIL; sl_CmdSet.s_WriteCmdHeader.v_OffsetInFile = 0; { s32 vl_DestPos; s32 vl_Distance; t_WriteCmd * pl_WriteCmd1; t_WriteCmd * pl_WriteCmd2; u8 vl_CmdNo; /* Generates insertion of new entry in file */ /*------------------------------------------*/ /* Determine position of command ( if deleted entry is before and not adjacent then it is the second command ) */ vl_Distance = pp_InsDirFileInfo->v_PositionInFile - pp_DelDirFileInfo->v_PositionInFile; /* Calculate destination position of entry */ vl_DestPos = pp_InsDirFileInfo->v_PositionInFile; if (vl_Distance > 0 ) vl_DestPos = vl_DestPos - pp_DelDirFileInfo->v_EntryLenght; /* Determine position of command in command set */ if (vl_Distance > pp_DelDirFileInfo->v_EntryLenght ) pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[1]; else pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[0]; /* Write header ( It is the same that the deleted object ) */ pl_WriteCmd1->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; pl_WriteCmd1->v_Size = FM_SIZE_OF_OBJ_HEADER; pl_WriteCmd1->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_PositionInFile; pl_WriteCmd1->u_Dest.v_DestIndex = vl_DestPos; /* Write name of object */ pl_WriteCmd1++; pl_WriteCmd1->v_TypeOfCmd = FS_SRC_ADR_DST_INDEX; pl_WriteCmd1->v_Size = vp_NameLenght+1; pl_WriteCmd1->u_Srce.p_Srce = pp_ObjName; pl_WriteCmd1->u_Dest.v_DestIndex = vl_DestPos+ FM_SIZE_OF_OBJ_HEADER; /* Generates write command of old data beetween deleted and inserted entry and of data */ /* after last entry */ /*-------------------------------------------------------------------------------------------*/ if ( vl_Distance > pp_DelDirFileInfo->v_EntryLenght ) { /* The deleted entry is before the inserted entry */ /* Generates the first write command of data between deleted and inserted entry */ pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[0]; pl_WriteCmd1->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; pl_WriteCmd1->u_Dest.v_DestIndex = pp_DelDirFileInfo->v_PositionInFile; pl_WriteCmd1->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_PositionInFile + pp_DelDirFileInfo->v_EntryLenght; pl_WriteCmd1->v_Size = pp_InsDirFileInfo->v_PositionInFile - pp_DelDirFileInfo->v_PositionInFile - pp_DelDirFileInfo->v_EntryLenght; sl_CmdSet.s_WriteCmdHeader.v_NbrCmds ++; /* Generates the second write command of data after inserted entity ( if exist ) */ pl_WriteCmd2 = &sl_CmdSet.s_WriteCmd[3]; pl_WriteCmd2->v_Size = pp_InsDirFileInfo->v_FileSize - pp_InsDirFileInfo->v_PositionInFile; if ( pl_WriteCmd2->v_Size != 0 ) { sl_CmdSet.s_WriteCmdHeader.v_NbrCmds++; pl_WriteCmd2->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; pl_WriteCmd2->u_Srce.v_SrceIndex = pp_InsDirFileInfo->v_PositionInFile; pl_WriteCmd2->u_Dest.v_DestIndex = pl_WriteCmd1->u_Dest.v_DestIndex + pl_WriteCmd1->v_Size + vl_InsEntryLenght; } } else { /* The deleted entry is after or at same position that the inserted entity */ /* Are insert and delete entries not at same position ? */ if ( vl_Distance < 0 ) { /* The deleted entry is after the inserted entry */ /* Generates the first write command of data between deleted and inserted entry */ pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[2]; sl_CmdSet.s_WriteCmdHeader.v_NbrCmds++; pl_WriteCmd1->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; pl_WriteCmd1->u_Srce.v_SrceIndex = pp_InsDirFileInfo->v_PositionInFile; pl_WriteCmd1->u_Dest.v_DestIndex = pp_InsDirFileInfo->v_PositionInFile + vl_InsEntryLenght; pl_WriteCmd1->v_Size = pp_DelDirFileInfo->v_PositionInFile - pp_InsDirFileInfo->v_PositionInFile; /* Generates the second write command of data after inserted entity ( if exist ) */ pl_WriteCmd2 = &sl_CmdSet.s_WriteCmd[3]; pl_WriteCmd2->u_Dest.v_DestIndex = pl_WriteCmd1->u_Dest.v_DestIndex + pl_WriteCmd1->v_Size; pl_WriteCmd2->v_Size = sl_WriteHeader.v_FinalFileSize - pl_WriteCmd2->u_Dest.v_DestIndex; if ( pl_WriteCmd2->v_Size != 0 ) { sl_CmdSet.s_WriteCmdHeader.v_NbrCmds++; pl_WriteCmd2->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX; pl_WriteCmd2->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_FileSize - pl_WriteCmd2->v_Size; } } else { /* The deleted entry is at same position that the inserted entity */ /* Generates a single write command of data after inserted entity ( if exist ) */ pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[2]; pl_WriteCmd1->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_PositionInFile + pp_DelDirFileInfo->v_EntryLenght; pl_WriteCmd1->u_Dest.v_DestIndex = pp_DelDirFileInfo->v_PositionInFile + vl_InsEntryLenght; pl_WriteCmd1->v_Size = sl_WriteHeader.v_FinalFileSize - pl_WriteCmd1->u_Dest.v_DestIndex;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -