[comp.sources.misc] Wasting time on a Sun3

matt@srs.UUCP (Matt Goheen) (08/13/87)

Here is a little program I cooked up.  This version is Sun3 only, if
I get enough responce, I'll adapt it to Sun2s (pretty trivial actually,
but see included README for details).

						Matt Goheen
						S.R. Systems
				{seismo,rutgers,ames}!rochester!srs!matt

-----cut-----here-----and-----have-----your-----way-----with-----me-----
#!/bin/sh
#
# shar archiver, delete everything above the #!/bin/sh line
# and run through sh (not csh)
#
echo 'shar: extracting "README" (3051 characters)'
# 'README' has a checksum of 15571 on BSD and 1790 on System V.
sed 's/^X//' > README << 'XXX_EOF_XXX'
X
XTAKE NOTE:  brottool as distributed here will only run on a Sun3.  That
X	    is only because the f_sqrt() function uses some 68020
X	    instructions.  However, it wouldn't be much fun on a Sun2
X	    anyway (too slow) so I didn't supply a Sun2 f_sqrt() routine.
X	    Also, because the array used for plotting is so large (2 Meg),
X	    most Sun2 systems will fall a bit short.  This was developed
X	    on Sun OS 3.2, no promises about other versions (no way for
X	    2.x, probably works for any 3.x).
X
X
XBrottool is a little program that takes the following equation:
X
X    tmp = y - SIGN(x) * sqrt(fabs(b*x-c));
X    y = a - x;
X    x = tmp;
X
Xand goes nuts with it.  Preferably, it should be started up like:
X
X    brottool -Ws 1100 700
X
Xsince brottool scales its control panel according to the size of the frame,
Xthis allows for greater accuracy when selecting the seed values.  I've
Xfound that the best setup is to set the X offset around the middle, set the
Xhorizontal scrollbar around the middle so that the origin is about in the
Xcenter of the screen, and set the Y offset to around 300 (it defaults to 120).
X
XBrottool clears the screen and restarts anytime one of the seeds changes,
Xthe scale changes or the X or Y offsets change.  It does NOT restart if you
Xscroll (the canvas is a "window" into the larger background, the X and Y
Xoffsets control where in the background the program will plot, you can then
Xscroll your window around viewing the picture).
X
XClicking the "Stop" botton halts the plotting.  This is actually rather
Xuseless (until I add something like screendump - maybe).
X
XBrottool allocates a 2 Meg. array for plotting (monocrome).  If your system
Xhas only 4 meg (or heaven forbid - less), you will want to make sure that
Xnothing else is running (esp. other tools).  They can be on the desktop, they
Xjust shouldn't be in the run state or you will get some pretty massive paging
Xand swapping (i.e. no perfmeter, clocktool, etc.).
X
XThe f_sqrt() routine has restricted use because half of it was developed
Xon company time.  Run "sccs what f_tab_sqrt.o" (once it is unpacked) on
Xthe file to see the Copyright notice.  The rest of the program is purely
Xpublic domain, although I would appreciate it if people sent me any neat
Xchanges they make.
X
XTo make brottool, do the following (assuming you have already unpacked
Xthe shell archive):
X
X    1) Type "make"
X    2) As mentioned above, type "brottool -Ws 1100 700 &"
X    3) Play
X
XPOSSIBLE ENHANCEMENTS:
X
X1) Add Sun2 f_sqrt() routine.
X2) Add floating point support.  The patterns generated are VERY accuracy
X   dependant.  Although floating point looks better, it was too slow for
X   me, so I did the integer implementation.
X3) Add a "screendump" command.
X4) Add a "don't clear" button so that multiple images can be viewed (either
X   overlayed or offset).
X5) Other wizbang stuff, like XORing new points, reverse video (although
X   this can be done with suntools), etc.
X
X
X					Have fun, and don't
X					hypnotize yourself,
X
X					Matt Goheen
X			{seismo,allegra,ames,rutgers}!rochester!srs!matt
X
XXX_EOF_XXX
if test 3051 -ne "`wc -c < README`"
then
    echo 'shar: transmission error on "README"'
fi
chk=`sum README | awk '{print $1}'`
if test 15571 -ne $chk -a 1790 -ne $chk
then
    echo 'shar: checksum error on "README"'
fi
echo 'shar: extracting "Makefile" (268 characters)'
# 'Makefile' has a checksum of 64750 on BSD and 21309 on System V.
sed 's/^X//' > Makefile << 'XXX_EOF_XXX'
X#
X# Makefile for brottool.
X#
X
XPACKAGE = brottool
XGLIBS = -lsuntool -lsunwindow -lpixrect
XCFLAGS = -O
X.PRECIOUS: f_tab_sqrt.o
X
X${PACKAGE}: ${PACKAGE}.o f_tab_sqrt.o
X	cc ${CFLAGS} -o ${PACKAGE} ${PACKAGE}.o f_tab_sqrt.o $(GLIBS)
X
X${PACKAGE}.o: brottool.h brottool.icon
X
XXX_EOF_XXX
if test 268 -ne "`wc -c < Makefile`"
then
    echo 'shar: transmission error on "Makefile"'
fi
chk=`sum Makefile | awk '{print $1}'`
if test 64750 -ne $chk -a 21309 -ne $chk
then
    echo 'shar: checksum error on "Makefile"'
