- removed slk references
[people/xl0/gpxe.git] / src / hci / mucurses / core.c
1 #include <curses.h>
2 #include "core.h"
3
4 /** @file
5  *
6  * MuCurses core functions
7  *
8  */
9
10 WINDOW _stdscr = {
11         .attrs = A_DEFAULT,
12         .ori_y = 0,
13         .ori_x = 0,
14         .curs_y = 0,
15         .curs_x = 0,
16         .scr = curscr,
17 };
18
19 /*
20  *  Primitives
21  */
22
23 /**
24  * Write a single character rendition to a window
25  *
26  * @v *win      window in which to write
27  * @v ch        character rendition to write
28  * @v wrap      wrap "switch"
29  */
30 void _wputch ( WINDOW *win, chtype ch, int wrap ) {
31         /* make sure we set the screen cursor to the right position
32            first! */
33         win->scr->movetoyx( win->scr, win->ori_y + win->curs_y,
34                                       win->ori_x + win->curs_x );
35         win->scr->putc(win->scr, ch);
36         if ( ++(win->curs_x) - win->width == 0 ) {
37                 if ( wrap == WRAP ) {
38                         win->curs_x = 0;
39                         /* specification says we should really scroll,
40                            but we have no buffer to scroll with, so we
41                            can only overwrite back at the beginning of
42                            the window */
43                         if ( ++(win->curs_y) - win->height == 0 )
44                                 win->curs_y = 0;
45                 } else {
46                         (win->curs_x)--;
47                 }
48         }
49 }
50
51 /**
52  * Write a chtype string to a window
53  *
54  * @v *win      window in which to write
55  * @v *chstr    chtype string
56  * @v wrap      wrap "switch"
57  * @v n         write at most n chtypes
58  */
59 void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) {
60         for ( ; *chstr && n-- ; chstr++ ) {
61                 _wputch(win,*chstr,wrap);
62         }
63 }
64
65 /**
66  * Write a standard c-style string to a window
67  *
68  * @v *win      window in which to write
69  * @v *str      string
70  * @v wrap      wrap "switch"
71  * @v n         write at most n chars from *str
72  */
73 void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) {
74         for ( ; *str && n-- ; str++ ) {
75                 _wputch( win, *str | win->attrs, wrap );
76         }
77 }
78
79 /**
80  * Move a window's cursor to the specified position
81  *
82  * @v *win      window to be operated on
83  * @v y         Y position
84  * @v x         X position
85  * @ret rc      return status code
86  */
87 int wmove ( WINDOW *win, int y, int x ) {
88         /* chech for out-of-bounds errors */
89         if ( ( (unsigned)y >= win->height ) ||
90              ( (unsigned)x >= win->width ) ) {
91                 return ERR;
92         }
93
94         win->curs_y = y;
95         win->curs_x = x;
96         win->scr->movetoyx( win->scr, win->ori_y + win->curs_y, 
97                                       win->ori_x + win->curs_x );
98         return OK;
99 }