Annotation of qemu/roms/ipxe/src/hci/mucurses/mucurses.c, revision 1.1.1.1

1.1       root        1: #include <ipxe/console.h>
                      2: #include <curses.h>
                      3: #include "mucurses.h"
                      4: 
                      5: /** @file
                      6:  *
                      7:  * MuCurses core functions
                      8:  *
                      9:  */
                     10: 
                     11: FILE_LICENCE ( GPL2_OR_LATER );
                     12: 
                     13: static void _wupdcurs ( WINDOW *win ) __nonnull;
                     14: void _wputch ( WINDOW *win, chtype ch, int wrap ) __nonnull;
                     15: void _wputc ( WINDOW *win, char c, int wrap ) __nonnull;
                     16: void _wcursback ( WINDOW *win ) __nonnull;
                     17: void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) __nonnull;
                     18: void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) __nonnull;
                     19: int wmove ( WINDOW *win, int y, int x ) __nonnull;
                     20: 
                     21: WINDOW _stdscr = {
                     22:        .attrs = A_DEFAULT,
                     23:        .ori_y = 0,
                     24:        .ori_x = 0,
                     25:        .curs_y = 0,
                     26:        .curs_x = 0,
                     27:        .scr = &_ansi_screen,
                     28: };
                     29: 
                     30: /*
                     31:  *  Primitives
                     32:  */
                     33: 
                     34: /**
                     35:  * Update cursor position
                     36:  *
                     37:  * @v *win     window in which to update position
                     38:  */
                     39: static void _wupdcurs ( WINDOW *win ) {
                     40:        win->scr->movetoyx ( win->scr, win->ori_y + win->curs_y,
                     41:                             win->ori_x + win->curs_x );
                     42: }
                     43: 
                     44: /**
                     45:  * Write a single character rendition to a window
                     46:  *
                     47:  * @v *win     window in which to write
                     48:  * @v ch       character rendition to write
                     49:  * @v wrap     wrap "switch"
                     50:  */
                     51: void _wputch ( WINDOW *win, chtype ch, int wrap ) {
                     52:        /* make sure we set the screen cursor to the right position
                     53:           first! */
                     54:        _wupdcurs(win);
                     55:        win->scr->putc(win->scr, ch);
                     56:        if ( ++(win->curs_x) - win->width == 0 ) {
                     57:                if ( wrap == WRAP ) {
                     58:                        win->curs_x = 0;
                     59:                        /* specification says we should really scroll,
                     60:                           but we have no buffer to scroll with, so we
                     61:                           can only overwrite back at the beginning of
                     62:                           the window */
                     63:                        if ( ++(win->curs_y) - win->height == 0 )
                     64:                                win->curs_y = 0;
                     65:                } else {
                     66:                        (win->curs_x)--;
                     67:                }
                     68:        }
                     69: }
                     70: 
                     71: /**
                     72:  * Write a single character to a window
                     73:  *
                     74:  * @v *win     window in which to write
                     75:  * @v c                character rendition to write
                     76:  * @v wrap     wrap "switch"
                     77:  */
                     78: void _wputc ( WINDOW *win, char c, int wrap ) {
                     79:        _wputch ( win, ( c | win->attrs ), wrap );
                     80: }
                     81: 
                     82: /**
                     83:  * Retreat the cursor back one position (useful for a whole host of
                     84:  * ops)
                     85:  *
                     86:  * @v *win     window in which to retreat
                     87:  */
                     88: void _wcursback ( WINDOW *win ) {
                     89:        if ( win->curs_x == 0 ) {
                     90:                if ( win->curs_y == 0 )
                     91:                        win->curs_y = win->height - 1;
                     92:                win->curs_x = win->width = 1;
                     93:        } else {
                     94:                win->curs_x--;
                     95:        }
                     96: 
                     97:        _wupdcurs(win);
                     98: }
                     99: 
                    100: /**
                    101:  * Write a chtype string to a window
                    102:  *
                    103:  * @v *win     window in which to write
                    104:  * @v *chstr   chtype string
                    105:  * @v wrap     wrap "switch"
                    106:  * @v n                write at most n chtypes
                    107:  */
                    108: void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) {
                    109:        for ( ; *chstr && n-- ; chstr++ ) {
                    110:                _wputch(win,*chstr,wrap);
                    111:        }
                    112: }
                    113: 
                    114: /**
                    115:  * Write a standard c-style string to a window
                    116:  *
                    117:  * @v *win     window in which to write
                    118:  * @v *str     string
                    119:  * @v wrap     wrap "switch"
                    120:  * @v n                write at most n chars from *str
                    121:  */
                    122: void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) {
                    123:        for ( ; *str && n-- ; str++ ) {
                    124:                _wputc ( win, *str, wrap );
                    125:        }
                    126: }
                    127: 
                    128: /**
                    129:  * Move a window's cursor to the specified position
                    130:  *
                    131:  * @v *win     window to be operated on
                    132:  * @v y                Y position
                    133:  * @v x                X position
                    134:  * @ret rc     return status code
                    135:  */
                    136: int wmove ( WINDOW *win, int y, int x ) {
                    137:        /* chech for out-of-bounds errors */
                    138:        if ( ( (unsigned)y >= win->height ) ||
                    139:             ( (unsigned)x >= win->width ) ) {
                    140:                return ERR;
                    141:        }
                    142: 
                    143:        win->curs_y = y;
                    144:        win->curs_x = x;
                    145:        _wupdcurs(win);
                    146:        return OK;
                    147: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.