#include <curses.h>
#include <stdio.h>
#include <stddef.h>
#include <gpxe/vsprintf.h>
#include "mucurses.h"
/** @file
*
* MuCurses printing functions
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
/**
* Add a single-byte character and rendition to a window and advance
* the cursor
*
* @v *win window to be rendered in
* @v ch character to be added at cursor
* @ret rc return status code
*/
int waddch ( WINDOW *win, const chtype ch ) {
_wputch( win, ch, WRAP );
return OK;
}
/**
* Add string of single-byte characters to a window
*
* @v *win window to be rendered in
* @v *str standard c-style string
* @v n max number of chars from string to render
* @ret rc return status code
*/
int waddnstr ( WINDOW *win, const char *str, int n ) {
_wputstr( win, str, WRAP, n );
return OK;
}
struct printw_context {
struct printf_context ctx;
WINDOW *win;
};
static void _printw_handler ( struct printf_context *ctx, unsigned int c ) {
struct printw_context *wctx =
container_of ( ctx, struct printw_context, ctx );
_wputch( wctx->win, c | wctx->win->attrs, WRAP );
}
/**
* Print formatted output in a window
*
* @v *win subject window
* @v *fmt formatted string
* @v varglist argument list
* @ret rc return status code
*/
int vw_printw ( WINDOW *win, const char *fmt, va_list varglist ) {
struct printw_context wctx;
wctx.win = win;
wctx.ctx.handler = _printw_handler;
vcprintf ( &(wctx.ctx), fmt, varglist );
return OK;
}
/**
* Print formatted output to a window
*
* @v *win subject window
* @v *fmt formatted string
* @v ... string arguments
* @ret rc return status code
*/
int wprintw ( WINDOW *win, const char *fmt, ... ) {
va_list args;
int i;
va_start ( args, fmt );
i = vw_printw ( win, fmt, args );
va_end ( args );
return i;
}