hschumann2/TempleOS-Source-Code
0847
1 2U8 *FileExtDot(U8 *src)3{//Find dot char in name.4 I64 ch;5 while (ch=*src++)6 if (ch=='.' && *src!='/' && *src!='.')7 return src-1;8 return NULL;9}10 11U8 *FileExtRem(U8 *src,U8 *dst=NULL)12{//Remove filename extension from str.13 U8 *ptr;14 if (ptr=FileExtDot(src)) {15 if (dst)16 StrCpy(dst,ptr+1);17 *ptr=0;18 } else if (dst)19 *dst=0;20 return dst;21}22 23Bool IsDotZ(U8 *filename)24{//Does name end in .Z?25 I64 i=StrLen(filename);26 if (StrOcc(filename,'.')>1 && filename[i-1]=='Z' && filename[i-2]=='.')27 return TRUE;28 else29 return FALSE;30}31 32Bool IsDotC(U8 *filename)33{//Does name end in .C?34 I64 i=StrLen(filename);35 if (StrOcc(filename,'.')>1 && filename[i-1]=='C' && filename[i-2]=='.')36 return TRUE;37 else38 return FALSE;39}40 41Bool FilesFindMatch(U8 *_test_name,U8 *files_find_mask,I64 fuf_flags=0)42{//Does filename meet Files Find mask?43 I64 tn_len=StrLen(_test_name),mask_len=StrLen(files_find_mask);44 U8 *mask1=MAlloc(mask_len+1),*mask2=MAlloc(mask_len+1),45 *ptr,*test_name1,*test_name2;46 Bool res=FALSE;47 StrCpy(mask1,files_find_mask);48 if (StrOcc(_test_name,'/')) {49 test_name1=MAlloc(tn_len+1);50 test_name2=MAlloc(tn_len+1);51 StrCpy(test_name1,_test_name);52 StrLastRem(test_name1,"/",test_name2);53 } else {54 test_name1=NULL;55 test_name2=NULL;56 }57 while (TRUE) {58 StrFirstRem(mask1,";",mask2);59 if (!test_name2 || StrOcc(mask2,'/'))60 ptr=_test_name;61 else62 ptr=test_name2;63 if (*mask2) {64 if (*mask2=='!') {65 if (WildMatch(ptr,mask2+1)) {66 res=FALSE;67 break;68 }69 } else {70 if (WildMatch(ptr,mask2)) {71 if (Bt(&fuf_flags,FUf_JUST_TXT) &&72 !FilesFindMatch(_test_name,FILEMASK_TXT)) {73 res=FALSE;74 break;75 } else if (Bt(&fuf_flags,FUf_JUST_DD) &&76 !FilesFindMatch(_test_name,FILEMASK_DD)) {77 res=FALSE;78 break;79 } else if (Bt(&fuf_flags,FUf_JUST_SRC) &&80 !FilesFindMatch(_test_name,FILEMASK_SRC)) {81 res=FALSE;82 break;83 } else if (Bt(&fuf_flags,FUf_JUST_AOT) &&84 !FilesFindMatch(_test_name,FILEMASK_AOT)) {85 res=FALSE;86 break;87 } else if (Bt(&fuf_flags,FUf_JUST_JIT) &&88 !FilesFindMatch(_test_name,FILEMASK_JIT)) {89 res=FALSE;90 break;91 } else if (Bt(&fuf_flags,FUf_JUST_GR) &&92 !FilesFindMatch(_test_name,FILEMASK_GR)) {93 res=FALSE;94 break;95 } else96 res=TRUE;97 }98 }99 } else100 break;101 }102 Free(test_name1);103 Free(test_name2);104 Free(mask1);105 Free(mask2);106 return res;107}108 109U8 *DirNameAbs(U8 *_dirname)110{//MAlloc absolute dir string with drv letter.111 I64 maxlen;112 U8 drv[3],*res,*buf,*buf2,*buf3,*buf4,*dirname,*free_dirname;113 if (!Fs->cur_dir || !*Fs->cur_dir)114 return StrNew(_dirname);115 free_dirname=dirname=MStrUtil(_dirname,116 SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);117 *drv=Drv2Let;118 drv[1]=':';119 drv[2]=0;120 if (*dirname && dirname[1]==':') {121 if (*dirname==':')122 *drv=blkdev.boot_drv_let;123 else if (*dirname=='~')124 *drv=*blkdev.home_dir;125 else126 *drv=*dirname;127 dirname=dirname+2;128 buf=StrNew("/");129 } else130 buf=StrNew(Fs->cur_dir);131 if (*dirname=='/') {132 Free(buf);133 buf=StrNew("/");134 dirname++;135 }136 buf2=StrNew(dirname);137 maxlen=StrLen(buf)+1+StrLen(buf2)+1;138 buf3=MAlloc(maxlen);139 buf4=MAlloc(maxlen);140 StrCpy(buf3,buf);141 while (*buf2) {142 StrFirstRem(buf2,"/",buf4);143 if (!*buf4)144 StrCpy(buf3,"/");145 else if (!StrCmp(buf4,"..")) {146 StrLastRem(buf3,"/");147 if (!*buf3)148 StrCpy(buf3,"/");149 } else if (!StrCmp(buf4,"~")) {150 Free(buf3);151 buf3=MAlloc(StrLen(blkdev.home_dir+2)+1+StrLen(buf2)+1);152 StrCpy(buf3,blkdev.home_dir+2);153 *drv=*blkdev.home_dir;154 } else if (!StrCmp(buf4,"."));155 else if (*buf4) {156 if (StrCmp(buf3,"/"))157 CatPrint(buf3,"/");158 CatPrint(buf3,buf4);159 }160 }161 Free(buf);162 res=MAlloc(StrLen(buf3)+3);163 StrCpy(res,drv);164 StrCpy(res+2,buf3);165 Free(buf2);166 Free(buf3);167 Free(buf4);168 Free(free_dirname);169 return res;170}171 172U8 *FileNameAbs(U8 *_filename,I64 fuf_flags=0)173{//Absolute filename. Accepts FUF_Z_OR_NOT_Z, FUF_SCAN_PARENTS.174 U8 *res,*filename,*buf,*buf_file,*buf_dir,*free_filename,*free_buf;175 CDirEntry de;176 free_filename=filename=MStrUtil(_filename,177 SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);178 free_buf=buf=StrNew(filename);179 if (*buf && buf[1]==':') {180 buf+=2;181 filename+=2;182 }183 buf_file=MAlloc(StrLen(free_filename)+1);184 StrLastRem(buf,"/",buf_file);185 if (*filename=='/' && !*buf)186 StrCpy(buf,"/");187 buf_dir=DirNameAbs(free_buf);188 Free(free_buf);189 res=MAlloc(StrLen(buf_dir)+1+StrLen(buf_file)+1);190 StrCpy(res,buf_dir);191 if (res[StrLen(res)-1]!='/')192 CatPrint(res,"/");193 CatPrint(res,buf_file);194 Free(buf_file);195 Free(buf_dir);196 Free(free_filename);197 if (fuf_flags && FileFind(res,&de,fuf_flags|FUF_JUST_FILES)) {198 Free(res);199 res=de.full_name;200 }201 return res;202}203 204U8 *ExtChg(U8 *filename,U8 *extension)205{//Change filename extension.206 U8 *res=MAlloc(StrLen(filename)+1+StrLen(extension)+1);207 StrCpy(res,filename);208 if (FileExtDot(filename))209 FileExtRem(res);210 return CatPrint(res,".%s",extension);211}212 213U8 *ExtDft(U8 *filename,U8 *extension)214{//Give extension if has none.215 U8 *res=MAlloc(StrLen(filename)+1+StrLen(extension)+1);216 StrCpy(res,filename);217 if (!FileExtDot(filename))218 CatPrint(res,".%s",extension);219 return res;220}221 222CDirEntry *Cd2DirEntry(CDirEntry *tmpde,U8 *abs_name)223{224 I64 i;225 while (tmpde) {226 i=StrLen(tmpde->full_name);227 if (StrNCmp(tmpde->full_name,abs_name,i)||228 i && tmpde->full_name[i-1]!='/' && abs_name[i] && abs_name[i]!='/')229 tmpde=tmpde->next;230 else231 if (StrLen(abs_name)==i)232 return tmpde;233 else234 return Cd2DirEntry(tmpde->sub,abs_name);235 }236 return NULL;237}238 239I64 FileAttr(U8 *name,I64 attr=0)240{241 if (IsDotZ(name))242 attr|=RS_ATTR_COMPRESSED;243 else244 attr&=~RS_ATTR_COMPRESSED;245 if (IsDotC(name))246 attr|=RS_ATTR_CONTIGUOUS;247 return attr;248}249 250Bool FileNameChk(U8 *filename)251{//Return check for valid filename, not checking existence.252 U8 *ptr=filename;253 if (!filename) return FALSE;254 if (!*ptr) return FALSE;255 if (*ptr=='.') {256 if (!ptr[1]) return TRUE;257 if (ptr[1]=='.' && !ptr[2]) return TRUE;258 }259 if (StrLen(filename)>=CDIR_FILENAME_LEN) return FALSE;260 while (*ptr)261 if (!Bt(char_bmp_filename,*ptr++))262 return FALSE;263 return TRUE;264}265 266U8 *ToggleZorNotZ(U8 *name)267{//MAlloc name with Z if not Z or vice versa.268 U8 *res;269 if (IsDotZ(name)) {270 res=StrNew(name);271 res[StrLen(name)-2]=0;272 } else273 res=MStrPrint("%s.Z",name);274 return res;275}276 277U8 *FileNameTmpTxt()278{//Make pretty-safe tmp filename in home dir.279 return MStrPrint("~/SysTmp%X.DD.Z",GetTSC>>8&0xFFFFFFFF);280}281 282U8 *DirCur(CTask *task=NULL,CTask *mem_task=NULL)283{//MAlloc copy of cur dir with drv letter.284 U8 *st;285 if (!task) task=Fs;286 if (!task->cur_dir)287 return NULL;288 st=MAlloc(StrLen(task->cur_dir)+3,mem_task);289 *st=Drv2Let(task->cur_dv);290 st[1]=':';291 StrCpy(st+2,task->cur_dir);292 return st;293}294 295U8 *DirFile(U8 *dirname,U8 *name=NULL,U8 *_extension=NULL)296{/*Strips file from dirname, scans for file upward until found or297returns default.298 299("/Kernel/KHashA.HC.Z",NULL,NULL) returns "D:/Kernel"300("/Kernel",NULL,"PRJ.Z") returns "D:/Kernel/Kernel.PRJ.Z"301("/Kernel/BlkDev",NULL,"PRJ.Z") returns "D:/Kernel/Kernel.PRJ.Z"302("/Apps/Psalmody","Load","HC.Z") returns "D:/Apps/Psalmody/Load.HC.Z"303*/304 U8 *st=DirNameAbs(dirname),*st2,*st3,*res,*dft=NULL,*ext;305 if (_extension && *_extension) {306 if (*_extension=='.')307 ext=StrNew(_extension);308 else309 ext=MStrPrint(".%s",_extension);310 } else311 ext=StrNew("");312 while (StrOcc(st,'/')&&!IsDir(st))313 StrLastRem(st,"/");314 while (StrOcc(st,'/')) {315 st2=StrNew(st);316 st3=StrNew(st);317 StrLastRem(st2,"/",st3);318 319 if (name)320 res=MStrPrint("%s/%s%s",st,name,ext);321 else {322 if (*ext)323 res=MStrPrint("%s/%s%s",st,st3,ext);324 else325 res=StrNew(st);326 }327 if (!dft)328 dft=StrNew(res);329 if (!*ext && (!name||!*name) || FileFind(res)) {330 Free(st3);331 Free(st2);332 Free(st);333 Free(dft);334 Free(ext);335 return res;336 }337 Free(st);338 st=st2;339 Free(st3);340 }341 Free(st);342 Free(ext);343 return dft;344}345 