``` ssize_t adapterWrite(void* p, const char *buf, size_t n) { return ((Print*) p) -> write(buf, n); } FILE* openAdapter(void *p) { cookie_io_functions_t fncs; fncs.write = adapterWrite; fncs.close = NULL; return fopencookie(p, "w", fncs); } size_t Print::printf(const char *fmt, ...) { va_list args; va_start(args, fmt); FILE* adapter = openAdapter(this); size_t len = vfprintf(adapter, fmt, args); fclose(adapter); va_end(args); return len; } size_t Print::printf(const __FlashStringHelper *fmt, ...) { size_t fmtLen = strlen_P((PGM_P) fmt); char format[fmtLen + 1]; strcpy_P(format, (PGM_P) fmt); va_list args; va_start(args, fmt); FILE* adapter = openAdapter(this); size_t len = vfprintf(adapter, format, args); fclose(adapter); va_end(args); return len; } ```