fi
echo 'shar: extracting "brottool.c" (9322 characters)'
# 'brottool.c' has a checksum of 19388 on BSD and 28013 on System V.
sed 's/^X//' > brottool.c << 'XXX_EOF_XXX'
X/*
X** 	Overview:	Plot stuff in window...
X*/
X
X#include <stdio.h>
X#include <suntool/sunview.h>
X#include <suntool/canvas.h>
X#include <suntool/panel.h>
X#include "brottool.h"
X
X/*
Xstatic void resize_proc();
Xstatic void repaint_proc();
X*/
Xstatic Notify_value my_notice_destroy();
Xstatic short bits[16] = { 0x8000, 0x4000, 0x2000, 0x1000, 0x800,
X			  0x400, 0x200, 0x100, 0x80, 0x40, 0x20,
X			  0x10, 0x8, 0x4, 0x2, 0x1 };
X
Xstatic short icon_image[] = {
X#include "brottool.icon"
X};
XDEFINE_ICON_FROM_IMAGE(brot_icon, icon_image);
X
X
Xextern Notify_error notify_dispatch();
Xvoid do_batch();
X
X/* twice as wide as tall */
Xstatic int Xmax = MAX_X_OFF;
Xstatic int Ymax = MAX_Y_OFF;
Xstatic int Stop;		/* Are we stopped? */
Xstatic int my_done;		/* set in my_notice_destroy() */
Xstatic int linebytes;		/* to get Y index into display array */
Xstatic int a, b, c;		/* seed values */
Xstatic int factor;		/* scaling factor */
Xstatic int count;		/* number of STEP points plotted */
Xstatic int xoff, yoff;		/* current X and Y offsets */
Xstatic int sx, sy;		/* current values of X and Y */
Xstatic char *image;		/* pointer to display array (NOT screen) */
Xstatic Pixwin *pw;		/* screen pixwin */
Xstatic Pixrect *Mypr;		/* display array pixrect */
X
X/* pointers to panel items */
Xstatic Panel_item panel_item_A, panel_item_B, panel_item_C;
Xstatic Panel_item panel_item_X, panel_item_Y, panel_stop_toggle;
X
X/* All the notify procs for the panel items call this one procedure.
X** It merely changes the values and restarts the display (unless the
X** item is the "Stop" button, in which case the display isn't restarted).
X*/
X
Xchange_proc(item, value, event)
XPanel_item item;
Xint value;
XEvent *event;
X{
X    if (item == panel_item_A)
X	a = value;
X    else if (item == panel_item_B)
X	b = value;
X    else if (item == panel_item_C)
X	c = value << SHIFT;
X    else if (item == panel_item_X)
X	xoff = value;
X    else if (item == panel_item_Y)
X	yoff = value;
X    else if (item == panel_stop_toggle) {
X	Stop = value;
X	return;
X    } else
X	factor = SHIFT - value;
X    /* could just use bzero() on "image", but Sun OS 3.2 bzero()
X    ** is broken for > 256K (64K * 4 bytes/long)
X    */
X    pr_rop(Mypr, 0, 0, Xmax, Ymax, PIX_CLR | PIX_DONTCLIP, 0, 0, 0);
X    sx = 0; sy = 0; count = 0;		/* start over */
X}
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X    int Xsize;			/* panel items scaled to frame size */
X    Frame frame;		/* the tool */
X    Panel panel;		/* the control panel */
X    Canvas canvas;		/* the canvas for drawing */
X    Panel_item panel_iters;	/* for number of STEP iterations */
X    char panel_iter_string[30];	/* ditto */
X
X    frame = window_create(NULL, FRAME,
X			  FRAME_LABEL, "BrotTool",
X			  FRAME_ARGC_PTR_ARGV, &argc, argv,
X			  FRAME_ICON, &brot_icon,
X			  FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
X			  WIN_ERROR_MSG, "Can't create frame",
X			  0);
X
X    /* get width of the frame to scale panel items by */
X    Xsize = ((Rect *) window_get(frame, WIN_RECT))->r_width;
X
X    panel = window_create(frame, PANEL, 
X		      PANEL_LABEL_BOLD, TRUE,
X		      0);
X
X    panel_item_A = panel_create_item(panel, PANEL_SLIDER,
X		      PANEL_VALUE, DEF_A,
X		      PANEL_MIN_VALUE, (-4 << SHIFT),
X		      PANEL_MAX_VALUE, (4 << SHIFT),
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_LABEL_STRING, "Seed 'A': ",
X		      PANEL_NOTIFY_LEVEL, PANEL_DONE,
X		      PANEL_SHOW_VALUE, TRUE,
X		      PANEL_SLIDER_WIDTH, Xsize-200,
X		      PANEL_SHOW_RANGE, FALSE,
X		      0);
X    panel_item_B = panel_create_item(panel, PANEL_SLIDER,
X		      PANEL_VALUE, DEF_B,
X		      PANEL_MIN_VALUE, (-4 << SHIFT),
X		      PANEL_MAX_VALUE, (4 << SHIFT),
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_LABEL_STRING, "Seed 'B': ",
X		      PANEL_NOTIFY_LEVEL, PANEL_DONE,
X		      PANEL_SHOW_VALUE, TRUE,
X		      PANEL_SLIDER_WIDTH, Xsize-200,
X		      PANEL_SHOW_RANGE, FALSE,
X		      0);
X    panel_item_C = panel_create_item(panel, PANEL_SLIDER,
X		      PANEL_VALUE, DEF_C >> SHIFT,
X		      PANEL_MIN_VALUE, (-4 << SHIFT),
X		      PANEL_MAX_VALUE, (4 << SHIFT),
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_LABEL_STRING, "Seed 'C': ",
X		      PANEL_NOTIFY_LEVEL, PANEL_DONE,
X		      PANEL_SHOW_VALUE, TRUE,
X		      PANEL_SLIDER_WIDTH, Xsize-200,
X		      PANEL_SHOW_RANGE, FALSE,
X		      0);
X
X    panel_item_X = panel_create_item(panel, PANEL_SLIDER,
X		      PANEL_VALUE, DEF_X_OFF,
X		      PANEL_MIN_VALUE, 0,
X		      PANEL_MAX_VALUE, MAX_X_OFF,
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_LABEL_STRING, "X Offset: ",
X		      PANEL_NOTIFY_LEVEL, PANEL_DONE,
X		      PANEL_SHOW_VALUE, TRUE,
X		      PANEL_SLIDER_WIDTH, Xsize-370,
X		      PANEL_SHOW_RANGE, FALSE,
X		      0);
X
X    /* This is a little strange because there are no PANEL_CHOICE_STRINGS.
X    ** Instead, we use the PANEL_LABEL_STRING to label our button.  This
X    ** is easier than loading a pixfont to get the string to come up bold
X    ** like the rest of the panel items.
X    */
X    panel_stop_toggle = panel_create_item(panel, PANEL_TOGGLE,
X		      PANEL_LABEL_STRING, "Stop",
X		      PANEL_CHOICE_STRINGS, "", 0,
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_TOGGLE_VALUE, 0, FALSE,
X		      0);
X    panel_create_item(panel, PANEL_CYCLE,
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_LABEL_STRING, " Scale:",
X		      PANEL_CHOICE_STRINGS, "1", "2", "4", "8", "16",
X			  "32", "64", "128", 0,
X		      PANEL_VALUE, DEF_FAC,
X		      0);
X
X    panel_item_Y = panel_create_item(panel, PANEL_SLIDER,
X		      PANEL_VALUE, DEF_Y_OFF,
X		      PANEL_MIN_VALUE, 0,
X		      PANEL_MAX_VALUE, MAX_Y_OFF,
X		      PANEL_NOTIFY_PROC, change_proc,
X		      PANEL_LABEL_STRING, "Y Offset: ",
X		      PANEL_NOTIFY_LEVEL, PANEL_DONE,
X		      PANEL_SHOW_VALUE, TRUE,
X		      PANEL_SLIDER_WIDTH, Xsize-370,
X		      PANEL_SHOW_RANGE, FALSE,
X		      0);
X
X    panel_create_item(panel, PANEL_MESSAGE,
X		      PANEL_LABEL_STRING, "Points:",
X		      0);
X    panel_iters = panel_create_item(panel, PANEL_MESSAGE,
X		      PANEL_LABEL_STRING, "    0",
X		      0);
X    (void) sprintf(panel_iter_string, "x %d", STEP);
X    panel_create_item(panel, PANEL_MESSAGE,
X		      PANEL_LABEL_STRING, panel_iter_string,
X		      0);
X
X    window_fit_height(panel);	/* squeeze everything together */
X
X    canvas = window_create(frame, CANVAS,
X			   /* CANVAS_RESIZE_PROC, resize_proc, */
X			   /* CANVAS_REPAINT_PROC, repaint_proc, */
X			   CANVAS_RETAINED, FALSE,
X			   CANVAS_AUTO_CLEAR, FALSE,
X			   CANVAS_WIDTH, Xmax,
X			   CANVAS_HEIGHT, Ymax,
X			   CANVAS_AUTO_SHRINK, FALSE,
X			   WIN_VERTICAL_SCROLLBAR, scrollbar_create(0),
X			   WIN_HORIZONTAL_SCROLLBAR, scrollbar_create(0),
X			   WIN_ERROR_MSG, "Can't create canvas",
X			   0);
X    
X    pw = canvas_pixwin(canvas);
X
X    (void) notify_interpose_destroy_func(frame, my_notice_destroy);
X
X    /* initialize defaults */
X    a = DEF_A; b = DEF_B; c = DEF_C; factor = SHIFT - DEF_FAC;
X    xoff = DEF_X_OFF; yoff = DEF_Y_OFF; Stop = FALSE;
X
X    /* allocate the memory pixrect for the actual display */
X    if ((Mypr = mem_create(Xmax, Ymax, 1)) == NULL) {
X	fprintf(stderr, "%s: not enough memory for display array", argv[0]);
X	exit(1);
X    }
X
X    image = (char *) ((struct mpr_data *) Mypr->pr_data)->md_image;
X    linebytes = ((struct mpr_data *) Mypr->pr_data)->md_linebytes;
X    window_set(frame, WIN_SHOW, TRUE, 0);
X
X    while (TRUE) {
X	(void) notify_dispatch();	/* any windowing to do? */
X	if (my_done)
X	    break;
X
X	/* Might be easier to call window_main_loop()? */
X	if (Stop) {		/* don't draw, sleep for 2/10 sec */
X	    usleep(200000);
X	    continue;
X	}
X	do_batch(&sx, &sy);
X	(void) sprintf(panel_iter_string, "%5d", ++count);
X	panel_set(panel_iters,
X		  PANEL_LABEL_STRING, panel_iter_string,
X		  0);
X    }
X}
X
X/* NOT NECESSARY...
Xstatic void
Xresize_proc()
X{
X}
X*/
X
X/* Since do_batch() periodically updates the screen anyway,
X** we don't need this at all...
Xstatic void
Xrepaint_proc()
X{
X    pw_write(pw, 0, 0, Xmax, Ymax, PIX_SRC, Mypr, 0, 0);
X}
X*/
X
Xstatic Notify_value
Xmy_notice_destroy(frame, status)
XFrame frame;
XDestroy_status status;
X{
X    if (status != DESTROY_CHECKING) {
X	my_done = 1;
X	(void) notify_stop();
X    }
X    return(notify_next_destroy_func(frame, status));
X}
X
X/* The basic equation is:
X**
X**	tmp = y - SIGN(x) * sqrt(fabs(b*x-c));
X**	y = a - x;
X**	x = tmp;
X*/
X
Xvoid
Xdo_batch()
X{
X    register int tmp, ix, iy, ifactor, i, ibytes;
X    register char *ia, *ib, *ic;
X    register short *ttmp;
X
X    ia = (char *) a; ib = (char *) b; ic = (char *) c;
X    ix = sx; iy = sy;
X    ibytes = linebytes;
X    ifactor = factor;
X
X    for (i=STEP; i--; ) {
X	tmp = iy; tmp >>= ifactor; tmp += yoff;		/* y */
X	if (tmp < Ymax && tmp >= 0) {
X	    tmp *= ibytes;
X	    ttmp = (short *) (image + tmp);
X	    tmp = ix; tmp >>= ifactor; tmp += xoff;	/* x */
X	    if (tmp < Xmax && tmp >= 0)
X		*(ttmp + (tmp >> 4)) |= bits[tmp & 0x0f];
X	}
X	tmp = (int) ib;
X	tmp *= ix;
X	tmp -= (int) ic;
X	if (tmp < 0)
X	    tmp = -tmp;
X	tmp = f_sqrt(tmp);
X	if (ix < 0)
X	    tmp = -tmp;
X	tmp = iy - tmp;
X	iy = (int) ia - ix;
X	ix = tmp;
X    }
X
X    /* Maybe this would be faster if we kept track of the canvases
X    ** current viewport and only did a pw_write of that area.  For
X    ** now, this appears to be fast enough.
X    */
X    pw_write(pw, 0, 0, Xmax, Ymax, PIX_SRC, Mypr, 0, 0);
X
X    sx = ix;	/* save the x value for the next call */
X    sy = iy;	/* save the y value for the next call */
X}
XXX_EOF_XXX
if test 9322 -ne "`wc -c < brottool.c`"
then
    echo 'shar: transmission error on "brottool.c"'
