rsalz@uunet.uu.net (Rich Salz) (01/25/89)
Submitted-by: Stephen A. Uhler <sau@bellcore.com> Posting-number: Volume 17, Issue 26 Archive-name: mgr/part25 #! /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 25 (of 61)." # Contents: demo/misc/ether.c demo/misc/lock.c demo/msg/client.c # font-16/U81 src/copyright.c src/get_info.c # Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:30 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'demo/misc/ether.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo/misc/ether.c'\" else echo shar: Extracting \"'demo/misc/ether.c'\" \(7443 characters\) sed "s/^X//" >'demo/misc/ether.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: ether.c,v 4.2 88/06/22 14:37:31 bianchi Exp $ X $Source: /tmp/mgrsrc/demo/misc/RCS/ether.c,v $ X*/ Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/demo/misc/RCS/ether.c,v $$Revision: 4.2 $"; X X/* strip_chart vmstat output version II */ X X#include "term.h" X#include <signal.h> X#include <sgtty.h> X XFILE *popen(), *file; X X#define INTERVAL 60 /* bar interval (in secs) */ X#define SCROLL 4 /* # of scrolls per window */ X#define MAX 3 /* max number of plots */ X#define FREQ 3 /* update frequency (secs)*/ X#define DELTA 4 /* pixels/update */ X X#define Min(x,y) ((x)>(y)?(y):(x)) X#define Max(x,y) ((x)>(y)?(x):(y)) X#define dprintf if (debug) fprintf X Xchar *labels[] = { /* graph labels */ X "Input" , "Output", "Coll." X }; X Xint indx[] = { /* field indeces into netstat(1) */ X 0, 2, 4 X }; X Xint limit[] = { /* default maximums */ X 15, 15, 3 X }; X Xmain(argc,argv) Xint argc; Xchar **argv; X { X register int i; X register int x; /* current plot position */ X int bar=0; /* hash mark counter */ X int back=0; /* enable background writes */ X int solid=1; /* make solid lines */ X int freq = FREQ; /* update frequency (secs) */ X int size; /* size of label region */ X int interval; /* hash mark interval (secs) */ X X char host[16]; /* hostname */ X char title[255]; /* chart title */ X char line[255]; /* vmstat input buffer */ X char *fields[20]; /* place for raw input fields */ X char *sprintf(); X X int current[MAX]; /* current data value */ X int old[MAX]; /* previous data value */ X int first =1; /* first time through */ X int clean(); X X int f_high, f_wide; /* font size */ X int high,wide; /* window size */ X int x1; /* left margin */ X int x2; /* title */ X int y1; /* title line */ X int y2; /* first bar */ X int scroll; /* scroll amount */ X int delta=DELTA; /* pixels/line */ X int item; X int dummy; X int debug=0; X X ckmgrterm( *argv ); X X for(i=1;i<argc;i++) { X if (strcmp(argv[i],"-d")==0) { X debug++; X } X else if (strncmp(argv[i],"-f",2)==0) { X freq = atoi(argv[i]+2); X if (freq < 1) freq = 1; X if (freq > 120) freq = 120; X } X else if (strncmp(argv[i],"-m",2)==0) { X int max; X max = atoi(argv[i]+2); X if (max < 1) max = 1; X if (max > 999) max = 999; X limit[0] = limit[1] = max; X limit[2] = (max>=5) ? max/5 : 1; X X } X else X fprintf(stderr,"%s: unknown flag %s. Ignored\n",*argv,argv[i]); X } X X if ((file = popen(sprintf(line,"netstat %d",freq),"r")) == NULL) X exit(1); X X m_setup(M_FLUSH); X m_ttyset(); X m_push(P_EVENT|P_FLAGS); X m_setmode(M_ABS); X X signal(SIGINT,clean); X signal(SIGTERM,clean); X X system("stty -ctlecho"); X m_setevent(RESHAPE,"R\fRedrawing...\n"); X m_setevent(REDRAW,"R\fRedrawing...\n"); X first = 1; X X while (1) { X X for(size=0,i=0;i<MAX;i++) X size = Max(size,strlen(labels[i])); X X /* clear the screen, flush pending input */ X X read_it(fileno(m_termin),line); X X /* get font size */ X X get_font(&f_wide,&f_high); X X /* get window size */ X X get_size(&dummy,&dummy,&wide,&high); X X if (wide==0 || high==0 || f_wide==0 || f_high==0) { X fprintf(stderr,"Can't get window info\n"); X clean(); X } X X /* get the title */ X X gethostname(host,sizeof(host)); X X sprintf(title,"Network statistics for %s in packets/%d seconds", X host,freq); X X if (strlen(title)*f_wide > wide) X sprintf(title,"%s (pkts/%ds.)",host,freq); X X /* make sure window is big enough */ X X if (f_high * (2*MAX+1) > high) { X fprintf(stderr,"\fWindow isn't tall enough\n"); X m_gets(line); X continue; X } X if (f_high * (3*MAX +1) > high) X size += 3; X X if (strlen(title)*f_wide > wide || 3*size*f_wide > wide*2) { X fprintf(stderr,"\fWindow isn't\nwide enough\n"); X m_gets(line); X continue; X } X X /* calculate key positions */ X X x1 = (size*f_wide+1); X x2 = (wide-strlen(title)*f_wide)/2; X y1 = f_high +1; X y2 = (high - y1) /MAX; X high--; X X m_func(B_SET); X m_clear(); X x = x1; X scroll = Max((wide-x1)/SCROLL,10); X scroll += scroll%delta; X X if (freq >15) X interval = INTERVAL * 10 /freq; X else X interval = INTERVAL / freq; X X /* draw form */ X X m_moveprint(x2,y1,title); X X for(i=0;i<MAX;i++) { X m_moveprint(x1-f_wide,high-i*y2,"0"); X m_moveprint(x1-f_wide*3,high-(i+1)*y2+f_wide*2+1, X sprintf(line,"%3d",limit[i])); X m_moveprint(1,high-i*y2-(y2-f_high)/2,labels[i]); X m_line(x1,high-i*y2,wide,high-i*y2); X } X X m_line(0,y1,wide,y1); X m_line(x1,y1,x1,high); X m_movecursor(x1,0); X m_flush(); X X /* read the data */ X X while (fgets(line,sizeof(line),file) != NULL) { X i = parse(line,fields); X if (strcmp(*fields,"input")==0) { X fgets(line,sizeof(line),file); X fgets(line,sizeof(line),file); X continue; X } X X /* calculate new line position */ X X for(i=0;i<MAX;i++) { X current[i] = atoi(fields[indx[i]]) * X (y2-3)/limit[i]; X current[i] = Min(current[i],y2-3) + y2*i + 1; X X if (!first) { X m_line(x,high-old[i],x+delta,high-current[i]); X if (solid) X m_line(x+delta,high-y2*i,x+delta,high-current[i]); X } X X dprintf(stderr,"%s %d->%d, ",labels[i], X high-old[i],high-current[i]); X old[i] = current[i]; X } X dprintf(stderr," [%d]\n",high); X X if (++bar == interval) { X m_line(x,y1,x,high); X bar = 0; X dprintf(stderr,"---------\n"); X } X X if (first) X first = 0; X else X x += delta; X X if (x > wide-delta) { X X /* scroll the display */ X X x -= scroll; X m_func(B_COPY); X m_bitcopy(x1+1,y1+1,wide-x1-1,high-y1-1,x1+scroll+1,y1+1); X m_func(B_CLEAR); X m_bitwrite(wide-scroll,y1+1,scroll,high); X m_func(B_SET); X X dprintf(stderr,"scroll to %d,%d from %d,%d\n", X x1+1,y1+1,x1+scroll+1,y1+1); X for(i=0;i<MAX;i++) X m_line(wide-scroll,high-i*y2,wide,high-i*y2); X } X m_flush(); X if (read_it(fileno(m_termin),line) && *line == 'R') X break; X } X } X } X Xclean() /* clean up on SIGINT */ X { X m_pop(0); X pclose(file); X m_clear(); X m_flush(); X m_ttyreset(); X exit(1); X } X Xint read_it(fd,line) /* non blocking read */ Xint fd; Xchar *line; X { X long rd; X X ioctl(fd,FIONREAD,&rd); X line[rd] = '\0'; X if (rd > 0) { X return(read(fd,line,rd)); X } X else X return(0); X } END_OF_FILE # end of 'demo/misc/ether.c' fi if test -f 'demo/misc/lock.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo/misc/lock.c'\" else echo shar: Extracting \"'demo/misc/lock.c'\" \(6857 characters\) sed "s/^X//" >'demo/misc/lock.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/* ************************************************************ *\ X/* star-trek lock screen (sau/sdh) */ X X#include <sgtty.h> X#include <stdio.h> X#include <pwd.h> X#include <sys/time.h> X#include <signal.h> X#include "bitmap.h" X X#define WIDE BIT_WIDE(display) X#define HIGH BIT_HIGH(display) X#define NICE 10 X Xstruct passwd *pwd, *getpwuid(); Xstruct timeval poll = {0,50000}; Xstruct sgttyb sg,save; Xchar buff[100]; Xstatic int dir = 1; X Xmain() X { X int read; X int pid; X int flip(); X BITMAP *display = bit_open("/dev/bwtwo0"); X BITMAP *stash = bit_alloc(WIDE,HIGH,NULL,1); X X if (!(display&&stash)) { X printf("Can't initialize the display, sorry\n"); X exit(1); X } X X pwd = getpwuid(getuid()); X X signal(SIGINT,SIG_IGN); X signal(SIGHUP,SIG_IGN); X signal(SIGTERM,SIG_IGN); X signal(SIGQUIT,SIG_IGN); X signal(SIGTSTP,SIG_IGN); X X gtty(0,&sg); X save = sg; X sg.sg_flags &= ~(ECHO|RAW); X sg.sg_flags |= CBREAK; X stty(0,&sg); X X bit_blit(stash,0,0,WIDE,HIGH,BIT_SRC,display,0,0); X bit_blit(display,0,0,WIDE,HIGH,BIT_SET,NULL,0,0); X if (NICE > 0) X nice(NICE); X if ((pid=fork()) == 0) {/* child */ X signal(SIGALRM,flip); X fly(display); X } X else { X while(1) { X read = 1; X if (select(32,&read,0,0,&poll) && read) { X gets(buff); X kill(pid,SIGALRM); /* change directions */ X if (strcmp(pwd->pw_passwd,crypt(buff,pwd->pw_passwd)) == 0) { X stty(0,&save); X kill(pid,SIGKILL); X while(wait(0)!=pid); X bit_blit(display,0,0,WIDE,HIGH,BIT_SRC,stash,0,0); X exit(0); X } X } X } X } X } X X/* star trek effect */ X/* X * porter.c Steve Hawley 4/3/87 X * rehacked 5/18/1988 for extra speed. X * re-re hacked 6/20/88 for MGR (SAU) X * A demo to get stars inspired by Star Trek without X * using quickdraw, and by addressing the screen directly. X * this version is roughly 8 times faster than its quickdraw X * equivalent. X * In considering the bit drawing routines, remember that X * on the macintosh, a bit turned on is black, not white. X */ X X#define BG_COLOR 4 /* usually blue */ X#define SSIZE 2 /* star size */ X#define MAXZ 500 /* maximum z depth */ X#define NSTARS 256 /* maximum number of stars */ X#define SPEED 6 /* star speed */ X#define SCALE (short)7 /* for rotator */ X#define COUNT (short)3 /* for rotator */ X#define ON 1 /* plotting states */ X#define OFF 0 X#define Random() rand() X Xshort maxv, maxh; /* display size */ Xshort hmaxv, hmaxh; /* 1/2 display size */ X Xstruct st { X short x, y, z; X short color; X short dir; X } stars[NSTARS]; /* our galaxy */ X Xfly (where) XBITMAP *where; X{ X register short i; X register struct st *stp; X X init_all(where); /* set up global variables */ X for (i=0, stp = stars; i< NSTARS; i++, stp++) { X /* initialize galaxy */ X do { X stp->x = Random(); X stp->y = Random(); X stp->z = (Random() % MAXZ) + 1; X stp->dir = dir ? COUNT : -COUNT; X stp->color = Random() % 23; X if (stp->color == BG_COLOR) X stp->color++; X X } while(project(where,stp->x, stp->y, stp->z, stp->color, ON)); /* on screen? */ X } X while (1) { /* loop 'til button */ X i = NSTARS; X stp = stars; X do { X project(where,stp->x, stp->y, stp->z, stp->color, OFF); /* turn star off*/ X if ((stp->z -= SPEED) <= 0) { /* star went past us */ X stp->x = Random(); X stp->y = Random(); X stp->z = MAXZ; X stp->dir = dir ? COUNT : -COUNT; X } X else { /* rotate universe */ X cordic(&stp->x,&stp->y,SCALE,stp->dir); X } X if (project(where,stp->x, stp->y, stp->z, stp->color, ON)) { X /* if projection is off screen, get a new position */ X stp->x = Random(); X stp->y = Random(); X stp->z = MAXZ; X stp->dir = dir ? COUNT : -COUNT; X } X ++stp; X } while(--i); X } X} X Xproject(where,x, y, z, col, state) Xregister BITMAP *where; Xregister short x, y, z; Xregister int col; Xregister short state; X{ X X /* one-point perspective projection */ X /* the offsets (maxh/2) and maxv/2) ensure that the X * projection is screen centered X */ X x = (x/z) + hmaxh; X y = (y/z) + hmaxv; X return(xplot(where,x, y, z, col, state)); X X} X Xinit_all(where) Xregister BITMAP *where; X{ X maxv = BIT_HIGH(where); X hmaxv = maxv>>1; X maxh = BIT_WIDE(where); X hmaxh = maxh>>1; X} X Xxplot(where,x, y, z, col, state) Xregister BITMAP *where; Xregister int x, y; Xregister int z; /* actually z position */ Xregister int col; Xint state; X{ X register int size = SSIZE; X /* are we on the screen? If not, let the caller know*/ X if (x < 0 || x >= maxh || y < 0 || y >= maxv ) X return(1); X X if (z > (3*MAXZ/4)) X size--; X else if ( z< (MAXZ/4)) X size++; X bit_blit(where,x,y,size,size, state ? X BIT_SRC^BIT_DST | GETCOLOR(col)^GETCOLOR(BG_COLOR) : X BIT_SRC | GETCOLOR(BG_COLOR), X 0l,0,0); X return(0); X} X X/* CORDIC rotator. Takes as args a point (x,y) and spins it */ X/* count steps counter-clockwise. 1 */ X/* Rotates atan( --------- ) */ X/* scale */ X/* 2 */ X/* Therefore a scale of 5 is 1.79 degrees/step and */ X/* a scale of 4 is 3.57 degrees/step */ X Xcordic(x, y, scale, count) Xshort *x, *y; Xregister short scale, count; X X{ X register short tempx, tempy; X X tempx = *x; X tempy = *y; X X if (count > 0) /* positive count (counter-clockwise) */ X for (; count; count--){ X tempx -= (tempy >> scale); X tempy += (tempx >> scale); X } X else /* negative count (clockwise) */ X for (; count; count++){ X tempx += (tempy >> scale); X tempy -= (tempx >> scale); X } X X *x = tempx; X *y = tempy; X} X Xint flip() X { X dir = 1-dir; X } END_OF_FILE # end of 'demo/misc/lock.c' fi if test -f 'demo/msg/client.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo/msg/client.c'\" else echo shar: Extracting \"'demo/msg/client.c'\" \(6568 characters\) sed "s/^X//" >'demo/msg/client.c' <<'END_OF_FILE' X/* $Header: client.c,v 4.1 88/06/21 14:02:36 bianchi Exp $ X $Source: /tmp/mgrsrc/demo/msg/RCS/client.c,v $ X*/ Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/demo/msg/RCS/client.c,v $$Revision: 4.1 $"; X 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/* sample client for testing server (template only) */ X X#include <stdio.h> X#include <signal.h> X#include "term.h" X#include "do.h" X X#define MAX 20 /* max # of servers */ X Xstruct server { X int id; X char *name; X }; X Xstruct server servers[MAX]; Xint cnt=0; /* server count */ X Xmain(argc,argv) Xint argc; Xchar **argv; X { X register int i; X char *ttyname(); X char *str_save(); X int clean(); X char message[100]; X char line[100]; X char args[100]; X char name[20]; X int id; X X ckmgrterm( *argv ); X X m_setup(M_FLUSH); X chmod(ttyname(2),0600); /* this is not gauranteed */ X m_push(P_EVENT|P_FLAGS); /* save old events and flags */ X signal(SIGTERM,clean); /* cleanup upon termination */ X signal(SIGINT,clean); X m_setevent(NOTIFY,"client"); /* my name is "client" */ X m_setevent(ACCEPT,"&%f:%m\r"); /* get messages: &<from>:<message\r */ X m_setevent(BUTTON_1,"D %n"); X m_setevent(BUTTON_2,"X %n is id %w"); X sprintf(message,"%c",C_WHO); X m_broadcast(message); /* ask all servers for their id's */ X m_flush(); X X /* loop, reading lines from keyboard */ X X while(m_gets(line) != NULL) { X printf("got: %s",line); X if (*line == '&') { X sscanf(line+1,"%d:%s %[^\n]", &id,message,args); X switch (*message) { X case S_HI: /* received server announcement */ X printf("Server %d (%s) started [%s]\n",id,message,args); X install(args,id); X break; X X case S_BYE: /* a server died */ X printf("Server %d died\n",id); X for(i=0;i<cnt;i++) X if (servers[i].id == id) { X printf("server %s (%d) removed from %d\n", X servers[i].name,servers[i].id,i); X servers[i].id = 0; X free(servers[i].name); X break; X } X if (i+1 == cnt && cnt>0) X cnt--; X break; X X case S_REPLY: /* a server reply message */ X printf("Server %d replied %s\n",id,message); X switch (message[1]) { X case R_WHO: /* who are you */ X install(args,id); X break; X case R_RCVD: /* received command */ X printf("Command received\n"); X break; X case R_DO: /* working on command */ X printf("Command is executing\n"); X break; X case R_DONE: /* command completed */ X printf("Command completed\n"); X break; X case R_BAD: /* command rejected */ X printf("Command rejected\n"); X break; X case R_UNKWN: /* unknown command */ X printf("Command unknown\n"); X break; X default: X printf("Unknown server reply\n"); X } X break; X X case C_WHO: /* some other client sent this */ X printf("got a client WHO message\n"); X break; X X default: X printf("non-server message from %d (%s)\n",id,message); X break; X } X } X X /* not a message, must be a button hit or kbd */ X X else { X switch (*line) { X case 'L': /* list servers */ X for(i=0;i<cnt;i++) { X if (servers[i].id > 0) X printf("%d) server %d is [%s]\n", X i,servers[i].id, servers[i].name); X } X break; X X case 'S': /* put file in snarf buffer */ X m_snarf(line+2); X printf("Putting->snarf buffer: %s\n",line+2); X break; X X case 'D': /* send command to server */ X sscanf(line,"%*s %s %[^\n]", name,args); X for(i=0;i<cnt;i++) X if (servers[i].id > 0 && strcmp(servers[i].name,name)==0) { X printf("sending [%s] to %s (%d)\n", X args,name,servers[i].id); X sprintf(message,"%c %s",C_DO,args); X m_sendto(servers[i].id,message); X break; X } X if (i==cnt) X printf("Can't find server [%s]\n",name); X break; X X case '?': /* list commands */ X printf("L list servers\n"); X printf("D <server> <command> do a command\n"); X printf("? ask for help\n"); X break; X X default: X printf("Not a message: %s\n",line); X } X } X m_flush(); X } X } X X/* Clean up and exit */ X Xclean(n) Xint n; X { X m_popall(); X exit(n); X } X X/* save a copy of string s */ X Xchar * Xstr_save(s) Xchar *s; X { X char *malloc(), *strcpy(); X return(strcpy(malloc(strlen(s)+1),s)); X } X X/* install a server */ X Xint Xinstall(name,id) Xchar *name; Xint id; X { X register int i,spot = -1; X X for(i=0;i<cnt;i++) X if (servers[i].id == id) { X printf("server id %d already installed at %d\n",id,i); X if (strcmp(name,servers[i].name) != 0) { X free(servers[i].name); X servers[i].name = str_save(name); X } X return(i); X } X else if (spot == -1 && servers[i].id == 0) X spot = i; X X X if (spot != -1) { X servers[spot].id = id; X servers[spot].name = str_save(name); X printf("server %s (%d) installed at %d\n", X name,id,spot); X } X else if (cnt < MAX) { X servers[cnt].id = id; X servers[cnt].name = str_save(name); X printf("server %s (%d) installed at %d\n", X name,id,cnt); X cnt++; X } X return(i); X } END_OF_FILE # end of 'demo/msg/client.c' fi if test -f 'font-16/U81' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'font-16/U81'\" else echo shar: Extracting \"'font-16/U81'\" \(7749 characters\) sed "s/^X//" >'font-16/U81' <<'END_OF_FILE' Xbegin 644 81.fnt XM%@X9!8 __@, . # !X # #__P XM P!C &##, 8#P#@ !PX . XM#\ X ?P'\ ,#_\'\/_X/@'\ #\ " _X!_#_P__O_X?PP!A^ XM &P!L # &X!A_#_P'\/_ ?P?_L ; &P!L 9 "__@'YP ?@ $ $ XM #@,! XMP ![_^ P #\ > # /X , /_^ XM # &, 8,,P.!@[@? .!P P? XMX'@'_Q_\!P/_Q_\__C_A_\ ?X <#_\?_/_S_^__G_S &'X XM ; .P . [@&?_/_Q_\__'_Q_^P!L ; &P!D +_^ ?C !^ X P XM ' # 8 P!@ XM /__X# ?X > #\ , PP 8!@ 8 XM ( , 8P!@Q_A\,#'!\ P# '#AT XMV 8#& P& P & P .,&& P #AP !P, Q@,P#, # 8#, 8& ! XML!S \'O 9@,P#& S ,8# ,# &8#, 9@,8!@ X!@. 8 'P & XM& #P 8 < !P8 , P # # # XM !S__@, #C@ #\ @_ /P P !@ !P& Q@& !@ XM @ P!C ,&/_,8P8,#P & & 8<#V8 XM# &P!@P# P!@ Q@,P!@ <#@ /@P!L ; &P , # &P!@8 &P XM., #X^\!L ; &P!L ; & P, 9@,P!F Q@& # & 8 !@ [@ X !@ 8 XM ? !@ !P '!@ P # , , , XM '/_^ P <& (X# &/_!M@# & ?P8#& 8 & XM ' !F # &, P9\^QF!@P' 8 8 #A@/!@, XM ; &# , # & #& S & !@& V# &P!L ; P , ; &!@ ;!P XMP -W;8&P!L ; &P!L 8# P!F S &,&# P 8 8!P & '' #P & !@ XM # & <& # , 8 P!@ XM8/_X# !@8 A@. YP<.W , '@ 8 #CA@,,# 8 XM < >> , 8P?_VS;&8'& 8 !@!@ , ,& X& ! XM@ 88 P , 88#, 8 8 #8, ; P!L # P , 8& !L.# XM S9M@; &P!L ; &P ,# &,&, 8P8,# #@!@# 8 X. /@ 8 & XM, 8 8 , P !@# & !@ XM__@, #,# # <'& 0S, P!_@ !@ <'& PP, !@ XM #X '@> P!C!__;,'S .X# & & !X , !P8'@8 & XM#!@# P !@P8P!@ !@_ 8PP!L # &P , # P!@8 &QP, # XM'&S!L ; &P!L ; P, 8P8P!AC 88 , & . !@' < ^ _A@ 8 P XM !@ !@ P& & # & , 8 &#_ XM^ P!X8P, P #X/PP, XX< ',[__,S &!__^!@,8##_P &!X XM 8=P!X > @ 0 # &,!@Q\P., > ( X <### P &!@^!@ P , XM,,, # ,#WA@.#@ & & ./_!C# &P , ; P , # &!@ ;. P ,( XM;,&P!L ; &P!L # P!C!C &&,!A@!@ 8 8 & X P !P'_&/ /X#Q@_ # # XMQF/ # &#@# ;G&?@/P8\ \9C@#^!_Q@&8!F 9 "8!G_X 8 P!@ X/_X XM# /QF!@'@ \#__ 8!W \ 8QO_]C& 8?__^& Q@,'^ 8?X"$ P P # XM#C@> >'_[ # , &##S !@'P #@!P.,<# X&'8& & !@P XMPP , P#X'CX? #@ !X > !Q@.&,, S P!L # P , 8& !MP# PAL XM8; &P#, ; ,8 ,# &&,, 8-@#, . !@!P 8 P&;_#_P_V/_!_P_V XM;_ , P8< ,!^^;_#_QO\/]F_@?\'_& 9@&8!F 9@&?_@# # # # __@, XM!AL8, S ' ,SP!@#X \!#" P$,(X<#YC@ <8#& P88!_C P88& !@ 8< XM''@ >?_L , P 8,'\ & _ . ' \SP, # 8Y@8 P!\&## XM_PQP & ' ']A\ ? > > ., <P8__, # &_^/_C __@8 &^ , # &QA XML ;_\P!O_Q_X P, 88PP!@^ /P P & # !@ # 9X,,!C!XP,'_#!Y\ XM, P #!C@ P&,9X.,#'@PP>?'# 8# 8!G Y@&<#F 8 , < , . ,#_^0PD XM#QAP#,/_\8 C& & ' #\ , # PPWSX?^< Y@,8#!A@'^>'C PP #'_[P> XM> !X 8!@ # #!@/X P'. X < _\ P <!G&!@ & 'P8,/_ XMS?P 8!_ '&'P!\ '@?_@> !PQXS!C_\P , ;_X_^, #_^!@ ;P P , ;#&P XM!O_# &_\!_P# P!AC# &#X > & 8 . & !G 9@&8#F 8# 8#G 8 XM# ,&< # 8QG 9@&<!F YP,,!@,!@&,#& 8X<8!@!@!P P X <! P/_YC&P. XM&#P88__S ,8 \ < _X P ,#__QXS [@ !V Q@,#, 9,R8!F &?_G!P> XM > !@& , ,& SP# X< #@!P!_@# !@&X8& P !C P #/ XMCP# >/ 8. 'P!X!_^ > .#/[,&, S P!L # P/L 8& !O@# P!L,; & XMP , ; 8 # ,# ,(8-@ P X !@ 8 8 >8!F !@&8!@,!@&8!@, XM P;@ ,!C&8!F 9@&8!F P P& 8X<8!ASA@& , # # # #X$# __G,[ 8X XM#AA@ #, !A@'P!P'!P# P/__##8!L #8#& P,P !L>/______\!@.. > XM'@?_C P P P8#/@8#AS . ' #\/_\ ?_@ . ?!@8 & #,# &X# XM ,!@, !@ . > >!P,QM_\P!L # &P , # ^P!@8 &W , # &P9L ; XM P!L!@ & P, 8-@PAAC # # & !P!@ ?Y@&8 & 9_^ P& 9@& P XM#!^ P&,9@&8!F 9@&8 #_@# 8!AAA@&#\& 8!@ & , 8 ?PP,#_^,S,!C@' XM,# ,_@&& [ '@P# , # PP\,-@&P -@,8# S &PP_______P, =P >!X XM!_^,# # /_X,V!G.#L 8 8 ?X__P !_^ P!X&!@ P ,__@ ; &! XM@, 8 & !X !X& S&W_S &P , ; P , ; &!@ ;. P , ;!FP!L # XM &P# 8# P!@V#'&&, , 8 8 # & /YF 9@ 8!G_X# 8!F 8# , XM'\ # 8QF 9@&8!F 9@ '_ ,!@&'.& 8'@8!@, 8 P!@!GF!P/_X[<P&. <P XM, S 88'& 6# , P ,!#"PPV ; V Q@,!X ;'C8!F &?_@^ >> XM 88 __FS8,^X.P !@!@#_P# ' ' 8& & ;_^ !L 8& XMP!@ 8 !X!_^ > 8#/^8#, ; P!L # P!L 8& !L<# P!L#; &P , XM; , !@,# &!P,^8P8 P#@ !@ . 8 !P&8!F !@&8 ,!@&8!@, P< XMX ,!C&8!F 9@&8!F & P& 8,P8Q@_!@&!@ !@# & ,/X& __AMC XX!V 8 XM #, !@PX8!8, P# &,;'C8!N '8#& P'@ !DS(P,, Q_^!P 9@ XM!A@ !@P?/@V/@> & & \SP, X 8 \!@8 P P!@## &P!@P# XM&P!@X !X'_X'@ ,?Q@,P!L ; &P , # &P!@8# &PX, # &P-L ; P-L XM S & P, 8' W=C!@# , & 8!@ & 9@&8 & 9@ P& 9@& P #!AP XM P&,9@&8!F 9@&8 8# 8!@_!GF'.& 8, & , 8 @? 8#_^#\$#S@'8!@ XM 8 ,#' P%@X' , ,S'SY@,< Y@,<' > &>'AA@8 &!@ ' !_^# XM, &# _\&8W!X 8 8#C' P X 'P#@#P.!@& # & ,, ; &# , ; XM &'P X !X !X X . [ &P!L ; P , ; &!@, ;!PP , ; >P!L # ^P# XM, 8# P!@<#X^8# ,!@ 8 !P& 8#G 9@&8#F 8# 8#F 8# ,&#@# XM 8QF 9@&<!F Y@ ,!@,!@.!X&S8X<8#A@ P P P" X!@/_X/P8;/@[ # ! XMP P,8# >!XX P/_\?X.'##@X '& PXX P 8P,"$ P P, ( '_X,P XM , P8!_@9C>/P P# ,,,# 'P ? , +AP& P & P P8#& P8 8#& XMP? 'P !X > <!P'P!L Q@,P#, # 8#, 8& 8#,#C P!L!Y@,P &!S ,8 XM# ,!@, @/!Y@, P. !@ # 8 !@>>## 8P>,!@, P>8!@, P8' ,! XMC&8!F 9X,,'F P& P##X'@>'G XP^, # # # & __@> _'__, , #P XM# ; & P'_@# __P> /\!___X8#!_ # __A_@ !@ @'_Y_^ > XM P #!@#,##X_S #@< !X , ? !\!P '^'_C_^?_ #!_\?_!@!_\?_! XM\ ? !@ !@ !P#_[ &__'_S_\__L !_\P!A^!_\P'/_[ &P#G_S ?_L 9_\ XM P'_P" X#L 8# __@'X .?@ #_9O\/_#_8_\ P#_9@& P #!@. P&, XM9@&,#&_P_V8 !_P!\/]@,!P.8!C_9_^ & , 8 8#_^ P!X'/X@ 0 #X, XM!L < 'X , /@!__^!@,!P ,#__!X ?_G_X P XM# ,& ,P,' ^ '#@ # P \ #@& /P?^/_X?P ,!_ ?P& !_ ?P#@ XM \ ' #^, ;_@'\/_#_^P !_# &'X!_# ,__L ; .'\, ?WP!A_ # XM '\ (# &P!@,#_^ ?@ 9^ 'YF/ /X#Q@_@# #QF 8# ,& 8# 8QF XM 8_\8\ \9@ #^ #P/& P& 9 "#QG_X . P' !@/_X , XM XM !P ! XMP , XM & P XM!_!@ !@ & # #, __@ P XM XM & & XM XM 8 # XM & & 8 , ,P#_^ # XM XM P P XM XM /__ ,# , XM8 8 ,# P S /_X , XM XM " " XM XM __\ _\ /@ !@ XM !@ _\ # !\ __@ P XM XM XM XM !_ \ & X: & !_ , #@ X Xend END_OF_FILE # end of 'font-16/U81' fi if test -f 'src/copyright.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/copyright.c'\" else echo shar: Extracting \"'src/copyright.c'\" \(7128 characters\) sed "s/^X//" >'src/copyright.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: copyright.c,v 4.3 88/07/11 13:46:06 sau Exp $ X $Source: /tmp/mgrsrc/src/RCS/copyright.c,v $ X*/ Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/copyright.c,v $$Revision: 4.3 $"; X X/* flash a copyright notice at Mgr startup */ X X#include <sys/time.h> X#include <sys/signal.h> X#include "bitmap.h" X#include "copyright.h" X X#define SSIZE 3 /* star size */ X X#define BG_COLOR 4 /* background color */ X#define LOGO_COLOR 2 X#define CR_COLOR 5 /* copyright color */ X Xstatic BITMAP *logo[] = X { &lb_0, &lb_1, &lb_2, &lb_3, &lb_4, &lb_5, &lb_6, &lb_7}; X Xstatic struct timeval delay = { X (long) 0, (long) 120000 X }; X X/* for "star trek" clip areas */ X Xstruct rect { X short x1,y1; X short x2,y2; X }c1,c2; X Xcopyright(where) XBITMAP *where; /* where to blast the copyright */ X { X BITMAP *notice = &cr; X int x = (BIT_WIDE(where)-BIT_WIDE(notice))/2; X int y = BIT_HIGH(where)/2; X int high = BIT_HIGH(logo[0]); X int wide = BIT_WIDE(logo[0]); X int mask = 1; /* select mask (1 == kbd) */ X int pid; /* pid of "startrek" program */ X register int i; X char c; X X c1.x1 = x - SSIZE; X c1.y1 = y - SSIZE; X c1.x2 = BIT_WIDE(notice) + x; X c1.y2 = BIT_HIGH(notice) + y; X X bit_blit(where,0,0,BIT_WIDE(where), X BIT_HIGH(where),BIT_SRC|GETCOLOR(BG_COLOR),0l,0,0); X bit_blit(where,x,y,BIT_WIDE(notice),BIT_HIGH(notice), X BIT_SRC^BIT_DST|GETCOLOR(BG_COLOR)^GETCOLOR(CR_COLOR), X notice,0,0); X X x = (BIT_WIDE(where)-wide)/2; X y = y - high - BIT_HIGH(notice); X X c2.x1 = x - SSIZE; X c2.y1 = y - SSIZE; X c2.x2 = wide + x; X c2.y2 = high + y; X X /* kick off stars */ X X if ((pid=fork()) == 0) /* child */ X fly(where,c1,c2); X else { X for(i=0;select(32,&mask,0,0,&delay) <= 0;i++,mask=1) X bit_blit(where,x,y,wide,high, X BIT_SRC|GETCOLOR(BG_COLOR), X logo[i%8],0,0); X read(0,&c,1); X kill(pid,SIGTERM); X while(wait(0)!=pid); X } X } X X/* star trek effect */ X X X/* X * porter.c Steve Hawley 4/3/87 X * rehacked 5/18/1988 for extra speed. X * re-re hacked 6/20/88 for MGR (SAU) X * A demo to get stars inspired by Star Trek without X * using quickdraw, and by addressing the screen directly. X * this version is roughly 8 times faster than its quickdraw X * equivalent. X * In considering the bit drawing routines, remember that X * on the macintosh, a bit turned on is black, not white. X */ X X#define MAXZ 500 /* maximum z depth */ X#define NSTARS 256 /* maximum number of stars */ X#define SPEED 8 /* star speed */ X#define SCALE (short)6 /* for rotator */ X#define COUNT (short)3 /* for rotator */ X#define ON 1 /* plotting states */ X#define OFF 0 X#define Random() rand() X Xshort maxv, maxh; /* display size */ Xshort hmaxv, hmaxh; /* 1/2 display size */ X Xstruct st { X short x, y, z; X short color; X } stars[NSTARS]; /* our galaxy */ X Xfly (where,clip1,clip2) XBITMAP *where; Xstruct rect clip1, clip2; /* "holes" in galaxy */ X{ X register short i; X register struct st *stp; X X init_all(where); /* set up global variables */ X for (i=0, stp = stars; i< NSTARS; i++, stp++) { X /* initialize galaxy */ X do { X stp->x = Random(); X stp->y = Random(); X stp->z = (Random() % MAXZ) + 1; X stp->color = Random() % 23; X if (stp->color == BG_COLOR) X stp->color++; X X } while(project(where,stp->x, stp->y, stp->z, stp->color, ON,clip1,clip2)); /* on screen? */ X } X while (1) { /* loop 'til button */ X i = NSTARS; X stp = stars; X do { X project(where,stp->x, stp->y, stp->z, stp->color, OFF,clip1,clip2); /* turn star off*/ X if ((stp->z -= SPEED) <= 0) { /* star went past us */ X stp->x = Random(); X stp->y = Random(); X stp->z = MAXZ; X } X else { /* rotate universe */ X cordic(&stp->x,&stp->y,SCALE,COUNT); X } X if (project(where,stp->x, stp->y, stp->z, stp->color, ON,clip1,clip2)) { X /* if projection is off screen, get a new position */ X stp->x = Random(); X stp->y = Random(); X stp->z = MAXZ; X } X ++stp; X } while(--i); X } X} X Xproject(where,x, y, z, col, state,clip1,clip2) Xregister BITMAP *where; Xregister short x, y, z; Xregister int col; Xregister short state; Xstruct rect clip1, clip2; X{ X X /* one-point perspective projection */ X /* the offsets (maxh/2) and maxv/2) ensure that the X * projection is screen centered X */ X x = (x/z) + hmaxh; X y = (y/z) + hmaxv; X return(xplot(where,x, y, col, state,clip1,clip2)); X X} X Xinit_all(where) Xregister BITMAP *where; X{ X maxv = BIT_HIGH(where); X hmaxv = maxv>>1; X maxh = BIT_WIDE(where); X hmaxh = maxh>>1; X} X Xxplot(where,x, y, col, state,clip1,clip2) Xregister BITMAP *where; Xregister int x, y; Xregister int col; Xint state; Xstruct rect clip1, clip2; X{ X register short *line, b; X X /* are we on the screen? If not, let the caller know*/ X if (x < 0 || x >= maxh || y < 0 || y >= maxv ) X return(1); X if (!(x < clip1.x1 || x >= clip1.x2 || y < clip1.y1 || y >= clip1.y2 )) X return(0); X if (!(x < clip2.x1 || x >= clip2.x2 || y < clip2.y1 || y >= clip2.y2 )) X return(0); X X bit_blit(where,x,y,SSIZE,SSIZE, state ? X BIT_SRC^BIT_DST | GETCOLOR(col)^GETCOLOR(BG_COLOR) : X BIT_SRC | GETCOLOR(BG_COLOR), X 0l,0,0); X return(0); X} X X/* CORDIC rotator. Takes as args a point (x,y) and spins it */ X/* count steps counter-clockwise. 1 */ X/* Rotates atan( --------- ) */ X/* scale */ X/* 2 */ X/* Therefore a scale of 5 is 1.79 degrees/step and */ X/* a scale of 4 is 3.57 degrees/step */ X Xcordic(x, y, scale, count) Xshort *x, *y; Xregister short scale, count; X X{ X register short tempx, tempy; X X tempx = *x; X tempy = *y; X X if (count > 0) /* positive count (counter-clockwise) */ X for (; count; count--){ X tempx -= (tempy >> scale); X tempy += (tempx >> scale); X } X else /* negative count (clockwise) */ X for (; count; count++){ X tempx += (tempy >> scale); X tempy += (tempx >> scale); X } X X *x = tempx; X *y = tempy; X} END_OF_FILE # end of 'src/copyright.c' fi if test -f 'src/get_info.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/get_info.c'\" else echo shar: Extracting \"'src/get_info.c'\" \(7612 characters\) sed "s/^X//" >'src/get_info.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: get_info.c,v 4.3 88/08/22 11:42:35 sau Exp $ X $Source: /tmp/mgrsrc/src/RCS/get_info.c,v $ X*/ Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/get_info.c,v $$Revision: 4.3 $"; X X/* return info to shell */ X X#include "bitmap.h" X#include "font.h" X#include "defs.h" X#include "menu.h" X#include "event.h" X#include <stdio.h> X#include "window.h" X X/* BUTTON_SYS is never reported as a possible button setting. */ X#define RPT_BUTTON() (button_state == BUTTON_SYS ? 0 : button_state ) X Xget_info(win,window,text) Xregister WINDOW *win; /* window info is about */ XBITMAP *window; /* window's bitmap data */ XBITMAP *text; /* window's text region */ X { X int cnt = W(esc_cnt); /* # of leading ESC #'s */ X int count; /* whatever */ X char font_buff[MAX_PATH]; /* space to store a path name */ X char coords[1024]; /* space for return value */ X register WINDOW *win2; /* generic window pntr */ X struct font *Get_font(); X X if (cnt == 1) { /* info about spot */ X for(win2=active;win2!=(WINDOW *) 0;win2=win2->next) X if (mousein(W(esc)[0],W(esc)[1],win2,1)) X break; X if (win2 != (WINDOW *) 0) X sprintf(coords,"%s %s %d %d\n", X win->tty+strlen(win->tty)-2, X win2->tty+strlen(win2->tty)-2,win2->num,win2->pid); X else X sprintf(coords,"\n"); X Write(W(to_fd),coords,strlen(coords)); X return; X } X X#ifdef DEBUG X dprintf(i)(stderr,"%s: getting info %d\r\n",W(tty),*W(esc)); X#endif X switch (W(esc)[0]) { X case G_TERMCAP: /* send termcap entry back to shell */ X { X int lines = T_HIGH/FSIZE(high); X int cols = T_WIDE/FSIZE(wide); X sprintf(coords,"%s:am:li#%d:co#%d:bs:cl=^L:ce=\\E%c:cd=\\E%c:cm=\\E%%r%%d%c%%d%c:al=\\E%c:dl=\\E%c:ic=\\E%c:dc=\\E%c:im=:ta=^I:up=\\E%c:do=\\E%c:nd=\\E%c:ku=\\E[A:kd=\\E[B:kr=\\E[C:kl=\\E[D:so=\\E%c:se=\\E%c:vs=\\E%c:ve=\\E%c:\n", X C_NAME,lines,cols,E_CLEAREOL,E_CLEAREOS, X E_SEP1,E_CUP,E_ADDLINE,E_DELETELINE,E_ADDCHAR,E_DELETECHAR, X E_UPLINE,E_DOWN,E_RIGHT,E_STANDOUT,E_STANDEND, X E_VI,E_NOVI); X } X break; X case G_WINSIZE: /* cols, lines */ X sprintf(coords,"%d %d\n", T_WIDE/FSIZE(wide), X T_HIGH/FSIZE(high)); X break; X case G_FONT: /* font wide, high, # */ X { X register int id = W(font)->ident; X sprintf(coords,"%d %d %d %s\n", FSIZE(wide), X FSIZE(high),id,id>0?fontlist[id-1]: X "default.fnt"); X } X break; X case G_CURSOR: /* x,y gx,gy cursor_type */ X sprintf(coords,"%d %d %d %d %d\n", X W(x)/FSIZE(wide), X W(y)/FSIZE(high)-1, X W(gx), W(gy), X W(curs_type)); X break; X case G_TEXT: /* text region size: x,y,wide,high */ X sprintf(coords,"%d %d %d %d\n", X W(text.x),W(text.y),W(text.wide),W(text.high)); X break; X case G_MOUSE: /* mouse coordinates */ X sprintf(coords,"%d %d %d\n", mousex, mousey, RPT_BUTTON()); X break; X case G_MOUSE2: /* massaged coordinates */ X if (W(flags)&W_ABSCOORDS) X sprintf(coords, "%d %d %d\n", mousex-W(x0), mousey-W(y0), X RPT_BUTTON()); X else X sprintf(coords,"%d %d %d\n", X (mousex-W(x0))*GMAX/BIT_WIDE(W(window)), X (mousey-W(y0))*GMAX/BIT_HIGH(W(window)), X RPT_BUTTON()); X break; X case G_COORDS: /* window coords */ X sprintf(coords,"%d %d %d %d\n",W(x0),W(y0), X WIDE,HIGH); X break; X case G_STATUS: /* window status */ X sprintf(coords,"%c\n",W(flags)&W_ACTIVE X ? C_EXPOSED: C_OBSCURED); X if (win == active) X *coords = C_ACTIVE; X break; X case G_ALLMINE: /* window status for client windows */ X case G_ALL: /* complete window status */ X { X register char status; X *coords = '\0'; X for(win2=active;win2!=(WINDOW *) 0;win2=win2->next) { X if (*W(esc)==G_ALLMINE && win2->main != W(main)) X continue; X status = win2->flags&W_ACTIVE ? C_EXPOSED:C_OBSCURED; X if (win2 == win) X status += ('A'-'a'); X sprintf(coords+strlen(coords),"%d %d %d %d %s %d %c %d\n", X win2->x0, X win2->y0, X win2->BIT_WIDE(border), X win2->BIT_HIGH(border), X win2->tty+strlen(win2->tty)-2, X win2->num, X status, X win2->setid); X Write(W(to_fd),coords,strlen(coords)); X *coords = '\0'; X } X sprintf(coords+strlen(coords),"\n"); X } X break; X case G_NOTIFY: /* list windows with notify set */ X { X register char *str; X *coords = '\0'; X for(win2=active;win2!=(WINDOW *) 0;win2=win2->next) { X#ifdef DEBUG X dprintf(i)(stderr," checking %s\r\n",win2->tty); X#endif X if (IS_EVENT(win2,EVENT_NOTIFY) && X (str = win2->events[GET_EVENT(EVENT_NOTIFY)])) { X sprintf(coords+strlen(coords),"%d.%d %d %s\n", X win2->pid,win2->num,strlen(str),str); X Write(W(to_fd),coords,strlen(coords)); X *coords = '\0'; X#ifdef DEBUG X dprintf(i)(stderr," got %s\r\n",str); X#endif X } X } X sprintf(coords+strlen(coords),"\n"); X } X break; X case G_SYSTEM: /* system status */ X gethostname(coords,sizeof(coords)); X sprintf(coords+strlen(coords)," %d %d %d %d %d\n", X BIT_WIDE(screen), X BIT_HIGH(screen), X SUM_BDR, X DEPTH, X BITS+1); X break; X case G_ID: /* client window id */ X for(count=0,win2=W(main);win2;win2=win2->alt) X count++; X sprintf(coords,"%d %d\n",W(num),count); X break; X case G_FLAGS: /* window flags */ X sprintf(coords,"%0x\n",W(flags)); X break; X#ifdef OBSOLETE X case G_ALLFONT: /* font information */ X { X register struct font *temp; X register int i; X X sprintf(coords,"%d %d",font->head.wide, X font->head.high); X for(i=0;i<MAXFONT;i++) { X temp=Get_font(i); X sprintf(coords+strlen(coords), " %d %d", X temp->head.wide, X temp->head.high); X } X strcat(coords,"\n"); X } X break; X#endif X } X if (strlen(coords)) X Write(W(to_fd),coords,strlen(coords)); X#ifdef DEBUG X dprintf(i)(stderr," sending (%d) [%s]\r\n", X strlen(coords),coords); X#endif X } END_OF_FILE # end of 'src/get_info.c' fi echo shar: End of archive 25 \(of 61\). cp /dev/null ark25isdone 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.