|
|
1.1 ! root 1: /********************************************************************* ! 2: * COPYRIGHT NOTICE * ! 3: ********************************************************************** ! 4: * This software is copyright (C) 1982 by Pavel Curtis * ! 5: * * ! 6: * Permission is granted to reproduce and distribute * ! 7: * this file by any means so long as no fee is charged * ! 8: * above a nominal handling fee and so long as this * ! 9: * notice is always included in the copies. * ! 10: * * ! 11: * Other rights are reserved except as explicitly granted * ! 12: * by written permission of the author. * ! 13: * Pavel Curtis * ! 14: * Computer Science Dept. * ! 15: * 405 Upson Hall * ! 16: * Cornell University * ! 17: * Ithaca, NY 14853 * ! 18: * * ! 19: * Ph- (607) 256-4934 * ! 20: * * ! 21: * Pavel.Cornell@Udel-Relay (ARPAnet) * ! 22: * decvax!cornell!pavel (UUCPnet) * ! 23: *********************************************************************/ ! 24: ! 25: /* ! 26: ** lib_newwin.c ! 27: ** ! 28: ** The routines newwin(), subwin() and their dependent ! 29: ** ! 30: ** $Log: lib_newwin.c,v $ ! 31: * Revision 1.12 93/04/12 14:13:55 bin ! 32: * Udo: third color update ! 33: * ! 34: * Revision 2.3 92/11/08 15:33:25 munk ! 35: * Correct definition of calloc() and malloc() ! 36: * and usage of cast operator ! 37: * ! 38: * Revision 1.5 92/06/02 12:05:26 bin ! 39: * *** empty log message *** ! 40: * ! 41: * Revision 1.2 92/04/13 14:38:12 bin ! 42: * update by vlad ! 43: * ! 44: * Revision 2.2 91/04/20 19:31:13 munk ! 45: * Usage of register variables ! 46: * ! 47: * Revision 2.1 82/10/25 14:48:18 pavel ! 48: * Added Copyright Notice ! 49: * ! 50: * Revision 2.0 82/10/25 13:47:18 pavel ! 51: * Beta-one Test Release ! 52: * ! 53: ** ! 54: */ ! 55: ! 56: #ifdef RCSHDR ! 57: static char RCSid[] = ! 58: "$Header: /src386/usr/lib/ncurses/RCS/lib_newwin.c,v 1.12 93/04/12 14:13:55 bin Exp Locker: bin $"; ! 59: #endif ! 60: ! 61: #include "term.h" ! 62: #include "curses.h" ! 63: #include "curses.priv.h" ! 64: ! 65: char *calloc(), *malloc(); ! 66: ! 67: static WINDOW *makenew(); ! 68: ! 69: ! 70: WINDOW * ! 71: newwin(num_lines, num_columns, begy, begx) ! 72: int num_lines, num_columns, begy, begx; ! 73: { ! 74: void free(); ! 75: register WINDOW *win; ! 76: chtype *ptr; ! 77: register int i, j; ! 78: ! 79: #ifdef TRACE ! 80: if (_tracing) ! 81: _tracef("newwin(%d,%d,%d,%d) called", num_lines, num_columns, begy, begx); ! 82: #endif ! 83: ! 84: if (!num_lines) ! 85: num_lines = lines - begy; ! 86: ! 87: if (!num_columns) ! 88: num_columns = columns - begx; ! 89: ! 90: if ((win = makenew(num_lines, num_columns, begy, begx)) == ERR) ! 91: return(ERR); ! 92: ! 93: for (i = 0; i < num_lines; i++) ! 94: { ! 95: if ((win->_line[i] = (chtype *)calloc(num_columns, sizeof(chtype))) ! 96: == NULL) ! 97: { ! 98: for (j = 0; j < i; j++) ! 99: free(win->_line[j]); ! 100: ! 101: free(win->_firstchar); ! 102: free(win->_lastchar); ! 103: free(win->_line); ! 104: free(win); ! 105: ! 106: return(ERR); ! 107: } ! 108: else ! 109: for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns; ) ! 110: *ptr++ = ' '; ! 111: } ! 112: ! 113: #ifdef TRACE ! 114: if (_tracing) ! 115: _tracef("\tnewwin: returned window is %o", win); ! 116: #endif ! 117: ! 118: return(win); ! 119: } ! 120: ! 121: ! 122: WINDOW * ! 123: subwin(orig, num_lines, num_columns, begy, begx) ! 124: register WINDOW *orig; ! 125: int num_lines, num_columns, begy, begx; ! 126: { ! 127: register WINDOW *win; ! 128: int i, j, k; ! 129: ! 130: #ifdef TRACE ! 131: if (_tracing) ! 132: _tracef("subwin(%d,%d,%d,%d) called", ! 133: num_lines, num_columns, begy, begx); ! 134: #endif ! 135: /* no negative displacments */ ! 136: if ((0 > (j = begy)) || (0 > (k = begx))) ! 137: return(ERR); ! 138: ! 139: if (!num_lines) ! 140: num_lines = orig->_maxy - begy; ! 141: ! 142: if (!num_columns) ! 143: num_columns = orig->_maxx - begx; ! 144: ! 145: /* turn relative location to absolute location */ ! 146: begx += orig->_begx; ! 147: begy += orig->_begy; ! 148: ! 149: /* more sanity checks */ ! 150: if ((0 > num_lines) || ! 151: (0 > num_columns) || ! 152: ((begy + num_lines) > (orig->_begy + orig->_maxy)) || ! 153: ((begx + num_columns) > (orig->_begx + orig->_maxx))) ! 154: return(ERR); ! 155: ! 156: if ((win = makenew(num_lines, num_columns, begy, begx)) == ERR) ! 157: return(ERR); ! 158: ! 159: for (i = 0; i < num_lines; i++) ! 160: win->_line[i] = &orig->_line[j++][k]; ! 161: ! 162: win->_flags = _SUBWIN; ! 163: ! 164: #ifdef TRACE ! 165: if (_tracing) ! 166: _tracef("\tsubwin: returned window is %o", win); ! 167: #endif ! 168: ! 169: return(win); ! 170: } ! 171: ! 172: ! 173: static WINDOW * ! 174: makenew(num_lines, num_columns, begy, begx) ! 175: int num_lines, num_columns, begy, begx; ! 176: { ! 177: void free(); ! 178: register int i; ! 179: register WINDOW *win; ! 180: ! 181: if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL) ! 182: return ERR; ! 183: ! 184: if ((win->_line = (chtype **) calloc(num_lines, sizeof (chtype *))) ! 185: == NULL) ! 186: { ! 187: free(win); ! 188: ! 189: return(ERR); ! 190: } ! 191: ! 192: if ((win->_firstchar = (short *) calloc(num_lines, sizeof(short))) == NULL) ! 193: { ! 194: free(win->_line); ! 195: free(win); ! 196: ! 197: return(ERR); ! 198: } ! 199: ! 200: if ((win->_lastchar = (short *) calloc(num_lines, sizeof(short))) == NULL) ! 201: { ! 202: free(win->_firstchar); ! 203: free(win->_line); ! 204: free(win); ! 205: ! 206: return(ERR); ! 207: } ! 208: ! 209: if ((win->_numchngd = (short *) calloc(num_lines, sizeof(short))) == NULL) ! 210: { ! 211: free(win->_lastchar); ! 212: free(win->_firstchar); ! 213: free(win->_line); ! 214: free(win); ! 215: ! 216: return(ERR); ! 217: } ! 218: ! 219: win->_curx = 0; ! 220: win->_cury = 0; ! 221: win->_maxy = num_lines - 1; ! 222: win->_maxx = num_columns - 1; ! 223: win->_begy = begy; ! 224: win->_begx = begx; ! 225: ! 226: win->_flags = 0; ! 227: win->_attrs = A_NORMAL; ! 228: ! 229: win->_clear = (num_lines == lines && num_columns == columns); ! 230: win->_scroll = FALSE; ! 231: win->_leave = FALSE; ! 232: win->_use_keypad = FALSE; ! 233: win->_use_meta = FALSE; ! 234: win->_nodelay = FALSE; ! 235: ! 236: win->_regtop = 0; ! 237: win->_regbottom = num_lines - 1; ! 238: ! 239: for (i = 0; i < num_lines; i++) ! 240: { ! 241: win->_firstchar[i] = win->_lastchar[i] = _NOCHANGE; ! 242: win->_numchngd[i] = 0; ! 243: } ! 244: ! 245: if (begx + num_columns == columns) ! 246: { ! 247: win->_flags |= _ENDLINE; ! 248: ! 249: if (begx == 0 && num_lines == lines && begy == 0) ! 250: win->_flags |= _FULLWIN; ! 251: ! 252: if (begy + num_lines == lines) ! 253: win->_flags |= _SCROLLWIN; ! 254: } ! 255: ! 256: return(win); ! 257: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.