fi
chk=`sum brottool.c | awk '{print $1}'`
if test 19388 -ne $chk -a 28013 -ne $chk
then
    echo 'shar: checksum error on "brottool.c"'
fi
echo 'shar: extracting "brottool.h" (863 characters)'
# 'brottool.h' has a checksum of 24498 on BSD and 65017 on System V.
sed 's/^X//' > brottool.h << 'XXX_EOF_XXX'
X/* Number of points to plot before updating the screen */
X#define STEP		5000
X
X/* Default seed values */
X#define DEF_A		(-22938)
X#define DEF_B		(-1638)
X#define DEF_C		221459251
X
X/* Index of default screen magnification factor (1, 2, 4, 8, 16, 32, 64, 128) */
X#define DEF_FAC		6
X
X/* Size of display area:
X** X=(DEF_SIZE << (WIN_SHIFT+1)),
X** Y=(DEF_SIZE << (WIN_SHIFT-1))
X*/
X#define DEF_SIZE	512
X#define WIN_SHIFT	3
X
X/* Default X and Y offsets into display area (NOT the same as scrolling) */
X#define DEF_X_OFF	100
X#define DEF_Y_OFF	120
X
X/* For scrollbars, display size */
X#define MAX_X_OFF	(DEF_SIZE << (WIN_SHIFT+1))
X#define MAX_Y_OFF	(DEF_SIZE << (WIN_SHIFT-1))
X
X/* Number of bits in fixed point calculations, probably shouldn't mess
X** with this one.  14 seems to overflow, 12 gives poor (or poorer) results.
X** This seems to be the best.
X*/
X#define SHIFT		13
X
XXX_EOF_XXX
if test 863 -ne "`wc -c < brottool.h`"
then
    echo 'shar: transmission error on "brottool.h"'
