Annotation of 43BSD/usr.lib/libcurses/newwin.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)newwin.c   5.1 (Berkeley) 6/7/85";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * allocate space for and set up defaults for a new window
                     13:  *
                     14:  */
                     15: 
                     16: # include      "curses.ext"
                     17: 
                     18: char   *malloc();
                     19: 
                     20: # define       SMALLOC (short *) malloc
                     21: 
                     22: static WINDOW  *makenew();
                     23: 
                     24: # undef                nl      /* don't need it here, and it interferes        */
                     25: 
                     26: WINDOW *
                     27: newwin(num_lines, num_cols, begy, begx)
                     28: int    num_lines, num_cols, begy, begx;
                     29: {
                     30:        reg WINDOW      *win;
                     31:        reg char        *sp;
                     32:        reg int         i, by, bx, nl, nc;
                     33:        reg int         j;
                     34: 
                     35:        by = begy;
                     36:        bx = begx;
                     37:        nl = num_lines;
                     38:        nc = num_cols;
                     39: 
                     40:        if (nl == 0)
                     41:                nl = LINES - by;
                     42:        if (nc == 0)
                     43:                nc = COLS - bx;
                     44:        if ((win = makenew(nl, nc, by, bx)) == NULL)
                     45:                return ERR;
                     46:        if ((win->_firstch = SMALLOC(nl * sizeof win->_firstch[0])) == NULL) {
                     47:                free(win->_y);
                     48:                free(win);
                     49:                return NULL;
                     50:        }
                     51:        if ((win->_lastch = SMALLOC(nl * sizeof win->_lastch[0])) == NULL) {
                     52:                free(win->_y);
                     53:                free(win->_firstch);
                     54:                free(win);
                     55:                return NULL;
                     56:        }
                     57:        win->_nextp = win;
                     58:        for (i = 0; i < nl; i++) {
                     59:                win->_firstch[i] = _NOCHANGE;
                     60:                win->_lastch[i] = _NOCHANGE;
                     61:        }
                     62:        for (i = 0; i < nl; i++)
                     63:                if ((win->_y[i] = malloc(nc * sizeof win->_y[0])) == NULL) {
                     64:                        for (j = 0; j < i; j++)
                     65:                                free(win->_y[j]);
                     66:                        free(win->_firstch);
                     67:                        free(win->_lastch);
                     68:                        free(win->_y);
                     69:                        free(win);
                     70:                        return ERR;
                     71:                }
                     72:                else
                     73:                        for (sp = win->_y[i]; sp < win->_y[i] + nc; )
                     74:                                *sp++ = ' ';
                     75:        win->_ch_off = 0;
                     76: # ifdef DEBUG
                     77:        fprintf(outf, "NEWWIN: win->_ch_off = %d\n", win->_ch_off);
                     78: # endif
                     79:        return win;
                     80: }
                     81: 
                     82: WINDOW *
                     83: subwin(orig, num_lines, num_cols, begy, begx)
                     84: reg WINDOW     *orig;
                     85: int            num_lines, num_cols, begy, begx;
                     86: {
                     87:        reg int         i;
                     88:        reg WINDOW      *win;
                     89:        reg int         by, bx, nl, nc;
                     90: 
                     91:        by = begy;
                     92:        bx = begx;
                     93:        nl = num_lines;
                     94:        nc = num_cols;
                     95: 
                     96:        /*
                     97:         * make sure window fits inside the original one
                     98:         */
                     99: # ifdef        DEBUG
                    100:        fprintf(outf, "SUBWIN(%0.2o, %d, %d, %d, %d)\n", orig, nl, nc, by, bx);
                    101: # endif
                    102:        if (by < orig->_begy || bx < orig->_begx
                    103:            || by + nl > orig->_maxy + orig->_begy
                    104:            || bx + nc > orig->_maxx + orig->_begx)
                    105:                return ERR;
                    106:        if (nl == 0)
                    107:                nl = orig->_maxy + orig->_begy - by;
                    108:        if (nc == 0)
                    109:                nc = orig->_maxx + orig->_begx - bx;
                    110:        if ((win = makenew(nl, nc, by, bx)) == NULL)
                    111:                return ERR;
                    112:        win->_nextp = orig->_nextp;
                    113:        orig->_nextp = win;
                    114:        win->_orig = orig;
                    115:        _set_subwin_(orig, win);
                    116:        return win;
                    117: }
                    118: 
                    119: /*
                    120:  * this code is shared with mvwin()
                    121:  */
                    122: _set_subwin_(orig, win)
                    123: register WINDOW        *orig, *win;
                    124: {
                    125:        register int    i, j, k;
                    126: 
                    127:        j = win->_begy - orig->_begy;
                    128:        k = win->_begx - orig->_begx;
                    129:        win->_ch_off = k;
                    130: # ifdef DEBUG
                    131:        fprintf(outf, "_SET_SUBWIN_: win->_ch_off = %d\n", win->_ch_off);
                    132: # endif
                    133:        win->_firstch = &orig->_firstch[j];
                    134:        win->_lastch = &orig->_lastch[j];
                    135:        for (i = 0; i < win->_maxy; i++, j++)
                    136:                win->_y[i] = &orig->_y[j][k];
                    137: 
                    138: }
                    139: 
                    140: /*
                    141:  *     This routine sets up a window buffer and returns a pointer to it.
                    142:  */
                    143: static WINDOW *
                    144: makenew(num_lines, num_cols, begy, begx)
                    145: int    num_lines, num_cols, begy, begx; {
                    146: 
                    147:        reg int         i;
                    148:        reg WINDOW      *win;
                    149:        reg int         by, bx, nl, nc;
                    150: 
                    151:        by = begy;
                    152:        bx = begx;
                    153:        nl = num_lines;
                    154:        nc = num_cols;
                    155: 
                    156: # ifdef        DEBUG
                    157:        fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", nl, nc, by, bx);
                    158: # endif
                    159:        if ((win = (WINDOW *) malloc(sizeof *win)) == NULL)
                    160:                return NULL;
                    161: # ifdef DEBUG
                    162:        fprintf(outf, "MAKENEW: nl = %d\n", nl);
                    163: # endif
                    164:        if ((win->_y = (char **) malloc(nl * sizeof win->_y[0])) == NULL) {
                    165:                free(win);
                    166:                return NULL;
                    167:        }
                    168: # ifdef DEBUG
                    169:        fprintf(outf, "MAKENEW: nc = %d\n", nc);
                    170: # endif
                    171:        win->_cury = win->_curx = 0;
                    172:        win->_clear = FALSE;
                    173:        win->_maxy = nl;
                    174:        win->_maxx = nc;
                    175:        win->_begy = by;
                    176:        win->_begx = bx;
                    177:        win->_flags = 0;
                    178:        win->_scroll = win->_leave = FALSE;
                    179:        _swflags_(win);
                    180: # ifdef DEBUG
                    181:        fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear);
                    182:        fprintf(outf, "MAKENEW: win->_leave = %d\n", win->_leave);
                    183:        fprintf(outf, "MAKENEW: win->_scroll = %d\n", win->_scroll);
                    184:        fprintf(outf, "MAKENEW: win->_flags = %0.2o\n", win->_flags);
                    185:        fprintf(outf, "MAKENEW: win->_maxy = %d\n", win->_maxy);
                    186:        fprintf(outf, "MAKENEW: win->_maxx = %d\n", win->_maxx);
                    187:        fprintf(outf, "MAKENEW: win->_begy = %d\n", win->_begy);
                    188:        fprintf(outf, "MAKENEW: win->_begx = %d\n", win->_begx);
                    189: # endif
                    190:        return win;
                    191: }
                    192: 
                    193: _swflags_(win)
                    194: register WINDOW        *win;
                    195: {
                    196:        win->_flags &= ~(_ENDLINE|_FULLLINE|_FULLWIN|_SCROLLWIN);
                    197:        if (win->_begx + win->_maxx == COLS) {
                    198:                win->_flags |= _ENDLINE;
                    199:                if (win->_begx == 0) {
                    200:                        if (AL && DL)
                    201:                                win->_flags |= _FULLLINE;
                    202:                        if (win->_maxy == LINES && win->_begy == 0)
                    203:                                win->_flags |= _FULLWIN;
                    204:                }
                    205:                if (win->_begy + win->_maxy == LINES)
                    206:                        win->_flags |= _SCROLLWIN;
                    207:        }
                    208: }

unix.superglobalmegacorp.com

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