diff --git a/cinera/cinera.c b/cinera/cinera.c index 27f78c4..8258453 100644 --- a/cinera/cinera.c +++ b/cinera/cinera.c @@ -23,14 +23,12 @@ typedef struct version CINERA_APP_VERSION = { .Major = 0, .Minor = 8, - .Patch = 14 + .Patch = 13 }; #include // NOTE(matt): varargs #include // NOTE(matt): printf, sprintf, vsprintf, fprintf, perror -#define __USE_XOPEN_EXTENDED // NOTE(matt): realpath() #include // NOTE(matt): calloc, malloc, free -#undef __USE_XOPEN_EXTENDED #include // NOTE(matt): getopts #include #include @@ -4076,9 +4074,26 @@ SeekBufferForString(buffer *Buffer, char *String, void ResolvePath(char **Path) { - char *Result = realpath(*Path, 0); + buffer B; + ClaimBuffer(&B, BID_RESOLVED_PATH, StringLength(*Path) + 1); + CopyStringToBufferNoFormat(&B, Wrap0(*Path)); + + B.Ptr = B.Location; + while(SeekBufferForString(&B, "/../", C_SEEK_FORWARDS, C_SEEK_END) == RC_SUCCESS) + { + char *NextComponentHead = B.Ptr; + int RemainingChars = StringLength(NextComponentHead); + --B.Ptr; + SeekBufferForString(&B, "/", C_SEEK_BACKWARDS, C_SEEK_BEFORE); + SeekBufferForString(&B, "/", C_SEEK_BACKWARDS, C_SEEK_START); + CopyStringToBufferNoFormat(&B, Wrap0(NextComponentHead)); + Clear(B.Ptr, B.Size - (B.Ptr - B.Location)); + B.Ptr -= RemainingChars; + } + Free(*Path); - *Path = Result; + ExtendString0(Path, Wrap0(B.Location)); + DeclaimBuffer(&B); } char *