fi
chk=`sum brottool.h | awk '{print $1}'`
if test 24498 -ne $chk -a 65017 -ne $chk
then
    echo 'shar: checksum error on "brottool.h"'
fi
echo 'shar: extracting "brottool.icon" (1933 characters)'
# 'brottool.icon' has a checksum of 43697 on BSD and 49786 on System V.
sed 's/^X//' > brottool.icon << 'XXX_EOF_XXX'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x00C0,0x0300,0x0001,
X	0x8000,0x00C0,0x0300,0x0001,0x800F,0xE060,0x0607,0xF001,
X	0x803F,0xF860,0x061F,0xFC01,0x80F0,0x1E30,0x0C78,0x0F01,
X	0x8140,0x051C,0x38A0,0x0281,0x8380,0x0387,0xE1C0,0x01C1,
X	0x8500,0x0140,0x0280,0x00A1,0x8600,0x00C0,0x0300,0x0061,
X	0x8C00,0x0060,0x0600,0x0031,0x8C00,0x0060,0x0600,0x0031,
X	0x9800,0x0030,0x0C00,0x0019,0x9800,0x0030,0x0C00,0x0019,
X	0x9800,0x0030,0x0C00,0x0019,0x9800,0x0030,0x0C00,0x0019,
X	0x9800,0x0030,0x0C00,0x0019,0x9800,0x0030,0x0C00,0x0019,
X	0x9800,0x0030,0x0C00,0x0019,0x8C00,0x0070,0x0E00,0x0031,
X	0x8C00,0x0070,0x0E00,0x0031,0x8600,0x00D0,0x0B00,0x0061,
X	0x8500,0x016F,0xF680,0x00A1,0x8380,0x039F,0xF9C0,0x01C1,
X	0x8140,0x0500,0x00A0,0x0281,0x82F0,0x1E00,0x0078,0x0F41,
X	0x87FF,0xF800,0x001F,0xFFE1,0x8C0F,0xE018,0x1807,0xF031,
X	0x9800,0x0024,0x2400,0x0019,0x9800,0x0024,0x2400,0x0019,
X	0x9800,0x0022,0x4400,0x0019,0x9800,0x001F,0xF800,0x0019,
X	0x9800,0x001F,0xF800,0x0019,0x9800,0x0022,0x4400,0x0019,
X	0x9800,0x0024,0x2400,0x0019,0x9800,0x0024,0x2400,0x0019,
X	0x8C0F,0xE018,0x1807,0xF031,0x87FF,0xF800,0x001F,0xFFE1,
X	0x82F0,0x1E00,0x0078,0x0F41,0x8140,0x0500,0x00A0,0x0281,
X	0x8380,0x039F,0xF9C0,0x01C1,0x8500,0x016F,0xF680,0x00A1,
X	0x8600,0x00D0,0x0B00,0x0061,0x8C00,0x0070,0x0E00,0x0031,
X	0x8C00,0x0070,0x0E00,0x0031,0x9800,0x0030,0x0C00,0x0019,
X	0x9800,0x0030,0x0C00,0x0019,0x9800,0x0030,0x0C00,0x0019,
X	0x9800,0x0030,0x0C00,0x0019,0x9800,0x0030,0x0C00,0x0019,
X	0x9800,0x0030,0x0C00,0x0019,0x9800,0x0030,0x0C00,0x0019,
X	0x8C00,0x0060,0x0600,0x0031,0x8C00,0x0060,0x0600,0x0031,
X	0x8600,0x00C0,0x0300,0x0061,0x8500,0x0140,0x0280,0x00A1,
X	0x8380,0x0387,0xE1C0,0x01C1,0x8140,0x051C,0x38A0,0x0281,
X	0x80F0,0x1E30,0x0C78,0x0F01,0x803F,0xF860,0x061F,0xFC01,
X	0x800F,0xE060,0x0607,0xF001,0x8000,0x00C0,0x0300,0x0001,
X	0x8000,0x00C0,0x0300,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF
XXX_EOF_XXX
if test 1933 -ne "`wc -c < brottool.icon`"
then
    echo 'shar: transmission error on "brottool.icon"'
