Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
FileSysISO.txt232 linesDownload Raw Back to BlkDev
1 2U0 Date2ISO1(CISO1Date *dst,CDate cdt)3{4  CDateStruct ds;5  Date2Struct(&ds,cdt);6  dst->year=ds.year-ISO1_BASE_YEAR;7  dst->mon=ds.mon;8  dst->day=ds.day_of_mon;9  dst->hour=ds.hour;10  dst->min=ds.min;11  dst->sec=ds.sec;12  dst->sec100=ds.sec100;13}14 15CDate ISO1DateStruct2CDate(CISO1Date *dt)16{17  CDateStruct ds;18  MemSet(&ds,0,sizeof(CDateStruct));19  ds.day_of_mon=dt->day;20  ds.mon=dt->mon;21  ds.year=dt->year+ISO1_BASE_YEAR;22  ds.sec100=dt->sec100;23  ds.sec=dt->sec;24  ds.min=dt->min;25  ds.hour=dt->hour;26  return Struct2Date(&ds);27}28 29Bool ISO1FromName(U8 *dst,U8 *src)30{31  I64 i,j,n;32  MemSet(dst,0,CDIR_FILENAME_LEN);33  n=*src++;34  if (n==1 && !*src) {35    *dst='.';36  } else if (n==1 && *src==1) {37    *dst='.';38    dst[1]='.';39  } else {40    n>>=1;41    j=0;42    for (i=0;i<n;i++) {43      src++;44      if (*src==';')45        break;46      if (Bt(char_bmp_filename,*src)) {47        if (j>=CDIR_FILENAME_LEN-1)48          return FALSE;49        dst[j++]=*src++;50      } else51        return FALSE;52    }53  }54  return FileNameChk(dst);55}56 57Bool ISO1CDirFill(CDirEntry *tmpde,CISO1DirEntry *de)58{59  Bool res;60  MemSet(tmpde,0,sizeof(CDirEntry));61  res=ISO1FromName(tmpde->name,&de->name_len);62  tmpde->clus=de->loc.little;63  tmpde->size=de->size.little;64  tmpde->attr=FileAttr(tmpde->name);65  if (de->flags & ISO1_ATTR_DIR)66    tmpde->attr|=RS_ATTR_DIR;67  tmpde->datetime=ISO1DateStruct2CDate(&de->date);68  return res;69}70 71Bool ISO1FileFind(CDrv *dv,I64 cur_dir_clus,U8 *name,72        CDirEntry *_res,I64 fuf_flags=0)73{//FUF_JUST_DIRS, FUF_JUST_FILES74  CISO1DirEntry *isoptr,*buf;75  U8 dname[CDIR_FILENAME_LEN];76  Bool res=FALSE,unlock;77  I64 i;78  if (fuf_flags&~FUG_FILE_FIND)79    throw('FUF');80  DrvChk(dv);81  if (dv->fs_type!=FSt_ISO9660)82    PrintErr("Not ISO9660 Drv\n");83  else84    try {85      unlock=DrvLock(dv);86      isoptr=MAlloc(dv->spc<<BLK_SIZE_BITS);87      ClusRead(dv,isoptr,cur_dir_clus,1);88      if (isoptr->name_len==1 && !isoptr->name) {//curdir89        i=(isoptr->size.little+dv->spc<<BLK_SIZE_BITS-1)/dv->spc<<BLK_SIZE_BITS;90        buf=MAlloc(dv->spc<<BLK_SIZE_BITS*i);91        ClusRead(dv,buf,cur_dir_clus,i);92        Free(isoptr);93      } else {94        buf=isoptr;95        i=1;96      }97      i*=dv->spc<<BLK_SIZE_BITS;98      isoptr=buf;99      while (i>0) {100        if (!isoptr->len) {101          isoptr(U8 *)++;102          i--;103        } else {104          ISO1FromName(dname,&isoptr->name_len);105          if (*dname) {106            if (!StrCmp(name,dname)) {107              res=ISO1CDirFill(_res,isoptr);108              if (res &&109                    !(fuf_flags&FUF_JUST_DIRS &&110                    !(_res->attr & RS_ATTR_DIR)) &&111                    !(fuf_flags&FUF_JUST_FILES && _res->attr & RS_ATTR_DIR) )112                goto iff_done;113              else114                res=FALSE;115            }116          }117          i-=isoptr->len;118          isoptr(U8 *)+=isoptr->len;119        }120      }121iff_done:122      Free(buf);123      if (unlock)124        DrvUnlock(dv);125    } catch126      if (unlock)127        DrvUnlock(dv);128  return res;129}130 131U8 *ISO1FileRead(CDrv *dv,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)132{133  U8 *buf=NULL;134  CDirEntry de;135  I64 c,blk_cnt,cur_dir_clus;136  DrvChk(dv);137  *_size=0;138  *_attr=0;139  if (dv->fs_type!=FSt_ISO9660)140    PrintErr("Not ISO9660 Drv\n");141  else142    try {143      DrvLock(dv);144      cur_dir_clus=Name2DirClus(dv,cur_dir);145      if (ISO1FileFind(dv,cur_dir_clus,filename,&de,FUF_JUST_FILES)) {146        blk_cnt=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;147        buf=MAlloc(blk_cnt<<BLK_SIZE_BITS+1);148        c=de.clus;149        c=ClusBlkRead(dv,buf,c,blk_cnt);150        buf[de.size]=0; //Terminate151        *_size=de.size;152        *_attr=FileAttr(de.name,de.attr);153      }154      DrvUnlock(dv);155    } catch156      DrvUnlock(dv);157  return buf;158}159 160Bool ISO1Cd(U8 *name,I64 cur_dir_clus)161{162  CDirEntry de;163  if (Fs->cur_dv->fs_type!=FSt_ISO9660)164    PrintErr("Not ISO9660 Drv\n");165  else if (ISO1FileFind(Fs->cur_dv,cur_dir_clus,name,&de,FUF_JUST_DIRS))166    return TRUE;167  else168    PrintErr("File not found: \"%s\".\n",name);169  return FALSE;170}171 172CDirEntry *ISO1FilesFind(U8 *files_find_mask,173        I64 fuf_flags,CDirEntry *parent=NULL)174{175  CDrv *dv=Fs->cur_dv;176  CISO1DirEntry *buf,*buf2,*isoptr;177  I64 i,cur_dir_clus=Name2DirClus(dv,Fs->cur_dir);178  CDirEntry *res=NULL,*tmpde;179  if (fuf_flags&~FUG_FILES_FIND)180    throw('FUF');181  isoptr=MAlloc(dv->spc<<BLK_SIZE_BITS);182  ClusRead(dv,isoptr,cur_dir_clus,1);183  if (isoptr->name_len==1 && !isoptr->name) {//curdir184    i=(isoptr->size.little+dv->spc<<BLK_SIZE_BITS-1)/dv->spc<<BLK_SIZE_BITS;185    buf=MAlloc(dv->spc<<BLK_SIZE_BITS*i);186    ClusRead(dv,buf,cur_dir_clus,i);187    Free(isoptr);188  } else {189    buf=isoptr;190    i=1;191  }192  buf2=buf;193  i*=dv->spc<<BLK_SIZE_BITS;194  while (i>0) {195    if (!buf->len) {196      buf(U8 *)++;197      i--;198    } else {199      tmpde=MAlloc(sizeof(CDirEntry));200      if (ISO1CDirFill(tmpde,buf)) {201        tmpde->parent=parent;202        if (Bt(&fuf_flags,FUf_RECURSE) && tmpde->attr&RS_ATTR_DIR &&203              *tmpde->name!='.') {204          tmpde->next=res;205          res=tmpde;206          tmpde->full_name=DirNameAbs(tmpde->name);207          if (Cd(tmpde->name)) {208            tmpde->sub=ISO1FilesFind(files_find_mask,fuf_flags,tmpde);209            Cd("..");210          }211        } else {212          tmpde->full_name=FileNameAbs(tmpde->name);213          if ((tmpde->attr & RS_ATTR_DIR ||214                !Bt(&fuf_flags,FUf_JUST_DIRS)) &&215                !(Bt(&fuf_flags,FUf_RECURSE) &&216                *tmpde->name=='.' && tmpde->attr&RS_ATTR_DIR) &&217                FilesFindMatch(tmpde->full_name,files_find_mask,fuf_flags)) {218            tmpde->next=res;219            res=tmpde;220          } else221            DirEntryDel(tmpde);222        }223      } else224        DirEntryDel(tmpde);225      i-=buf->len;226      buf(U8 *)+=buf->len;227    }228  }229  Free(buf2);230  return res;231}232