summaryrefslogtreecommitdiff
path: root/public/fd_printf.md
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2013-10-12 13:47:42 -0400
committerLuke Shumaker <LukeShu@sbcglobal.net>2013-10-12 13:47:42 -0400
commit6a42c8de66e3b2dc7293ddeadaa3ee396db2624d (patch)
tree67a027b892d3122662526504dd6d11e8dea02ca1 /public/fd_printf.md
initial commit
Diffstat (limited to 'public/fd_printf.md')
-rw-r--r--public/fd_printf.md37
1 files changed, 37 insertions, 0 deletions
diff --git a/public/fd_printf.md b/public/fd_printf.md
new file mode 100644
index 0000000..5e1098e
--- /dev/null
+++ b/public/fd_printf.md
@@ -0,0 +1,37 @@
+`fd_printf`: print formatted text directly to a file descriptor
+===============================================================
+:copyright 2013 Luke Shumaker
+:license WTFPL-2
+
+I wrote this while debugging some code, and thought it might be useful
+to others:
+
+ #define _GNU_SOURCE /* vasprintf() */
+ #include <stdarg.h> /* va_start()/va_end() */
+ #include <stdio.h> /* vasprintf() */
+ #include <stdlib.h> /* free() */
+ #include <unistd.h> /* write() */
+
+ int
+ fd_printf(int fd, const char *format, ...)
+ {
+ va_list arg;
+ int len;
+ char *str;
+
+ va_start(arg, format);
+ len = vasprintf(&str, format, arg);
+ va_end(arg);
+
+ write(fd, str, len);
+
+ free(str);
+ return len;
+ }
+
+
+It is a version of `printf` that prints to a file descriptor—where
+`fprintf` prints to a `FILE*` data structure.
+
+The appeal of this is that `FILE*` I/O is buffered—which means mixing
+it with raw file descriptor I/O is going to produce weird results.