hschumann2/TempleOS-Source-Code
0847
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 