Files
kerep/src/Filesystem/path.c
2023-06-08 18:41:05 +06:00

89 lines
2.4 KiB
C

#include "filesystem.h"
char* __path_concat(allocator_ptr al, u32 n, ...){
char** parts=(char**)allocator_alloc(al, n*sizeof(char*));
u32* lengths=allocator_alloc(al, n*sizeof(u32));
u32 totalLength=0;
// reading args from va_list
va_list vl;
va_start(vl, n);
for(u16 i=0; i<n; i++){
char* part=va_arg(vl,char*);
i16 length=cptr_length(part);
parts[i]=part;
lengths[i]=length;
totalLength+=length;
}
va_end(vl);
// allocating memory for output value
char* totality=allocator_alloc(al, totalLength+1);
const char* output=totality;
totality[totalLength]=0;
// copying content of all strings to rezult
u16 k=0;
for(; k<n-1; k++){
memcpy(totality, parts[k], lengths[k]);
totality+=lengths[k];
*totality=path_sep;
totality++;
}
memcpy(totality, parts[k], lengths[k]);
allocator_free(al, lengths);
allocator_free(al, parts);
return output;
}
char* path_fixSeparators(allocator_ptr al, const char* path){
char* pathCopy=cptr_copy(al, path);
char c;
while((c=*pathCopy)){
if(c==path_notSep)
*pathCopy=path_sep;
pathCopy++;
}
return pathCopy;
}
Maybe path_throwIfEscapes(const char* path){
LinearAllocator _al; LinearAllocator_construct(&_al, 128);
allocator_ptr al=&_al.base;
if(cptr_contains(path,".."))
safethrow(cptr_concat(al, "path <",path,"> uses <..>, that's not allowed"),
LinearAllocator_destruct(&_al));
LinearAllocator_destruct(&_al);
return MaybeNull;
}
char* path_parentDir(allocator_ptr al, char* dir){
char* copy=cptr_copy(al, dir);
i32 length=cptr_length(copy);
i32 i=cptr_lastIndexOfChar(copy,path_sep);
if(i!=-1 && i==length-1){
copy[length-1]=0;
i=cptr_lastIndexOfChar(copy,path_sep);
}
if(i==-1){
allocator_free(al, copy);
copy=allocator_alloc(al, 2);
copy[0]='.';
copy[1]=0;
}
return copy;
}
char* path_basename(allocator_ptr al, char* path, bool with_extension){
i32 nameIndex=cptr_lastIndexOfChar(path, path_sep)+1;
string rezult=string_fromCptr(path+nameIndex);
if(!with_extension){
i32 extIndex=cptr_lastIndexOfChar(rezult.ptr, '.');
if(extIndex!=0 && extIndex!=-1)
rezult.length=extIndex;
}
return string_extract(al, rezult);
}