fi
chk=`sum brottool.icon | awk '{print $1}'`
if test 43697 -ne $chk -a 49786 -ne $chk
then
    echo 'shar: checksum error on "brottool.icon"'
fi
echo 'shar: extracting "encoded" (6239 characters)'
# 'encoded' has a checksum of 18293 on BSD and 3096 on System V.
sed 's/^X//' > encoded << 'XXX_EOF_XXX'
Xbegin 755 f_tab_sqrt.o
XM``(!!P```%0``!#H`````````!@`````````$``````O`B0O``CMPA``4D'B
XM0>-!<!:004C`;QS@JN.*!H(```!4($+B@'(*DH!"@#`0XF@D'TYU<@&2@..J
XM!H(```!4($+B@'(*DH!"@#`0XF@D'TYU``````3F!E,'>PA\"6$*,@KT"ZD,
XM5`SV#9`.)`ZR#SL/OQ`_$+L1-!&I$AP2C!+Y$V03S!0R%)<4^15:%;D6%Q9S
XM%LT7)A=^%]48*AA^&-$9(QET&<0:$QIA&JX:^QM&&Y$;VQPD'&P<M!S['4$=
XMAQW,'A$>5!Z8'MH?'!]>'Y\?WR`?(%\@GB#=(1LA6"&5(=(B#R)*(H8BP2+\
XM(S8C<".J(^,D'"14)(TDQ23\)3,E:B6A)=<F#29#)G@FK2;B)Q8G2R=_)[(G
XMYB@9*$PH?RBQ*.,I%2E'*7DIJBG;*@PJ/"IM*ITJS2K]*RPK6RN+*[DKZ"P7
XM+$4L<RRA+,\L_2TJ+5<MA"VQ+=XN"RXW+F,NCRZ[+N<O$R\^+VDOE"^_+^HP
XM%3`_,&HPE#"^,.@Q$C$[,64QCC&X,>$R"C(S,ELRA#*L,M4R_3,E,TTS=3.=
XM,\0S[#03-#HT8C2)-+`TUC3]-20U2C5Q-9<UO37C-@DV+S95-GHVH#;%-NLW
XM$#<U-UHW?S>D-\DW[3@2.#8X6SA_.*,XQSCK.0\Y,SE7.7HYGCG".>4Z"#HL
XM.D\Z<CJ5.K@ZVSK].R`[0SME.X@[JCO,.^X\$3PS/%4\=SR8/+H\W#S]/1\]
XM0#UB/8,]I#W&/><^"#XI/DH^:CZ+/JP^S3[M/PX_+C]//V\_CS^O/\\_[T`/
XM0"]`3T!O0(]`KT#.0.Y!#4$M04Q!:T&+0:I!R4'H0@=")D)%0F1"@T*B0L!"
XMWT+^0QQ#.T-90W=#ED.T0])#\$0/1"U$2T1I1(=$I$3"1.!$_D4;13E%5D5T
XM19%%KT7,1>I&!T8D1D%&7D9[1IA&M4;21N]'#$<I1T9'8D=_1YQ'N$?51_%(
XM#D@J2$9(8TA_2)M(MTC42/!)#$DH241)8$E\29=)LTG/2>M*!DHB2CY*64IU
XM2I!*K$K'2N)*_DL92S1+4$MK2X9+H4N\2]=+\DP-3"A,0TQ>3'A,DTRN3,E,
XMXTS^31A-,TU-36A-@DV=3;=-T4WL3@9.($XZ3E5.;TZ)3J-.O4[73O%/"T\E
XM3S]/6$]R3XQ/ID^_3]E/\U`,4"90/U!94')0C%"E4+]0V%#Q40M1)%$]4591
XM;U&)4:)1NU'44>U2!E(?4CA245)I4H)2FU*T4LU2Y5+^4Q=3+U-(4V!3>5.2
XM4ZI3PE/;4_-4#%0D5#Q4551M5(54G52V5,Y4YE3^5195+E5&55Y5=E6.5:95
XMOE765>Y6!58=5C56359D5GQ6E%:K5L-6VU;R5PI7(5<Y5U!7:%=_5Y=7KE?%
XM5]U7]%@+6")8.EA16&A8?UB66*U8Q%C<6/-9"EDA63A93EEE67Q9DUFJ6<%9
XMV%GN6@5:'%HS6DE:8%IW6HU:I%JZ6M%:Z%K^6Q5;*UM"6UA;;EN%6YM;L5O(
XM6]Y;]%P+7"%<-UQ-7&-<>ER07*9<O%S27.A<_ET472I=0%U676Q=@EV87:Y=
XMQ%W97>]>!5X;7C!>1EY<7G)>AUZ=7K->R%[>7O-?"5\>7S1?25]?7W1?BE^?
XM7[5?RE_?7_5@"F`?8#5@2F!?8'5@BF"?8+1@R6#>8/1A"6$>83-A2&%=87)A
XMAV&<8;%AQF';8?!B!6(:8BYB0V)88FUB@F*78JMBP&+58NIB_F,38RAC/&-1
XM8V5C>F./8Z-CN&/,8^%C]60*9!YD,V1'9%MD<&2$9)EDK63!9-9DZF3^91-E
XM)V4[94]E8V5X98QEH&6T9<AEW&7P9@5F&68M9D%F569I9GUFD6:E9KEFS&;@
XM9O1G"&<<9S!G1&=89VMG?V>39Z=GNF?.9^)G]F@):!UH,6A$:%AH;&A_:)-H
XMIFBZ:,UHX6CU:0AI'&DO:4)I5FEI:7UID&FD:;=IRFG>:?%J!&H8:BMJ/FI1
XM:F5J>&J+:IYJLFK%:MAJZVK^:Q%K)6LX:TMK7FMQ:X1KEVNJ:[UKT&OC:_9L
XM"6P<;"]L0FQ5;&AL>FR-;*!LLVS&;-EL[&S^;1%M)&TW;4EM7&UO;8)ME&VG
XM;;IMS&W?;?)N!&X7;BEN/&Y/;F%N=&Z&;IENJVZ^;M!NXV[U;PAO&F\L;S]O
XM46]D;W9OB&^;;ZUOOV_2;^1O]G`)<!MP+7`_<%)P9'!V<(APFW"M<+]PT7#C
XM</5Q!W$:<2QQ/G%0<6)Q='&&<9AQJG&\<<YQX''R<@1R%G(H<CIR3')><G!R
XM@7*3<J5RMW+)<MMR[7+^<Q!S(G,T<T9S5W-I<WMSC7.><[!SPG/3<^5S]W0(
XM=!IT+'0]=$]T8'1R=(1TE72G=+ATRG3;=.UT_G40=2%U,W5$=59U9W5Y=8IU
XMG'6M=;YUT'7A=?)V!'85=B=V.'9)=EIV;'9]=HYVH':Q=L)VTW;E=O9W!W<8
XM=REW.W=,=UUW;G=_=Y!WH7>S=\1WU7?F=_=X"'@9>"IX.WA,>%UX;GA_>)!X
XMH7BR>,-XU'CE>/9Y!WD8>2EY.GE+>5MY;'E]>8YYGWFP><!YT7GB>?-Z!'H4
XM>B5Z-GI'>EAZ:'IY>HIZFGJK>KQZS'K=>NYZ_GL/>R![,'M!>U)[8GMS>X-[
XME'NE>[5[QGO6>^=[]WP(?!A\*7PY?$I\6GQK?'M\C'R<?*Q\O7S-?-Y\[GS^
XM?0]]'WTP?4!]4'UA?7%]@7V2?:)]LGW"?=-]XWWS?@1^%'XD?C1^17Y5?F5^
XM=7Z%?I9^IGZV?L9^UG[F?O9_!W\7?R=_-W]'?U=_9W]W?X=_EW^G?[=_QW_7
XM?^=_]X`'@!>`)X`W@$>`5X!G@'>`AX"7@*>`MX#'@->`YX#W@0:!%H$F@3:!
XM1H%6@6:!=8&%@96!I8&U@<2!U('D@?2"`X(3@B.",X)"@E*"8H)R@H&"D8*A
XM@K""P(+0@M^"[X+_@PZ#'H,M@SV#38-<@VR#>X.+@YN#JH.Z@\F#V8/H@_B$
XM!X07A":$-H1%A%6$9(1TA(.$DX2BA+&$P830A."$[X3_A0Z%'84MA3R%2X5;
XMA6J%>H6)A9B%J(6WA<:%U87EA?2&`X83AB*&,89`AE"&7X9NAGV&C8:<AJN&
XMNH;)AMF&Z(;WAP:'%8<DAS2'0X=2AV&'<(=_AXZ'G8>MA[R'RX?:A^F'^(@'
XMB!:()8@TB$.(4HAAB'"(?XB.B)V(K(B[B,J(V8CHB/>)!HD5B22),XE"B5&)
XM8(EOB7V)C(F;B:J)N8G(B=>)YHGTB@.*$HHABC"*/XI-BER*:XIZBHF*EXJF
XMBK6*Q(K2BN&*\(K_BPV+'(LKBSF+2(M7BV:+=(N#BY*+H(NOB[Z+S(O;B^J+
XM^(P'C!6,)(PSC$&,4(Q>C&V,?(R*C)F,IXRVC,2,TXSBC/",_XT-C1R-*HTY
XMC4>-5HUDC7.-@8V0C9Z-K(V[C<F-V(WFC?6.`XX2CB".+HX]CDN.6HYHCG:.
XMA8Z3CJ&.L(Z^CLR.VX[ICO>/!H\4CR*/,8\_CTV/7(]JCWB/AH^5CZ./L8^_
XMC\Z/W(_JC_B0!Y`5D".0,9`_D$Z07)!JD'B0AI"5D*.0L9"_D,V0VY#ID/B1
XM!I$4D2*1,)$^D4R16I%HD7:1A9&3D:&1KY&]D<N1V9'GD?62`Y(1DA^2+9([
XMDDF25Y)EDG.2@9*/DIV2JY*YDL>2U9+CDO&2_Y,-DQJ3*),VDT234I-@DVZ3
XM?).*DYB3I9.SD\&3SY/=D^N3^90&E!24(I0PE#Z43)19E&>4=92#E)&4GI2L
XME+J4R)35E..4\93_E0R5&I4HE3:50Y51E5^5;)5ZE8B5EI6CE;&5OY7,E=J5
XMZ)7UE@.6$98>EBR6.99'EE668I9PEGZ6BY:9EJ:6M);"EL^6W9;JEOB7!9<3
XMER&7+I<\ETF75Y=DEW*7?Y>-EYJ7J)>UE\.7T)?>E^N7^9@&F!28(9@OF#R8
XM2IA7F&28<IA_F(V8FIBHF+68PIC0F-V8ZYCXF069$YD@F2V9.YE(F5:98YEP
XMF7Z9BYF8F::9LYG`F<Z9VYGHF?::`YH0FAV:*YHXFD6:4YI@FFV:>IJ(FI6:
XMHIJOFKV:RIK7FN2:\9K_FPR;&9LFFS.;09M.FUN;:)MUFX.;D)N=FZJ;MYO$
XMF]*;WYOLF_F<!IP3G""<+9P[G$B<59QBG&^<?)R)G):<HYRPG+V<RIS8G.6<
XM\IS_G0R=&9TFG3.=0)U-G5J=9YUTG8&=CIV;G:B=M9W"G<^=W)WIG?:>`YX0
XMGAV>*IXWGD.>4)Y=GFJ>=YZ$GI&>GIZKGKB>Q9[2GMZ>ZY[XGP6?$I\?GRR?
XM.9]%GU*?7Y]LGWF?AI^3GY^?K)^YG\:?TY_?G^R?^:`&H!.@'Z`LH#F@1J!3
XMH%^@;*!YH(:@DJ"?H*R@N:#%H-*@WZ#LH/BA!:$2H1ZA*Z$XH46A4:%>H6NA
XM=Z&$H9&AG:&JH;>APZ'0H=VAZ:'VH@.B#Z(<HBFB-:)"HDZB6Z)HHG2B@:*-
XMHIJBIZ*SHL"BS*+9HN:B\J+_HPNC&*,DHS&C/:-*HU>C8Z-PHWRCB:.5HZ*C
XMKJ.[H\>CU*/@H^VC^:0&I!*D'Z0KI#BD1*11I%VD:J1VI(*DCZ2;I*BDM*3!
XMI,VDV:3FI/*D_Z4+I1BE)*4PI3VE2:56I6*E;J5[I8>EDZ6@I:REN:7%I=&E
XMWJ7JI?:F`Z8/IANF**8TID"F3:99IF6F<:9^IHJFEJ:CIJ^FNZ;(IM2FX*;L
XMIOFG!:<1IQVG*J<VIT*G3J=;IV>G<Z=_IXRGF*>DI["GO*?)I]6GX:?MI_FH
XM!J@2J!ZH*J@VJ$*H3ZA;J&>H<ZA_J(NHF*BDJ+"HO*C(J-2HX*CMJ/FI!:D1
XMJ1VI*:DUJ4&I3:E:J6:I<JE^J8JIEJFBJ:ZINJG&J=*IWJGJJ?:J`ZH/JANJ
XM)ZHSJC^J2ZI7JF.J;ZI[JH>JDZJ?JJNJMZK#JL^JVZKGJO.J_ZL+JQ>K(ZLO
XMJSNK1ZM3JUZK:JMVJX*KCJN:JZ:KLJN^J\JKUJOBJ^ZK^JP%K!&L':PIK#6L
XM0:Q-K%FL9:QPK'RLB*R4K*"LK*RXK,2LSZS;K.>L\ZS_K0NM%JTBK2ZM.JU&
XMK5*M7:UIK76M@:V-K9BMI*VPK;RMR*W3K=^MZZWWK@*N#JX:KB:N,:X]KDFN
XM5:Y@KFRN>*Z$KH^NFZZGKK.NOJ[*KM:NXJ[MKOFO!:\0KQRO**\SKS^O2Z]6
XMKV*O;J]YKX6OD:^<KZBOM*^_K\NOUZ_BK^ZO^K`%L!&P';`HL#2P/[!+L%>P
XM8K!NL'JPA;"1L)RPJ+"TL+^PR[#6L.*P[;#YL06Q$+$<L2>Q,[$^L4JQ5;%A
XML6VQ>+&$L8^QF[&FL;*QO;')L=2QX+'KL?>R`K(.LAFR);(PLCRR1[)3LEZR
XM:K)ULH&RC+*8LJ.RK[*ZLL:RT;+<LNBR\[+_LPJS%K,ALRVS.+-#LT^S6K-F
XMLW&S?+.(LY.SG[.JL[6SP;/,L]BSX[/NL_JT!;01M!RT)[0SM#ZT2;15M&"T
XM:[1WM(*TCK29M*2TL+2[M,:TTK3=M.BT\[3_0"@C*69?=&%B7W-Q<G0N<R`Q
XM+C$@0V]P>7)I9VAT("A#*2`X+S$Q+S@W(%-P965C:"!296-O9VYI=&EO;B!3
XM>7-T96US"D`H(RE4:&ES(&-O9&4@;6%Y($Y/5"!B92!S;VQD(&%N9"]O<B!U
XM<V5D(&9O<B!P<F]F:70N("!#;W!I97,@9F]R"D`H(REN;VXM<')O9FET('5S
XM92!M87D@8F4@;6%D92P@87,@;&]N9R!A<R!T:&ES(&-O<'ER:6=H="!N;W1I
XM8V4*0"@C*6ES(&YO="!R96UO=F5D(&]R(&%L=&5R960N`````!X```9`````
XM/```!D`````$!P`!7````%0````.!0`&#@`````````67W-Q<G1?=&%B`%]F
X&7W-Q<G0`
X`
Xend
XXX_EOF_XXX
if test 6239 -ne "`wc -c < encoded`"
then
    echo 'shar: transmission error on "encoded"'
fi
chk=`sum encoded | awk '{print $1}'`
if test 18293 -ne $chk -a 3096 -ne $chk
then
    echo 'shar: checksum error on "encoded"'
else
    echo 'shar: decoding "encoded" to "f_tab_sqrt.o"'
    uudecode encoded
fi
echo 'shar: extracting "Copyright.c" (269 characters)'
# 'Copyright.c' has a checksum of 19970 on BSD and 22893 on System V.
sed 's/^X//' > Copyright.c << 'XXX_EOF_XXX'
Xstatic char Sccsid[] = "\
X@(#)f_tab_sqrt.s 1.1 Copyright (C) 8/11/87 Speech Recognition Systems\n\
X@(#)This code may NOT be sold and/or used for profit.  Copies for\n\
X@(#)non-profit use may be made, as long as this copyright notice\n\
X@(#)is not removed or altered.";
XXX_EOF_XXX
if test 269 -ne "`wc -c < Copyright.c`"
then
    echo 'shar: transmission error on "Copyright.c"'
fi
chk=`sum Copyright.c | awk '{print $1}'`
if test 19970 -ne $chk -a 22893 -ne $chk
then
    echo 'shar: checksum error on "Copyright.c"'
fi