|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Edward Wang at The University of California, Berkeley. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)wwopen.c 3.29 (Berkeley) 6/6/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include "ww.h" ! 28: #include <sys/types.h> ! 29: #include <sys/socket.h> ! 30: ! 31: struct ww * ! 32: wwopen(flags, nrow, ncol, row, col, nline) ! 33: { ! 34: register struct ww *w; ! 35: register i, j; ! 36: char m; ! 37: short nvis; ! 38: ! 39: w = (struct ww *)calloc(sizeof (struct ww), 1); ! 40: if (w == 0) { ! 41: wwerrno = WWE_NOMEM; ! 42: goto bad; ! 43: } ! 44: w->ww_pty = -1; ! 45: w->ww_socket = -1; ! 46: ! 47: for (i = 0; i < NWW && wwindex[i] != 0; i++) ! 48: ; ! 49: if (i >= NWW) { ! 50: wwerrno = WWE_TOOMANY; ! 51: goto bad; ! 52: } ! 53: w->ww_index = i; ! 54: ! 55: if (nline < nrow) ! 56: nline = nrow; ! 57: ! 58: w->ww_w.t = row; ! 59: w->ww_w.b = row + nrow; ! 60: w->ww_w.l = col; ! 61: w->ww_w.r = col + ncol; ! 62: w->ww_w.nr = nrow; ! 63: w->ww_w.nc = ncol; ! 64: ! 65: w->ww_b.t = row; ! 66: w->ww_b.b = row + nline; ! 67: w->ww_b.l = col; ! 68: w->ww_b.r = col + ncol; ! 69: w->ww_b.nr = nline; ! 70: w->ww_b.nc = ncol; ! 71: ! 72: w->ww_i.t = MAX(w->ww_w.t, 0); ! 73: w->ww_i.b = MIN(w->ww_w.b, wwnrow); ! 74: w->ww_i.l = MAX(w->ww_w.l, 0); ! 75: w->ww_i.r = MIN(w->ww_w.r, wwncol); ! 76: w->ww_i.nr = w->ww_i.b - w->ww_i.t; ! 77: w->ww_i.nc = w->ww_i.r - w->ww_i.l; ! 78: ! 79: w->ww_cur.r = w->ww_w.t; ! 80: w->ww_cur.c = w->ww_w.l; ! 81: ! 82: if (flags & WWO_PTY) { ! 83: if (wwgetpty(w) < 0) ! 84: goto bad; ! 85: w->ww_ispty = 1; ! 86: } else if (flags & WWO_SOCKET) { ! 87: int d[2]; ! 88: if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, d) < 0) { ! 89: wwerrno = WWE_SYS; ! 90: goto bad; ! 91: } ! 92: w->ww_pty = d[0]; ! 93: w->ww_socket = d[1]; ! 94: } ! 95: if (flags & (WWO_PTY|WWO_SOCKET)) { ! 96: if ((w->ww_ob = malloc(512)) == 0) { ! 97: wwerrno = WWE_NOMEM; ! 98: goto bad; ! 99: } ! 100: w->ww_obe = w->ww_ob + 512; ! 101: w->ww_obp = w->ww_obq = w->ww_ob; ! 102: } ! 103: ! 104: w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l, ! 105: w->ww_w.nr, w->ww_w.nc, sizeof (char)); ! 106: if (w->ww_win == 0) ! 107: goto bad; ! 108: m = 0; ! 109: if (flags & WWO_GLASS) ! 110: m |= WWM_GLS; ! 111: if (flags & WWO_REVERSE) ! 112: if (wwavailmodes & WWM_REV) ! 113: m |= WWM_REV; ! 114: else ! 115: flags &= ~WWO_REVERSE; ! 116: for (i = w->ww_w.t; i < w->ww_w.b; i++) ! 117: for (j = w->ww_w.l; j < w->ww_w.r; j++) ! 118: w->ww_win[i][j] = m; ! 119: ! 120: if (flags & WWO_FRAME) { ! 121: w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l, ! 122: w->ww_w.nr, w->ww_w.nc, sizeof (char)); ! 123: if (w->ww_fmap == 0) ! 124: goto bad; ! 125: for (i = w->ww_w.t; i < w->ww_w.b; i++) ! 126: for (j = w->ww_w.l; j < w->ww_w.r; j++) ! 127: w->ww_fmap[i][j] = 0; ! 128: } ! 129: ! 130: w->ww_buf = (union ww_char **) ! 131: wwalloc(w->ww_b.t, w->ww_b.l, ! 132: w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char)); ! 133: if (w->ww_buf == 0) ! 134: goto bad; ! 135: for (i = w->ww_b.t; i < w->ww_b.b; i++) ! 136: for (j = w->ww_b.l; j < w->ww_b.r; j++) ! 137: w->ww_buf[i][j].c_w = ' '; ! 138: ! 139: w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short)); ! 140: if (w->ww_nvis == 0) { ! 141: wwerrno = WWE_NOMEM; ! 142: goto bad; ! 143: } ! 144: w->ww_nvis -= w->ww_w.t; ! 145: nvis = m ? 0 : w->ww_w.nc; ! 146: for (i = w->ww_w.t; i < w->ww_w.b; i++) ! 147: w->ww_nvis[i] = nvis; ! 148: ! 149: w->ww_state = WWS_INITIAL; ! 150: w->ww_oflags = flags; ! 151: return wwindex[w->ww_index] = w; ! 152: bad: ! 153: if (w != 0) { ! 154: if (w->ww_win != 0) ! 155: wwfree(w->ww_win, w->ww_w.t); ! 156: if (w->ww_fmap != 0) ! 157: wwfree(w->ww_fmap, w->ww_w.t); ! 158: if (w->ww_buf != 0) ! 159: wwfree((char **)w->ww_buf, w->ww_b.t); ! 160: if (w->ww_nvis != 0) ! 161: free((char *)(w->ww_nvis + w->ww_w.t)); ! 162: if (w->ww_ob != 0) ! 163: free(w->ww_ob); ! 164: if (w->ww_pty >= 0) ! 165: (void) close(w->ww_pty); ! 166: if (w->ww_socket >= 0) ! 167: (void) close(w->ww_socket); ! 168: free((char *)w); ! 169: } ! 170: return 0; ! 171: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.