\h'-\w'\\$1\ 'u'\\$1\ \c
.ft P
..
-.ie t .ds o \(bu
-.el .ds o o
+.ie t \{\
+. ds o \(bu
+. de VP
+. sp .4v
+..
+\}
+.el \{\
+. ds o o
+. de VP
+. sp
+..
+\}
.
.TH gprintf 3 "9 March 2024" "Straylight/Edgeware" "mLib utilities library"
.
.SH SYNOPSIS
.nf
.B "#include <mLib/gprintf.h>"
-
+.PP
.ta 2n
.B "struct gprintf_ops {"
.BI " int (*putch)(void *" out ", int " ch ");"
.BI " int (*putm)(void *" out ", const char *" p ", size_t " sz ");"
.BI " int (*nputf)(void *" out ", size_t " maxsz ", const char *" p ", ...);"
.B "};"
-
+.PP
.BI "int gprintf(const struct gprintf_ops *" ops ", void *" out ","
.ta \w'\fBint gprintf('u
.BI " const char *" p ", ...);"
.BI "int vgprintf(const struct gprintf_ops *" ops ", void *" out ","
.ta \w'\fBint vgprintf('u
.BI " const char *" p ", va_list *" ap ");"
-
+.PP
.BI "int gprintf_memputf(char **" buf_inout ", size_t *" sz_inout ","
.ta \w'\fBint gprintf_memputf('u
.BI " size_t " maxsz ", const char *" p ", va_list " ap ");"
-
+.PP
.B "const struct gprintf_ops file_printops;"
.fi
.
size_t sz;
/* ...\& other members ...\& */
};
-
+.VP
/* ...\& define putch and putm ...\& */
-
+.VP
static int nputf(void *out, size_t maxsz, const char *p, ...)
{
struct my_output *myout = out;
va_list ap;
int n;
-
+.VP
va_start(ap, p);
n = gprintf_memputf(&myout->buf, &myout->sz, maxsz, p, ap);
va_end(ap);
if (n > 0) n = putm(myout, myout->buf, n);
return (n);
}
-
+.VP
const struct gprintf_ops my_output_ops = { putch, putm, nputf };
-
+.VP
/* ...\& */
-
+.VP
struct my_output myout;
-
+.VP
myout.buf = 0; myout.sz = 0;
/* ...\& other initialization ...\& */
gprintf(&my_output_ops, &myout, "Hello, %s!", "world");