Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / hci / mucurses / edging.c
diff --git a/qemu/roms/ipxe/src/hci/mucurses/edging.c b/qemu/roms/ipxe/src/hci/mucurses/edging.c
new file mode 100644 (file)
index 0000000..eccd324
--- /dev/null
@@ -0,0 +1,111 @@
+#include <curses.h>
+#include "mucurses.h"
+#include "cursor.h"
+
+/** @file
+ *
+ * MuCurses edging functions
+ *
+ */
+
+/**
+ * Draw borders from single-byte characters and renditions around a
+ * window
+ *
+ * @v *win     window to be bordered
+ * @v verch    vertical chtype
+ * @v horch    horizontal chtype
+ * @ret rc     return status code
+ */
+int box ( WINDOW *win, chtype verch, chtype horch ) {
+       chtype corner = '+' | win->attrs; /* default corner character */
+       return wborder( win, verch, verch, horch, horch,
+                       corner, corner, corner, corner );
+}
+
+/**
+ * Draw borders from single-byte characters and renditions around a
+ * window
+ *
+ * @v *win     window to be bordered
+ * @v ls       left side
+ * @v rs       right side
+ * @v ts       top
+ * @v bs       bottom
+ * @v tl       top left corner
+ * @v tr       top right corner
+ * @v bl       bottom left corner
+ * @v br       bottom right corner
+ * @ret rc     return status code
+ */
+int wborder ( WINDOW *win, chtype ls, chtype rs,
+             chtype ts, chtype bs, chtype tl,
+             chtype tr, chtype bl, chtype br ) {
+       struct cursor_pos pos;
+
+       _store_curs_pos( win, &pos );
+       wmove(win,0,0);
+
+       _wputch(win,tl,WRAP);
+       while ( ( win->width - 1 ) - win->curs_x ) {
+               _wputch(win,ts,WRAP);
+       }
+       _wputch(win,tr,WRAP);
+
+       while ( ( win->height - 1 ) - win->curs_y ) {
+               _wputch(win,ls,WRAP);
+               wmove(win,win->curs_y,(win->width)-1);
+               _wputch(win,rs,WRAP);
+       }
+
+       _wputch(win,bl,WRAP);
+       while ( ( win->width -1 ) - win->curs_x ) {
+               _wputch(win,bs,WRAP);
+       }
+       _wputch(win,br,NOWRAP); /* do not wrap last char to leave
+                                  cursor in last position */
+       _restore_curs_pos( win, &pos );
+
+       return OK;
+}
+
+/**
+ * Create a horizontal line in a window
+ *
+ * @v *win     subject window
+ * @v ch       rendition and character
+ * @v n                max number of chars (wide) to render
+ * @ret rc     return status code
+ */
+int whline ( WINDOW *win, chtype ch, int n ) {
+       struct cursor_pos pos;
+
+       _store_curs_pos ( win, &pos );
+       while ( ( win->curs_x - win->width ) && n-- ) {
+               _wputch ( win, ch, NOWRAP );
+       }
+       _restore_curs_pos ( win, &pos );
+
+       return OK;
+}
+
+/**
+ * Create a vertical line in a window
+ *
+ * @v *win     subject window
+ * @v ch       rendition and character
+ * @v n                max number of chars (high) to render
+ * @ret rc     return status code
+ */
+int wvline ( WINDOW *win, chtype ch, int n ) {
+       struct cursor_pos pos;
+
+       _store_curs_pos ( win, &pos );
+       while ( ( win->curs_y - win->height ) && n-- ) {
+               _wputch ( win, ch, NOWRAP );
+               wmove( win, ++(win->curs_y), pos.x);
+       }
+       _restore_curs_pos ( win, &pos );
+
+       return OK;
+}