- added doxygen @file header
[people/xl0/gpxe.git] / src / hci / mucurses / print.c
1 #include <curses.h>
2 #include <vsprintf.h>
3 #include <stddef.h>
4 #include "core.h"
5
6 /** @file
7  *
8  * MuCurses printing functions
9  *
10  */
11
12 /**
13  * Add a single-byte character and rendition to a window and advance
14  * the cursor
15  *
16  * @v *win      window to be rendered in
17  * @v ch        character to be added at cursor
18  * @ret rc      return status code
19  */
20 int waddch ( WINDOW *win, const chtype ch ) {
21         _wputch( win, ch, WRAP );
22         return OK;
23 }
24
25 /**
26  * Add string of single-byte characters to a window
27  *
28  * @v *win      window to be rendered in
29  * @v *str      standard c-style string
30  * @v n         max number of chars from string to render
31  * @ret rc      return status code
32  */
33 int waddnstr ( WINDOW *win, const char *str, int n ) {
34         _wputstr( win, str, WRAP, n );
35         return OK;
36 }
37
38 struct printw_context {
39         struct printf_context ctx;
40         WINDOW *win;
41 };
42
43 static void _printw_handler ( struct printf_context *ctx, unsigned int c ) {
44         struct printw_context *wctx =
45                 container_of ( ctx, struct printw_context, ctx );
46
47         _wputch( wctx->win, c | wctx->win->attrs, WRAP );
48 }
49
50 /**
51  * Print formatted output in a window
52  *
53  * @v *win      subject window
54  * @v *fmt      formatted string
55  * @v varglist  argument list
56  * @ret rc      return status code
57  */
58 int vw_printw ( WINDOW *win, const char *fmt, va_list varglist ) {
59         struct printw_context wctx = {
60                 .win = win,
61                 .ctx = { .handler = _printw_handler, },
62         };
63
64         vcprintf ( &(wctx.ctx), fmt, varglist );
65         return OK;
66 }
67
68 /**
69  * Print formatted output to a window
70  *
71  * @v *win      subject window
72  * @v *fmt      formatted string
73  * @v ...       string arguments
74  * @ret rc      return status code
75  */
76 int wprintw ( WINDOW *win, const char *fmt, ... ) {
77         va_list args;
78         int i;
79
80         va_start ( args, fmt );
81         i = vw_printw ( win, fmt, args );
82         va_end ( args );
83         return i;
84 }