From 0d7bb871e6d410271fba4c13c29e2ab2033a24d7 Mon Sep 17 00:00:00 2001 From: turbocat Date: Sat, 19 Jun 2021 20:17:05 +0000 Subject: [PATCH] Newlibc: Added getcwd and dirname git-svn-id: svn://kolibrios.org@8879 a494cfbc-eb01-0410-851d-a64ba20cac60 --- contrib/sdk/sources/newlib/libc/Makefile | 7 +- contrib/sdk/sources/newlib/libc/dirent/dir.c | 12 +++- .../sdk/sources/newlib/libc/dirent/ksys_fs.h | 10 +++ contrib/sdk/sources/newlib/libc/libc.def | 2 + .../sdk/sources/newlib/libc/string/dirname.c | 67 +++++++++++++++++++ 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 contrib/sdk/sources/newlib/libc/string/dirname.c diff --git a/contrib/sdk/sources/newlib/libc/Makefile b/contrib/sdk/sources/newlib/libc/Makefile index c6787cdac0..fd9a3ce267 100644 --- a/contrib/sdk/sources/newlib/libc/Makefile +++ b/contrib/sdk/sources/newlib/libc/Makefile @@ -325,7 +325,8 @@ STRING_SRCS= \ wmemcmp.c \ wmemcpy.c \ wmemmove.c \ - wmemset.c + wmemset.c \ + dirname.c STDIO_SRCS= \ @@ -600,8 +601,8 @@ $(NAME).dll: $(LIB_OBJS) $(SRC_DEP) Makefile install: libc.dll libc.dll.a libdll.a mv -f libc.dll $(SDK_DIR)/bin - mv -f libc.dll.a $(INSTALLDIR) - mv -f libdll.a $(INSTALLDIR) + mv -f libc.dll.a $(INSTALLDIR)/lib + mv -f libdll.a $(INSTALLDIR)/lib libdll.a: $(LIBDLL_OBJS) Makefile $(AR) $(ARFLAGS) libdll.a $(LIBDLL_OBJS) diff --git a/contrib/sdk/sources/newlib/libc/dirent/dir.c b/contrib/sdk/sources/newlib/libc/dirent/dir.c index 6c31c68d28..4f1da97b73 100644 --- a/contrib/sdk/sources/newlib/libc/dirent/dir.c +++ b/contrib/sdk/sources/newlib/libc/dirent/dir.c @@ -13,4 +13,14 @@ int mkdir(const char* dir, unsigned fake_mode){ int chdir(char* dir){ _ksys_setcwd(dir); return 0; -} \ No newline at end of file +} + +char *getcwd(char *buf, unsigned size){ + if(!buf){ + if((buf = malloc(size))==NULL){ + return NULL; + } + } + _ksys_getcwd(buf, size); + return(buf); +} diff --git a/contrib/sdk/sources/newlib/libc/dirent/ksys_fs.h b/contrib/sdk/sources/newlib/libc/dirent/ksys_fs.h index 410a9d7d13..5dc360dc06 100644 --- a/contrib/sdk/sources/newlib/libc/dirent/ksys_fs.h +++ b/contrib/sdk/sources/newlib/libc/dirent/ksys_fs.h @@ -107,4 +107,14 @@ int _ksys_free(void *mem) return val; } +static inline +int _ksys_getcwd(char* buf, int bufsize){ + register int val; + asm_inline( + "int $0x40" + :"=a"(val):"a"(30), "b"(2), "c"(buf), "d"(bufsize) + ); + return val; +} + #endif diff --git a/contrib/sdk/sources/newlib/libc/libc.def b/contrib/sdk/sources/newlib/libc/libc.def index b63cd54fe9..6c60f829d6 100644 --- a/contrib/sdk/sources/newlib/libc/libc.def +++ b/contrib/sdk/sources/newlib/libc/libc.def @@ -518,3 +518,5 @@ EXPORTS mkdir rmdir chdir + dirname + getcwd diff --git a/contrib/sdk/sources/newlib/libc/string/dirname.c b/contrib/sdk/sources/newlib/libc/string/dirname.c new file mode 100644 index 0000000000..b889f7d0c6 --- /dev/null +++ b/contrib/sdk/sources/newlib/libc/string/dirname.c @@ -0,0 +1,67 @@ +/* dirname - return directory part of PATH. + Copyright (C) 1996-2019 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +char * +dirname (char *path) +{ + static const char dot[] = "."; + char *last_slash; + /* Find last '/'. */ + last_slash = path != NULL ? strrchr (path, '/') : NULL; + if (last_slash != NULL && last_slash != path && last_slash[1] == '\0') + { + /* Determine whether all remaining characters are slashes. */ + char *runp; + for (runp = last_slash; runp != path; --runp) + if (runp[-1] != '/') + break; + /* The '/' is the last character, we have to look further. */ + if (runp != path) + last_slash = memrchr (path, '/', runp - path); + } + if (last_slash != NULL) + { + /* Determine whether all remaining characters are slashes. */ + char *runp; + for (runp = last_slash; runp != path; --runp) + if (runp[-1] != '/') + break; + /* Terminate the path. */ + if (runp == path) + { + /* The last slash is the first character in the string. We have to + return "/". As a special case we have to return "//" if there + are exactly two slashes at the beginning of the string. See + XBD 4.10 Path Name Resolution for more information. */ + if (last_slash == path + 1) + ++last_slash; + else + last_slash = path + 1; + } + else + last_slash = runp; + last_slash[0] = '\0'; + } + else + /* This assignment is ill-designed but the XPG specs require to + return a string containing "." in any case no directory part is + found and so a static and constant string is required. */ + path = (char *) dot; + return path; +} \ No newline at end of file