⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffs.c

📁 ADAM2 sources (modified by Oleg)
💻 C
📖 第 1 页 / 共 3 页
字号:
  *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 + -