hschumann2/TempleOS-Source-Code
0847
1 2#help_index "File/Internal"3I64 DirTreeSerializeSize(CDirEntry *tmpde)4{5 I64 res=0;6 while (tmpde) {7 res+=CDIR_SIZE+1;8 if (tmpde->attr & RS_ATTR_DIR)9 res+=DirTreeSerializeSize(tmpde->sub);10 tmpde=tmpde->next;11 }12 return res+1;13}14I64 DirTreeSerializeFill(CDirEntry *tmpde,U8 *dst)15{16 I64 res=0,i;17 while (tmpde) {18 *dst++=1;19 res++;20 MemCpy(dst,&tmpde->start,CDIR_SIZE);21 dst+=CDIR_SIZE;22 res+=CDIR_SIZE;23 if (tmpde->attr & RS_ATTR_DIR) {24 i=DirTreeSerializeFill(tmpde->sub,dst);25 dst+=i;26 res+=i;27 }28 tmpde=tmpde->next;29 }30 *dst=0;31 return res+1;32}33public U8 *DirTreeSerialize(CDirEntry *tmpde,I64 *_size=NULL)34{//Serialize tree returned from FilesFind() into a one contiguous U8 array.35 I64 size=DirTreeSerializeSize(tmpde);36 U8 *buf=MAlloc(size);37 DirTreeSerializeFill(tmpde,buf);38 if (_size) *_size=size;39 return buf;40}41 42U8 *DirTreeUnserialize2(U8 *src,CDirEntry **tmpde)43{44 CDirEntry *tmpde1;45 if (*src++) {46 tmpde1=CAlloc(sizeof(CDirEntry));47 *tmpde=tmpde1;48 MemCpy(&tmpde1->start,src,CDIR_SIZE);49 src+=CDIR_SIZE;50 if (tmpde1->attr & RS_ATTR_DIR)51 src=DirTreeUnserialize2(src,&tmpde1->sub);52 src=DirTreeUnserialize2(src,&tmpde1->next);53 } else54 *tmpde=NULL;55 return src;56}57public CDirEntry *DirTreeUnserialize(U8 *src)58{//Unserialize tree to make it like a tree returned from FilesFind().59 CDirEntry *tmpde=NULL;60 DirTreeUnserialize2(src,&tmpde);61 return tmpde;62}63 64#help_index "File/Program Routines"65U0 FOFlatten(CDirEntry *tmpde,CDirEntry **a,I64 *i)66{67 CDirEntry *tmpde1;68 while (tmpde) {69 tmpde1=tmpde->next;70 if (tmpde->attr&RS_ATTR_DIR) {71 FOFlatten(tmpde->sub,a,i);72 DirEntryDel(tmpde);73 } else {74 a[*i]=tmpde;75 *i=*i+1;76 }77 tmpde=tmpde1;78 }79}80 81I64 Size1(CDirEntry *tmpde,I64 *_fuf_flags,I64 round_to)82{83 U8 buf[BLK_SIZE];84 I64 res=0,i;85 CDrv *dv;86 while (tmpde) {87 if ((i=tmpde->size) && Bt(_fuf_flags,FUf_EXPAND) &&88 !(tmpde->attr&RS_ATTR_DIR) &&89 FileAttr(tmpde->name)&RS_ATTR_COMPRESSED) {90 dv=Let2Drv(*tmpde->full_name);91 BlkRead(dv,buf,Clus2Blk(dv,tmpde->clus),1);92 i=(&buf)(CArcCompress *)->expanded_size;93 }94 if (round_to)95 i=CeilU64(tmpde->size,round_to);96 if (tmpde->attr&RS_ATTR_DIR)97 i+=Size1(tmpde->sub,_fuf_flags,round_to);98 tmpde->user_data=i;99 res+=i;100 tmpde=tmpde->next;101 }102 return res;103}104public I64 Size(U8 *files_find_mask="/*",U8 *fu_flags=NULL,I64 round_to=0)105{//Total size of files in mask. "+x" for expanded size.106//Does not include directory size of base directory, but107 //does include size of sub directories.108 I64 fuf_flags=0,res=0;109 CDirEntry *tmpde1=NULL;110 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r");111 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);112 if (tmpde1=FilesFind(files_find_mask,fuf_flags&FUG_FILES_FIND)) {113 fuf_flags&=FUF_EXPAND;114 res=Size1(tmpde1,&fuf_flags,round_to);115 DirTreeDel(tmpde1);116 }117 return res;118}119 120public I64 FileCnt(CDirEntry *tmpde)121{//Cnt of files in CDirEntry tree.122 I64 cnt=0;123 while (tmpde) {124 if (tmpde->attr&RS_ATTR_DIR)125 cnt+=FileCnt(tmpde->sub);126 else127 cnt++;128 tmpde=tmpde->next;129 }130 return cnt;131}132 133#help_index "File/Cmd Line (Typically);Cmd Line (Typically)"134public I64 FF(U8 *files_find_mask,U8 *fu_flags=NULL)135{//Files find. List files matching mask.136 I64 cnt=0,fuf_flags=0;137 CDirEntry *tmpde,*tmpde1;138 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+f+F");139 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);140 tmpde=tmpde1=FilesFind(files_find_mask,fuf_flags);141 while (tmpde) {142 PutFileLink(tmpde->full_name);143 '\n';144 cnt++;145 tmpde=tmpde->next;146 }147 DirTreeDel(tmpde1);148 return cnt;149}150 151public I64 Zip(U8 *files_find_mask="*",U8 *fu_flags=NULL)152{//Compress files by moving to .Z filename.153 U8 *st;154 CDirEntry *tmpde,*tmpde1;155 I64 res=0,fuf_flags=0;156 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+f+F+O");157 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);158 tmpde=tmpde1=FilesFind(files_find_mask,fuf_flags);159 while (tmpde) {160 if (!IsDotZ(tmpde->full_name)) {161 st=MStrPrint("%s.Z",tmpde->full_name);162 res+=Move(tmpde->full_name,st);163 Free(st);164 }165 tmpde=tmpde->next;166 }167 DirTreeDel(tmpde1);168 return res;169}170 171public I64 Unzip(U8 *files_find_mask="*.Z",U8 *fu_flags=NULL)172{//Uncompress files by moving to not .Z filename.173//You don't have to do this for normal operation.174 //It automatically unzips ".Z" files.175 U8 *st;176 CDirEntry *tmpde,*tmpde1;177 I64 res=0,fuf_flags=0;178 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+f+F+O");179 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);180 tmpde=tmpde1=FilesFind(files_find_mask,fuf_flags);181 while (tmpde) {182 if (IsDotZ(tmpde->full_name)) {183 st=StrNew(tmpde->full_name);184 StrLastRem(st,".");185 res+=Move(tmpde->full_name,st);186 Free(st);187 }188 tmpde=tmpde->next;189 }190 DirTreeDel(tmpde1);191 return res;192}193 