mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 15:28:30 +00:00
Fix some static analysis issues
This commit is contained in:
parent
fb54604b31
commit
f147d3dde9
30 changed files with 375 additions and 266 deletions
|
@ -16,6 +16,7 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/assert.h"
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/stdio/internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
|
@ -37,8 +38,8 @@
|
|||
* @return stream object if successful, or NULL w/ errno
|
||||
*/
|
||||
FILE *freopen(const char *pathname, const char *mode, FILE *stream) {
|
||||
int fd;
|
||||
FILE *res;
|
||||
int fd, fd2;
|
||||
unsigned flags;
|
||||
flags = fopenflags(mode);
|
||||
flockfile(stream);
|
||||
|
@ -46,19 +47,30 @@ FILE *freopen(const char *pathname, const char *mode, FILE *stream) {
|
|||
if (pathname) {
|
||||
/* open new stream, overwriting existing alloc */
|
||||
if ((fd = open(pathname, flags, 0666)) != -1) {
|
||||
dup3(fd, stream->fd, flags & O_CLOEXEC);
|
||||
fd2 = dup3(fd, stream->fd, flags & O_CLOEXEC);
|
||||
close(fd);
|
||||
stream->iomode = flags;
|
||||
stream->beg = 0;
|
||||
stream->end = 0;
|
||||
res = stream;
|
||||
if (fd2 != -1) {
|
||||
stream->fd = fd2;
|
||||
stream->iomode = flags;
|
||||
stream->beg = 0;
|
||||
stream->end = 0;
|
||||
res = stream;
|
||||
} else {
|
||||
res = NULL;
|
||||
}
|
||||
} else {
|
||||
res = NULL;
|
||||
}
|
||||
} else {
|
||||
fcntl(stream->fd, F_SETFD, !!(flags & O_CLOEXEC));
|
||||
fcntl(stream->fd, F_SETFL, flags & ~O_CLOEXEC);
|
||||
res = stream;
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wanalyzer-fd-use-without-check"
|
||||
if (fcntl(stream->fd, F_SETFD, !!(flags & O_CLOEXEC)) != -1 &&
|
||||
fcntl(stream->fd, F_SETFL, flags & ~O_CLOEXEC) != -1) {
|
||||
#pragma GCC diagnostic pop
|
||||
res = stream;
|
||||
} else {
|
||||
res = NULL;
|
||||
}
|
||||
}
|
||||
funlockfile(stream);
|
||||
return res;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set noet ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
│ │
|
||||
│ Musl Libc │
|
||||
|
@ -334,6 +334,8 @@ size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restri
|
|||
case UCS2:
|
||||
case UTF_16:
|
||||
l = 0;
|
||||
if (!scd)
|
||||
goto starved;
|
||||
if (!scd->state) {
|
||||
if (*inb < 2) goto starved;
|
||||
c = get_16((void *)*in, 0);
|
||||
|
@ -347,6 +349,8 @@ size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restri
|
|||
continue;
|
||||
case UTF_32:
|
||||
l = 0;
|
||||
if (!scd)
|
||||
goto starved;
|
||||
if (!scd->state) {
|
||||
if (*inb < 4) goto starved;
|
||||
c = get_32((void *)*in, 0);
|
||||
|
@ -398,6 +402,7 @@ size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restri
|
|||
if (!c) goto ilseq;
|
||||
break;
|
||||
case ISO2022_JP:
|
||||
if (!scd) goto starved;
|
||||
if (c >= 128) goto ilseq;
|
||||
if (c == '\033') {
|
||||
l = 3;
|
||||
|
|
|
@ -102,15 +102,24 @@ static int do_nftw(char *path,
|
|||
dfd = open(path, O_RDONLY | O_DIRECTORY);
|
||||
err = errno;
|
||||
if (dfd < 0 && err == EACCES) type = FTW_DNR;
|
||||
if (!fd_limit) close(dfd);
|
||||
if (!fd_limit) {
|
||||
close(dfd);
|
||||
dfd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
|
||||
if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) {
|
||||
if (dfd != -1)
|
||||
close(dfd);
|
||||
return r;
|
||||
}
|
||||
|
||||
for (; h; h = h->chain)
|
||||
if (h->dev == st.st_dev && h->ino == st.st_ino)
|
||||
if (h->dev == st.st_dev && h->ino == st.st_ino) {
|
||||
if (dfd != -1)
|
||||
close(dfd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((type == FTW_D || type == FTW_DP) && fd_limit) {
|
||||
if (dfd < 0) {
|
||||
|
|
|
@ -75,7 +75,10 @@ FILE *popen(const char *cmdline, const char *mode) {
|
|||
if ((f = fdopen(pipefds[dir], mode))) {
|
||||
switch ((pid = fork())) {
|
||||
case 0:
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wanalyzer-fd-leak"
|
||||
unassert(dup2(pipefds[!dir], !dir) == !dir);
|
||||
#pragma GCC diagnostic pop
|
||||
// we can't rely on cloexec because cocmd builtins don't execve
|
||||
if (pipefds[0] != !dir)
|
||||
unassert(!close(pipefds[0]));
|
||||
|
|
|
@ -69,7 +69,9 @@ int scandir(const char *path, struct dirent ***res,
|
|||
}
|
||||
errno = old_errno;
|
||||
|
||||
if (cmp) qsort(names, cnt, sizeof *names, (int (*)(const void *, const void *))cmp);
|
||||
if (cmp && names) {
|
||||
qsort(names, cnt, sizeof *names, (int (*)(const void *, const void *))cmp);
|
||||
}
|
||||
*res = names;
|
||||
return cnt;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ COSMOPOLITAN_C_START_
|
|||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § standard i/o ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
/* clang-format off */
|
||||
|
||||
struct FILE;
|
||||
typedef struct FILE FILE;
|
||||
|
@ -27,147 +28,146 @@ extern FILE *stdin;
|
|||
extern FILE *stdout;
|
||||
extern FILE *stderr;
|
||||
|
||||
errno_t ferror(FILE *) libcesque paramsnonnull();
|
||||
void clearerr(FILE *) libcesque paramsnonnull();
|
||||
int feof(FILE *) libcesque paramsnonnull();
|
||||
int getc(FILE *) libcesque paramsnonnull();
|
||||
int putc(int, FILE *) libcesque paramsnonnull();
|
||||
int fflush(FILE *) libcesque;
|
||||
int fpurge(FILE *) libcesque;
|
||||
int fgetc(FILE *) libcesque paramsnonnull();
|
||||
char *fgetln(FILE *, size_t *) libcesque paramsnonnull((1));
|
||||
int ungetc(int, FILE *) libcesque paramsnonnull();
|
||||
int fileno(FILE *) libcesque paramsnonnull() nosideeffect;
|
||||
int fputc(int, FILE *) libcesque paramsnonnull();
|
||||
int fputs(const char *, FILE *) libcesque paramsnonnull();
|
||||
int fputws(const wchar_t *, FILE *) libcesque paramsnonnull();
|
||||
void flockfile(FILE *) libcesque;
|
||||
void funlockfile(FILE *) libcesque paramsnonnull();
|
||||
int ftrylockfile(FILE *) libcesque paramsnonnull();
|
||||
char *fgets(char *, int, FILE *) libcesque paramsnonnull();
|
||||
wchar_t *fgetws(wchar_t *, int, FILE *) libcesque paramsnonnull();
|
||||
wint_t putwc(wchar_t, FILE *) libcesque paramsnonnull();
|
||||
wint_t fputwc(wchar_t, FILE *) libcesque paramsnonnull();
|
||||
errno_t ferror(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
void clearerr(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
int feof(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
int getc(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
int putc(int, FILE *) libcesque paramsnonnull() __read_write(2);
|
||||
int fflush(FILE *) libcesque __read_write(1);
|
||||
int fpurge(FILE *) libcesque __read_write(1);
|
||||
int fgetc(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
char *fgetln(FILE *, size_t *) libcesque paramsnonnull((1)) __read_write(1) __write_only(2);
|
||||
int ungetc(int, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
int fileno(FILE *) libcesque paramsnonnull() nosideeffect __write_only(1);
|
||||
int fputc(int, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
int fputs(const char *, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
int fputws(const wchar_t *, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
void flockfile(FILE *) libcesque __write_only(1);
|
||||
void funlockfile(FILE *) libcesque paramsnonnull() __write_only(1);
|
||||
int ftrylockfile(FILE *) libcesque paramsnonnull() __write_only(1);
|
||||
char *fgets(char *, int, FILE *) libcesque paramsnonnull() __write_only(1, 2) __read_write(3);
|
||||
wchar_t *fgetws(wchar_t *, int, FILE *) libcesque paramsnonnull() __write_only(1, 2) __read_write(3);
|
||||
wint_t putwc(wchar_t, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
wint_t fputwc(wchar_t, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
wint_t putwchar(wchar_t) libcesque;
|
||||
wint_t getwchar(void) libcesque;
|
||||
wint_t getwc(FILE *) libcesque paramsnonnull();
|
||||
wint_t fgetwc(FILE *) libcesque paramsnonnull();
|
||||
wint_t ungetwc(wint_t, FILE *) libcesque paramsnonnull();
|
||||
wint_t getwc(FILE *) libcesque paramsnonnull() __write_only(1);
|
||||
wint_t fgetwc(FILE *) libcesque paramsnonnull() __write_only(1);
|
||||
wint_t ungetwc(wint_t, FILE *) libcesque paramsnonnull() __write_only(2);
|
||||
int getchar(void) libcesque;
|
||||
int putchar(int) libcesque;
|
||||
int puts(const char *) libcesque;
|
||||
ssize_t getline(char **, size_t *, FILE *) libcesque paramsnonnull();
|
||||
ssize_t getdelim(char **, size_t *, int, FILE *) libcesque paramsnonnull();
|
||||
FILE *fopen(const char *, const char *) libcesque paramsnonnull((2)) __wur;
|
||||
FILE *fdopen(int, const char *) libcesque paramsnonnull() __wur;
|
||||
FILE *fmemopen(void *, size_t, const char *) libcesque paramsnonnull((3)) __wur;
|
||||
FILE *freopen(const char *, const char *, FILE *) paramsnonnull((2, 3));
|
||||
size_t fread(void *, size_t, size_t, FILE *) libcesque paramsnonnull((4));
|
||||
size_t fwrite(const void *, size_t, size_t, FILE *) paramsnonnull((4));
|
||||
int fclose(FILE *) libcesque;
|
||||
int fseek(FILE *, long, int) libcesque paramsnonnull();
|
||||
long ftell(FILE *) libcesque paramsnonnull();
|
||||
int fseeko(FILE *, int64_t, int) libcesque paramsnonnull();
|
||||
int64_t ftello(FILE *) libcesque paramsnonnull();
|
||||
void rewind(FILE *) libcesque paramsnonnull();
|
||||
int fopenflags(const char *) libcesque paramsnonnull();
|
||||
void setlinebuf(FILE *) libcesque;
|
||||
void setbuf(FILE *, char *) libcesque;
|
||||
void setbuffer(FILE *, char *, size_t) libcesque;
|
||||
int setvbuf(FILE *, char *, int, size_t) libcesque;
|
||||
int pclose(FILE *) libcesque;
|
||||
char *ctermid(char *) libcesque;
|
||||
void perror(const char *) libcesque relegated;
|
||||
int puts(const char *) libcesque __read_only(1);
|
||||
|
||||
ssize_t getline(char **, size_t *, FILE *) libcesque paramsnonnull() __read_write(1) __read_write(2) __read_write(3);
|
||||
ssize_t getdelim(char **, size_t *, int, FILE *) libcesque paramsnonnull() __read_write(1) __read_write(2) __read_write(4);
|
||||
FILE *fopen(const char *, const char *) libcesque paramsnonnull((2)) __read_only(1) __read_only(2) __wur;
|
||||
FILE *fdopen(int, const char *) libcesque paramsnonnull() __read_only(2) __wur;
|
||||
FILE *fmemopen(void *, size_t, const char *) libcesque paramsnonnull((3)) __read_write(1) __read_only(3) __wur;
|
||||
FILE *freopen(const char *, const char *, FILE *) paramsnonnull((2, 3)) __read_only(1) __read_only(2) __read_write(3);
|
||||
size_t fread(void *, size_t, size_t, FILE *) libcesque paramsnonnull((4)) __write_only(1) __read_write(4);
|
||||
size_t fwrite(const void *, size_t, size_t, FILE *) paramsnonnull((4)) __read_only(1) __read_write(4);
|
||||
int fclose(FILE *) libcesque __read_write(1);
|
||||
int fseek(FILE *, long, int) libcesque paramsnonnull() __read_write(1);
|
||||
long ftell(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
int fseeko(FILE *, int64_t, int) libcesque paramsnonnull() __read_write(1);
|
||||
int64_t ftello(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
void rewind(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
int fopenflags(const char *) libcesque paramsnonnull() __read_only(1);
|
||||
void setlinebuf(FILE *) libcesque __read_write(1);
|
||||
void setbuf(FILE *, char *) libcesque __read_write(1) __write_only(2);
|
||||
void setbuffer(FILE *, char *, size_t) libcesque __read_write(1) __write_only(2);
|
||||
int setvbuf(FILE *, char *, int, size_t) libcesque __read_write(1);
|
||||
int pclose(FILE *) libcesque __read_write(1);
|
||||
char *ctermid(char *) libcesque __write_only(1);
|
||||
void perror(const char *) libcesque relegated __read_only(1);
|
||||
|
||||
typedef uint64_t fpos_t;
|
||||
char *gets(char *) libcesque paramsnonnull();
|
||||
int fgetpos(FILE *, fpos_t *) libcesque paramsnonnull();
|
||||
int fsetpos(FILE *, const fpos_t *) libcesque paramsnonnull();
|
||||
char *gets(char *) libcesque paramsnonnull() __write_only(1);
|
||||
int fgetpos(FILE *, fpos_t *) libcesque paramsnonnull() __read_write(1) __write_only(2);
|
||||
int fsetpos(FILE *, const fpos_t *) libcesque paramsnonnull() __read_write(1) __read_only(2);
|
||||
|
||||
FILE *tmpfile(void) libcesque __wur;
|
||||
char *tmpnam(char *) libcesque __wur;
|
||||
char *tmpnam_r(char *) libcesque __wur;
|
||||
char *tmpnam(char *) libcesque __write_only(1) __wur;
|
||||
char *tmpnam_r(char *) libcesque __write_only(1) __wur;
|
||||
|
||||
FILE *popen(const char *, const char *) libcesque;
|
||||
FILE *popen(const char *, const char *) libcesque __read_only(1) __read_only(2);
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § standard i/o » formatting ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
int printf(const char *, ...) printfesque(1) paramsnonnull((1)) libcesque;
|
||||
int vprintf(const char *, va_list) paramsnonnull() libcesque;
|
||||
int fprintf(FILE *, const char *, ...) printfesque(2)
|
||||
paramsnonnull((1, 2)) libcesque;
|
||||
int vfprintf(FILE *, const char *, va_list) paramsnonnull() libcesque;
|
||||
int scanf(const char *, ...) libcesque scanfesque(1);
|
||||
int vscanf(const char *, va_list) libcesque;
|
||||
int fscanf(FILE *, const char *, ...) libcesque scanfesque(2);
|
||||
int vfscanf(FILE *, const char *, va_list) libcesque;
|
||||
int printf(const char *, ...) printfesque(1) paramsnonnull((1)) libcesque __read_only(1);
|
||||
int vprintf(const char *, va_list) paramsnonnull() libcesque __read_only(1);
|
||||
int fprintf(FILE *, const char *, ...) printfesque(2) paramsnonnull((1, 2)) libcesque __read_write(1) __read_only(2);
|
||||
int vfprintf(FILE *, const char *, va_list) paramsnonnull() libcesque __read_write(1) __read_only(2);
|
||||
int scanf(const char *, ...) libcesque scanfesque(1) __read_only(1);
|
||||
int vscanf(const char *, va_list) libcesque __read_only(1);
|
||||
int fscanf(FILE *, const char *, ...) libcesque scanfesque(2) __read_write(1) __read_only(2);
|
||||
int vfscanf(FILE *, const char *, va_list) libcesque __read_write(1) __read_only(2);
|
||||
|
||||
int snprintf(char *, size_t, const char *, ...) printfesque(3) libcesque;
|
||||
int vsnprintf(char *, size_t, const char *, va_list) libcesque;
|
||||
int sprintf(char *, const char *, ...) libcesque;
|
||||
int vsprintf(char *, const char *, va_list) libcesque;
|
||||
int snprintf(char *, size_t, const char *, ...) printfesque(3) libcesque __write_only(1) __read_only(3);
|
||||
int vsnprintf(char *, size_t, const char *, va_list) libcesque __write_only(1) __read_only(3);
|
||||
int sprintf(char *, const char *, ...) libcesque __write_only(1) __read_only(2);
|
||||
int vsprintf(char *, const char *, va_list) libcesque __write_only(1) __read_only(2);
|
||||
|
||||
int fwprintf(FILE *, const wchar_t *, ...) libcesque;
|
||||
int fwscanf(FILE *, const wchar_t *, ...) libcesque;
|
||||
int swprintf(wchar_t *, size_t, const wchar_t *, ...) libcesque;
|
||||
int swscanf(const wchar_t *, const wchar_t *, ...) libcesque;
|
||||
int vfwprintf(FILE *, const wchar_t *, va_list) libcesque;
|
||||
int vfwscanf(FILE *, const wchar_t *, va_list) libcesque;
|
||||
int vswprintf(wchar_t *, size_t, const wchar_t *, va_list) libcesque;
|
||||
int vswscanf(const wchar_t *, const wchar_t *, va_list) libcesque;
|
||||
int vwprintf(const wchar_t *, va_list) libcesque;
|
||||
int vwscanf(const wchar_t *, va_list) libcesque;
|
||||
int wprintf(const wchar_t *, ...) libcesque;
|
||||
int wscanf(const wchar_t *, ...) libcesque;
|
||||
int fwide(FILE *, int) libcesque;
|
||||
int fwprintf(FILE *, const wchar_t *, ...) libcesque __read_write(1) __read_only(2);
|
||||
int fwscanf(FILE *, const wchar_t *, ...) libcesque __read_write(1) __read_only(2);
|
||||
int swprintf(wchar_t *, size_t, const wchar_t *, ...) libcesque __write_only(1) __read_only(3);
|
||||
int swscanf(const wchar_t *, const wchar_t *, ...) libcesque __read_only(1) __read_only(2);
|
||||
int vfwprintf(FILE *, const wchar_t *, va_list) libcesque __read_write(1) __read_only(2);
|
||||
int vfwscanf(FILE *, const wchar_t *, va_list) libcesque __read_write(1) __read_only(2);
|
||||
int vswprintf(wchar_t *, size_t, const wchar_t *, va_list) libcesque __write_only(1) __read_only(3);
|
||||
int vswscanf(const wchar_t *, const wchar_t *, va_list) libcesque __read_only(1) __read_only(2);
|
||||
int vwprintf(const wchar_t *, va_list) libcesque __read_only(1);
|
||||
int vwscanf(const wchar_t *, va_list) libcesque __read_only(1);
|
||||
int wprintf(const wchar_t *, ...) libcesque __read_only(1);
|
||||
int wscanf(const wchar_t *, ...) libcesque __read_only(1);
|
||||
int fwide(FILE *, int) libcesque __read_write(1);
|
||||
|
||||
int sscanf(const char *, const char *, ...) libcesque scanfesque(2);
|
||||
int vsscanf(const char *, const char *, va_list) libcesque;
|
||||
int sscanf(const char *, const char *, ...) libcesque scanfesque(2) __read_only(1) __read_only(2);
|
||||
int vsscanf(const char *, const char *, va_list) libcesque __read_only(1) __read_only(2);
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § standard i/o » allocating ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
int asprintf(char **, const char *, ...) printfesque(2)
|
||||
paramsnonnull((1, 2)) libcesque;
|
||||
int vasprintf(char **, const char *, va_list) paramsnonnull() libcesque;
|
||||
int asprintf(char **, const char *, ...) printfesque(2) paramsnonnull((1, 2)) libcesque __write_only(1);
|
||||
int vasprintf(char **, const char *, va_list) paramsnonnull() libcesque __write_only(1);
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § standard i/o » without mutexes ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
int getc_unlocked(FILE *) libcesque paramsnonnull();
|
||||
int puts_unlocked(const char *) libcesque;
|
||||
int getc_unlocked(FILE *) libcesque paramsnonnull() __read_write(1);
|
||||
int puts_unlocked(const char *) libcesque __read_only(1);
|
||||
int getchar_unlocked(void) libcesque;
|
||||
int putc_unlocked(int, FILE *) libcesque paramsnonnull();
|
||||
int putc_unlocked(int, FILE *) libcesque paramsnonnull() __read_write(2);
|
||||
int putchar_unlocked(int) libcesque;
|
||||
void clearerr_unlocked(FILE *) libcesque;
|
||||
int feof_unlocked(FILE *) libcesque;
|
||||
int ferror_unlocked(FILE *) libcesque;
|
||||
int fileno_unlocked(FILE *) libcesque;
|
||||
int fflush_unlocked(FILE *) libcesque;
|
||||
int fgetc_unlocked(FILE *) libcesque;
|
||||
int fputc_unlocked(int, FILE *) libcesque;
|
||||
size_t fread_unlocked(void *, size_t, size_t, FILE *) libcesque;
|
||||
size_t fwrite_unlocked(const void *, size_t, size_t, FILE *) libcesque;
|
||||
char *fgets_unlocked(char *, int, FILE *) libcesque;
|
||||
int fputs_unlocked(const char *, FILE *) libcesque;
|
||||
wint_t getwc_unlocked(FILE *) libcesque;
|
||||
void clearerr_unlocked(FILE *) libcesque __write_only(1);
|
||||
int feof_unlocked(FILE *) libcesque __read_only(1);
|
||||
int ferror_unlocked(FILE *) libcesque __read_only(1);
|
||||
int fileno_unlocked(FILE *) libcesque __read_only(1);
|
||||
int fflush_unlocked(FILE *) libcesque __read_write(1);
|
||||
int fgetc_unlocked(FILE *) libcesque __read_write(1);
|
||||
int fputc_unlocked(int, FILE *) libcesque __read_write(2);
|
||||
size_t fread_unlocked(void *, size_t, size_t, FILE *) libcesque __write_only(1) __read_write(4);
|
||||
size_t fwrite_unlocked(const void *, size_t, size_t, FILE *) libcesque __read_only(1) __read_write(4);
|
||||
char *fgets_unlocked(char *, int, FILE *) libcesque __write_only(1) __read_write(3);
|
||||
int fputs_unlocked(const char *, FILE *) libcesque __read_only(1) __read_write(2);
|
||||
wint_t getwc_unlocked(FILE *) libcesque __read_write(1);
|
||||
wint_t getwchar_unlocked(void) libcesque;
|
||||
wint_t fgetwc_unlocked(FILE *) libcesque;
|
||||
wint_t fputwc_unlocked(wchar_t, FILE *) libcesque;
|
||||
wint_t putwc_unlocked(wchar_t, FILE *) libcesque;
|
||||
wint_t fgetwc_unlocked(FILE *) libcesque __read_write(1);
|
||||
wint_t fputwc_unlocked(wchar_t, FILE *) libcesque __read_write(2);
|
||||
wint_t putwc_unlocked(wchar_t, FILE *) libcesque __read_write(2);
|
||||
wint_t putwchar_unlocked(wchar_t) libcesque;
|
||||
wchar_t *fgetws_unlocked(wchar_t *, int, FILE *) libcesque;
|
||||
int fputws_unlocked(const wchar_t *, FILE *) libcesque;
|
||||
wint_t ungetwc_unlocked(wint_t, FILE *) libcesque paramsnonnull();
|
||||
int ungetc_unlocked(int, FILE *) libcesque paramsnonnull();
|
||||
int fseek_unlocked(FILE *, int64_t, int) libcesque paramsnonnull();
|
||||
ssize_t getdelim_unlocked(char **, size_t *, int, FILE *) paramsnonnull();
|
||||
int fprintf_unlocked(FILE *, const char *, ...) printfesque(2) libcesque;
|
||||
int vfprintf_unlocked(FILE *, const char *, va_list) paramsnonnull() libcesque;
|
||||
wchar_t *fgetws_unlocked(wchar_t *, int, FILE *) libcesque __write_only(1, 2) __read_write(3);
|
||||
int fputws_unlocked(const wchar_t *, FILE *) libcesque __read_only(1) __read_write(2);
|
||||
wint_t ungetwc_unlocked(wint_t, FILE *) libcesque paramsnonnull() __read_write(2);
|
||||
int ungetc_unlocked(int, FILE *) libcesque paramsnonnull() __read_write(2);
|
||||
int fseek_unlocked(FILE *, int64_t, int) libcesque paramsnonnull() __read_write(1);
|
||||
ssize_t getdelim_unlocked(char **, size_t *, int, FILE *) paramsnonnull() __read_write(1) __read_write(2) __read_write(4);
|
||||
int fprintf_unlocked(FILE *, const char *, ...) printfesque(2) libcesque __read_write(1) __read_only(2);
|
||||
int vfprintf_unlocked(FILE *, const char *, va_list) paramsnonnull() libcesque __read_write(1) __read_only(2);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* COSMOPOLITAN_LIBC_STDIO_H_ */
|
||||
|
|
|
@ -52,6 +52,7 @@ int vasprintf(char **strp, const char *fmt, va_list va) {
|
|||
*strp = p;
|
||||
return rc;
|
||||
} else {
|
||||
free(p);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -254,11 +254,15 @@ int __vcscanf(int callback(void *), //
|
|||
c = READ;
|
||||
}
|
||||
fpbufsize = FP_BUFFER_GROW;
|
||||
fpbuf = malloc(fpbufsize);
|
||||
fpbufcur = 0;
|
||||
fpbuf[fpbufcur++] = c;
|
||||
fpbuf[fpbufcur] = '\0';
|
||||
goto ConsumeFloatingPointNumber;
|
||||
if ((fpbuf = malloc(fpbufsize))) {
|
||||
fpbufcur = 0;
|
||||
fpbuf[fpbufcur++] = c;
|
||||
fpbuf[fpbufcur] = '\0';
|
||||
goto ConsumeFloatingPointNumber;
|
||||
} else {
|
||||
items = -1;
|
||||
goto Done;
|
||||
}
|
||||
default:
|
||||
items = einval();
|
||||
goto Done;
|
||||
|
@ -513,12 +517,16 @@ int __vcscanf(int callback(void *), //
|
|||
if (discard) {
|
||||
buf = NULL;
|
||||
} else if (ismalloc) {
|
||||
buf = malloc(bufsize * charbytes);
|
||||
struct FreeMe *entry;
|
||||
if (buf && (entry = calloc(1, sizeof(struct FreeMe)))) {
|
||||
entry->ptr = buf;
|
||||
entry->next = freeme;
|
||||
freeme = entry;
|
||||
if ((buf = malloc(bufsize * charbytes))) {
|
||||
struct FreeMe *entry;
|
||||
if (buf && (entry = calloc(1, sizeof(struct FreeMe)))) {
|
||||
entry->ptr = buf;
|
||||
entry->next = freeme;
|
||||
freeme = entry;
|
||||
}
|
||||
} else {
|
||||
items = -1;
|
||||
goto Done;
|
||||
}
|
||||
} else {
|
||||
buf = va_arg(va, void *);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue