aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/printf.h29
-rw-r--r--include/printf_buffer.h44
2 files changed, 64 insertions, 9 deletions
diff --git a/include/printf.h b/include/printf.h
index 5127a45..2c99805 100644
--- a/include/printf.h
+++ b/include/printf.h
@@ -65,18 +65,31 @@ int __translated_number_width (locale_t loc,
const char *first, const char *last)
attribute_hidden;
-extern int __printf_fphex (FILE *, const struct printf_info *,
- const void *const *) attribute_hidden;
+
+struct __printf_buffer;
+void __printf_buffer (struct __printf_buffer *buf, const char *format,
+ va_list ap, unsigned int mode_flags);
+struct __wprintf_buffer;
+void __wprintf_buffer (struct __wprintf_buffer *buf, const wchar_t *format,
+ va_list ap, unsigned int mode_flags);
+
extern int __printf_fp (FILE *, const struct printf_info *,
const void *const *);
libc_hidden_proto (__printf_fp)
-extern int __printf_fp_l (FILE *, locale_t, const struct printf_info *,
- const void *const *);
-libc_hidden_proto (__printf_fp_l)
-extern unsigned int __guess_grouping (unsigned int intdig_max,
- const char *grouping)
- attribute_hidden;
+void __printf_fphex_l_buffer (struct __printf_buffer *, locale_t,
+ const struct printf_info *,
+ const void *const *) attribute_hidden;
+void __printf_fp_l_buffer (struct __printf_buffer *, locale_t,
+ const struct printf_info *,
+ const void *const *) attribute_hidden;
+struct __wprintf_buffer;
+void __wprintf_fphex_l_buffer (struct __wprintf_buffer *, locale_t,
+ const struct printf_info *,
+ const void *const *) attribute_hidden;
+void __wprintf_fp_l_buffer (struct __wprintf_buffer *, locale_t,
+ const struct printf_info *,
+ const void *const *) attribute_hidden;
# endif /* !_ISOMAC */
#endif
diff --git a/include/printf_buffer.h b/include/printf_buffer.h
index e27f2a8..39ef232 100644
--- a/include/printf_buffer.h
+++ b/include/printf_buffer.h
@@ -45,7 +45,12 @@
enum __printf_buffer_mode
{
__printf_buffer_mode_failed,
+ __printf_buffer_mode_snprintf,
__printf_buffer_mode_to_file,
+ __printf_buffer_mode_strfmon,
+ __printf_buffer_mode_fp, /* For __printf_fp_l_buffer. */
+ __printf_buffer_mode_fp_to_wide, /* For __wprintf_fp_l_buffer. */
+ __printf_buffer_mode_fphex_to_wide, /* For __wprintf_fphex_l_buffer. */
};
/* Buffer for fast character writing with overflow handling.
@@ -268,13 +273,45 @@ bool __wprintf_buffer_flush (struct __wprintf_buffer *buf) attribute_hidden;
#define Xprintf_buffer_puts Xprintf (buffer_puts)
#define Xprintf_buffer_write Xprintf (buffer_write)
+/* Commonly used buffers. */
+
+struct __printf_buffer_snprintf
+{
+ struct __printf_buffer base;
+#define PRINTF_BUFFER_SIZE_DISCARD 128
+ char discard[PRINTF_BUFFER_SIZE_DISCARD]; /* Used in counting mode. */
+};
+
+/* Sets up [BUFFER, BUFFER + LENGTH) as the write target. If LENGTH
+ is positive, also writes a NUL byte to *BUFFER. */
+void __printf_buffer_snprintf_init (struct __printf_buffer_snprintf *,
+ char *buffer, size_t length)
+ attribute_hidden;
+
+/* Add the null terminator after everything has been written. The
+ return value is the one expected by printf (see __printf_buffer_done). */
+int __printf_buffer_snprintf_done (struct __printf_buffer_snprintf *)
+ attribute_hidden;
+
/* Flush function implementations follow. They are called from
__printf_buffer_flush. Generic code should not call these flush
functions directly. Some modes have inline implementations. */
+void __printf_buffer_flush_snprintf (struct __printf_buffer_snprintf *)
+ attribute_hidden;
struct __printf_buffer_to_file;
void __printf_buffer_flush_to_file (struct __printf_buffer_to_file *)
attribute_hidden;
+struct __printf_buffer_fp;
+void __printf_buffer_flush_fp (struct __printf_buffer_fp *)
+ attribute_hidden;
+struct __printf_buffer_fp_to_wide;
+void __printf_buffer_flush_fp_to_wide (struct __printf_buffer_fp_to_wide *)
+ attribute_hidden;
+struct __printf_buffer_fphex_to_wide;
+void __printf_buffer_flush_fphex_to_wide (struct
+ __printf_buffer_fphex_to_wide *)
+ attribute_hidden;
struct __wprintf_buffer_to_file;
void __wprintf_buffer_flush_to_file (struct __wprintf_buffer_to_file *)
@@ -282,10 +319,15 @@ void __wprintf_buffer_flush_to_file (struct __wprintf_buffer_to_file *)
/* Buffer sizes. These can be tuned as necessary. There is a tension
here between stack consumption, cache usage, and additional system
- calls or heap allocations (if the buffer is too small). */
+ calls or heap allocations (if the buffer is too small).
+
+ Also see PRINTF_BUFFER_SIZE_DISCARD above for snprintf. */
/* Fallback buffer if the underlying FILE * stream does not provide
buffer space. */
#define PRINTF_BUFFER_SIZE_TO_FILE_STAGE 128
+/* Temporary buffer used during floating point digit translation. */
+#define PRINTF_BUFFER_SIZE_DIGITS 64
+
#endif /* PRINTF_BUFFER_H */