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