diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 04:23:18 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 04:23:18 +0000 |
commit | b90161ccd3b318f3314a23cb10c387651ad35831 (patch) | |
tree | a47dc087160299ce02d728cbf031d84af6281537 /compat | |
parent | Adding upstream version 2.1.30. (diff) | |
download | libyang2-upstream.tar.xz libyang2-upstream.zip |
Adding upstream version 2.1.148.upstream/2.1.148upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/compat.c | 60 | ||||
-rw-r--r-- | compat/compat.h.in | 18 | ||||
-rw-r--r-- | compat/posix-shims/strings.h | 8 |
3 files changed, 46 insertions, 40 deletions
diff --git a/compat/compat.c b/compat/compat.c index 5fb2be8..24f235c 100644 --- a/compat/compat.c +++ b/compat/compat.c @@ -86,9 +86,9 @@ vasprintf(char **strp, const char *fmt, va_list ap) ssize_t getline(char **lineptr, size_t *n, FILE *stream) { - static char line[256]; + static char chunk[256]; char *ptr; - ssize_t len; + ssize_t len, written; if (!lineptr || !n) { errno = EINVAL; @@ -99,28 +99,31 @@ getline(char **lineptr, size_t *n, FILE *stream) return -1; } - if (!fgets(line, 256, stream)) { - return -1; - } - - ptr = strchr(line, '\n'); - if (ptr) { - *ptr = '\0'; - } - - len = strlen(line); - - if (len + 1 < 256) { - ptr = realloc(*lineptr, 256); - if (!ptr) { - return -1; + *n = *lineptr ? *n : 0; + written = 0; + while (fgets(chunk, sizeof(chunk), stream)) { + len = strlen(chunk); + if (written + len > *n) { + ptr = realloc(*lineptr, *n + sizeof(chunk)); + if (!ptr) { + return -1; + } + *lineptr = ptr; + *n = *n + sizeof(chunk); } - *lineptr = ptr; - *n = 256; + memcpy(*lineptr + written, &chunk, len); + written += len; + if ((*lineptr)[written - 1] == '\n') { + break; + } + } + if (written) { + (*lineptr)[written] = '\0'; + } else { + written = -1; } - strcpy(*lineptr, line); - return len; + return written; } #endif @@ -322,21 +325,6 @@ gmtime_r(const time_t *timep, struct tm *result) #endif #endif -#ifndef HAVE_DIRNAME -#ifdef _WIN32 -#include <shlwapi.h> -char * -dirname(char *path) -{ - PathRemoveFileSpecA(path); - return path; -} - -#else -#error No dirname() implementation for this platform is available. -#endif -#endif - #ifndef HAVE_SETENV #ifdef _WIN32 int diff --git a/compat/compat.h.in b/compat/compat.h.in index c697d6c..3baa489 100644 --- a/compat/compat.h.in +++ b/compat/compat.h.in @@ -3,7 +3,7 @@ * @author Michal Vasko <mvasko@cesnet.cz> * @brief compatibility functions header * - * Copyright (c) 2021 CESNET, z.s.p.o. + * Copyright (c) 2021 - 2023 CESNET, z.s.p.o. * * This source code is licensed under BSD 3-Clause License (the "License"). * You may not use this file except in compliance with the License. @@ -65,14 +65,12 @@ #cmakedefine HAVE_STRCHRNUL #cmakedefine HAVE_GET_CURRENT_DIR_NAME #cmakedefine HAVE_PTHREAD_MUTEX_TIMEDLOCK -#cmakedefine HAVE_TM_GMTOFF -#cmakedefine HAVE_TIME_H_TIMEZONE #cmakedefine HAVE_REALPATH #cmakedefine HAVE_LOCALTIME_R #cmakedefine HAVE_GMTIME_R +#cmakedefine HAVE_TIMEGM #cmakedefine HAVE_STRPTIME #cmakedefine HAVE_MMAP -#cmakedefine HAVE_DIRNAME #cmakedefine HAVE_STRCASECMP #cmakedefine HAVE_SETENV @@ -188,6 +186,18 @@ char *realpath(const char *path, char *resolved_path); struct tm *localtime_r(const time_t *timep, struct tm *result); #endif +#ifndef HAVE_GMTIME_R +struct tm *gmtime_r(const time_t *timep, struct tm *result); +#endif + +#ifndef HAVE_TIMEGM +# if defined (_WIN32) +# define timegm _mkgmtime +# else +# error No timegm() implementation for this platform is available. +# endif +#endif + #ifndef HAVE_STRPTIME char *strptime(const char *s, const char *format, struct tm *tm); #endif diff --git a/compat/posix-shims/strings.h b/compat/posix-shims/strings.h index c917a66..1ac0519 100644 --- a/compat/posix-shims/strings.h +++ b/compat/posix-shims/strings.h @@ -7,3 +7,11 @@ #error No strcasecmp() implementation for this platform is available. #endif #endif + +#ifndef HAVE_STRNCASECMP +#ifdef _MSC_VER +#define strncasecmp _strnicmp +#else +#error No strncasecmp() implementation for this platform is available. +#endif +#endif |