tools/nolibc/stdio: add fwrite() to stdio

We'll use it to write substrings. It relies on a simpler _fwrite() that
only takes one size. fputs() was also modified to rely on it.

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
Willy Tarreau 2022-02-07 17:23:32 +01:00 committed by Paul E. McKenney
parent 99b037cbd5
commit e3e19052d5

View File

@ -84,12 +84,14 @@ int putchar(int c)
}
/* puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
/* fwrite(), puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
/* internal fwrite()-like function which only takes a size and returns 0 on
* success or EOF on error. It automatically retries on short writes.
*/
static __attribute__((unused))
int fputs(const char *s, FILE *stream)
int _fwrite(const void *buf, size_t size, FILE *stream)
{
size_t len = strlen(s);
ssize_t ret;
int fd;
@ -98,16 +100,35 @@ int fputs(const char *s, FILE *stream)
fd = 3 + (long)stream;
while (len > 0) {
ret = write(fd, s, len);
while (size) {
ret = write(fd, buf, size);
if (ret <= 0)
return EOF;
s += ret;
len -= ret;
size -= ret;
buf += ret;
}
return 0;
}
static __attribute__((unused))
size_t fwrite(const void *s, size_t size, size_t nmemb, FILE *stream)
{
size_t written;
for (written = 0; written < nmemb; written++) {
if (_fwrite(s, size, stream) != 0)
break;
s += size;
}
return written;
}
static __attribute__((unused))
int fputs(const char *s, FILE *stream)
{
return _fwrite(s, strlen(s), stream);
}
static __attribute__((unused))
int puts(const char *s)
{