📄 ffs.c
字号:
*cbit16++=(bit8) (val>>8); }void _ffs_UpdateBit16Value(char *cbit16, bit16u val) { FWBOpen((bit32u)cbit16); FWBWriteByte((bit32u)cbit16++,(bit8) val); FWBWriteByte((bit32u)cbit16++,(bit8) (val>>8)); FWBClose(); }bit32 _ffs_GetBit24Value(char *cbit24) { int tmp; tmp=(int)*cbit24++; tmp&=0x0ff; tmp|=(((int) *cbit24++)<<8)&0x0ff00; tmp|=(((int) *cbit24)<<16)&0x0ff0000; return(tmp); }void _ffs_PutBit24Value(char *cbit16, bit32u val) { *cbit16++=(bit8) val; *cbit16++=(bit8) (val>>8); *cbit16++=(bit8) (val>>16); }bit32 _ffs_GetBit32Value(char *cbit32) { int tmp; tmp=(int)*cbit32++; tmp&=0x0ff; tmp|=(((int) *cbit32++)<<8)&0x0ff00; tmp|=(((int) *cbit32++)<<16)&0x0ff0000; tmp|=(((int) *cbit32++)<<24)&0x0ff000000; return(tmp); }static char *smonth[]={"Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"};void _ffs_DecodeAndPrintMdate(int mdate) { int day,month,year; year = (mdate>>9) +1970; month= ((mdate>>5)&0x0f) +1; day = (mdate&0x1f) +1; sys_printf("%s %2d, %4d",smonth[month-1],day,year); }void _ffs_DecodeAndPrintMtime(int mtime) { int hour,min,sec,rhour; char ampm; rhour= (mtime>>11)&0x1f; min = (mtime>>5)&0x3f; sec = ((mtime)&0x1f)<<1; ampm = (rhour>11)?'p':'a'; hour = rhour%12; hour = (hour==0)?12:hour; sys_printf("%2d:%02d:%02d%cm",hour,min,sec,ampm); }void _ffs_SplitIntoFirstDirAndRest(char *src,char **d1,char **l1) { char *cp; /* src= [/]dir[/rest/rest] */ /* \ / \ / */ /* dir rest */ *d1=0; *l1=0; if (strlen(src)==0) return; if (*src=='/') src++; if (strlen(src)==0) return; *d1=src; cp=strchr(src,'/'); if (cp!=0) { *cp=0; cp++; if (strlen(cp)) *l1=cp; } }ffs_tEntry *_ffs_FindFFSEWithNameInDir(ffs_tEntry *ffs,int inode,char *name) { while(_ffs_GetBit16Value(ffs->inode)!=0x0ffff) { if ((inode==_ffs_GetBit16Value(ffs->inode))&& ((strlen(name)==ffs->fnlen)||(strlen(name)==0))&& (_ffs_GetBit16Value(ffs->flags)&FFS_F_DELETE)&& (strncmp(ffs->data,name,strlen(name))==0) ) { return(ffs); } ffs=(ffs_tEntry *)(((char *)ffs)+(sizeof(ffs_tEntry)-1)+_ffs_GetBit24Value(ffs->flen)+ffs->fnlen); } return(0); }int ffs_remove(const char *filename) { char tmpfile[80],*pRestOfFileName,*cp,*dir; ffs_tEntry *ffs,*ffse; int i,slot,inode; char tmpmnt[20]; /* If first char is not '/' */ if (filename[0]=='/') { strcpy(tmpfile,filename); } else { get_cwd(tmpfile); strcat(tmpfile,"/"); strcat(tmpfile,filename); } pRestOfFileName=tmpfile; if (ffs_iNumOfFlashMounts==0) return(-1); ffs=(ffs_tEntry *)(((char *)ffs_sFlashFileSystemsMounts[0].ffs_ptr)+8); for(i=0;i<ffs_iNumOfFlashMounts;i++) { slot=ffs_sFlashFileSystemsMounts[i].slot; sys_sprintf(tmpmnt,"/slot%d",slot); if (strncmp(pRestOfFileName,tmpmnt,strlen(tmpmnt))==0) { ffs=(ffs_tEntry *)(((char *)ffs_sFlashFileSystemsMounts[i].ffs_ptr)+8); pRestOfFileName+=strlen(tmpmnt); } } ffse=ffs; if (strlen(pRestOfFileName)) { inode=0; do { cp=pRestOfFileName; _ffs_SplitIntoFirstDirAndRest(cp,&dir,&pRestOfFileName); ffse=_ffs_FindFFSEWithNameInDir(ffs,inode,dir); if (!ffse) return(-1); if (_ffs_GetBit16Value(ffse->flags)&FFS_F_DIRECTORY) inode=_ffs_GetBit16Value(ffse->data+strlen(dir)); else { if (pRestOfFileName) return(-1); } }while(pRestOfFileName); } if (_ffs_GetBit16Value(ffse->flags)&FFS_F_DIRECTORY) { /*Check for an empty directory first */ inode=_ffs_GetBit16Value(ffse->data+strlen(dir)); if(_ffs_FindFFSEWithNameInDir(ffs,inode,"")) return(-1); /*Directory is not empty!!! */ } _ffs_UpdateBit16Value(ffse->flags,_ffs_GetBit16Value(ffse->flags)&~FFS_F_DELETE); return(0); }FFS_FILE *ffs_fopen(const char *filename, const char *type) { char tmpfile[255]; char tmpmnt[20]; char *dir,*pRestOfFileName; char *cp,autoloadnum=0; bit32u datetime; int inode,i,slot,rmode,wmode,amode,autoloadok,blk_aln,tmpwflags; ffs_tEntry *ffs,*ffse; FFS_FILE *pFCB; if (!(pFCB=fcb_FileGetFCB())) {/* _StsGetFCBFail++; */ return(0); } rmode=FALSE; wmode=FALSE; amode=FALSE; autoloadok=FALSE; blk_aln=FALSE; while(*type) { if (*type=='r') rmode=TRUE; if (*type=='w') wmode=TRUE; if (*type=='a') amode=TRUE; if (*type=='B') blk_aln=TRUE; if (*type=='X') { autoloadnum=0; while (isdigit(type[1])) { autoloadnum*=10; type++; autoloadnum+=*type-'0'; autoloadok=TRUE; } } type++; } if (amode) return(0); if ((!rmode)&&(!wmode)) return(0); /* If first char is not '/' */ if (filename[0]=='/') { strcpy(tmpfile,filename); } else { get_cwd(tmpfile); strcat(tmpfile,"/"); strcat(tmpfile,filename); } pRestOfFileName=tmpfile; if (ffs_iNumOfFlashMounts==0) return(0); ffs=(ffs_tEntry *)(((char *)ffs_sFlashFileSystemsMounts[0].ffs_ptr)+8); for(i=0;i<ffs_iNumOfFlashMounts;i++) { slot=ffs_sFlashFileSystemsMounts[i].slot; sys_sprintf(tmpmnt,"/slot%d",slot); if (strncmp(pRestOfFileName,tmpmnt,strlen(tmpmnt))==0) { ffs=(ffs_tEntry *)(((char *)ffs_sFlashFileSystemsMounts[i].ffs_ptr)+8); pRestOfFileName+=strlen(tmpmnt); } } ffse=ffs; if (strlen(pRestOfFileName)) { inode=0; do { cp=pRestOfFileName; _ffs_SplitIntoFirstDirAndRest(cp,&dir,&pRestOfFileName); ffse=_ffs_FindFFSEWithNameInDir(ffs,inode,dir); if (!ffse) { if (pRestOfFileName) /*Return NULL if not leaf */ return(0); if (!wmode) /*Return if not write request*/ return(0); ffse=sys_malloc(i=((sizeof(ffs_tEntry)-1)+strlen(dir))); if (!ffse) return(0); _ffs_PutBit16Value(ffse->inode,inode); /*Create File flags */ tmpwflags=FFS_F_DELETE; tmpwflags|=FFS_F_USER_READ|FFS_F_USER_WRITE|FFS_F_USER_EXECUTE; tmpwflags|=FFS_F_GROUP_READ|FFS_F_GROUP_WRITE|FFS_F_GROUP_EXECUTE; tmpwflags|=FFS_F_WORLD_READ|FFS_F_WORLD_WRITE|FFS_F_WORLD_EXECUTE; if (autoloadok) tmpwflags|=FFS_F_AUTO_EXECUTE; if (blk_aln) tmpwflags|=FFS_F_BLOCK_ALIGN; _ffs_PutBit16Value(ffse->flags,tmpwflags); datetime=GetCurrentDateTime(); _ffs_PutBit16Value(ffse->mdate,(bit16u)(datetime>>16)); _ffs_PutBit16Value(ffse->mtime,(bit16u)(datetime )); ffse->uid=0; ffse->gid=0; ffse->fnlen=strlen(dir); _ffs_PutBit24Value(ffse->flen,0); ffse->aeo=(autoloadok)?autoloadnum:0xff; for(cp=ffse->data,i=0;i<strlen(dir);i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -