aboutsummaryrefslogtreecommitdiff
path: root/include/base/fmt.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/base/fmt.h')
-rw-r--r--include/base/fmt.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/include/base/fmt.h b/include/base/fmt.h
new file mode 100644
index 0000000..4c187fd
--- /dev/null
+++ b/include/base/fmt.h
@@ -0,0 +1,73 @@
+#pragma once
+
+typedef struct fmt·State fmt·State;
+
+struct fmt·State
+{
+ struct{
+ char *beg;
+ char *cur;
+ char *end;
+ } buffer;
+ int n;
+
+ va_list args;
+ rune verb;
+ ulong flag;
+ int width;
+ int prec;
+ char *thousands, *groups, *decimal;
+
+ void *file;
+ int (*flush)(fmt·State *);
+ struct {
+ void *heap;
+ mem·Reallocator mem;
+ };
+};
+
+#define iota(x) (1 << (x))
+enum
+{
+ fmt·Width = iota(0),
+ fmt·Left = iota(1),
+ fmt·Prec = iota(2),
+ fmt·Sharp = iota(3),
+ fmt·Space = iota(4),
+ fmt·Sign = iota(5),
+ fmt·Apost = iota(6),
+ fmt·Zero = iota(7),
+ fmt·Unsigned = iota(8),
+ fmt·Short = iota(9),
+ fmt·Long = iota(10),
+ fmt·Vlong = iota(11),
+ fmt·Comma = iota(12),
+ fmt·Byte = iota(13),
+ fmt·Ldouble = iota(14),
+ fmt·Flag = iota(15),
+};
+#undef iota
+
+/* normal printing interface */
+int fmt·print(char *fmt, ...);
+int fmt·fprint(int fd, char *fmt, ...);
+void fmt·panic(char *fmt, ...);
+
+int fmt·sprint(char *buf, char *fmt, ...);
+int fmt·nsprint(int len, char *buf, char *fmt, ...);
+char *fmt·esprint(char *buf, char *end, char *fmt, ...);
+
+int fmt·vprint(char *fmt, va_list args);
+int fmt·vfprint(int fd, char *fmt, va_list args);
+int fmt·vnsprint(int len, char *buf, char *fmt, va_list args);
+char *fmt·vesprint(char *buf, char *end, char *fmt, va_list args);
+
+/* low-level interface: used for custom printing verbs */
+int fmt·open(int fd, int len, char *buf, fmt·State *); // creates a buffer on a file
+int fmt·make(mem·Reallocator mem, void *heap, fmt·State *); // creates an in-memory buffer
+void fmt·free(fmt·State *); // releases an in-memory buffer
+
+int fmt·do(fmt·State *, char *fmt);
+int fmt·write(fmt·State *, char *fmt, ...);
+int fmt·vwrite(fmt·State *, char *fmt, va_list args);
+int fmt·install(int c, int (*format)(fmt·State *));