Fix basename() and dirname()

This commit is contained in:
Justine Tunney 2022-04-06 00:13:44 -07:00
parent 9b11206ae3
commit 04d39d47f1
41 changed files with 489 additions and 207 deletions

View file

@ -1,7 +1,7 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi
Copyright 2021 Justine Alexandra Roberts Tunney
Copyright 2020 Justine Alexandra Roberts Tunney
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted, provided that the
@ -16,33 +16,21 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/
#include "libc/dce.h"
#include "libc/str/path.h"
#include "libc/str/str.h"
/**
* Returns true if pathname is absolute, e.g.
* Returns true if pathname is considered absolute.
*
* - `/home/jart/foo.txt` is absolute
* - `C:/Users/jart/foo.txt` is absolute on NT
* - `C:\Users\jart\foo.txt` is absolute on NT
* - `\??\C:\Users\jart\foo.txt` is absolute on NT
* - `\\.\C:\Users\jart\foo.txt` is absolute on NT
* - `/Users/jart/foo.txt` we consider it absolute enough on NT
* - `\Users\jart\foo.txt` we consider it absolute enough on NT
* - `C:/Users/jart/foo.txt` is absolute on Windows
* - `C:\Users\jart\foo.txt` is absolute on Windows
* - `\??\C:\Users\jart\foo.txt` is absolute on Windows
* - `\\.\C:\Users\jart\foo.txt` is absolute on Windows
* - `/Users/jart/foo.txt` is effectively absolute on Windows
* - `\Users\jart\foo.txt` is effectively absolute on Windows
*
* Please note that the recommended approach to using Cosmopolitan is to
* not use absolute paths at all. If you do use absolute paths then it's
* a good idea on Windows to stay within the C: drive. This is because
* Cosmopolitan Libc doesn't create a virtual filesystem layer and
* instead just replaces `\` characters with `/`.
*/
bool _isabspath(const char *p) {
if (*p == '/') {
return true;
}
if (IsWindows() &&
(*p == '/' || *p == '\\' || (isalpha(p[0]) && p[1] == ':'))) {
return true;
}
return false;
bool _isabspath(const char *path) {
return _classifypath(path) & _PATH_ABS;
}