|
|
1.1 root 1: /*
2: * Copyright (c) 1981 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)newwin.c 5.3 (Berkeley) 6/30/88";
20: #endif /* not lint */
21:
22: /*
23: * allocate space for and set up defaults for a new window
24: *
25: */
26:
27: # include "curses.ext"
28:
29: char *malloc();
30:
31: # define SMALLOC (short *) malloc
32:
33: static WINDOW *makenew();
34:
35: # undef nl /* don't need it here, and it interferes */
36:
37: WINDOW *
38: newwin(num_lines, num_cols, begy, begx)
39: int num_lines, num_cols, begy, begx;
40: {
41: reg WINDOW *win;
42: reg char *sp;
43: reg int i, by, bx, nl, nc;
44: reg int j;
45:
46: by = begy;
47: bx = begx;
48: nl = num_lines;
49: nc = num_cols;
50:
51: if (nl == 0)
52: nl = LINES - by;
53: if (nc == 0)
54: nc = COLS - bx;
55: if ((win = makenew(nl, nc, by, bx)) == NULL)
56: return ERR;
57: if ((win->_firstch = SMALLOC(nl * sizeof win->_firstch[0])) == NULL) {
58: free(win->_y);
59: free(win);
60: return NULL;
61: }
62: if ((win->_lastch = SMALLOC(nl * sizeof win->_lastch[0])) == NULL) {
63: free(win->_y);
64: free(win->_firstch);
65: free(win);
66: return NULL;
67: }
68: win->_nextp = win;
69: for (i = 0; i < nl; i++) {
70: win->_firstch[i] = _NOCHANGE;
71: win->_lastch[i] = _NOCHANGE;
72: }
73: for (i = 0; i < nl; i++)
74: if ((win->_y[i] = malloc(nc * sizeof win->_y[0])) == NULL) {
75: for (j = 0; j < i; j++)
76: free(win->_y[j]);
77: free(win->_firstch);
78: free(win->_lastch);
79: free(win->_y);
80: free(win);
81: return ERR;
82: }
83: else
84: for (sp = win->_y[i]; sp < win->_y[i] + nc; )
85: *sp++ = ' ';
86: win->_ch_off = 0;
87: # ifdef DEBUG
88: fprintf(outf, "NEWWIN: win->_ch_off = %d\n", win->_ch_off);
89: # endif
90: return win;
91: }
92:
93: WINDOW *
94: subwin(orig, num_lines, num_cols, begy, begx)
95: reg WINDOW *orig;
96: int num_lines, num_cols, begy, begx;
97: {
98: reg int i;
99: reg WINDOW *win;
100: reg int by, bx, nl, nc;
101:
102: by = begy;
103: bx = begx;
104: nl = num_lines;
105: nc = num_cols;
106:
107: /*
108: * make sure window fits inside the original one
109: */
110: # ifdef DEBUG
111: fprintf(outf, "SUBWIN(%0.2o, %d, %d, %d, %d)\n", orig, nl, nc, by, bx);
112: # endif
113: if (by < orig->_begy || bx < orig->_begx
114: || by + nl > orig->_maxy + orig->_begy
115: || bx + nc > orig->_maxx + orig->_begx)
116: return ERR;
117: if (nl == 0)
118: nl = orig->_maxy + orig->_begy - by;
119: if (nc == 0)
120: nc = orig->_maxx + orig->_begx - bx;
121: if ((win = makenew(nl, nc, by, bx)) == NULL)
122: return ERR;
123: win->_nextp = orig->_nextp;
124: orig->_nextp = win;
125: win->_orig = orig;
126: _set_subwin_(orig, win);
127: return win;
128: }
129:
130: /*
131: * this code is shared with mvwin()
132: */
133: _set_subwin_(orig, win)
134: register WINDOW *orig, *win;
135: {
136: register int i, j, k;
137:
138: j = win->_begy - orig->_begy;
139: k = win->_begx - orig->_begx;
140: win->_ch_off = k;
141: # ifdef DEBUG
142: fprintf(outf, "_SET_SUBWIN_: win->_ch_off = %d\n", win->_ch_off);
143: # endif
144: win->_firstch = &orig->_firstch[j];
145: win->_lastch = &orig->_lastch[j];
146: for (i = 0; i < win->_maxy; i++, j++)
147: win->_y[i] = &orig->_y[j][k];
148:
149: }
150:
151: /*
152: * This routine sets up a window buffer and returns a pointer to it.
153: */
154: static WINDOW *
155: makenew(num_lines, num_cols, begy, begx)
156: int num_lines, num_cols, begy, begx; {
157:
158: reg int i;
159: reg WINDOW *win;
160: reg int by, bx, nl, nc;
161:
162: by = begy;
163: bx = begx;
164: nl = num_lines;
165: nc = num_cols;
166:
167: # ifdef DEBUG
168: fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", nl, nc, by, bx);
169: # endif
170: if ((win = (WINDOW *) malloc(sizeof *win)) == NULL)
171: return NULL;
172: # ifdef DEBUG
173: fprintf(outf, "MAKENEW: nl = %d\n", nl);
174: # endif
175: if ((win->_y = (char **) malloc(nl * sizeof win->_y[0])) == NULL) {
176: free(win);
177: return NULL;
178: }
179: # ifdef DEBUG
180: fprintf(outf, "MAKENEW: nc = %d\n", nc);
181: # endif
182: win->_cury = win->_curx = 0;
183: win->_clear = FALSE;
184: win->_maxy = nl;
185: win->_maxx = nc;
186: win->_begy = by;
187: win->_begx = bx;
188: win->_flags = 0;
189: win->_scroll = win->_leave = FALSE;
190: _swflags_(win);
191: # ifdef DEBUG
192: fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear);
193: fprintf(outf, "MAKENEW: win->_leave = %d\n", win->_leave);
194: fprintf(outf, "MAKENEW: win->_scroll = %d\n", win->_scroll);
195: fprintf(outf, "MAKENEW: win->_flags = %0.2o\n", win->_flags);
196: fprintf(outf, "MAKENEW: win->_maxy = %d\n", win->_maxy);
197: fprintf(outf, "MAKENEW: win->_maxx = %d\n", win->_maxx);
198: fprintf(outf, "MAKENEW: win->_begy = %d\n", win->_begy);
199: fprintf(outf, "MAKENEW: win->_begx = %d\n", win->_begx);
200: # endif
201: return win;
202: }
203:
204: _swflags_(win)
205: register WINDOW *win;
206: {
207: win->_flags &= ~(_ENDLINE|_FULLLINE|_FULLWIN|_SCROLLWIN);
208: if (win->_begx + win->_maxx == COLS) {
209: win->_flags |= _ENDLINE;
210: if (win->_begx == 0) {
211: if (AL && DL)
212: win->_flags |= _FULLLINE;
213: if (win->_maxy == LINES && win->_begy == 0)
214: win->_flags |= _FULLWIN;
215: }
216: if (win->_begy + win->_maxy == LINES)
217: win->_flags |= _SCROLLWIN;
218: }
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.