[comp.sources.unix] v17i025: MGR, Bellcore window manager, Part24/61

rsalz@uunet.uu.net (Rich Salz) (01/25/89)

Submitted-by: Stephen A. Uhler <sau@bellcore.com>
Posting-number: Volume 17, Issue 25
Archive-name: mgr/part24




#! /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 24 (of 61)."
# Contents:  demo/icon/cut.c demo/icon/window_print.c demo/misc/close.c
#   doc/usrman/croff/croff.l doc/usrman/croff/hash.c src/blit/hash.c
#   src/default_font.h
# Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:28 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'demo/icon/cut.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'demo/icon/cut.c'\"
else
echo shar: Extracting \"'demo/icon/cut.c'\" \(6170 characters\)
sed "s/^X//" >'demo/icon/cut.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: cut.c,v 1.1 88/07/08 11:11:39 sau Exp $
X	$Source: /tmp/mgrsrc/demo/icon/RCS/cut.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/demo/icon/RCS/cut.c,v $$Revision: 1.1 $";
X
X/* save current cut buffer in a file */
X
X#include <signal.h>
X#include "term.h"
X
X#define TERM		"mgr"			/* name of valid terminal id */
X
X#define RESTORE	0				/* restore previous icon */
X#define CLOSED		1
X#define OPEN		2
X#define WINK		3
X
X#define ICON_CLOSED	"file_shut"
X#define ICON_OPEN		"file_open"
X#define ICON_WINK		"file_shutb"
X#define CMDNAME		"hm -s"	/* default command */
X#define SLOP			3			/* space around the window */
X
X#define MENU_COUNT		(sizeof(menu)/sizeof(struct menu_entry))
X#define max(x,y)	((x)>(y)?(x):(y))
X#define min(x,y)	((x)<(y)?(x):(y))
X#define dprintf	if(debug)fprintf
X
Xint border;
XFILE *debug;
X
Xmain(argc,argv)
X	int argc;
X	char **argv;
X	{
X	register int i;
X	char *getenv();
X	char *term = getenv ("TERM");
X   char *name = argv[0];
X   char *cmd;				/* command to pipe data to */
X	char line[80];			/* event input buffer */
X
X	int x,y,wide,high;	/* main window size */
X	int w,h;					/* icon size */
X	int max_w, max_h;		/* max icon size */
X	int ix, iy;				/* icon position */
X	int fw,fh,font;				/* font for vi window */
X   int got=0;
X   int shape = 1;			/* window reshape? */
X   FILE *test;				/* temporary file */
X
X	int clean();
X
X	if (getenv("DEBUG"))
X		debug = stderr;
X	else
X		debug = NULL;
X
X	/* make sure environment is ok */
X
X	if (term!=NULL && strcmp(term,TERM)!=0) {
X		fprintf(stderr,"%s only runs on %s terminals\n",name,TERM);
X		exit(1);
X	   }
X
X	/* get args */
X
X   if (argc>1 && strcmp(argv[1],"-s")==0) {	/* don't redhape window */
X      argc--, argv++;
X      shape=0;
X      }
X
X   if (argc>1)
X      cmd = argv[1];
X   else if ((cmd=getenv("CUT")) == NULL)
X      cmd = CMDNAME;
X
X   /* make sure we can run the command */
X
X   if ((test = popen(cmd,"w")) == NULL || pclose(test)!=0) {
X      fprintf(stderr,"%s: Can't start (%s)\n",name,cmd);
X      exit(1);
X      }
X   
X	/* set up window environment */
X
X	m_setup(0);
X	m_ttyset();
X
X	signal(SIGHUP,clean);
X	signal(SIGTERM,clean);
X	signal(SIGINT,clean);
X
X	m_push(P_FONT|P_POSITION|P_EVENT|P_FLAGS);
X	get_size(&x,&y,&wide,&high);
X	get_param(0,0,0,&border);
X	m_setmode(M_NOWRAP);
X	m_func(B_COPY);
X
X	/* get icons */
X
X	if (!down_load(ICON_CLOSED,CLOSED,&w,&h)) {
X      fprintf(stderr,"%s: Can't find %s\n",name,ICON_CLOSED);
X		clean(1);
X		}
X	max_h = h; max_w = w;
X
X	if (!down_load(ICON_OPEN,OPEN,&w,&h)) {
X      fprintf(stderr,"%s: Can't find %s\n",name,ICON_OPEN);
X		clean(1);
X		}
X	max_h = max(max_h,h);
X	max_w = max(max_w,w);
X
X	if (!down_load(ICON_WINK,WINK,&w,&h)) {
X      fprintf(stderr,"%s: Can't find %s\n",name,ICON_WINK);
X		clean(1);
X		}
X
X	max_h = max(max_h,h);
X	max_w = max(max_w,w);
X
X	/* get icon position */
X   
X	m_font(1);	/* a small font */
X   if (shape) {
X		m_push(P_FLAGS|P_EVENT);
X		m_setmode(M_ABS);
X		m_setevent(BUTTON_1,"Z %p\r");
X		fprintf(stderr,"Click button 1 to indicate icon position\n");
X		while (*m_gets(line) != 'Z')
X			;
X		sscanf(line,"Z %d %d",&w,&h);
X		ix = w + x + border; 
X		iy = h + y + border;
X		m_pop();
X
X		/* iconify window */
X
X		m_shapewindow(ix,iy,SLOP+2*border+max_w, SLOP+2*border+max_h);
X		dprintf(debug,"Shaping window to %d x %d\n",border+max_w, border+max_h);
X      }
X
X	/* setup events */
X
X	m_setevent(ACTIVATE,"A\r");
X	m_setevent(DEACTIVATE,"D\r");
X	m_setevent(REDRAW,"R\r");
X	m_setevent(RESHAPE,"S\r");
X	m_setevent(SNARFED,"C %c\r");
X	m_clearmode(M_ACTIVATE);
X
X	/* display icon */
X
X	setup(CLOSED);
X
X	/* wait for an event */
X
X	while(!feof(m_termin)) {
X		m_flush();
X		m_gets(line);
X		switch(*line) {
X			case 'A':	/* window is activated */
X            if (got) {
X               setup(OPEN);
X				   m_flush();
X				   m_put();
X				   m_sendme("\r\005 done\r");
X				   m_flush();
X				   append_file(cmd,got);
X               got = 0;
X               }
X            sleep(1);
X				m_clearmode(M_ACTIVATE);
X				break;
X			case 'D':	/* window is deactivated */
X				setup(CLOSED);
X				break;
X			case 'S':	/* window is reshaped */
X            if (shape) {
X					get_size(&ix,&iy,0,0);
X					m_shapewindow(ix,iy,SLOP+2*border+max_w, SLOP+2*border+max_h);
X               }
X				setup(RESTORE);
X				break;
X			case 'R':	/* screen is redrawn */
X            setup(RESTORE);
X				break;
X			case 'C':	/* Someone cut something */
X				got = atoi(line+2);		/* # of bytes */
X				setup(WINK);
X				m_flush();
X				sleep(1);
X				setup(CLOSED);
X			}
X		}
X	}
X
X/*	Clean up and exit */
X
Xclean()
X	{
X	m_popall();
X	m_ttyreset();
X	exit(1);
X	}
X
X/* setup an icon */
X
Xsetup(where)
Xint where;		/* bitmap # */
X	{
X   static int was=0;
X
X   if (where==0)		/* restore previous icon */
X      where = was;
X
X	m_clear();
X	m_bitcopyto(0,0,999,999,0,0,0,where);
X	dprintf(debug,"displaying icon [%d] \n",where);
X   m_flush();
X   was = where;
X	}
X
X/* download icon */
X
Xint
Xdown_load(name,where,w,h)
Xchar *name;	/* name of icon */
Xint where;	/* scratchpad bitmap # */
Xint *w, *h;	/* icon size */
X	{
X	char buff[20];
X	int n;
X
X   m_bitfromfile(where,name);
X   m_flush();
X   m_gets(buff);
X   n = sscanf(buff,"%d %d",w,h);
X	dprintf(debug,"Getting icon [%s] into %d (%d x %d)\n",
X		name,where,*w,*h);
X	if (n < 2) 
X		return(0);
X	else
X		return(1);
X	}
X
Xint
Xappend_file(cmd,bytes)
Xchar *cmd;		/* command to pipe file to */
Xint bytes;
X	{
X   FILE *file;
X   long now = time(0);
X   char *ctime();
X	register int c,count = 0;
X	int gotn = 0;
X
X   dprintf(stderr,"appending %d bytes\n",bytes);
X   file = popen(cmd,"w");
X   fprintf(file,"\n> %d bytes at: %s  ",bytes,ctime(&now));
X
X	while((c=getc(m_termin)) != '\005') {
X		if (c=='\n' && gotn++ ==0) {
X		   count++;
X			putc(c,file);
X			putc(' ',file);
X			putc(' ',file);
X			}
X		else if (c!= '\n') {
X			putc(c,file);
X			gotn = 0;
X			}
X		}
X	fflush(file);
X   pclose(file);
X	return(count);
X	}
END_OF_FILE
# end of 'demo/icon/cut.c'
fi
if test -f 'demo/icon/window_print.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'demo/icon/window_print.c'\"
else
echo shar: Extracting \"'demo/icon/window_print.c'\" \(6454 characters\)
sed "s/^X//" >'demo/icon/window_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: window_print.c,v 4.1 88/06/21 14:00:15 bianchi Exp $
X	$Source: /tmp/mgrsrc/demo/icon/RCS/window_print.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/demo/icon/RCS/window_print.c,v $$Revision: 4.1 $";
X
X/* print any window on the hp think jet (use lpr filter) */
X
X#include <stdio.h>
X#include <signal.h>
X#include <sys/file.h>
X#include "term.h"
X#include "dump.h"
X
X#define TEMP	"/tmp/pr."			/* temp file name */
X#define MESSAGE	"\rwindow dump"			/* window message */
X#define WORKING	"\rworking..................."	/* print in progress */
X#define JOB	"window"			/* default page header */
X#define OPTION	'v'				/* lpr filter option */
X
X#define MSG_OK		"ok"			/* message ack - success */
X#define MSG_BAD		"x"			/* message nac - failure */
X#define MSG_FILE	"F"			/* service type - no data */
X#define NAME		"print bitmap"		/* name of service */
X
X#define dprintf	if(debug) fprintf
X
X#define GET_OPT(i)	\
X	strlen(argv[i])>2 ? argv[i]+2 : argv[++i]
X#define Min(x)		((x)<5 ? 5 : (x))
X
Xchar command[100];				/* lpr command to run */
Xchar line[100];					/* event input buffer */
Xchar temp[20];					/* temp file name */
Xchar my_host[20];				/* my host */
Xchar mgr_host[20];				/* mgr host */
Xchar title[40];					/* window title */
X
Xint remote;					/* remote from mgr host */
Xint debug;
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   register int i, c;
X   int x,y;					/* bitmap size */
X   int id,sub;					/* window to dump */
X   int clean();
X   char *sprintf();
X
X   char *printer = NULL;			/* printer name */
X   char *job = JOB;				/* job name */
X   char *filter = NULL;				/* pre-filter */
X   char *message = NULL;			/* message line */
X   char option = OPTION;			/* lpr filter */
X   char *noprint = NULL;			/* just same file */
X
X   ckmgrterm( *argv );
X   gethostname(my_host,sizeof(my_host));
X   debug = getenv("DEBUG");
X
X   /* check arguments */
X
X   for(i=1;i<argc;i++) {
X      if (*argv[i] == '-')
X         switch (argv[i][1]) {
X            case 'f':				/* specify filter */
X               filter = GET_OPT(i);
X               break;
X            case 'p':				/* printer name */
X            case 'P':				/* printer name */
X               printer = GET_OPT(i);
X               break; 
X            case 'm':				/* message line */
X               message = GET_OPT(i);
X               break; 
X            case 'j':				/* job name */
X            case 'J':				/* job name */
X               job = GET_OPT(i);
X               break; 
X            case 'o':				/* option flag */
X               option = *(GET_OPT(i));
X               break; 
X            case 'x':				/* dont print name */
X               noprint = GET_OPT(i);
X               break; 
X            default:
X               fprintf(stderr,"%s: invalid flag %c ignored\n",argv[0],argv[i][1]);
X            }
X      else
X         fprintf(stderr,"%s: invalid argument %s ignored\n",argv[0],argv[i]);
X      }
X
X   /* setup mgr */
X
X   m_setup(M_FLUSH);
X   m_push(P_FLAGS|P_EVENT);
X   m_ttyset();
X
X   get_param(mgr_host,0,0,0);
X   remote = strcmp(mgr_host,my_host);
X   dprintf(stderr,"my host (%s), mgr host (%s)\n",my_host,mgr_host);
X
X   if (message)
X      sprintf(title,"\r%s",message);
X   else if (printer && remote)
X      sprintf(title,"%s at %s on %s",MESSAGE,my_host,printer);
X   else if (remote)
X      sprintf(title,"%s at %s",MESSAGE,my_host);
X   else if (printer)
X      sprintf(title,"%s on %s",MESSAGE,printer);
X   else
X      strcpy(title,MESSAGE);
X
X   get_size(&x,&y,0,0);
X   if (!debug)
X      m_sizeall(x,y,Min(strlen(title)-1),1);
X   m_setmode(M_NOWRAP);
X   m_clear();
X   m_printstr(title);
X   m_clearmode(M_ACTIVATE);
X   
X   m_setevent(ACTIVATED,"A\r");			/* window made active */
X   m_setevent(DEACTIVATED,"D\r");		/* window made in-avtive */
X   m_setevent(BUTTON_1,"B %w\r");		/* button 1 hit */
X   m_setevent(REDRAW,"R\r");
X   m_setevent(RESHAPE,"S\r");
X   
X   signal(SIGHUP,clean);
X   signal(SIGINT,clean);
X   signal(SIGTERM,clean);
X
X   /* build command */
X
X   sprintf(temp,"%s%s%d",TEMP,my_host,getpid());
X   dprintf(stderr,"temp file name: (%s)\n",temp);
X   
X   if (noprint) {
X      if (remote)
X         sprintf(command,"rcp %s:%s %s",mgr_host,temp,noprint);
X      else
X         sprintf(command,"cp %s %s",temp,noprint);
X      }
X   else {
X      if (remote)
X         sprintf(command,"rsh %s cat %s | ",mgr_host,temp);
X      else
X         sprintf(command,"< %s ",temp);
X      if (filter) 
X         sprintf(command+strlen(command),"%s | ",filter);
X      strcat(command,"lpr ");
X      if (printer)
X         sprintf(command+strlen(command),"-P%s ",printer);
X      sprintf(command+strlen(command),"-J%s -%c",job,option);
X      }
X   dprintf(stderr,"command: (%s)\n",command);
X   
X   while (m_gets(line) != NULL) {
X     dprintf(stderr,"main loop got: %s",line);
X     switch(c = *line) {
X        case 'S':				/* window reshaped */
X           get_size(&x,&y,0,0);
X           if (!debug)
X              m_sizeall(x,y,strlen(title)-1,1);
X           m_clear();
X           m_printstr(title);
X           break;
X        case 'R':				/* window redrawn */
X           m_printstr(title);
X           break;
X        case 'A':				/* window activated */
X           m_setmode(M_WOB);
X           break;
X        case 'D':				/* window deactivated */
X           m_clearmode(M_WOB);
X           break;
X        case 'B':				/* button hit */
X           id = 0;
X           sscanf(line+2,"%d.%d",&id,&sub);
X           dprintf(stderr," got: %d, %d\n",id,sub);
X           if (id) {
X              m_othersave(id,sub,temp);
X              m_clearmode(M_WOB);
X              m_printstr(WORKING);
X              sleep(1); 
X              system(command,temp);
X              if (remote)
X                 system(sprintf(command,"rsh %s rm %s\n",mgr_host,temp));
X              else
X                 unlink(temp);
X              }
X           m_printstr(title);
X           m_clearmode(M_ACTIVATE);
X           break;  
X        }
X      }
X   }
X
Xclean(n)
Xint n;
X   {
X   m_ttyreset();
X   if (remote)
X      system(sprintf(command,"rsh %s rm %s\n",mgr_host,temp));
X   else
X      unlink(temp);
X   m_pop();
X   m_clear();
X   exit(n);
X   }
END_OF_FILE
# end of 'demo/icon/window_print.c'
fi
if test -f 'demo/misc/close.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'demo/misc/close.c'\"
else
echo shar: Extracting \"'demo/misc/close.c'\" \(6539 characters\)
sed "s/^X//" >'demo/misc/close.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: close.c,v 4.6 88/08/08 09:43:38 sau Exp $
X	$Source: /tmp/mgrsrc/demo/misc/RCS/close.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/demo/misc/RCS/close.c,v $$Revision: 4.6 $";
X
X/* close a window  - keep icon uncovered */
X
X#include <signal.h>
X#include "term.h"
X
X
Xstatic int debug = 0;			/* for debugging */
X
Xstatic int wide, high, xmax, ymax, border;	/* global mgr state info */
X
X#define Max(x,y)	((x)>(y)?(x):(y))
X#define Min(x,y)	((x)<(y)?(x):(y))
X#define dprintf		if (debug) fprintf
X
X#define XSLOP		6	/* extra horizontal space around window */
X#define YSLOP		2	/* extra vertical space around window */
X#define WAIT		20	/* seconds until next look for an opening */
X#define RAND		11	/* max time to wait before moving */
X
X#define Active		"A\r"
X#define Covered		"C\r"
X#define Redraw		"R\r"
X
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   char host[16];			/* host name */
X   char line[MAXLINE];			/* input buffer for events */
X   char text[MAXLINE];			/* text for icon */
X   char moving[MAXLINE];		/* text for icon while moving */
X   int font;
X   int clean();
X   int sigalrm();
X   char *getenv();
X
X   ckmgrterm( *argv );
X
X   /* turn on debugging */
X
X   if (getenv("DEBUG"))
X      debug++;
X
X   /* get icon text */
X
X   srand(getpid());
X   if (debug)
X      setbuf(stderr,NULL);
X   m_setup(M_FLUSH);
X   m_push(P_ALL & (~P_MOUSE));	
X
X   signal(SIGINT,clean);
X   signal(SIGTERM,clean);
X   signal(SIGALRM,sigalrm);
X
X   m_ttyset();
X
X   if (argc>3)
X      usage(*argv);
X
X   if (argc>1  &&  *argv[1] ) {
X      /* There is a message and it is not zero length */
X      text[0] = '\f';
X      /* If the string in argv[1] contains a %d, then the window set ID will
X         be included in the message.
X      */
X      sprintf(&text[1], argv[1], m_setid());
X      sprintf(moving, "\fMoving %s", &text[1]);
X   }
X   else {
X      /* No message or it is zero length. */
X      gethostname(host,sizeof(host));
X      sprintf(text, "\f%s(%d)", host, m_setid());
X      sprintf(moving, "\fMoving(%d)", m_setid());
X      }
X
X   if (!debug)
X      m_setmode(M_NOINPUT);
X   if (argc==3  &&  (font=atoi(argv[2])) > 0)
X      m_font(font);
X
X   setupwindow(text);
X
X   /* set events */
X
X   m_setevent(ACTIVATED,Active);
X   m_setevent(COVERED,Covered); 
X   m_setevent(REDRAW,Redraw); 
X
X   /* bury it and wait */
X
X   if (!goto_spot(wide,high)) {
X      /* Window was too big; use font zero and try again */
X      m_font( 0 );
X      setupwindow( text );
X      }
X   goto_spot(wide,high);
X   	/* no place to go; we'll stay where we are until something opens up */
X
X   while(1) {
X      m_clearmode(M_ACTIVATE);
X      if (!debug)
X         m_setmode(M_NOINPUT);
X      m_gets(line);
X      alarm(0);
X      m_push(P_EVENT);
X      m_setevent(COVERED,Covered); 
X      dprintf(stderr,"Read [%s]\n",line);
X
X      if (*line == *Active)			/* activate window */
X         clean();
X
X      else if (*line == *Covered) {
X         m_printstr(moving);
X         get_size(0,0,&wide,&high);
X         wide += 2*border+XSLOP;
X         high += 2*border+YSLOP;
X         dprintf(stderr,"going to ?,? %d %d\n",wide,high);
X         sleep(((unsigned)rand()) % RAND);
X         if (goto_spot(wide,high)) {
X	    m_clearevent(COVERED);
X            m_clearmode(M_ACTIVATE);
X            }
X         else {				/* no place to go */
X            alarm(WAIT);
X            }
X         }
X      m_printstr(text);
X      m_pop();
X      }
X   }
X
X/* restore window state and exit */
X
Xstatic
Xclean()
X   {
X   m_ttyreset();
X   m_popall(0);
X   exit(1);
X   }
X
X/* find an unused spot for a window */
X
Xstatic
Xint
Xgoto_spot(wide, high)
Xint wide,high;					/* minimum spot size */
X   {
X   struct window_data	coords[1000];	/* present window coords. go here */
X   register int		c,
X			count,
X			intersection,
X			setid = m_setid(),
X			x,
X			y, nexty;
X
X   while( (count = get_all(coords)) == 0 )
X	;
X   dprintf(stderr,"found %d windows\n", count);
X
X   /*	Find the best spot.  We want to avoid too exhaustive a search.
X	We march through the screen, trying to fit the moving window into
X	spaces.  Any time we collide with a window, we skip to the right edge
X	of that window and note if it's top edge is the lowest one we've seen
X	which is still above where we are.  This allows us to skip over the
X	larger areas of occupied screen quickly.
X   */
X   for( y = ymax-high;  y >= 0;  y = nexty - 1 ) {
X      nexty = y;
X      for( x = xmax-wide;  x >= 0;  x -= 1 ) {
X	 intersection = 0;
X	 for( c = 0;  c < count;  c++ ) {
X	    if( coords[c].setid == setid )
X	       continue;
X            if( in_win( coords+c, x, y, x + wide, y + high ) ) {
X	       intersection = 1;
X	       nexty = Max( y, Max( nexty, coords[c].y - high ) );
X	       x = coords[c].x - wide;
X	       break;
X	       }
X	    }
X	 if( !intersection ) {
X            dprintf(stderr,"going to %d, %d\n", x, y);
X	    m_push(P_EVENT);
X	    m_movewindow( x + XSLOP/2, y + YSLOP/2 );
X	    m_pop();
X	    return( 1 );
X	    }
X	 }
X      }
X   dprintf(stderr,"no openings\n");
X   return( 0 );
X   }
X
X
X/* check for window-rectangle intersection */
X
Xstatic
Xint
Xin_win(list,x0,y0,x1,y1)
Xregister struct window_data *list;		/* window coordinates */
Xregister int x0,y0,x1,y1;			/* rectangle coordinates */
X   {
X   return(
X   (
X      list->x + list->w < x0  ||  x1 < list->x  ||
X      list->y + list->h < y0  ||  y1 < list->y
X   ) ?  0  :  1);
X   }
X
X
X/* send an alarm signal */
X
Xstatic
Xsigalrm()
X   {
X   m_sendme(Covered);
X   }
X
X
Xstatic
Xint
Xm_setid()
X{
X	static int		setid = -1;
X	struct window_data	window;
X
X	if( setid == -1 ) {
X		while( get_eachclientwin( &window ) )
X			;
X		setid = window.setid;
X	}
X	return setid;
X}
X
X
Xstatic
Xusage( pgm )
Xchar	*pgm;
X{
X	fprintf( stderr, "Usage:  %s [ message [ fontnumber ] ]\n", pgm );
X	fputs( "\
XIf the message is zero-length, the default message is printed.\n\
XIf fontnumber is non-numberic or not available, zero is assumed.\n\
X", stderr );
X	exit( 255 );
X}
X
X
Xstatic
Xsetupwindow( text )
Xchar	*text;
X{
X	/* change window size */
X
X	m_size(Max(strlen(text)-1, 5), 1);
X	m_setmode(M_NOWRAP);
X	m_printstr(text);
X
X	/* how big is it */
X
X	get_size(0, 0, &wide, &high);
X	get_param(0, &xmax, &ymax, &border);
X	wide += 2*border+XSLOP;
X	high += 2*border+YSLOP;
X}
END_OF_FILE
# end of 'demo/misc/close.c'
fi
if test -f 'doc/usrman/croff/croff.l' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'doc/usrman/croff/croff.l'\"
else
echo shar: Extracting \"'doc/usrman/croff/croff.l'\" \(6025 characters\)
sed "s/^X//" >'doc/usrman/croff/croff.l' <<'END_OF_FILE'
X%{
X/*
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: croff.l,v 1.2 88/07/07 10:17:25 sau Exp $
X	$Source: /tmp/mgrsrc/doc/usrman/croff/RCS/croff.l,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/doc/usrman/croff/RCS/croff.l,v $$Revision: 1.2 $";
X
X/* is this lex abuse? */
X
X
X#include "hash.h"
X
X#define dprintf	if(debug)fprintf
X
Xextern struct table_entry keywords_data[];
Xextern struct table_entry *keywords[];
X
Xchar *ks,*ke;	/* keyword delimeters */
Xchar *cs,*ce;	/* comment delimeters */
Xchar *is,*ie;	/* identifier delimeters */
Xchar *fs,*fe;	/* function delimeters */
Xchar *ps,*pe;	/* pre-proc delimeters */
X
Xint force = 0;		/* force xlation without .SS */
Xint no_troff = 0;	/* dont xlate \ etc */
Xint no_lig = 0;		/* on't emit troff ligatures (brain damaged imagen) */
Xint debug = 0;		/* do debugging */
X
X%}
X
X%START start comment quote
XW	[ 	]*
XK	[a-zA-Z_][a-zA-Z0-9_]*
X
X%%
X
X
X^".SS".*$ {			/* start source processing */
X        static char t1[25],t2[25],t3[25],t4[25];
X	int n;
X	BEGIN start;
X        if (!force) {
X	   ECHO;
X	   n = sscanf(yytext,".SS %s %s %s %s",t1,t2,t3,t4);
X           switch(n) {
X              case 4: case 5: case 6: case 7: case 8: case 9:
X                 ce = t4;
X              case 3:
X                 ke = t3;
X              case 2:
X                 cs = t2;
X              case 1:
X                 ks = t1;
X              }
X	   }
X	}
X<start,comment,quote>^".SE" {	/* end source processing */
X	if (!force)
X           BEGIN 0;
X	ECHO;
X	}
X<start>"/*" {			/* start a comment */
X	BEGIN comment;
X	printf("%s",cs);
X	ECHO;
X	dprintf(stderr,"[CS]");
X	}
X<comment>"*/" {			/* end a comment */
X	ECHO;
X	printf("%s",ce);
X	BEGIN start;
X	dprintf(stderr,"[CE]");
X	}
X<start,comment,quote>"\-|" {	/* handle troff escapes */
X	if (no_troff)
X           ECHO;
X	else switch(*yytext) {
X           case '-':  printf("\\-");   break;
X	   case '\\': printf("\\e");   break;
X	   case '|':  printf("\\(or"); break;
X           }
X	dprintf(stderr,"%s",yytext);
X	}
X<start>\" {			/* start quote */
X	BEGIN quote;
X	ECHO;
X	dprintf(stderr,"[\"");
X	}
X<quote>\\\" {			/* \" in a string */
X	printf("\\e\"");
X	}
X<quote>\" {			/* end quoted string */
X	BEGIN start;
X	ECHO;
X	dprintf(stderr,"\"]");
X	}
X<start,comment,quote>[fF][il]	|
X<start,comment,quote>ff {	/* defeat troff ligatures */
X	if (no_lig)
X	   printf("%c\\&%c",yytext[0],yytext[1]);
X	else
X           ECHO;
X	dprintf(stderr,"[%s]\n",yytext);
X	}
X<start>^#{W}define	|
X<start>^#{W}undef	|
X<start>^#{W}line	|
X<start>^#{W}include	|
X<start>^#{W}ifdef	|
X<start>^#{W}ifndef	|
X<start>^#{W}if		|
X<start>^#{W}endif	|
X<start>^#{W}else {		/* pre-processor tokens */
X	   printf("%s%s%s",ps,yytext,pe);
X	   dprintf(stderr,"%s%s%s","[PS]",yytext,"[PE]");
X	}
X<start>{K}/{W}\( {		/* look for key words  - might be functions */
X	if (is_entry(keywords,HSIZE,yytext)) 
X	   printf("%s%s%s",ks,yytext,ke);
X 	else
X	   printf("%s%s%s",fs,yytext,fe);
X	}
X<start>{K} {			/* look for key words  - might be identifiers */
X	if (is_entry(keywords,HSIZE,yytext)) 
X	   printf("%s%s%s",ks,yytext,ke);
X 	else
X	   printf("%s%s%s",is,yytext,ie);
X	}
X%%
X
X#define GET_OPT(i)	\
X	strlen(argv[i])>2 ? argv[i]+2 : argv[++i]
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   register int i;
X   register char c = '\0';
X
X   /* set default values */
X
X   ks = "\\fB";		/* keywords in bold */
X   ke = "\\fP";
X   cs = "\\fI";		/* comments in bold */
X   ce = "\\fP";
X   is = "";
X   ie = "";
X   fs = "";
X   fe = "";
X   ps = "\\fB";		/* cpp decl's in bold */
X   pe = "";
X
X   debug = getenv("DEBUG");
X
X   /* get arguments */
X
X   for(i=1;i<argc;i++) {
X      if (*argv[i] == '-')
X         switch (c = argv[i][1]) {
X            case 'a':	/* add keyword to list */
X               add_entry(keywords,HSIZE,GET_OPT(i));
X               break;
X            case 'd':	/* delete keyword from list */
X               dlt_entry(keywords,HSIZE,GET_OPT(i));
X               break;
X            case 'F':	/* force processing without .SS */
X               unput('\n');unput('S'); unput('S'); unput('.');
X               force++;
X               break;
X            case 'l':	/* don't pass any ligatures to troff */
X               no_lig++;	
X               break;
X            case 't':	/* don't futz with \, | or - \n */
X               no_troff++;	
X               break;
X            case 'p':	/* set pre-processor escape prefix */
X               ps = GET_OPT(i);
X               break;
X            case 'i':	/* set identifier escape prefix */
X               is = GET_OPT(i);
X               break;
X            case 'f':	/* set function escape prefix */
X               fs = GET_OPT(i);
X               break;
X            case 'k':	/* set keyword escape prefix */
X               ps = ks = GET_OPT(i);
X               break;
X            case 'c':	/* set comment escape prefix */
X               cs = GET_OPT(i);
X               break;
X            case 'e':	/* set all ending escape prefixen */
X               ie = pe = fe = ke = ce = GET_OPT(i);
X               break;
X            default:
X               fprintf(stderr,"%s: flag %s ignored\n",*argv,argv[i]);
X               break;
X            }
X         else switch(c) {	/* optional turn-off codes */
X            case 'p':
X               pe = argv[i];
X               break;
X            case 'i':
X               ie = argv[i];
X               break;
X            case 'f':
X               fe = argv[i];
X               break;
X            case 'k':
X               pe = ke = argv[i];
X               break;
X            case 'c':
X               ce = argv[i];
X               break;
X            default:
X               fprintf(stderr,"%s: arg [%s] ignored\n",*argv,argv[i]);
X               break;
X            }
X      }
X   yylex();
X   }
X
Xyywrap()
X   {
X   return(1);
X   }
END_OF_FILE
# end of 'doc/usrman/croff/croff.l'
fi
if test -f 'doc/usrman/croff/hash.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'doc/usrman/croff/hash.c'\"
else
echo shar: Extracting \"'doc/usrman/croff/hash.c'\" \(6039 characters\)
sed "s/^X//" >'doc/usrman/croff/hash.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: hash.c,v 1.1 88/07/07 10:12:06 sau Exp $
X	$Source: /tmp/mgrsrc/doc/usrman/croff/RCS/hash.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/doc/usrman/croff/RCS/hash.c,v $$Revision: 1.1 $";
X
X/************************************************************************
X *
X *	Simple Forms Package		Version 1.0	10/83
X */
X
X/* table lookup routines */
X
X#include "hash.h"
X#include <stdio.h>
X
X/*******************************************************************************
X * Generate a hash table index from an arbitrary length string
X * This is probably not a good algorithm
X */
X
Xint
XHash(key,max)
Xchar *key;		/* key to hash on */
Xint max;		/* max should be a prime number */
X   {
X   register int i = 0;
X   register long sum;
X   for(sum = 0; *key != '\0';i++, sum += (*key++)<<(i&7));
X   return((int) (sum % max));
X   }
X
X/*******************************************************************************
X * Generate a hash table index from an arbitrary length string
X * This is probably not a good algorithm
X */
X
Xint
Xhash(key,max)
Xregister char *key;		/* key to hash on */
Xint max;			/* max should be a prime number */
X   {
X   register int sum;
X        
X   for (sum = *key; *key; sum += (*key) * (*(++key)));
X   return( (sum += *(key-2)) % max);
X   }
X
X/*******************************************************************************
X *	add an entry to the hash table, return count
X */
X
Xint
Xadd_entry(table,size,name)
Xstruct table_entry *table[];	/* name of hash table */
Xint size;			/* number of table entries */
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	char *alloc(), *save_line();
X	register TABLE *list;
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name)) {
X	      list -> count += 1;
X	      return(list -> count);
X	      }
X	list = (TABLE *) alloc(sizeof (TABLE));
X	list -> name = save_line(name);
X	list -> next = table[index];
X	list -> value = (char *) 0;
X	list -> count = 1;
X	table[index] = list;
X	return(1);
X	}	    
X
X/*******************************************************************************
X *	remove an entry to the hash table, return count
X */
X
Xint
Xdlt_entry(table,size,name)
Xstruct table_entry *table[];	/* pntr to hash table */
Xint size;			/* size of hash table */
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	void free();
X	register struct table_entry *list, *temp= (struct table_entry *) 0;
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; temp=list,list = list->next)
X	   if (Same(list->name,name)) {
X	      if (list -> count > 0)
X	         list -> count -= 1;
X	      if (list -> count == 0 && !(list->flags&HASH_STATIC)) {
X	         free(list -> name);
X	         if (list -> value)
X 	            free(list -> value);
X	         if (list == table[index]) {
X	            table[index] = list->next;
X	            free(list);
X	            }
X	         else {
X	            temp->next = list->next;
X                    free(list);
X	            }
X		 return(0);
X	         }    
X	      else return(list -> count);
X	      }
X	return(-1);
X	}	    
X
X/*******************************************************************************
X *	get an entry to the hash table, return value
X */
X
Xchar *
Xget_entry(table,size,name)
Xstruct table_entry *table[];
Xint size;
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	register struct table_entry *list;
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name)) {
X	      return(list->count > 0 ? list -> value : (char *) 0);
X	      }
X	return((char *) 0);
X	}	    
X
X/*******************************************************************************
X *	see if item is in table 
X */
X
Xint
Xis_entry(table,size,name)
Xstruct table_entry *table[];
Xint size;
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	register struct table_entry *list;
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name)) {
X	      return(list->count);
X	      }
X	return(0);
X	}	    
X
X/*******************************************************************************
X *	put an entry to the hash table, return 1 if ok
X */
X
Xint
Xput_entry(table,size,name,value)
Xstruct table_entry *table[];	/* name of hash table */
Xint size;			/* number of table entries */
Xchar *name;			/* name to be put in table */
Xchar *value;			/* value to be put into table */
X	{
X	int HASH(), index;
X	register struct table_entry *list;
X        char *save_line();
X	void free();
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name) && !(list->flags&HASH_STATIC)) {
X	      if (list -> value != (char *) 0) free(list -> value);
X	      if (value != (char *) 0) list -> value = save_line(value);
X              else list->value == (char *) 0;
X	      return(1);
X	      }
X	return(0);
X	}	    
X
X/*******************************************************************************
X *
X *	allocate space for, and save a string; return its address
X */
X
Xchar *
Xsave_line(string)
Xchar *string;
X   {
X   char *where,*alloc(),*strcpy();
X
X   if (string == (char *) 0) string = "";
X   where=alloc(strlen(string)+1);
X   strcpy(where,string);
X   return(where);
X   }
X
X/*******************************************************************************
X *
X *	allocate some space
X */
X
Xchar *
Xalloc(bytes)
Xint bytes;
X  {
X  char *malloc(),*where;
X  void exit();
X
X  if ((where=malloc((unsigned)bytes)) == NULL) {
X     fprintf(stderr,"no room for %d bytes\n",bytes);
X     exit(1);
X     }
X  return(where);
X  }	
END_OF_FILE
# end of 'doc/usrman/croff/hash.c'
fi
if test -f 'src/blit/hash.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/blit/hash.c'\"
else
echo shar: Extracting \"'src/blit/hash.c'\" \(6027 characters\)
sed "s/^X//" >'src/blit/hash.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: hash.c,v 4.1 88/06/21 13:19:05 bianchi Exp $
X	$Source: /tmp/mgrsrc/src/blit/RCS/hash.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/src/blit/RCS/hash.c,v $$Revision: 4.1 $";
X
X/************************************************************************
X *
X *	Simple Forms Package		Version 1.0	10/83
X */
X
X/* table lookup routines */
X
X#include "hash.h"
X#include <stdio.h>
X
X/*******************************************************************************
X * Generate a hash table index from an arbitrary length string
X * This is probably not a good algorithm
X */
X
Xint
XHash(key,max)
Xchar *key;		/* key to hash on */
Xint max;		/* max should be a prime number */
X   {
X   register int i = 0;
X   register long sum;
X   for(sum = 0; *key != '\0';i++, sum += (*key++)<<(i&7));
X   return((int) (sum % max));
X   }
X
X/*******************************************************************************
X * Generate a hash table index from an arbitrary length string
X * This is probably not a good algorithm
X */
X
Xint
Xhash(key,max)
Xregister char *key;		/* key to hash on */
Xint max;			/* max should be a prime number */
X   {
X   register int sum;
X        
X   for (sum = *key; *key; sum += (*key) * (*(++key)));
X   return( (sum += *(key-2)) % max);
X   }
X
X/*******************************************************************************
X *	add an entry to the hash table, return count
X */
X
Xint
Xadd_entry(table,size,name)
Xstruct table_entry *table[];	/* name of hash table */
Xint size;			/* number of table entries */
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	char *alloc(), *save_line();
X	register TABLE *list;
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name)) {
X	      list -> count += 1;
X	      return(list -> count);
X	      }
X	list = (TABLE *) alloc(sizeof (TABLE));
X	list -> name = save_line(name);
X	list -> next = table[index];
X	list -> value = (char *) 0;
X	list -> count = 1;
X	table[index] = list;
X	return(1);
X	}	    
X
X/*******************************************************************************
X *	remove an entry to the hash table, return count
X */
X
Xint
Xdlt_entry(table,size,name)
Xstruct table_entry *table[];	/* pntr to hash table */
Xint size;			/* size of hash table */
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	void free();
X	register struct table_entry *list, *temp= (struct table_entry *) 0;
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; temp=list,list = list->next)
X	   if (Same(list->name,name)) {
X	      if (list -> count > 0)
X	         list -> count -= 1;
X	      if (list -> count == 0 && !(list->flags&HASH_STATIC)) {
X	         free(list -> name);
X	         if (list -> value)
X 	            free(list -> value);
X	         if (list == table[index]) {
X	            table[index] = list->next;
X	            free(list);
X	            }
X	         else {
X	            temp->next = list->next;
X                    free(list);
X	            }
X		 return(0);
X	         }    
X	      else return(list -> count);
X	      }
X	return(-1);
X	}	    
X
X/*******************************************************************************
X *	get an entry to the hash table, return value
X */
X
Xchar *
Xget_entry(table,size,name)
Xstruct table_entry *table[];
Xint size;
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	register struct table_entry *list;
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name)) {
X	      return(list->count > 0 ? list -> value : (char *) 0);
X	      }
X	return((char *) 0);
X	}	    
X
X/*******************************************************************************
X *	see if item is in table 
X */
X
Xint
Xis_entry(table,size,name)
Xstruct table_entry *table[];
Xint size;
Xchar *name;			/* name to be put in table */
X	{
X	int HASH(), index;
X	register struct table_entry *list;
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name)) {
X	      return(list->count);
X	      }
X	return(0);
X	}	    
X
X/*******************************************************************************
X *	put an entry to the hash table, return 1 if ok
X */
X
Xint
Xput_entry(table,size,name,value)
Xstruct table_entry *table[];	/* name of hash table */
Xint size;			/* number of table entries */
Xchar *name;			/* name to be put in table */
Xchar *value;			/* value to be put into table */
X	{
X	int HASH(), index;
X	register struct table_entry *list;
X        char *save_line();
X	void free();
X
X	index=HASH(name,size);
X	for(list=table[index]; list != (TABLE *) 0; list = list -> next)
X	   if (Same(list->name,name) && !(list->flags&HASH_STATIC)) {
X	      if (list -> value != (char *) 0) free(list -> value);
X	      if (value != (char *) 0) list -> value = save_line(value);
X              else list->value == (char *) 0;
X	      return(1);
X	      }
X	return(0);
X	}	    
X
X/*******************************************************************************
X *
X *	allocate space for, and save a string; return its address
X */
X
Xchar *
Xsave_line(string)
Xchar *string;
X   {
X   char *where,*alloc(),*strcpy();
X
X   if (string == (char *) 0) string = "";
X   where=alloc(strlen(string)+1);
X   strcpy(where,string);
X   return(where);
X   }
X
X/*******************************************************************************
X *
X *	allocate some space
X */
X
Xchar *
Xalloc(bytes)
Xint bytes;
X  {
X  char *malloc(),*where;
X  void exit();
X
X  if ((where=malloc((unsigned)bytes)) == NULL) {
X     fprintf(stderr,"no room for %d bytes\n",bytes);
X     exit(1);
X     }
X  return(where);
X  }	
END_OF_FILE
# end of 'src/blit/hash.c'
fi
if test -f 'src/default_font.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/default_font.h'\"
else
echo shar: Extracting \"'src/default_font.h'\" \(6467 characters\)
sed "s/^X//" >'src/default_font.h' <<'END_OF_FILE'
X/* static font file */
X
Xstruct font_header default_font_head = {
X	(char) 22, (char) 8, (char) 16,
X	(char) 5, (char) 95, (char) 32
X	};
X
Xshort default_font_image[] = {
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003c, 0x003c, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0070, 0x0000,
X	0x0008, 0x240a, 0x3864, 0x3008, 0x0810, 0x0800, 0x0000, 0x0002,
X	0x3c08, 0x3c3c, 0x0c3e, 0x3c7e, 0x3c3c, 0x0000, 0x0400, 0x203c,
X	0x1810, 0x781c, 0x787e, 0x7e1c, 0x423e, 0x1e42, 0x40c6, 0x423c,
X	0x7c3c, 0x7c3c, 0x7e42, 0x8282, 0x4282, 0x7e20, 0x2004, 0x0000,
X	0x2000, 0x4000, 0x0200, 0x0c00, 0x4008, 0x0440, 0x3800, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0808, 0x0000,
X	0x0008, 0x240a, 0x54a4, 0x4808, 0x1008, 0x2a00, 0x0000, 0x0002,
X	0x4218, 0x4242, 0x0c20, 0x4202, 0x4242, 0x0000, 0x0800, 0x1042,
X	0x2410, 0x4422, 0x4440, 0x4022, 0x4208, 0x0244, 0x40c6, 0x6242,
X	0x4242, 0x4242, 0x0842, 0x8292, 0x4282, 0x0220, 0x2004, 0x0000,
X	0x1000, 0x4000, 0x0200, 0x1200, 0x4008, 0x0440, 0x0800, 0x0000,
X	0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0010, 0x0808, 0x0000,
X	0x0008, 0x2414, 0x54a8, 0x4808, 0x1008, 0x1c08, 0x0000, 0x0004,
X	0x4228, 0x4242, 0x1420, 0x4002, 0x4242, 0x0000, 0x1000, 0x0842,
X	0x4228, 0x4442, 0x4240, 0x4042, 0x4208, 0x0248, 0x40aa, 0x6242,
X	0x4242, 0x4242, 0x0842, 0x4492, 0x2444, 0x0420, 0x1004, 0x1000,
X	0x0800, 0x4000, 0x0200, 0x1000, 0x4000, 0x0040, 0x0800, 0x0000,
X	0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0010, 0x0808, 0x0000,
X	0x0008, 0x243e, 0x50c8, 0x3008, 0x2004, 0x2a08, 0x0000, 0x0004,
X	0x4608, 0x0202, 0x147c, 0x7c04, 0x4242, 0x0808, 0x2000, 0x0402,
X	0x4e28, 0x4440, 0x4240, 0x4040, 0x4208, 0x0250, 0x40aa, 0x5242,
X	0x4242, 0x4220, 0x0842, 0x4492, 0x2444, 0x0820, 0x1004, 0x2800,
X	0x0438, 0x5c3c, 0x3a3c, 0x7c3a, 0x5c38, 0x1c44, 0x08ee, 0x5c3c,
X	0x5c3a, 0x2c3c, 0x7c42, 0x4282, 0x4442, 0x7c10, 0x0808, 0x3200,
X	0x0008, 0x0014, 0x3808, 0x2000, 0x2004, 0x0808, 0x007e, 0x0008,
X	0x4a08, 0x041c, 0x2442, 0x4204, 0x3c42, 0x0808, 0x407e, 0x0204,
X	0x5244, 0x7c40, 0x427c, 0x7c40, 0x7e08, 0x0270, 0x40aa, 0x5242,
X	0x4242, 0x7c18, 0x0842, 0x4454, 0x1828, 0x0820, 0x0804, 0x4400,
X	0x0044, 0x6242, 0x4642, 0x1046, 0x6208, 0x0448, 0x0892, 0x6242,
X	0x6246, 0x3242, 0x1042, 0x4282, 0x4442, 0x0410, 0x0808, 0x5a00,
X	0x0008, 0x0028, 0x1410, 0x5200, 0x2004, 0x007e, 0x0000, 0x0008,
X	0x5208, 0x0802, 0x2402, 0x4208, 0x4242, 0x0000, 0x4000, 0x0208,
X	0x5244, 0x4240, 0x4240, 0x404e, 0x4208, 0x0248, 0x4092, 0x4a42,
X	0x7c42, 0x4804, 0x0842, 0x287c, 0x1828, 0x1020, 0x0804, 0x8200,
X	0x0004, 0x4240, 0x4242, 0x1042, 0x4208, 0x0450, 0x0892, 0x4242,
X	0x4242, 0x2040, 0x1042, 0x2492, 0x2822, 0x0860, 0x0806, 0x4c00,
X	0x0008, 0x007c, 0x1413, 0x9400, 0x2004, 0x0008, 0x0000, 0x0010,
X	0x6208, 0x1002, 0x4402, 0x4208, 0x423e, 0x0000, 0x207e, 0x0408,
X	0x4c44, 0x4240, 0x4240, 0x4042, 0x4208, 0x0244, 0x4092, 0x4a42,
X	0x4042, 0x4402, 0x0842, 0x2854, 0x2410, 0x2020, 0x0404, 0x0000,
X	0x003c, 0x4240, 0x427e, 0x1042, 0x4208, 0x0470, 0x0892, 0x4242,
X	0x4242, 0x203c, 0x1042, 0x2492, 0x1024, 0x1010, 0x0808, 0x0000,
X	0x0000, 0x0028, 0x5415, 0x8800, 0x2004, 0x0008, 0x0000, 0x0010,
X	0x4208, 0x2042, 0x7e42, 0x4210, 0x4202, 0x0000, 0x1000, 0x0800,
X	0x40fe, 0x4242, 0x4240, 0x4042, 0x4208, 0x4244, 0x4092, 0x4642,
X	0x4042, 0x4442, 0x0842, 0x2844, 0x2410, 0x2020, 0x0404, 0x0000,
X	0x0044, 0x4240, 0x4240, 0x1042, 0x4208, 0x0448, 0x0892, 0x4242,
X	0x4242, 0x2002, 0x1042, 0x2492, 0x2814, 0x2010, 0x0808, 0x0000,
X	0x0008, 0x0050, 0x5425, 0x8800, 0x1008, 0x0008, 0x1800, 0x0820,
X	0x4208, 0x4042, 0x0442, 0x4210, 0x4242, 0x0818, 0x0800, 0x1008,
X	0x2282, 0x4222, 0x4440, 0x4026, 0x4208, 0x4242, 0x4082, 0x4642,
X	0x4042, 0x4242, 0x0842, 0x1044, 0x4210, 0x4020, 0x0204, 0x0000,
X	0x0044, 0x6242, 0x4642, 0x1046, 0x4208, 0x0444, 0x0892, 0x4242,
X	0x6246, 0x2042, 0x1246, 0x1892, 0x4418, 0x4010, 0x0808, 0x0000,
X	0x0008, 0x0050, 0x3826, 0x7600, 0x1008, 0x0000, 0x0800, 0x0820,
X	0x3c3e, 0x7e3c, 0x043c, 0x3c10, 0x3c3c, 0x0808, 0x0400, 0x2008,
X	0x1c82, 0x7c1c, 0x787e, 0x401a, 0x423e, 0x3c42, 0x7e82, 0x423c,
X	0x403c, 0x423c, 0x083c, 0x1044, 0x4210, 0x7e20, 0x0204, 0x0000,
X	0x003a, 0x5c3c, 0x3a3c, 0x103a, 0x4208, 0x0442, 0x0892, 0x423c,
X	0x5c3a, 0x203c, 0x0c3a, 0x186c, 0x4408, 0x7e10, 0x0808, 0x0000,
X	0x0000, 0x0000, 0x1000, 0x0000, 0x0810, 0x0000, 0x0800, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0004, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0400, 0x0000, 0x0000,
X	0x4002, 0x0000, 0x0000, 0x0000, 0x0008, 0x0010, 0x0808, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0420, 0x0000, 0x1000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x000e, 0x0000, 0x0000, 0x0000, 0x0000, 0x003c, 0x003c, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0042, 0x0000, 0x4400, 0x0000, 0x0000,
X	0x4002, 0x0000, 0x0000, 0x0000, 0x0050, 0x000e, 0x0870, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x003c, 0x0000, 0x3800, 0x0000, 0x0000,
X	0x4002, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00fe,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X	
X	};
X
Xbit_static(default_font,760,16,default_font_image,1);
END_OF_FILE
# end of 'src/default_font.h'
fi
echo shar: End of archive 24 \(of 61\).
cp /dev/null ark24isdone
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
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.