History

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.

Willy Tarreau committed 4 years ago

Commit e3e19051 parent 99b037c1 file · +28 −7Browse files

Unified · Split

tools/include/nolibc/stdio.h+28−7
@@ -84,12 +84,14 @@ int putchar(int c) · 83 unmodified lines
8484 }
8585
8686
87−/* puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
87+/* fwrite(), puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
8888
89+/* internal fwrite()-like function which only takes a size and returns 0 on
90+ * success or EOF on error. It automatically retries on short writes.
91+ */
8992 static __attribute__((unused))
90−int fputs(const char *s, FILE *stream)
93+int _fwrite(const void *buf, size_t size, FILE *stream)
9194 {
92− size_t len = strlen(s);
9395 ssize_t ret;
9496 int fd;
9597
@@ -98,16 +100,35 @@ int fputs(const char *s, FILE *stream) · 2 unmodified lines
98100
99101 fd = 3 + (long)stream;
100102
101− while (len > 0) {
102− ret = write(fd, s, len);
103+ while (size) {
104+ ret = write(fd, buf, size);
103105 if (ret <= 0)
104106 return EOF;
105− s += ret;
106− len -= ret;
107+ size -= ret;
108+ buf += ret;
107109 }
108110 return 0;
109111 }
110112
113+static __attribute__((unused))
114+size_t fwrite(const void *s, size_t size, size_t nmemb, FILE *stream)
115+{
116+ size_t written;
117+
118+ for (written = 0; written < nmemb; written++) {
119+ if (_fwrite(s, size, stream) != 0)
120+ break;
121+ s += size;
122+ }
123+ return written;
124+}
125+
126+static __attribute__((unused))
127+int fputs(const char *s, FILE *stream)
128+{
129+ return _fwrite(s, strlen(s), stream);
130+}
131+
111132 static __attribute__((unused))
112133 int puts(const char *s)
113134 {