See: https://gist.github.com/ingramj/1105106/adfad1a7b1f0575dd7737c296d644856f2c2d074 --- lib/cmdline.c.orig 2020-06-13 17:42:45.000000000 +0800 +++ lib/cmdline.c 2022-05-31 20:35:42.000000000 +0800 @@ -39,6 +39,97 @@ #include #include +#if defined(__APPLE__) +#if __STDC_VERSION__ >= 199901L +/* restrict is a keyword */ +#else +# define restrict +#endif + +#ifndef _POSIX_SOURCE +typedef long ssize_t; +#define SSIZE_MAX LONG_MAX +#endif + +ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delimiter, + FILE *restrict stream); +ssize_t getline(char **restrict lineptr, size_t *restrict n, + FILE *restrict stream); + +#define _GETDELIM_GROWBY 128 /* amount to grow line buffer by */ +#define _GETDELIM_MINLEN 4 /* minimum line buffer size */ + +ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delimiter, + FILE *restrict stream) +{ + char *buf, *pos; + int c; + ssize_t bytes; + + if (lineptr == NULL || n == NULL) { + errno = EINVAL; + return -1; + } + if (stream == NULL) { + errno = EBADF; + return -1; + } + + /* resize (or allocate) the line buffer if necessary */ + buf = *lineptr; + if (buf == NULL || *n < _GETDELIM_MINLEN) { + buf = realloc(*lineptr, _GETDELIM_GROWBY); + if (buf == NULL) { + /* ENOMEM */ + return -1; + } + *n = _GETDELIM_GROWBY; + *lineptr = buf; + } + + /* read characters until delimiter is found, end of file is reached, + or an error occurs. */ + bytes = 0; + pos = buf; + while ((c = getc(stream)) != EOF) { + if (bytes + 1 >= SSIZE_MAX) { + errno = EOVERFLOW; + return -1; + } + bytes++; + if (bytes >= *n - 1) { + buf = realloc(*lineptr, *n + _GETDELIM_GROWBY); + if (buf == NULL) { + /* ENOMEM */ + return -1; + } + *n += _GETDELIM_GROWBY; + pos = buf + bytes - 1; + *lineptr = buf; + } + + *pos++ = (char) c; + if (c == delimiter) { + break; + } + } + + if (ferror(stream) || (feof(stream) && (bytes == 0))) { + /* EOF, or an error from getc(). */ + return -1; + } + + *pos = '\0'; + return bytes; +} + +ssize_t getline(char **restrict lineptr, size_t *restrict n, + FILE *restrict stream) +{ + return getdelim(lineptr, n, '\n', stream); +} +#endif + #include "cmdline.h" #include "formats.h" #include "hash-utility.h" # See: https://github.com/hboetes/mg/issues/7#issuecomment-475869095 --- lib/traverse.c.orig 2020-06-13 17:42:45.000000000 +0800 +++ lib/traverse.c 2022-05-31 19:48:09.000000000 +0800 @@ -41,6 +41,12 @@ #include "fts/fts.h" +#if defined(__APPLE__) +#define st_atim st_atimespec +#define st_ctim st_ctimespec +#define st_mtim st_mtimespec +#endif + ////////////////////// // TRAVERSE SESSION // //////////////////////