home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume17
/
mgr
/
part20
< prev
next >
Wrap
Text File
|
1989-01-19
|
52KB
|
1,993 lines
Subject: v17i021: MGR, Bellcore window manager, Part21/61
Newsgroups: comp.sources.unix
Approved: rsalz@uunet.UU.NET
Submitted-by: Stephen A. Uhler <sau@bellcore.com>
Posting-number: Volume 17, Issue 21
Archive-name: mgr/part21
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 20 (of 61)."
# Contents: demo/misc/Makefile demo/misc/clock2.c src/blit/bitmap.c
# src/blit/line.C src/blit/sym.c src/destroy.c src/font_subs.c
# src/oblit/bitmap.c src/print.c src/win_make.c
# Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:23 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'demo/misc/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'demo/misc/Makefile'\"
else
echo shar: Extracting \"'demo/misc/Makefile'\" \(4414 characters\)
sed "s/^X//" >'demo/misc/Makefile' <<'END_OF_FILE'
X# Copyright (c) 1987 Bellcore
X# All Rights Reserved
X# Permission is granted to copy or use this program, EXCEPT that it
X# may not be sold for profit, the copyright notice must be reproduced
X# on copies, and credit should be given to Bellcore where it is due.
X# BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X
X# $Header: Makefile,v 4.5 88/08/22 10:30:44 sau Exp $
X# $Source: /tmp/mgrsrc/demo/misc/RCS/Makefile,v $
X
X# makefile for demos
X
XLIB= ../../lib/libmgr.a
XBIT= ../../lib/blitlib.a
XINCL= -I../../lib
XCPIO=demo.cpio
XTAR = demo.tar
XCFLAGS=-O $(INCL)
XLDFLAGS=$(LIB)
XSTART=.
XCPIO=misc.cpio
XINSROOT=/usr/mgr
XINSDIR=$(INSROOT)/bin
X
XCFILES= art_data.c bounce.c clock.c clock2.c close.c \
X dmgr.c ether.c getpty.c grav.c grid.c hilbert.c hpmgr.c maze.c \
X mgrmail.c mgrmode.c mgrmsgs.c oclose.c omgrmail.c overlayd.c \
X set_console.c set_emacs.c set_termcap.c show.c startup.c \
X stat.c stringart.c lock.c
X
XOFILES= art_data.o bounce.o clock.o clock2.o close.o \
X dmgr.o ether.o getpty.o grav.o grid.o hilbert.o hpmgr.o maze.o \
X mgrmail.o mgrmode.o mgrmsgs.o oclose.o omgrmail.o overlayd.o \
X set_console.o set_emacs.o set_termcap.o show.o startup.o \
X stat.o stringart.o lock.o
X
XSMALL= bounce clock clock2 close dmgr ether grav grid hilbert \
X hpmgr maze mgrmail mgrmode mgrmsgs oclose omgrmail \
X set_emacs set_termcap show startup stat stringart
X
XALL = $(SMALL) overlayd set_console lock
X
XOTHER = Makefile
X
Xall: $(ALL)
X
Xsmall: $(SMALL)
X
Xfast:
X cc -c $(CFLAGS) $(CFILES)
X make all
X
Xbanner: banner.o $(LIB)
X cc $(CFLAGS) -o banner banner.o $(LDFLAGS)
X
Xclock: clock.o $(LIB)
X cc $(CFLAGS) -o clock clock.o $(LDFLAGS)
X
Xclock2: clock2.o $(LIB)
X cc $(CFLAGS) -o clock2 clock2.o $(LDFLAGS)
X
Xbounce: bounce.o $(LIB)
X cc $(CFLAGS) -o bounce bounce.o $(LDFLAGS)
X
Xdmgr: dmgr.o $(LIB)
X cc $(CFLAGS) -o dmgr dmgr.o $(LDFLAGS)
X
Xgrav: grav.o $(LIB)
X cc $(CFLAGS) -o grav grav.o $(LDFLAGS)
X
Xhpmgr: hpmgr.o getpty.o $(LIB)
X cc $(CFLAGS) -o hpmgr hpmgr.o getpty.o $(LDFLAGS)
X
Xmgrmsgs: mgrmsgs.o $(LIB)
X cc $(CFLAGS) -o mgrmsgs mgrmsgs.o $(LDFLAGS)
X
Xomgrmail: omgrmail.o $(LIB)
X cc $(CFLAGS) -o omgrmail omgrmail.o $(LDFLAGS)
X
Xmgrmail: mgrmail.o $(LIB)
X cc $(CFLAGS) -o mgrmail mgrmail.o $(LDFLAGS)
X
Xchart: chart.o $(LIB)
X cc $(CFLAGS) -o chart chart.o $(LDFLAGS)
X
Xclose: close.o $(LIB)
X cc $(CFLAGS) -o close close.o $(LDFLAGS)
X
Xoclose: oclose.o $(LIB)
X cc $(CFLAGS) -o oclose oclose.o $(LDFLAGS)
X
Xclose3: close3.o $(LIB)
X cc $(CFLAGS) -o close3 close3.o $(LDFLAGS)
X
Xstringart: stringart.o art_data.o $(LIB)
X cc $(CFLAGS) -o stringart stringart.o art_data.o $(LDFLAGS)
X
Xstat: stat.o $(LIB)
X cc $(CFLAGS) -o stat stat.o $(LDFLAGS)
X
Xether: ether.o $(LIB)
X cc $(CFLAGS) -o ether ether.o $(LDFLAGS)
X
Xset_console: set_console.o $(LIB)
X cc $(CFLAGS) -o set_console set_console.o $(LDFLAGS)
X
Xset_emacs: set_emacs.o $(LIB)
X cc $(CFLAGS) -o set_emacs set_emacs.o $(LDFLAGS)
X
Xset_termcap: set_termcap.o $(LIB)
X cc $(CFLAGS) -o set_termcap set_termcap.o $(LDFLAGS)
X
Xmgrmode: mgrmode.o $(LIB)
X cc $(CFLAGS) -o mgrmode mgrmode.o $(LDFLAGS)
X
Xshow: show.o $(LIB)
X cc $(CFLAGS) -o show show.o $(LDFLAGS)
X
Xstartup: startup.o $(LIB)
X cc $(CFLAGS) -o startup startup.o $(LDFLAGS)
X
Xhilbert: hilbert.o $(LIB)
X cc $(CFLAGS) -o hilbert hilbert.o $(LDFLAGS)
X
Xoverlayd: overlayd.o $(LIB)
X cc $(CFLAGS) -o overlayd overlayd.o $(LDFLAGS)
X
Xgrid: grid.o $(LIB)
X cc $(CFLAGS) -o grid grid.o $(LDFLAGS)
X
Xview: view.o $(LIB)
X cc $(CFLAGS) -o view view.o $(LDFLAGS)
X
Xfile: file.o $(LIB)
X cc $(CFLAGS) -o file file.o $(LDFLAGS)
X
Xprint: print.o $(LIB)
X cc $(CFLAGS) -o print print.o $(LDFLAGS)
X
Xwprint: wprint.o $(LIB)
X cc $(CFLAGS) -o wprint wprint.o $(LDFLAGS)
X
Xlock: lock.o $(LIB)
X cc $(CFLAGS) -o lock lock.o $(BIT) $(OTHERLIB)
X
Xmaze: maze.o $(LIB)
X cc $(CFLAGS) -o maze maze.o $(LDFLAGS)
X
X$(OFILES): ../../lib/term.h $(LIB)
X
Xinstall: all $(INSDIR)
X cd $(INSDIR); rm -f $(ALL)
X cp $(ALL) $(INSDIR)
X
Xsmallinstall: small $(INSDIR)
X cd $(INSDIR); rm -f $(SMALL)
X cp $(SMALL) $(INSDIR)
X -/etc/chown root $(INSDIR)/maze && chmod u+s $(INSDIR)/maze
X
X$(INSDIR):
X mkdir $@
X
Xtar:
X tar cf $(TAR) `ls $(CFILES) $(SH) $(OTHER)`
X
Xclean:
X rm -f *.o
X
Xclobber:
X rm -f $(ALL)
X
Xlist:
X @for i in ${CFILES} ${HFILES} ${OTHER}; do \
X echo "${START}/$$i"; \
X done
X
Xcpio:
X make -s list | cpio -ocv > ${CPIO}
END_OF_FILE
# end of 'demo/misc/Makefile'
fi
if test -f 'demo/misc/clock2.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'demo/misc/clock2.c'\"
else
echo shar: Extracting \"'demo/misc/clock2.c'\" \(5054 characters\)
sed "s/^X//" >'demo/misc/clock2.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: clock2.c,v 4.2 88/06/22 14:37:27 bianchi Exp $
X $Source: /tmp/mgrsrc/demo/misc/RCS/clock2.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/demo/misc/RCS/clock2.c,v $$Revision: 4.2 $";
X
X/* get today's date (analog clock version) */
X
X#include <errno.h>
X#include <time.h>
X#include <stdio.h>
X#include "term.h"
X#include "restart.h"
X
X#define OFFSET (500<<10) /* shift points to 1st quad */
X
X/* sin, cos tables: 0-360 deg. in 6 deg. increments (scaled to +/- 1024) */
X
Xint sin[] = {
X 0, 107, 212, 316, 416, 512,
X 601, 685, 760, 828, 886, 935,
X 973, 1001, 1018, 1023, 1018, 1001,
X 973, 935, 886, 828, 760, 685,
X 601, 511, 416, 316, 212, 107,
X 0, -107, -212, -316, -416, -512,
X -601, -685, -760, -828, -886, -935,
X -973, -1001, -1018, -1023, -1018, -1001,
X -973, -935, -886, -828, -760, -685,
X -601, -511, -416, -316, -212, -107,
X 0 };
X
X
Xint cos[] = {
X 1023, 1018, 1001, 973, 935, 886,
X 828, 760, 685, 601, 511, 416,
X 316, 212, 107, 0, -107, -212,
X -316, -416, -512, -601, -685, -760,
X -828, -886, -935, -973, -1001, -1018,
X -1023, -1018, -1001, -973, -935, -886,
X -828, -760, -685, -601, -511, -416,
X -316, -212, -107, 0, 107, 212,
X 316, 416, 512, 601, 685, 760,
X 828, 886, 935, 973, 1001, 1018,
X 1023 };
X
Xtypedef struct coord {
X int x,y;
X } coord;
X
X/* coordinates of the hands at 12:00 */
X
Xcoord second[] = { 1,-30, 0,485 };
Xcoord minute[] = { 10,-10, 0,400, -10,-10, 10,-10 };
Xcoord hour[] = { 35,-10, 0,270, -35,-10, 35,-10 };
X
Xcoord big_tic[] = { -11,485, 0,450, 11,485 };
Xcoord tic[] = { 0,485, 0,460 };
X
Xint h, old_h, m, old_m, s, old_s;
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X {
X register int i;
X int cal=0;
X int dotime(), clean();
X char line[80];
X
X ckmgrterm( *argv );
X
X if (argc>1 && strcmp(argv[1],"-c")==0)
X cal++;
X
X /* setup mgr environment */
X
X m_setup(0);
X m_push(P_FLAGS|P_EVENT);
X m_ttyset();
X
X m_setevent(REDRAW,"R\r");
X m_setevent(RESHAPE,"R\r");
X if (cal)
X m_setevent(ACTIVATE,"A\r");
X
X signal(SIGALRM,dotime);
X signal(SIGTERM,clean);
X signal(SIGINT,clean);
X signal(SIGHUP,clean);
X
X while(1) {
X m_func(B_SET);
X m_clear();
X m_ellipse(500,500,490,490);
X for(i=0;i<60;i+=5) /* the tic marks */
X if (i%15==0)
X draw(big_tic,2,i);
X else
X draw(tic,1,i);
X
X m_movecursor(500,500);
X get_time(&h, &m, &s);
X
X draw(hour,3,h);
X draw(minute,3,m);
X
X m_func(B_INVERT);
X draw(second,1,s);
X m_flush();
X dotime();
X
X /* wait for an event */
X
X while(1) {
X extern int errno;
X
X errno = 0;
X *line = '\0';
X if (m_gets(line) == NULL && errno && errno != EINTR)
X clean(0);
X alarm(0);
X if (*line=='R')
X break;
X else if (cal && *line == 'A') {
X long time(), tmp = time(0);
X char *ctime();
X
X m_push(P_ALL);
X m_font(11);
X m_size(27,3);
X m_clear();
X m_printstr("\n ");
X m_printstr(ctime(&tmp));
X m_flush();
X sleep(3);
X m_pop();
X m_clearmode(M_ACTIVATE);
X m_flush();
X }
X dotime();
X }
X }
X }
X
X/* update the time */
X
Xint
Xdotime()
X {
X old_h=h, old_m=m, old_s=s;
X get_time(&h, &m, &s);
X
X draw(second,1,old_s);
X if (old_m != m) {
X m_func(B_CLEAR);
X draw(minute,3,old_m);
X draw(hour,3,old_h);
X
X m_func(B_SET);
X draw(hour,3,h);
X draw(minute,3,m);
X m_func(B_INVERT);
X }
X
X draw(second,1,s);
X m_flush();
X signal(SIGALRM,dotime);
X alarm(1);
X }
X
X/* rotate and draw hands */
X
X#define X(i) (what[i].x)
X#define Y(i) (what[i].y)
X
Xdraw(what, n, theta)
Xcoord what[]; /* array of points */
Xint n; /* number of points */
Xint theta; /* angle (in 160th of a circle) */
X {
X register int i;
X
X for(i=0;i<n;i++) {
X m_line((X(i)*cos[theta]+Y(i)*sin[theta] + OFFSET)>>10,
X (X(i)*sin[theta]-Y(i)*cos[theta] + OFFSET)>>10,
X (X(i+1)*cos[theta]+Y(i+1)*sin[theta] + OFFSET)>>10,
X (X(i+1)*sin[theta]-Y(i+1)*cos[theta] + OFFSET)>>10);
X }
X }
X
X/* convert time to angles */
X
Xget_time(h,m,s)
Xint *h, *m, *s; /* hours, minutes, seconds */
X {
X struct tm *tme, *localtime();
X long tmp,time();
X
X tmp = time(0);
X tme = localtime(&tmp);
X
X *m = tme->tm_min;
X *s = tme->tm_sec;
X if (tme->tm_hour > 11)
X tme->tm_hour -= 12;
X *h = tme->tm_hour*5 + (2+tme->tm_min)/12;
X }
X
X/* clean up and exit */
X
Xclean(n)
Xint n;
X {
X m_popall(0);
X m_clear();
X m_flush();
X m_ttyreset();
X exit(1);
X }
END_OF_FILE
# end of 'demo/misc/clock2.c'
fi
if test -f 'src/blit/bitmap.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/blit/bitmap.c'\"
else
echo shar: Extracting \"'src/blit/bitmap.c'\" \(4616 characters\)
sed "s/^X//" >'src/blit/bitmap.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: bitmap.c,v 4.2 88/07/07 09:04:29 sau Exp $
X $Source: /tmp/mgrsrc/src/blit/RCS/bitmap.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/blit/RCS/bitmap.c,v $$Revision: 4.2 $";
X
X/* SUN-2 and SUN-3 bitblit code */
X
X#ifdef sun
X# include <sys/ioctl.h>
X# include <sun/fbio.h>
X# include <sys/file.h>
X# include <sys/mman.h>
X#endif
X#include <stdio.h>
X#include "bitmap.h"
X
Xint bit_debug = 1;
Xstatic int _s_start;
Xstatic _s_len;
X
X/* open the screen; it looks like memory */
X
XBITMAP *
Xbit_open(name)
Xchar *name; /* name of frame buffer */
X{
X BITMAP *result = BIT_NULL;
X#ifdef sun
X int fd;
X char *malloc();
X register DATA addr;
X struct fbtype buff;
X int pagesize;
X
X Bprintf(1) ("bit_open:(%s)\n", name);
X
X /* open the SUN screen */
X
X if ((fd = open(name, O_RDWR)) < 0)
X return (BIT_NULL);
X
X /* get the frame buffer size */
X
X if (ioctl(fd, FBIOGTYPE, &buff) < 0)
X return (BIT_NULL);
X
X /* malloc space for frame buffer */
X
X pagesize = getpagesize();
X if ((_s_start = (int) malloc(buff.fb_size + pagesize)) == 0)
X return (BIT_NULL);
X
X /* align space on a page boundary */
X
X buff.fb_size = (buff.fb_size+pagesize-1) &~ (pagesize-1);
X addr = (DATA ) ((_s_start + pagesize - 1) & ~(pagesize - 1));
X
X /* map the frame buffer into malloc'd space */
X
X#ifdef _MAP_NEW /* New semantics for mmap in Sun release 4.0 */
X addr = (DATA) mmap(addr, _s_len=buff.fb_size,
X PROT_WRITE, _MAP_NEW|MAP_SHARED, fd, 0);
X if ((int)addr == -1)
X return (BIT_NULL);
X#else
X if (mmap(addr, _s_len = buff.fb_size, PROT_WRITE, MAP_SHARED, fd, 0) < 0)
X return (BIT_NULL);
X#endif
X
X if ((result = (BITMAP *) malloc(sizeof(BITMAP))) == (BITMAP *) 0)
X return (BIT_NULL);
X
X result->primary = result;
X result->data = addr;
X result->x0 = 0,
X result->y0 = 0,
X result->wide = buff.fb_width;
X result->high = buff.fb_height;
X result->type = _SCREEN;
X Bprintf(2) (" O.K.(0x%lx)\n (%d x %x)",
X (long) result->data, result->wide, result->high);
X#endif
X return (result);
X}
X
X/* destroy a bitmap, free up space */
X
Xint
Xbit_destroy(bitmap)
XBITMAP *bitmap;
X{
X Bprintf(1) ("bit_destroy:\n");
X if (bitmap == (BITMAP *) 0)
X return (-1);
X if (IS_MEMORY(bitmap) && IS_PRIMARY(bitmap))
X free(bitmap->data);
X else if (IS_SCREEN(bitmap) && IS_PRIMARY(bitmap)) {
X munmap(BIT_DATA(bitmap), _s_len);
X free(_s_start);
X }
X free(bitmap);
X return (0);
X}
X
X/* create a bitmap as a sub-rectangle of another bitmap */
X
XBITMAP *
Xbit_create(map, x, y, wide, high)
XBITMAP *map;
Xint x, y, wide, high;
X{
X char *malloc();
X register BITMAP *result;
X
X Bprintf(1) ("bit_create:\n");
X if (x + wide > map->wide)
X wide = map->wide - x;
X if (y + high > map->high)
X high = map->high - y;
X if (wide < 1 || high < 1)
X return (BIT_NULL);
X
X if ((result = (BITMAP *) malloc(sizeof(BITMAP))) == (BITMAP *) 0)
X return (BIT_NULL);
X
X result->data = map->data;
X result->x0 = map->x0 + x;
X result->y0 = map->y0 + y;
X result->wide = wide;
X result->high = high;
X result->primary = map->primary;
X result->type = map->type;
X Bprintf(2) (" Created %d,%d %d,%d\n", result->x0, result->y0,
X result->wide, result->high);
X return (result);
X}
X
X/* allocate space for, and create a memory bitmap */
X
XBITMAP *
Xbit_alloc(wide, high, data, bits)
Xunsigned short wide, high;
XDATA data;
Xint bits; /* in preparation for color */
X{
X char *malloc();
X register BITMAP *result;
X register int size;
X
X Bprintf(1) ("bit_alloc:\n");
X if ((result = (BITMAP *) malloc(sizeof(BITMAP))) == (BITMAP *) 0)
X return (result);
X
X result->x0 = 0;
X result->y0 = 0;
X result->high = high;
X result->wide = wide;
X
X size = BIT_SIZE(result);
X
X if (data != (DATA ) 0)
X result->data = data;
X#ifdef ALIGN32
X else if ((result->data = (DATA ) memalign(4,size)) == (DATA ) 0) {
X#else
X else if ((result->data = (DATA ) malloc(size)) == (DATA ) 0) {
X#endif
X free(result);
X return ((BITMAP *) 0);
X }
X
X result->primary = result;
X result->type = _MEMORY;
X Bprintf(2) (" Created %d,%d %d,%d\n", result->x0, result->y0,
X result->wide, result->high);
X return (result);
X}
END_OF_FILE
# end of 'src/blit/bitmap.c'
fi
if test -f 'src/blit/line.C' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/blit/line.C'\"
else
echo shar: Extracting \"'src/blit/line.C'\" \(4306 characters\)
sed "s/^X//" >'src/blit/line.C' <<'END_OF_FILE'
X/* Copyright (c) 1988 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: line.C,v 4.2 88/06/30 11:40:57 sau Exp $
X $Source: /tmp/mgrsrc/src/blit/RCS/line.C,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/blit/RCS/line.C,v $$Revision: 4.2 $";
X
X#include "asm.h"
X#include "bitmap.h"
X
X/* Draw a line - Bresenham method using bit-field instructions.
X * The bitfield instructions don't buy much (<10%), but they're there.
X */
X
Xbit_line(dest, x0, y0, x1, y1, func)
Xregister BITMAP *dest; /* destination bitmap */
Xint x0, y0, x1, y1; /* line coordinates */
Xint func; /* set, clear, or invert */
X {
X register int err, rincr, rdecr, d_incr, count;
X register int offset; /* bit offset from x0,y0 */
X register long *base; /* address of x0,y0 */
X int dx, dy; /* # of pixels in x and y */
X int temp;
X
X#ifndef NOCLIP
X /* clip here */
X
X#define TOP 001
X#define BOTTOM 002
X#define LEFT 004
X#define RIGHT 010
X#define CROSS(x,y) \
X (x<0 ? LEFT : x>= (dest->wide) ? RIGHT : 0) + \
X (y < 0 ? TOP : y >= (dest -> high) ? BOTTOM : 0)
X
X {
X
X /* The classic line clipping algorithm */
X
X int cross0 = CROSS(x0, y0);
X int cross1 = CROSS(x1, y1);
X
X while (cross0 || cross1) {
X int cross, x, y;
X if (cross0 & cross1)
X return;
X if (cross0 != 0)
X cross = cross0;
X else
X cross = cross1;
X if (cross & (LEFT | RIGHT)) {
X int edge = (cross & LEFT) ? 0 : dest->wide - 1;
X y = y0 + (y1 - y0) * (edge - x0) / (x1 - x0);
X x = edge;
X }
X else if (cross & (TOP | BOTTOM)) {
X int edge = (cross & TOP) ? 0 : dest->high - 1;
X x = x0 + (x1 - x0) * (edge - y0) / (y1 - y0);
X y = edge;
X }
X if (cross == cross0) {
X x0 = x;
X y0 = y;
X cross0 = CROSS(x, y);
X }
X else {
X x1 = x;
X y1 = y;
X cross1 = CROSS(x, y);
X }
X }
X }
X
X /* end of clipping */
X#endif
X
X x0 += dest->x0;
X y0 += dest->y0;
X x1 += dest->x0;
X y1 += dest->y0;
X
X /* always draw left to right */
X
X if (x1 < x0) {
X temp = x1, x1 = x0, x0 = temp;
X temp = y1, y1 = y0, y0 = temp;
X }
X dx = x1 - x0;
X dy = y1 - y0;
X
X if (dy > 0)
X d_incr = BIT_LINE(dest);
X else
X d_incr = -BIT_LINE(dest), dy = -dy;
X
X base = y0 * (BIT_LINE(dest) >> 5) + (dest->data); /* start of line */
X offset = x0; /* bit offset from line */
X
X#define STEP(dx,dy,xmove,ymove,op) { \
X rincr = (dx - dy)<<1; \
X rdecr = -(dy<<1); \
X err = dx + rdecr; \
X for (count = dx; count >= 0; count--) { \
X op($base,$offset,IMM(1)); \
X offset += (xmove); \
X if (err < 0) { \
X offset += (ymove); \
X err += rincr; \
X } \
X else { \
X err += rdecr; \
X } \
X } \
X }
X
X /* @+ */
X
X if (dx > dy) /* gentle slope */
X switch (OPCODE(func)) {
X case OPCODE(SRC):
X case OPCODE(SRC | DST):
X case OPCODE(SRC | ~DST):
X case OPCODE(~0):
X STEP(dx, dy, 1, d_incr, BF_SET);
X break;
X case OPCODE(~SRC):
X case OPCODE(~(SRC|DST)):
X case OPCODE(DST & ~SRC):
X case OPCODE(0):
X STEP(dx, dy, 1, d_incr, BF_CLR);
X break;
X case OPCODE(SRC ^ DST):
X case OPCODE(~DST):
X case OPCODE(SRC & ~DST):
X case OPCODE(~(SRC&DST)):
X STEP(dx, dy, 1, d_incr, BF_INV);
X break;
X }
X else /* steep slope */
X switch (OPCODE(func)) {
X case OPCODE(SRC):
X case OPCODE(SRC | DST):
X case OPCODE(SRC | ~DST):
X case OPCODE(~0):
X STEP(dy, dx, d_incr, 1, BF_SET);
X break;
X case OPCODE(~SRC):
X case OPCODE(~(SRC|DST)):
X case OPCODE(DST & ~SRC):
X case OPCODE(0):
X STEP(dy, dx, d_incr, 1, BF_CLR);
X break;
X case OPCODE(SRC ^ DST):
X case OPCODE(~DST):
X case OPCODE(SRC & ~DST):
X case OPCODE(~(SRC&DST)):
X STEP(dy, dx, d_incr, 1, BF_INV);
X break;
X }
X }
END_OF_FILE
# end of 'src/blit/line.C'
fi
if test -f 'src/blit/sym.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/blit/sym.c'\"
else
echo shar: Extracting \"'src/blit/sym.c'\" \(5117 characters\)
sed "s/^X//" >'src/blit/sym.c' <<'END_OF_FILE'
X/* Copyright (c) 1988 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: sym.c,v 4.1 88/06/21 13:19:15 bianchi Exp $
X $Source: /tmp/mgrsrc/src/blit/RCS/sym.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/blit/RCS/sym.c,v $$Revision: 4.1 $";
X
X/* do symbolic substitution for asm decls SUN version */
X
X/* sample stab entries
X .stabs "x:r(0,1)",0x40,0,4,7
X .stabs "i:r(0,1)",0x40,0,4,6
X .stabs "d:r(0,13)",0x40,0,1,12
X .stabs "s:r(0,13)=*(0,2)",0x40,0,1,13
X sample sun instruction
X bfins.l %d1, (%$dbase)[%$dst:%$field]
X*/
X
X#include "stdio.h"
X#include "hash.h"
X
X#define GET_OPT(i) \
X strlen(argv[i])>2 ? argv[i]+2 : argv[++i]
X
X#define FMT " .stabs \"%[^:]:r%*[^\"]\",0x%d,%*d,%*d,%s"
X#define TSIZE 501 /* # of entries in hash table */
X#define KEY "#$ %s %s" /* key work entry */
X#define dprintf if(debug)fprintf
X
Xchar line[512]; /* input line buffer */
Xchar name[32]; /* parameter name */
Xchar reg[10]; /* register value */
X
Xstruct table_entry *table[TSIZE];
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X {
X int class; /* storage class */
X int n;
X char *start, *end; /* for finding sub's. */
X char *index(), *get_end();
X int value; /* register value to substitute */
X int count = 0; /* # of subs */
X int line_cnt=0; /* input line # */
X char type; /* register type 'a' or 'd' */
X int debug = 0;
X register int i;
X
X for(i=1;i<argc;i++) {
X if (*argv[i] == '-')
X switch (argv[i][1]) {
X case 'd': /* turn on debugging */
X debug++;
X break;
X case 'K': /* add keyword */
X {
X char *key = (GET_OPT(i));
X char *reg = argv[++i];
X add_entry(table,TSIZE,key);
X put_entry(table,TSIZE,key,reg);
X dprintf(stderr,"adding %s => %s from command line\n",key,reg);
X }
X break;
X default:
X fprintf(stderr,"%s: bad flag %c ignored\n",argv[0],argv[i][1]);
X }
X }
X
X dprintf(stderr,"Asm symbolic processor\n");
X while(gets(line) != NULL) {
X line_cnt++;
X n = sscanf(line,FMT,name,&class,reg);
X if (n==3 && class == 40) { /* declaration */
X if (is_entry(table,TSIZE,reg)) { /* delete old name */
X dlt_entry(table,TSIZE,get_entry(table,TSIZE,reg));
X }
X add_entry(table,TSIZE,reg);
X add_entry(table,TSIZE,name);
X put_entry(table,TSIZE,name,reg);
X put_entry(table,TSIZE,reg,name);
X puts(line);
X dprintf(stderr,"adding %s => %s from stab entry\n",name,reg);
X }
X else if (sscanf(line,KEY,name,reg) == 2) { /* keyword substitution */
X add_entry(table,TSIZE,name);
X put_entry(table,TSIZE,name,reg);
X dprintf(stderr,"adding %s => %s from file\n",name,reg);
X }
X else if (start = index(line,'$')) { /* parameter substitution */
X fwrite(line,1,start-line,stdout);
X do {
X end = get_end(start+1);
X strncpy(name,start+1,end-start-1);
X name[end-start-1] = '\0';
X if (is_entry(table,TSIZE,name)) { /* do substitution */
X value = atoi(get_entry(table,TSIZE,name));
X if (value > 7) {
X type = 'a';
X value -=8;
X }
X else
X type = 'd';
X printf("%c%d",type,value);
X dprintf(stderr,"line %d: substituting <%c%d> for <%s>\n",
X line_cnt,type,value,name);
X count++;
X }
X else if (is_reg(name)) { /* can't find sub */
X printf("%s",name);
X }
X else {
X printf("$%s",name);
X fprintf(stderr,"%s: Line %d no register found for %s\n",
X *argv,line_cnt,name);
X }
X if (start = index(end,'$'))
X fwrite(end,1,start-end,stdout);
X else
X printf("%s\n",end);
X }
X while(start);
X }
X else /* pass through */
X puts(line);
X }
X dprintf(stderr,"%d substitutions made on %d lines\n",count,line_cnt);
X exit(0);
X }
X
X/* find end of word */
X
Xchar *
Xget_end(str)
Xchar *str;
X {
X register char c;
X register int i=0;
X
X while (i++,(c = *str++)) {
X if (c>='a' && c<='z') continue;
X if (c>='A' && c <= 'Z') continue;
X if (i>1 && c>='0' && c <= '9') continue;
X if (c != '_') break;
X }
X return(str-1);
X }
X
X/* see if variable is [ad][0-7] */
X
Xint
Xis_reg(name)
Xchar *name;
X {
X return( (name[0]=='d' || name[1] == 'a') &&
X (name[1] >= '0' && name[1] <= '7'));
X }
END_OF_FILE
# end of 'src/blit/sym.c'
fi
if test -f 'src/destroy.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/destroy.c'\"
else
echo shar: Extracting \"'src/destroy.c'\" \(5076 characters\)
sed "s/^X//" >'src/destroy.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: destroy.c,v 4.1 88/06/21 13:21:40 bianchi Exp $
X $Source: /tmp/mgrsrc/src/RCS/destroy.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/destroy.c,v $$Revision: 4.1 $";
X
X/* destroy a window (needs fixing) */
X
X#include "bitmap.h"
X#include <stdio.h> /* temporary */
X#include <sys/wait.h>
X#include <sys/signal.h>
X#include "defs.h"
X#include "font.h"
X#include "event.h"
X
X#define ALL 1
X
X/* mark active window for destruction */
X
Xint destroy_window()
X {
X ACTIVE(flags) |= W_DIED;
X }
X
X/* destroy a window */
X
Xint destroy(win)
Xregister WINDOW *win;
X {
X int i;
X union wait status;
X
X if (win == (WINDOW *) 0)
X return(-1);
X
X MOUSE_OFF(mousex,mousey);
X cursor_off();
X
X if (win != active) {
X ACTIVE_OFF();
X expose(win);
X }
X
X active = W(next);
X
X /* deallocate window slot */
X
X if (active)
X ACTIVE(prev) = W(prev);
X
X /* remove window from screen */
X
X erase_win(W(border));
X
X if (W(main)==win) { /* kill process associated with the window */
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: destroy main %s\r\n",W(tty),W(alt)?"ALT":"");
X#endif
X killpg(W(pid),SIGHUP);
X
X if (geteuid() < 1) {
X chmod(W(tty),0666);
X chown(W(tty),0,0);
X }
X
X close(W(to_fd));
X mask &= ~(1<<W(to_fd));
X poll &= ~(1<<W(to_fd));
X#ifdef WHO
X rm_utmp(W(tty));
X#endif
X
X /* tell alternate windows main died */
X
X set_dead(win);
X
X /* wait for shell to die */
X
X#ifdef DEBUG
X dprintf(d)(stderr,"waiting for ..."); fflush(stderr);
X#endif
X if (W(pid) > 1) {
X i = wait3(&status,WNOHANG,0L);
X if (i == 0) { /* start it so it can die */
X kill(W(pid),SIGCONT);
X wait(&status);
X }
X }
X#ifdef DEBUG
X dprintf(d)(stderr," %d\r\n",i);
X#endif
X next_window--;
X }
X
X else if (W(main) && !(W(main)->flags&W_DIED)) { /* main still alive */
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: destroy alt %d\r\n",W(tty),W(num));
X#endif
X do_event(EVENT_DESTROY,win,E_MAIN);
X if (W(from_fd)) { /* re-attach output to main window */
X W(main)->from_fd = W(main)->to_fd;
X W(main)->max = W(max) - W(current); /* ??? */
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: copy %d chars at %d\r\n",
X W(main)->max, W(current));
X#endif
X bcopy(W(buff)+W(current)+1,W(main)->buff,W(main)->max);
X W(main)->current = 0;
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: reattaching main %d chars\r\n",W(tty),W(max));
X#endif
X }
X detach(win);
X }
X else if (W(main)) { /* tell main alts know they are dead */
X W(main)->alt = (WINDOW *) 0;
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: destroy alt, (tell main)\r\n",W(tty));
X#endif
X }
X else {
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: destroy alt, (dead main)\r\n",W(tty));
X#endif
X }
X
X /* fix up display if any windows left */
X
X if (active) {
X repair(win);
X un_covered();
X clip_bad(win); /* invalidate clip lists */
X ACTIVE_ON();
X cursor_on();
X }
X
X /* free space associated with dead window */
X
X unlink_win(win,ALL);
X
X#ifdef DEBUG
X dprintf(d)(stderr,"Active: %s-%d\r\n",
X active?ACTIVE(tty):"NONE", active?ACTIVE(num):0);
X#endif
X
X MOUSE_ON(mousex,mousey);
X
X return(0);
X }
X
X/* free all space associated with a window */
X
Xunlink_win(win,how)
Xregister WINDOW *win; /* window to unlink */
Xint how; /* if how, unlink window stack as well */
X {
X register int i;
X
X#ifdef DEBUG
X dprintf(u)(stderr,"Unlinking %s %s\n",W(tty),how?"ALL":"");
X#endif
X
X if (how && W(stack))
X unlink_win(W(stack),how);
X if (W(window))
X bit_destroy(W(window));
X for(i=0; i< MAXBITMAPS;i++)
X if (W(bitmaps)[i])
X bit_destroy(W(bitmaps)[i]);
X if (W(border))
X bit_destroy(W(border));
X if (W(save))
X bit_destroy(W(save));
X if (W(snarf))
X free(W(snarf));
X if (W(bitmap))
X free(W(bitmap));
X zap_cliplist(win);
X
X for(i=0; i< MAXEVENTS;i++)
X if (W(events)[i])
X free(W(events)[i]);
X
X for(i=0; i< MAXMENU;i++)
X if (W(menus)[i])
X menu_destroy(W(menus)[i]);
X
X free(win);
X }
X
X/* unlink an alternate window from list */
X
Xint
Xdetach(win2)
XWINDOW *win2;
X {
X register WINDOW *win = win2;
X
X if (!(W(main)))
X return;
X for(win=win2->main;W(alt)!=win2;win=W(alt))
X ;
X W(alt)= win2->alt;
X }
X
X/* notify alternate windows of impending death */
X
Xset_dead(win)
Xregister WINDOW *win;
X {
X for(win = W(alt); win != (WINDOW *) 0; win = W(alt)) {
X#ifdef DEBUG
X dprintf(d)(stderr,"%s: telling %d\r\n",W(tty),W(num));
X#endif
X W(main) = (WINDOW *) 0;
X }
X }
END_OF_FILE
# end of 'src/destroy.c'
fi
if test -f 'src/font_subs.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/font_subs.c'\"
else
echo shar: Extracting \"'src/font_subs.c'\" \(4187 characters\)
sed "s/^X//" >'src/font_subs.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: font_subs.c,v 4.2 88/06/24 10:18:04 sau Exp $
X $Source: /tmp/mgrsrc/src/RCS/font_subs.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/font_subs.c,v $$Revision: 4.2 $";
X
X/* font routines */
X
X#include "bitmap.h"
X#include "font.h"
X#include "default_font.h"
X#include "window.h"
X#include <stdio.h>
X#ifdef DEBUG
X# include "defs.h"
X#endif
X
X#define HEAD(x) font->head.x
X
X/**************************************************************************
X *
X * set up a font file
X */
X
Xstruct font *
Xopen_font(file)
Xchar *file; /* name of font file */
X {
X FILE *fp;
X int size;
X char *malloc();
X struct font *font, *open_sfont();
X
X if (file == (char *) 0 || *file == '\0') {
X return(open_sfont(default_font_head,&default_font));
X }
X
X#ifdef DEBUG
X dprintf(f)(stderr,"Opening font file [%s]\n",file);
X#endif
X
X if ((fp=fopen(file,"r")) == NULL)
X return((struct font *)0);
X
X if ((font=(struct font *) malloc(sizeof(struct font))) == (struct font *)0) {
X fclose(fp);
X return((struct font *)0);
X }
X
X if (fread(&(font->head),HEADER_SIZE,1,fp) != 1) {
X free((char *) font);
X fclose(fp);
X return((struct font *)0);
X }
X
X if (HEAD(type) != FONT_A) {
X free((char *) font);
X fclose(fp);
X return((struct font *)0);
X }
X
X font->data = bit_alloc(HEAD(wide) *HEAD(count),HEAD(high),NULL_DATA,1);
X font->table = (struct entry **) 0;
X
X /* read in font data */
X
X size = BIT_SIZE(font->data);
X fread(BIT_DATA(font->data), size, 1, fp);
X
X /* create individual characters */
X
X glyph_create( font );
X
X fclose(fp);
X return(font);
X }
X
X
X/**************************************************************************
X *
X * deallocate a font
X */
X
Xint
Xfree_font(dead_font)
Xstruct font *dead_font; /* font to be deallocated */
X {
X register int i;
X
X if (!dead_font)
X return(-1);
X
X for(i=0;i<MAXGLYPHS;i++)
X if (dead_font->glyph[i])
X bit_destroy(dead_font->glyph[i]);
X if (dead_font->head.type != FONT_S)
X bit_destroy(dead_font->data);
X zap_fhash(dead_font); /* free up hash table space */
X i=font_purge(dead_font); /* eliminate references to dead font */
X
X#ifdef DEBUG
X dprintf(f)(stderr,"freeing font %d (%d references)\n",
X dead_font->ident,i);
X#endif
X
X free((char *) dead_font);
X }
X
X/**************************************************************************
X *
X * set up a static font file
X */
X
Xstruct font *
Xopen_sfont(head,data)
Xstruct font_header head; /* font header */
XBITMAP *data; /* array of bits */
X {
X char *malloc();
X struct font *font;
X
X if ((font=(struct font *) malloc(sizeof(struct font))) == (struct font *)0)
X return((struct font *)0);
X
X font->head = head;
X font->data = data;
X font->head.type = FONT_S;
X font->table = (struct entry **) 0;
X
X /* create individual characters */
X
X glyph_create( font );
X
X return(font);
X }
X
X
Xstatic
Xglyph_create( font )
Xstruct font *font;
X {
X register int i, x;
X int first = HEAD(start);
X int last = HEAD(start) + HEAD(count);
X int wide = HEAD(wide);
X int high = HEAD(high);
X int nochar;
X
X /* Pick the character to be printed for characters not in the set.
X Normally, it is the character specified by C_NOCHAR, but it that isn't
X in the range of the set, we pick the first character (which is usually
X a space).
X */
X nochar = C_NOCHAR - HEAD(start);
X if( nochar >= last )
X nochar = 0;
X nochar *= wide;
X
X x = 0;
X for(i=0; i<MAXGLYPHS; i++)
X if (i < first || i >= last)
X font->glyph[i] = bit_create(font->data, nochar, 0, wide, high);
X else {
X font->glyph[i] = bit_create(font->data, x, 0, wide, high);
X x += wide;
X }
X }
END_OF_FILE
# end of 'src/font_subs.c'
fi
if test -f 'src/oblit/bitmap.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/oblit/bitmap.c'\"
else
echo shar: Extracting \"'src/oblit/bitmap.c'\" \(4634 characters\)
sed "s/^X//" >'src/oblit/bitmap.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: bitmap.c,v 4.2 88/07/07 09:08:51 sau Exp $
X $Source: /tmp/mgrsrc/src/oblit/RCS/bitmap.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/oblit/RCS/bitmap.c,v $$Revision: 4.2 $";
X
X/* SUN-2 and SUN-3 bitblit code */
X
X#ifdef sun
X# include <sys/ioctl.h>
X# include <sun/fbio.h>
X# include <sys/file.h>
X# include <sys/mman.h>
X#endif
X#include <stdio.h>
X#include "bitmap.h"
X
Xint bit_debug = 1;
Xstatic int _s_start;
Xstatic _s_len;
X
X/* open the screen; it looks like memory */
X
XBITMAP *
Xbit_open(name)
Xchar *name; /* name of frame buffer */
X{
X BITMAP *result = BIT_NULL;
X#ifdef sun
X int fd;
X char *malloc();
X register DATA addr;
X struct fbtype buff;
X int pagesize;
X
X Bprintf(1) ("bit_open:(%s)\n", name);
X
X /* open the SUN screen */
X
X if ((fd = open(name, O_RDWR)) < 0)
X return (BIT_NULL);
X
X /* get the frame buffer size */
X
X if (ioctl(fd, FBIOGTYPE, &buff) < 0)
X return (BIT_NULL);
X
X /* malloc space for frame buffer */
X
X pagesize = getpagesize();
X if ((_s_start = (int) malloc(buff.fb_size + pagesize)) == 0)
X return (BIT_NULL);
X
X /* align space on a page boundary */
X
X buff.fb_size = (buff.fb_size+pagesize-1) &~ (pagesize-1);
X addr = (DATA ) ((_s_start + pagesize - 1) & ~(pagesize - 1));
X
X /* map the frame buffer into malloc'd space */
X
X#ifdef _MAP_NEW /* New semantics for mmap in Sun release 4.0 */
X addr = (DATA) mmap(addr, _s_len=buff.fb_size,
X PROT_WRITE, _MAP_NEW|MAP_SHARED, fd, 0);
X if ((int)addr == -1)
X return (BIT_NULL);
X#else
X if (mmap(addr, _s_len = buff.fb_size, PROT_WRITE, MAP_SHARED, fd, 0) < 0)
X return (BIT_NULL);
X#endif
X
X if ((result = (BITMAP *) malloc(sizeof(BITMAP))) == (BITMAP *) 0)
X return (BIT_NULL);
X
X result->primary = result;
X result->data = addr;
X result->x0 = 0,
X result->y0 = 0,
X result->wide = buff.fb_width;
X result->high = buff.fb_height;
X result->type = _SCREEN;
X Bprintf(2) (" O.K.(0x%lx)\n (%d x %x)",
X (long) result->data, result->wide, result->high);
X#endif
X return (result);
X}
X
X/* destroy a bitmap, free up space */
X
Xint
Xbit_destroy(bitmap)
XBITMAP *bitmap;
X{
X Bprintf(1) ("bit_destroy:\n");
X if (bitmap == (BITMAP *) 0)
X return (-1);
X if (IS_MEMORY(bitmap) && IS_PRIMARY(bitmap))
X free(bitmap->data);
X else if (IS_SCREEN(bitmap) && IS_PRIMARY(bitmap)) {
X munmap(BIT_DATA(bitmap), _s_len);
X free(_s_start);
X }
X free(bitmap);
X return (0);
X}
X
X/* create a bitmap as a sub-rectangle of another bitmap */
X
XBITMAP *
Xbit_create(map, x, y, wide, high)
XBITMAP *map;
Xint x, y, wide, high;
X{
X char *malloc();
X register BITMAP *result;
X
X Bprintf(1) ("bit_create:\n");
X if (x + wide > map->wide)
X wide = map->wide - x;
X if (y + high > map->high)
X high = map->high - y;
X if (wide < 1 || high < 1)
X return (BIT_NULL);
X
X if ((result = (BITMAP *) malloc(sizeof(BITMAP))) == (BITMAP *) 0)
X return (BIT_NULL);
X
X result->data = map->data;
X result->x0 = map->x0 + x;
X result->y0 = map->y0 + y;
X result->wide = wide;
X result->high = high;
X result->primary = map->primary;
X result->type = map->type;
X Bprintf(2) (" Created %d,%d %d,%d\n", result->x0, result->y0,
X result->wide, result->high);
X return (result);
X}
X
X/* allocate space for, and create a memory bitmap */
X
XBITMAP *
Xbit_alloc(wide, high, data, bits)
Xunsigned short wide, high;
XDATA data;
Xint bits; /* in preparation for color */
X{
X char *malloc();
X register BITMAP *result;
X register int size;
X
X Bprintf(1) ("bit_alloc:\n");
X if ((result = (BITMAP *) malloc(sizeof(BITMAP))) == (BITMAP *) 0)
X return (result);
X
X result->x0 = 0;
X result->y0 = 0;
X result->high = high;
X result->wide = wide;
X
X size = BIT_SIZE(result);
X
X if (data != (DATA ) 0)
X result->data = data;
X#ifdef ALIGN32
X else if ((result->data = (DATA ) memalign(4,size)) == (DATA ) 0) {
X#else
X else if ((result->data = (DATA ) malloc(size)) == (DATA ) 0) {
X#endif
X free(result);
X return ((BITMAP *) 0);
X }
X
X result->primary = result;
X result->type = _MEMORY;
X Bprintf(2) (" Created %d,%d %d,%d\n", result->x0, result->y0,
X result->wide, result->high);
X return (result);
X}
END_OF_FILE
# end of 'src/oblit/bitmap.c'
fi
if test -f 'src/print.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/print.c'\"
else
echo shar: Extracting \"'src/print.c'\" \(4315 characters\)
sed "s/^X//" >'src/print.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: print.c,v 4.1 88/06/21 13:34:25 bianchi Exp $
X $Source: /tmp/mgrsrc/src/RCS/print.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/print.c,v $$Revision: 4.1 $";
X
X/* debugging routines for printing status info */
X
X#include <stdio.h>
X
Xstatic char *flags[] = {
X "active",
X "escape",
X "snarfable",
X "reverse",
X "standout",
X "died",
X "expose",
X "background",
X "nokill",
X "vi",
X "downloading",
X "noinput",
X "nowrap",
X "overstrike",
X "abs-coords",
X "minus",
X "snarf-lines",
X "snarf-tabs",
X "snarf-hard",
X (char *) 0
X };
X
Xstatic char *events[] = {
X "1_up",
X "no-event",
X "2_up",
X "3_up",
X "no-event",
X "3_down",
X "2_down",
X "no-event",
X "1_down",
X "shape",
X "redraw",
X "activated",
X "deactivated",
X "covered",
X "uncovered",
X "moved",
X "destroyed",
X "accept",
X "notify",
X "tell-me",
X "snarfed",
X "paste",
X "stack",
X "stack_flag",
X (char *) 0
X };
X
Xstatic char *stack[] = {
X "menu",
X "event",
X "font",
X "cursor",
X "bitmap",
X "position",
X "window",
X "flags",
X "mouse",
X "text",
X "CLEAR",
X (char *) 0
X };
X
Xstatic char *menu_states[] = {
X "choice",
X "bottom",
X "top",
X "top & bottom",
X "left",
X "left & bottom",
X "left & top",
X "left & top & bottom",
X "right",
X "right & bottom",
X "right & top",
X "right & top & bottom",
X "right & left",
X "right & left & bottom",
X "right & left & top",
X "right & left & top & bottom",
X };
X
Xstatic char buff[512];
X
X/* get flag names */
X
Xchar *print_flags(n)
Xint n;
X {
X char *binary();
X register int i,j;
X
X sprintf(buff,"(%s)",binary(n));
X for(j=1,i=0;flags[i];i++,j<<=1)
X if (j&n) {
X if (*buff) strcat(buff,",");
X strcat(buff,flags[i]);
X }
X return(buff);
X }
X
X/* get menu states */
X
Xchar
X*print_menu(n)
Xint n; /* menu state */
X {
X return(menu_states[n%16]);
X }
X
X/* get stack codes */
X
Xchar *print_stack(n)
Xint n;
X {
X register int i,j;
X char *binary();
X
X sprintf(buff,"(%s)",binary(n));
X for(j=1,i=0;stack[i];i++,j<<=1)
X if (j&n) {
X if (*buff) strcat(buff,",");
X strcat(buff,stack[i]);
X }
X return(buff);
X }
X
X/* get event names */
X
Xchar *print_events(n)
Xint n;
X {
X register int i,j;
X char *binary();
X
X sprintf(buff,"(%s)",binary(n));
X for(j=1,i=0;events[i];i++,j<<=1)
X if (j&n) {
X if (*buff) strcat(buff,",");
X strcat(buff,events[i]);
X }
X return(buff);
X }
X
X
X/* get ps info */
X
Xstatic char *list[100];
Xstatic int p_count = 0;
X
Xint
Xget_ps()
X {
X FILE *popen(), *ps = popen("ps a","r");
X char line[81];
X char *index(), *save_line();
X
X fgets(line,sizeof(line),ps);
X while(fgets(line,sizeof(line),ps) != NULL) {
X list[p_count++] = save_line(line+6);
X }
X pclose(ps);
X return(p_count);
X }
X
Xint
Xfree_ps()
X {
X register int i;
X
X for(i=0;i<p_count;i++) {
X if (list[i])
X free(list[i]);
X }
X p_count = 0;
X }
X
Xchar *
Xprint_ps(tty)
Xchar *tty;
X {
X register int i;
X register char *check = tty + (strlen(tty) - 2);
X register char *p1,*p2;
X char *index(), *strcpy();
X
X *buff = '\0';
X for(i=0;i<p_count;i++)
X if (list[i] && strncmp(check,list[i],2)==0 &&
X (int)(p1 = index(list[i],':')+4)>4) {
X if (p2 = index(p1,'\n'))
X *p2 = '\0';
X strcpy(buff,p1);
X if (*p1 != '-')
X break;
X }
X return(buff ? buff : strcpy(buff,"?? unknown ??"));
X }
X
X/*****************************************************************************
X * print x in binary
X */
X
Xchar *
Xbinary(x)
Xint x;
X {
X register int i;
X static char out[33];
X int n=32;
X
X out[n+1] = '\0';
X for(i=0;i<n+1;i++)
X if (x&(1<<i))
X out[n-i] = '1';
X else
X out[n-i] = '0';
X for(i=0;out[i]=='0' && i<33;i++);
X return(i>0?out+i-1:out);
X }
END_OF_FILE
# end of 'src/print.c'
fi
if test -f 'src/win_make.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/win_make.c'\"
else
echo shar: Extracting \"'src/win_make.c'\" \(4132 characters\)
sed "s/^X//" >'src/win_make.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: win_make.c,v 4.1 88/06/21 13:34:54 bianchi Exp $
X $Source: /tmp/mgrsrc/src/RCS/win_make.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/win_make.c,v $$Revision: 4.1 $";
X
X/* make an alternate window */
X
X#include "bitmap.h"
X#include "font.h"
X#include "defs.h"
X#include "window.h"
X#include "event.h"
X#include <stdio.h>
X
X/* manipulte an alternate (client) window - called by put_window() */
X
Xint
Xwin_make(win,indx)
XWINDOW *win; /* window issuing make-call */
Xint indx; /* current index into char string (yuk!) */
X {
X register int *p = W(esc); /* array of ESC digits */
X int buff[10];
X WINDOW *win2=win, *insert_win();
X
X switch (W(esc_cnt)) {
X case 1: /* destroy the window */
X#ifdef DEBUG
X dprintf(N)(stderr,"%s: destroying %d\n",W(tty),p[0]);
X#endif
X if (p[0]<=0 || W(main)->alt == (WINDOW *) 0 ||
X W(main)->alt->num<p[0]) {
X break;
X }
X for (win = W(main)->alt;win!=(WINDOW *) 0; win=W(alt)) {
X if (W(num)==p[0])
X break;
X }
X if (win != (WINDOW *) 0)
X W(flags) |= W_DIED;
X break;
X
X case 0: /* goto a new window */
X if (W(num)==p[0] || W(main)->alt == (WINDOW *) 0 ||
X W(main)->alt->num<p[0]) {
X break;
X }
X for (win = W(main);win!=(WINDOW *) 0; win=W(alt)) {
X if (W(num)==p[0])
X break;
X }
X
X /* move contents of shell buffer to new window */
X
X if (win != (WINDOW *) 0) {
X W(from_fd) = W(to_fd);
X win2->from_fd = 0;
X W(max) = win2->max - win2->current - indx - 1;
X bcopy(win2->buff + win2->current + indx + 1,W(buff),W(max));
X W(current) = 0;
X#ifdef DEBUG
X dprintf(N)(stderr,"%s: xfer %d\r\n",W(tty),W(max));
X#endif
X }
X break;
X
X case 3: /* make a new window */
X p[4] = -1;
X /* no break */
X case 4: /* new window + font (not implemented) */
X#ifdef DEBUG
X dprintf(N)(stderr,"%s: making alternate window\n",W(tty));
X#endif
X if (check_window(p[0],p[1],p[2],p[3],p[4]) == 0 ||
X next_window >= MAXWIN) {
X write(ACTIVE(to_fd),"\n",1);
X break;
X }
X if (win!=active)
X cursor_off();
X ACTIVE_OFF();
X if ((active = insert_win((WINDOW *) 0)) == (WINDOW *) 0 ||
X !setup_window(active,font,p[0],p[1],p[2],p[3])) {
X fprintf(stderr,"Out of memory for window creation -- bye!\n");
X quit();
X }
X
X /* next_window++; (this needs more thought) */
X
X /* make the window */
X
X set_covered(active);
X border(active,BLK_BDR,WH_BDR);
X CLEAR(ACTIVE(window),BIT_CLR);
X ACTIVE_ON();
X cursor_on();
X
X#ifdef DEBUG
X dprintf(N)(stderr,"%s: window created\n",W(tty));
X#endif
X /* fix pointer chain */
X
X ACTIVE(to_fd) = W(to_fd);
X ACTIVE(main) = W(main);
X ACTIVE(pid) = W(pid);
X ACTIVE(setid) = W(setid);
X strcpy(ACTIVE(tty),ACTIVE(main)->tty);
X ACTIVE(from_fd) = 0;
X ACTIVE(alt) = W(main)->alt;
X ACTIVE(main)->alt = active;
X if (ACTIVE(alt))
X ACTIVE(num) = ACTIVE(alt)->num + 1;
X else
X ACTIVE(num) = 1;
X
X#ifdef DEBUG
X dprintf(N)(stderr,"%s: created num %d\r\n",ACTIVE(tty),ACTIVE(num));
X#endif
X sprintf(buff,"%d\n",ACTIVE(num));
X write(ACTIVE(to_fd),buff,strlen(buff));
X clip_bad(active); /* invalidate clip lists */
X break;
X case 5: /* nothing */
X break;
X }
X }
END_OF_FILE
# end of 'src/win_make.c'
fi
echo shar: End of archive 20 \(of 61\).
cp /dev/null ark20isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 \
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 \
55 56 57 58 59 60 61 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 61 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0