v01i034: contool - A new Sunview console message handler
Charles Mcgrew
mcgrew at dartagnan.rutgers.edu
Thu Jun 22 03:51:28 AEST 1989
Submitted-by: chuck at melmac.harris-atd.com
Posting-number: Volume 1, Issue 34
Archive-name: contool2.1
#! /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 shell archive."
# Contents: Makefile README contool.c contool.man misc.c sample.filter
# icons icons/console1.icon icons/console1_bad.icon
# icons/console1_flash.icon icons/contool.icon
# icons/contool_bad.icon icons/stopsign.icon icons/stopsign_inv.icon
# Wrapped by chuck at melmac on Fri Feb 10 11:25:37 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(702 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
XBIN = /usr/local/bin
X
XMAN = /usr/man/manl
XMANEXT = l
X
X# directory where icons can be found, must end with '/'!
XICON_DIR = ./icons/
X
XOFILES = contool.o misc.o
X
X.c.o:
X cc -O -c -DICON_DIRECTORY=\"$(ICON_DIR)\" $<
X
Xcontool: $(OFILES)
X cc -o contool $(OFILES) -lsuntool -lsunwindow -lpixrect
X
Xinstall: contool $(MAN)/contool.$(MANEXT)
X cp contool $(BIN)
X chmod 755 $(BIN)/contool
X
X$(MAN)/contool.$(MANEXT): contool.man
X cp -p contool.man $(MAN)/contool.$(MANEXT)
X
Xinstall-icons:
X for i in icons/*.icon; do \
X cp $$i $(ICON_DIR); \
X done;
X
Xclean:
X rm -f *~ $(OFILES) contool core
X
Xshar:
X rm -f contool.shar
X shar -o contool.shar Makefile README contool.c contool.man misc.c sample.filter icons icons/*
END_OF_FILE
if test 702 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3733 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X Contool Version 2.1
X
X Change history:
X 1.0 20 Jun 88 Original release
X 1.1 30 Jun 88 Added -p option to pop open when messages
X arrive. Suggested by Doug Lind
X (lind at perron.ms.washington.edu).
X Added alternate icon sets for more attractive
X appearance when messages arrive. Alternate
X set two is from David Eckelcamp
X (eckelcamp at mcc.com).
X Cleaned up Makefile. Again, courtesy of
X David Eckelcamp.
X 2.0 23 Aug 88 Added automatic reload of filters when
X filter file is modified. Suggested by
X Craig Musicant (cmusican at stanford.prime.com).
X Filter strings are now regular expressions.
X Provided by jqj at hogg.cc.uoregon.edu.
X Reworked frame menu, based upon diffs posted
X to sun-source at titan.rice.edu.
X Added protection from overflowing the text edit
X window when too many messages arrive.
X Filters can now be read from any file, not
X just ~/.contool.
X 2.1 10 Feb 89 Added logging capability, courtesy of
X Gregory Bond (gnb at melba.bby.oz.au).
X
X Contool will capture and display system console messages with timestamps.
XIt is a replacement for the standard Sun console, which is created with
X"cmdtool -C". Contool will flash its icon and beep when messages are written
Xto the icon, so you can keep it closed on your desktop until a message arrives.
XYou can modify this beeping and flashing behavior; see the man page for more
Xdetails.
X
X Contool comes with several icons which you can use for different flash
Xstyles. The default is a flashing stop sign; some of us prefer a little
Xmonitor whose screen flashes. To achieve this behavior, you can invoke
X
X contool -g contool.icon -b contool.icon -f contool_bad.icon
X
Xto set the good, bad, and flash icons.
X
X You can instruct contool to filter and ignore certain common console
Xmessages. The man file explains how to create a file of filters in
X~/.contool; the included sample.filter is how my filters are set up. You
Xcan modify this to suit yourself, and copy it to ~/.contool.
X
X Before building contool, you need to check several site dependencies
Xin the Makefile and contool.c. These paths are:
X
X In Makefile:
X BIN Where the executable will go, normally
X /usr/local/bin
X MANDIR Where the man page will go, normally
X /usr/man/manl
X MANEXT The man page extension, usually 'l',
X for local man pages. You may want to
X make MANDIR /usr/man/man1, in which case
X MANEXT should be '1'.
X
X ICON_DIRECTORY Where you will keep the contool icons.
X On our system, this is /usr/local/images.
X Contool is shipped with this set to "./icons/",
X so that it will compile in the directory
X in which you unshar'ed it. Move the icons
X to your local icon repository, and change
X this path accordingly. MAKE SURE IT ENDS
X IN A '/'!
X
X In contool.c:
X You may wish to use an alternate icon set for contool. Simply
X uncomment the set you want to use as noted in contool.c.
X
XOnce you have adjusted these values, just type "make contool" or "make
Xinstall".
X
X Contool honors window command line options, described in suntools(1),
Xso you can change the default window size, icon position, etc. We like
Xto bring contool up closed, using "-Wi".
X
X Comments, bugs, to me, please. I would be very interested in your
Ximpressions of contool and any suggestions you might have to make it better.
XBy the way, there are a few convenient untility routines in misc.c you might
Xfind useful in other programs you are writing.
X
XChuck Musciano
XAdvanced Technology Department
XHarris Corporation
XPO Box 37, MS 3A/1912
XMelbourne, FL 32902
X(407) 727-6131
XARPA: chuck at trantor.harris-atd.com
END_OF_FILE
if test 3733 -ne `wc -c <'README'`; then
echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'contool.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'contool.c'\"
else
echo shar: Extracting \"'contool.c'\" \(21726 characters\)
sed "s/^X//" >'contool.c' <<'END_OF_FILE'
X/************************************************************************/
X/* Copyright 1988 by Chuck Musciano and Harris Corporation */
X/* */
X/* Permission to use, copy, modify, and distribute this software */
X/* and its documentation for any purpose and without fee is */
X/* hereby granted, provided that the above copyright notice */
X/* appear in all copies and that both that copyright notice and */
X/* this permission notice appear in supporting documentation, and */
X/* that the name of Chuck Musciano and Harris Corporation not be */
X/* used in advertising or publicity pertaining to distribution */
X/* of the software without specific, written prior permission. */
X/* Chuck Musciano and Harris Corporation make no representations */
X/* about the suitability of this software for any purpose. It is */
X/* provided "as is" without express or implied warranty. */
X/************************************************************************/
X
X
X/************************************************************************/
X/* */
X/* contool: capture and display timestamped console i/o */
X/* */
X/************************************************************************/
X
X#include <stdio.h>
X#include <fcntl.h>
X#include <sys/ioctl.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#include <suntool/sunview.h>
X#include <suntool/textsw.h>
X#include <suntool/icon_load.h>
X
X/**************** Site dependent parameters ****************************/
X
X/* Where the default contool icons are kept. !Must end in '/'! */
X
X#if !defined(ICON_DIRECTORY)
X#define ICON_DIRECTORY "./icons/"
X#endif
X
X/* The default icon names. Alternate sets are shown, and you might want
X to try these instead of the default set by uncommenting the desired set. */
X
X/* This set gives a blinking stop sign when messages arrive. */
X#define GOOD_ICON "contool.icon"
X#define BAD_ICON "stopsign.icon"
X#define INVERSE_ICON "stopsign_inv.icon"
X
X/* This set gives a terminal, labelled "Console", in a box. The screen
X flashes when messages arrive. */
X/* #define GOOD_ICON "contool.icon" */
X/* #define BAD_ICON "contool.icon" */
X/* #define INVERSE_ICON "contool_bad.icon" */
X
X/* This set gives a terminal, without a box. Again, the screen flashes
X when messages arrive. */
X/* #define GOOD_ICON "console1.icon" */
X/* #define BAD_ICON "console1_bad.icon" */
X/* #define INVERSE_ICON "console1_flash.icon" */
X
X/*************** End of site dependencies ******************************/
X
X#define TOOL_LABEL "<< Console Tool 2.1 >>"
X
X#define MAX_FILTERS 64
X
X#define strsave(s) ((char *) strcpy(malloc(strlen(s) + 1), s))
X
X#define BEEP_COUNT 3
X#define TS_INTERVAL 60
X
X#define NORMAL_MODE 1
X#define QUIET_MODE 2
X#define IGNORE_MODE 3
X
X#define TEXT_SIZE_LIMIT 32768
X#define TEXT_SIZE_FUZZ 1024
X#define TEXT_DELETE_SIZE 1024
X
X#define INPUT_BUFFER_SIZE 4096
X
X/*************** Stuff that regexp(3) needs ****************************/
X
Xstatic regexp_error();
X
X#define INIT register char *expbuf = ep, *sp = instring;
X#define GETC() (*sp++)
X#define PEEKC() (*sp)
X#define UNGETC(c) (--sp)
X#define RETURN(p) {bcopy(expbuf, sp = (char *) malloc(p - expbuf), p - expbuf); return(sp);}
X#define ERROR(val) {regexp_error(val, instring); return(NULL);}
X
X#include <regexp.h>
X
X/*************** Things that contool uses ******************************/
X
Xstruct f_rec {char *start;
X char *end;
X int scircf;
X int ecircf;
X int mode;
X };
X
Xchar *ct_usage = "usage: contool [-b <file>] [-c <file>] [-d <size>] [-f <file>] [-g <file>] [-l <size>] [-o <logfile>] [-p] [-r <amt>] [-s <amt>]\n";
X
Xstatic Frame bf;
Xstatic Textsw text;
Xstatic Icon good, bad, inverse;
Xstatic struct pixrect *good_pr, *bad_pr, *inv_pr;
Xstatic Menu_item stop_blink;
Xstatic Rect open_rect;
X
Xstatic char bad_icon[256]; /* -b */
Xstatic char filter_path[256]; /* -c */
Xstatic int delete_amt = TEXT_DELETE_SIZE; /* -d */
Xstatic char inv_icon[256]; /* -f */
Xstatic char good_icon[256]; /* -g */
Xstatic int size_limit = TEXT_SIZE_LIMIT; /* -l */
Xstatic int pop_open = FALSE; /* -p */
Xstatic int resolution = TS_INTERVAL; /* -r */
Xstatic int beep_amount = BEEP_COUNT; /* -s */
X
Xstatic int bad_is_up;
Xstatic int beep_count;
Xstatic int blinking = FALSE;
Xstatic int event_in_progress = FALSE;
Xstatic int explicit_filters = FALSE;
Xstatic struct f_rec filter[MAX_FILTERS];
Xstatic int filters = 0;
Xstatic int icon_height;
Xstatic int icon_width;
Xstatic FILE *master = NULL;
Xstatic int old_time = 0;
Xstatic char *program;
Xstatic FILE *slave = NULL;
Xstatic FILE *logfile = NULL;
X
Xstatic struct itimerval timer = {{0, 500000}, {0, 500000}};
X
X/************************************************************************/
X/* First, some basic console utility routines */
X/************************************************************************/
X
X/************************************************************************/
Xstatic acquire_console(path)
X
Xchar *path;
X
X{
X if (ioctl(fileno(slave), TIOCCONS, NULL) == -1) {
X fprintf(stderr, "%s: could not attach %s to /dev/console\n", program, path);
X exit(1);
X }
X}
X
X/************************************************************************/
Xstatic clear_messages()
X
X{
X textsw_reset(text, 0, 0);
X old_time = 0;
X}
X
X/************************************************************************/
Xstatic stop_blinking()
X
X{
X notify_set_itimer_func(bf, NULL, ITIMER_REAL, NULL, NULL);
X window_set(bf, FRAME_ICON, good, 0);
X blinking = FALSE;
X menu_set(stop_blink, MENU_INACTIVE, TRUE, 0);
X}
X
X/************************************************************************/
X/* Now, filter and regular expression handlers */
X/************************************************************************/
X
X/************************************************************************/
Xstatic internal_message(a, b, c, d, e, f)
X
Xint a, b, c, d, e, f;
X
X{ char buf[512];
X
X sprintf(buf, a, b, c, d, e, f);
X time_stamp();
X write_log(buf);
X do_insertion(buf, strlen(buf));
X}
X
X/************************************************************************/
Xstatic internal_error(a, b, c, d, e, f)
X
Xint a, b, c, d, e, f;
X
X{ char buf[512];
X
X sprintf(buf, a, b, c, d, e, f);
X time_stamp();
X fprintf(stderr, buf);
X}
X
X/************************************************************************/
Xstatic int match_exp(exp, circ, str)
X
Xchar *exp;
Xint circ;
Xchar *str;
X
X{
X circf = circ;
X return(step(str, exp));
X}
X
X/************************************************************************/
Xstatic regexp_error(val, string)
X
Xint val;
Xchar *string;
X
X{ char *msg;
X
X switch (val) {
X case 11 : msg = "range endpoint too large";
X case 16 : msg = "bad number";
X case 25 : msg = "\"\\digit\" out of range";
X case 36 : msg = "illegal or missing delimiter";
X case 41 : msg = "no remembered search string";
X case 42 : msg = "\\(\\) imbalance";
X case 43 : msg = "too many \\(";
X case 44 : msg = "more than 2 numbers given in \\{\\}";
X case 45 : msg = "} expected after \\";
X case 46 : msg = "first number exceeds second in \\{\\}";
X case 49 : msg = "[] imbalance";
X case 50 : msg = "regular expression overflow";
X default : msg = "regular expression compilation error";
X }
X internal_error("*** %s: %s in '%s'\n", program, msg, string);
X}
X
X/************************************************************************/
Xstatic load_filters()
X
X{ FILE *f;
X char buf[256], rbuf[1024], *token[6], *p, *index();
X int count;
X struct stat sb;
X static int load_time = 0;
X
X if (stat(filter_path, &sb) == -1) {
X if (explicit_filters && load_time == 0) {
X internal_error("*** %s: filter file %s cannot be accessed\n", program, filter_path);
X load_time = 1;
X }
X return;
X }
X if (sb.st_mtime > load_time) {
X for (count = 0; count < filters; count++) {
X free(filter[count].start);
X if (filter[count].end)
X free(filter[count].end);
X }
X filters = 0;
X }
X else
X return;
X
X if ((f = fopen(filter_path, "r")) != NULL) {
X while (getline(f, buf, 256) != EOF) {
X if ((p = index(buf, '#')) != NULL)
X *p = '\0';
X if (strlen(buf) == 0 || verify(buf, " "))
X continue;
X tokenize(buf, &count, token, 6);
X if (count == 2 || count == 4) {
X if (strcmp(lower(token[0]), "ignore") == 0)
X filter[filters].mode = IGNORE_MODE;
X else if (strcmp(token[0], "quiet") == 0)
X filter[filters].mode = QUIET_MODE;
X else {
X internal_error("*** %s: invalid contool filter:\n***\t%s\n", program, buf);
X continue;
X }
X if ((filter[filters].start = compile(token[1], rbuf, rbuf+1024, '\0')) == NULL)
X continue;
X filter[filters].scircf = circf;
X if (count == 4)
X if (strcmp(lower(token[2]), "to") == 0) {
X filter[filters].end = compile(token[3], rbuf, rbuf+1024, '\0');
X filter[filters].ecircf = circf;
X }
X else {
X internal_error("*** %s: invalid contool filter:\n***\t%s\n", program, buf);
X continue;
X }
X else
X filter[filters].end = NULL;
X filters++;
X }
X else
X internal_error("*** %s: invalid contool filter:\n\t%s\n", program, buf);
X }
X fclose(f);
X internal_message("*** filters loaded from %s\n", filter_path);
X load_time = sb.st_mtime;
X }
X else
X internal_error("*** %s: could not read filter file %s\n", program, filter_path);
X}
X
X/************************************************************************/
X/* Various event handlers for the console frame */
X/************************************************************************/
X
X/************************************************************************/
Xstatic Notify_value blink_proc(me, which)
X
Xint *me;
Xint which;
X
X{
X if (event_in_progress)
X return(NOTIFY_DONE);
X if (beep_count > 0) {
X window_bell(bf);
X beep_count--;
X }
X else if (blinking) {
X if (bad_is_up)
X window_set(bf, FRAME_ICON, inverse, 0);
X else
X window_set(bf, FRAME_ICON, bad, 0);
X bad_is_up = !bad_is_up;
X }
X if (beep_count == 0 && !blinking)
X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL);
X return(NOTIFY_DONE);
X}
X
X/************************************************************************/
Xstatic Notify_value close_proc(frame, event, arg, type)
X
XFrame frame;
XEvent *event;
XNotify_arg arg;
XNotify_event_type type;
X
X{ int init_closed, curr_closed, is_resize;
X Notify_value value;
X Rect *temp;
X
X event_in_progress = TRUE;
X init_closed = (int) window_get(frame, FRAME_CLOSED);
X is_resize = (event_id(event) == WIN_RESIZE);
X value = notify_next_event_func(frame, event, arg, type);
X curr_closed = (int) window_get(frame, FRAME_CLOSED);
X if (init_closed != curr_closed)
X if (!curr_closed && blinking) {
X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL);
X window_set(bf, FRAME_ICON, good, 0);
X blinking = FALSE;
X menu_set(stop_blink, MENU_INACTIVE, TRUE, 0);
X }
X event_in_progress = FALSE;
X if (is_resize) {
X temp = (Rect *) window_get(frame, FRAME_OPEN_RECT);
X if (temp->r_width <= icon_width && temp->r_height <= icon_height) { /* override spurious resize request */
X window_set(frame, FRAME_OPEN_RECT, &open_rect, FRAME_CLOSED, FALSE, 0);
X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL);
X window_set(bf, FRAME_ICON, good, 0);
X blinking = FALSE;
X menu_set(stop_blink, MENU_INACTIVE, TRUE, 0);
X }
X else /* save away new open rect */
X open_rect = *temp;
X }
X return(value);
X}
X
X/************************************************************************/
Xstatic Notify_value destroy_proc(frame, status)
X
XFrame frame;
XDestroy_status status;
X
X{
X if (status == DESTROY_CHECKING) {
X textsw_reset(text, 0, 0);
X return(NOTIFY_DONE);
X }
X else
X return(notify_next_destroy_func(frame, status));
X}
X
X/************************************************************************/
X/* Routines which handle capturing and displaying messages */
X/************************************************************************/
X
X/************************************************************************/
Xstatic write_log(s)
X
Xchar *s;
X
X{ int t;
X static char hostname[100] = "";
X
X if (logfile) {
X if (*hostname == NULL)
X if (gethostname(hostname, 99) != 0)
X strcpy(hostname, "(unknown)");
X t = time(0);
X fseek(logfile, 0L, 2);
X fprintf(logfile, "%s\t%.16s\t%s", hostname, ctime(&t) + 4, s);
X fflush(logfile);
X }
X}
X
X/************************************************************************/
Xstatic do_insertion(buf, len)
X
Xchar *buf;
Xint len;
X
X{ int first, last;
X
X while (len > size_limit - ((int) window_get(text, TEXTSW_LENGTH) - TEXT_SIZE_FUZZ)) { /* make some room */
X first = 1;
X last = TEXTSW_INFINITY;
X if (textsw_find_bytes(text, &first, &last, "\n<<<", 4, 0) == -1)
X if (textsw_find_bytes(text, &first, &last, "\n", 1, 0) == -1)
X first = delete_amt;
X textsw_delete(text, 0, first + 1);
X }
X window_set(text, TEXTSW_INSERTION_POINT, TEXTSW_INFINITY, 0);
X textsw_insert(text, buf, len);
X}
X
X/************************************************************************/
Xstatic time_stamp()
X
X{ int t, pos;
X char buf[5];
X
X t = time(0);
X if (t - old_time >= resolution) {
X window_set(text, TEXTSW_INSERTION_POINT, TEXTSW_INFINITY, 0);
X pos = (int) window_get(text, TEXTSW_LENGTH);
X if (pos != 0) {
X window_get(text, TEXTSW_CONTENTS, pos - 1, buf, 1);
X if (buf[0] != '\n')
X do_insertion("\n", 1);
X }
X do_insertion("\n<<< ", 5);
X do_insertion(ctime(&t), 24);
X do_insertion(" >>>\n", 5);
X old_time = t;
X }
X}
X
X/************************************************************************/
Xstatic Notify_value input_func(me, fd)
X
Xint *me;
Xint fd;
X
X{ char old_c, *s, *t, *index();
X int i, count, do_blink = FALSE;
X static int curr_filter = -1, curr_mode = NORMAL_MODE;
X static char in_buf[INPUT_BUFFER_SIZE + 2];
X
X while ((count = read(fileno(master), in_buf, INPUT_BUFFER_SIZE)) >= 0) {
X in_buf[count] = '\0';
X while (s = index(in_buf, '\015')) {
X strcpy(s, s + 1);
X count--;
X }
X for (t = in_buf; *t; *s = old_c, t = s) {
X if (s = index(t, '\n')) {
X old_c = *++s;
X *s = '\0';
X }
X else {
X s = t + strlen(t);
X old_c = '\0';
X }
X if (curr_mode == NORMAL_MODE) {
X load_filters();
X for (i = 0; i < filters; i++)
X if (match_exp(filter[i].start, filter[i].scircf, t)) {
X if (filter[i].mode == QUIET_MODE) {
X time_stamp();
X write_log(t);
X do_insertion(t, strlen(t));
X }
X if (filter[i].end) {
X curr_mode = filter[i].mode;
X curr_filter = i;
X }
X break;
X }
X if (i == filters) {
X time_stamp();
X write_log(t);
X do_insertion(t, strlen(t));
X do_blink = TRUE;
X }
X }
X else {
X if (curr_mode == QUIET_MODE) {
X time_stamp();
X write_log(t);
X do_insertion(t, strlen(t));
X }
X if (match_exp(filter[curr_filter].end, filter[curr_filter].ecircf, t)) {
X curr_mode = NORMAL_MODE;
X curr_filter = -1;
X }
X }
X }
X }
X window_set(text, TEXTSW_UPDATE_SCROLLBAR, 0);
X if (do_blink) {
X if (pop_open)
X window_set(bf, FRAME_CLOSED, FALSE, 0);
X if (window_get(bf, FRAME_CLOSED) && !blinking) {
X window_set(bf, FRAME_ICON, bad, 0);
X blinking = TRUE;
X bad_is_up = TRUE;
X menu_set(stop_blink, MENU_INACTIVE, FALSE, 0);
X }
X beep_count = beep_amount;
X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, &timer, NULL);
X }
X return(NOTIFY_DONE);
X}
X
X/************************************************************************/
X/* Routines which parse options, create windows, and main() */
X/************************************************************************/
X
X/************************************************************************/
Xstatic parse_options(argc, argv)
X
Xint *argc;
Xchar **argv;
X
X{ char *s, c;
X
X strcpy(good_icon, ICON_DIRECTORY);
X strcat(good_icon, GOOD_ICON);
X strcpy(bad_icon, ICON_DIRECTORY);
X strcat(bad_icon, BAD_ICON);
X strcpy(inv_icon, ICON_DIRECTORY);
X strcat(inv_icon, INVERSE_ICON);
X
X strcpy(filter_path, getenv("HOME"));
X strcat(filter_path, "/.contool");
X
X while ((c = getopt(argc, argv, "b:c:d:f:g:l:o:pr:s:?", &s)) != EOF)
X switch (c) {
X case 'b' : strcpy(bad_icon, s);
X break;
X case 'c' : strcpy(filter_path, s);
X explicit_filters = TRUE;
X break;
X case 'd' : if (verify(s, "0123456789"))
X delete_amt = atoi(s);
X else {
X fprintf(stderr, "%s: invalid delete amount: %s\n", program, s);
X exit(1);
X }
X break;
X case 'f' : strcpy(inv_icon, s);
X break;
X case 'g' : strcpy(good_icon, s);
X break;
X case 'l' : if (verify(s, "0123456789"))
X window_set(text, TEXTSW_MEMORY_MAXIMUM, (size_limit = atoi(s)) + TEXT_SIZE_FUZZ, 0);
X else {
X fprintf(stderr, "%s: invalid message limit: %s\n", program, s);
X exit(1);
X }
X break;
X case 'o': if ((logfile = fopen(s, "a")) == NULL) {
X fprintf(stderr, "%s : can't open logfile: %s\n", program, s);
X exit(1);
X }
X break;
X case 'p' : pop_open = TRUE;
X break;
X case 'r' : if (verify(s, "0123456789"))
X resolution = atoi(s);
X else {
X fprintf(stderr, "%s: invalid timestamp resolution: %s\n", program, s);
X exit(1);
X }
X break;
X case 's' : if (verify(s, "0123456789"))
X beep_amount = atoi(s);
X else {
X fprintf(stderr, "%s: invalid beep count: %s\n", program, s);
X exit(1);
X }
X break;
X case '?' : fprintf(stderr, ct_usage);
X exit(0);
X break;
X default : fprintf(stderr, ct_usage);
X exit(1);
X }
X}
X
X/************************************************************************/
Xstatic load_icons()
X
X{ char msg[IL_ERRORMSG_SIZE];
X
X if ((good_pr = icon_load_mpr(good_icon, msg)) == NULL) {
X fprintf(stderr, "%s: %s\n", program, msg);
X exit(1);
X }
X good = icon_create(ICON_IMAGE, good_pr,
X ICON_LABEL, "",
X ICON_WIDTH, good_pr->pr_size.x,
X ICON_HEIGHT, good_pr->pr_size.y,
X 0);
X icon_width = good_pr->pr_size.x;
X icon_height = good_pr->pr_size.y;
X if ((bad_pr = icon_load_mpr(bad_icon, msg)) == NULL) {
X fprintf(stderr, "%s: %s\n", program, msg);
X exit(1);
X }
X bad = icon_create(ICON_IMAGE, bad_pr,
X ICON_LABEL, "",
X ICON_WIDTH, bad_pr->pr_size.x,
X ICON_HEIGHT, bad_pr->pr_size.y,
X 0);
X if (bad_pr->pr_size.x > icon_width)
X icon_width = bad_pr->pr_size.x;
X if (bad_pr->pr_size.y > icon_height)
X icon_height = bad_pr->pr_size.y;
X if (*inv_icon == '\0')
X strcpy(inv_icon, bad_icon);
X if ((inv_pr = icon_load_mpr(inv_icon, msg)) == NULL) {
X fprintf(stderr, "%s: %s\n", program, msg);
X exit(1);
X }
X inverse = icon_create(ICON_IMAGE, inv_pr,
X ICON_LABEL, "",
X ICON_WIDTH, inv_pr->pr_size.x,
X ICON_HEIGHT, inv_pr->pr_size.y,
X 0);
X if (inv_pr->pr_size.x > icon_width)
X icon_width = inv_pr->pr_size.x;
X if (inv_pr->pr_size.y > icon_height)
X icon_height = inv_pr->pr_size.y;
X window_set(bf, FRAME_ICON, good, 0);
X}
X
X/************************************************************************/
Xmain(argc, argv)
X
Xint argc;
Xchar **argv;
X
X{ char *path, *open_psuedo_tty(), **saveargs();
X int i;
X Menu menu;
X
X program = strsave(argv[0]);
X
X bf = window_create(NULL, FRAME,
X FRAME_ARGC_PTR_ARGV, &argc, argv,
X FRAME_LABEL, TOOL_LABEL,
X 0);
X text = window_create(bf, TEXTSW,
X TEXTSW_DISABLE_CD, TRUE,
X TEXTSW_DISABLE_LOAD, TRUE,
X TEXTSW_AGAIN_RECORDING, FALSE,
X TEXTSW_IGNORE_LIMIT, TEXTSW_INFINITY,
X TEXTSW_MEMORY_MAXIMUM, size_limit + TEXT_SIZE_FUZZ,
X 0);
X open_rect = *((Rect *) window_get(bf, FRAME_OPEN_RECT));
X
X argv = saveargs(argc, argv);
X parse_options(&argc, argv);
X if (argc != 1) {
X fprintf(stderr, ct_usage);
X exit(1);
X }
X
X load_icons();
X
X path = open_psuedo_tty(&master, "r", &slave, "w");
X if (master == NULL) {
X fprintf(stderr, "%s: couldn't open any psuedo-tty\n");
X exit(1);
X }
X if (slave == NULL) {
X fprintf(stderr, "%s: couldn't open slave side of %s\n", program, path);
X exit(1);
X }
X
X i = fcntl(fileno(master), F_GETFL, 0);
X i |= FNDELAY;
X if (fcntl(fileno(master), F_SETFL, i) == -1) {
X fprintf(stderr, "%s: could not force %s to non-blocking i/o\n", program, path);
X exit(1);
X }
X
X acquire_console(path);
X
X stop_blink = menu_create_item(MENU_STRING, "Stop Blinking",
X MENU_INACTIVE, TRUE,
X MENU_ACTION_PROC, stop_blinking,
X 0);
X menu = menu_create(MENU_APPEND_ITEM, stop_blink,
X MENU_ACTION_ITEM, "Become Console", acquire_console,
X MENU_ACTION_ITEM, "Clear Messages", clear_messages,
X MENU_PULLRIGHT_ITEM, "Frame", window_get(bf, WIN_MENU),
X 0);
X window_set(bf, WIN_MENU, menu, 0);
X
X notify_set_input_func(bf, input_func, fileno(master));
X notify_interpose_destroy_func(bf, destroy_proc);
X notify_interpose_event_func(bf, close_proc, NOTIFY_SAFE);
X
X load_filters();
X
X window_main_loop(bf);
X}
END_OF_FILE
if test 21726 -ne `wc -c <'contool.c'`; then
echo shar: \"'contool.c'\" unpacked with wrong size!
fi
# end of 'contool.c'
fi
if test -f 'contool.man' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'contool.man'\"
else
echo shar: Extracting \"'contool.man'\" \(4928 characters\)
sed "s/^X//" >'contool.man' <<'END_OF_FILE'
X.TH CONTOOL 1 "10 December 1986"
X.SH NAME
Xcontool \- capture and display console output
X.SH SYNOPSIS
X.IP "\fBcontool\fP"
X[\fB\(hyb\fP \fIfile\fP] [\fB\(hyc\fP \fIfile\fP] [\fB\(hyd\fP \fIsize\fP] [\fB\(hyf\fP \fIfile\fP] [\fB\(hyg\fP \fIfile\fP] [\fB\(hyl\fP \fIsize\fP] [\f3\(hyo\fP \f2logfile\fP] [\f3\(hyp\fP] [\f3\(hyr\fP \f2amount\fP] [\f3\(hys\fP \f2count\fP]
X.SH DESCRIPTION
X.LP
X\f2Contool\fP captures and displays any messages sent to the system console.
XEach message is timestamped as it arrives. The messages are displayed in a
Xscrolling text window, so the user can scroll through old messages.
X.LP
XWhen a message arrives, \f3contool\fP will beep and, if closed, begin
Xblinking its icon until the user opens the tool. This behavior can be changed
Xwith the various options, described below.
X.LP
X\f2Contool\fP must be run under \f2suntools\fP(1), and accepts the
Xstandard window command line options.
X.LP
X\f2Contool\fP can be configured to ignore certain console messages using
Xentries in the file ~/.contool. Each line in the file has the format
X\*(lq\f2action start\fP [ \f3to\fP \f2stop\fP ]\*(rq. The \fIstart\fP and
X\fIstop\fP strings are regular expressions, as described in \fIed\fP(1).
XEach line of text written
Xto the console is compared against the list of \f2start\fP strings. A match
Xcauses the \f2action\fP to take place. If the \f2action\fP is \f3quiet\fP, the
Xmessage is written to the console, but no beeping or blinking occurs. If it
Xis \f3ignore\fP, the message is thrown away. If the optional \f3to\fP clause is
Xincluded, the desired \f2action\fP remains in effect until a line matching the \f2stop\fP
Xstring is encountered. Comments can be introduced into the file using the '#'
Xcharacter.
X.SH OPTIONS
X.IP "\fB\\(hyb\fP \fIfile\fP"
Xspecifies the \*(lqbad\*(rq icon to be displayed when a message
Xhas arrived on the console. The \f2file\fP must be in the format used by
X\f2iconedit\fP(1).
X.IP "\fB\\(hyc\fP \fIfile\fP"
Xspecifies a different filter file. If \fB\(hyc\fP is not used, \fIcontool\fP
Xwill read filters from ~/.contool, if it exists.
X.IP "\fB\\(hyd\fP \fIsize\fP"
Xsets the amount of text that will be removed from the front of the message
Xlog when the message size limit (see \fB\(hyl\fP, below) is exceeded. At
Xleast \fIsize\fP bytes will be removed, along with any text up to the start
Xof the next message. The default value is 1024 bytes.
X.IP "\fB\\(hyf\fP \fIfile\fP"
Xspecifies the \*(lqflash\*(rq icon which is alternated with the
Xbad icon (see \f3\(hyb\fP, above) when a message has arrived on the console.
XLike \f3\(hyb\fP, the file must be in the format used by \f2iconedit\fP(1).
XTo disable the flashing feature, specify \*(lq\*(rq as the \f2file\fP.
X.IP "\fB\\(hyg\fP \fIfile\fP"
Xspecifies the \*(lqgood\*(rq icon which is displayed when
Xno unviewed messages are present on the console. This icon is displayed
Xwhen the user closes \f2contool\fP, and remains displayed until a new message
Xarrives. Like \f3\(hyb\fP and \f3\(hyf\fP, the \f2file\fP must be in the
Xformat used by \f2iconedit\fP(1).
X.IP "\fB\\(hyl\fP \fIsize\fP"
Xsets the limit, in bytes, on the number of messages that will be saved.
XWhen a message would exceed this limit, some number of bytes of text (see
X\fB\(hyd\fP, above) will be deleted from the start of the message log. The
Xdefault value is 32768 bytes.
X.IP "\fB\\(hyo\fP \fIfile\fP"
Xinstructs contool to keep a log of all messages (that are accepted by
Xthe filters) into the named \fIfile\fP. This is useful for logging the
Xconsole messages from a network of workstations into files on a
Xserver, making administration of such a network much simpler. Care
Xshould be exercised in logging multiple machines to the one file; NFS
Xsometimes doesn't append if concurrent updates are done. This may be
Xan NFS bug.
X.IP "\f3\(hyp\fP"
Xcauses contool to pop open when a message arrives. By default,
Xcontool stays closed and blinks when messages arrive.
X.IP "\f3\(hyr\fP \f2amount\fP"
Xcontrols the resolution of the timestamps placed in the
Xmessage display. Normally, a message is not timestamped if it has arrived
Xwithin sixty seconds of the last timestamp. This prevents a cascade
Xof messages from receiving several, identical timestamps. If this option
Xis specified, the \f2amount\fP indicates the time, in seconds, to allow
Xbetween timestamps.
X.IP "\f3\(hys\fP \f2count\fP"
Xchanges the number of times \f2contool\fP will sound the bell
Xwhen a message arrives. To disable the bell, set the \f2count\fP to zero.
X.SH FILES
X.ta 2i
Xcontool.icon default \f3\(hyg\fP icon
X.br
Xstopsign.icon default \f3\(hyb\fP icon
X.br
Xstopsign_inv.icon default \f3\(hyf\fP icon
X.br
X~/.contool filter pattern file
X.SH AUTHOR
X.LP
XChuck Musciano
X.br
XAdvanced Technology Department
X.br
XHarris Corporation
X.br
X(407) 727-6131
X.br
XARPA: chuck at trantor.harris-atd.com
X.SH BUGS
X.LP
X\f2Contool\fP is a view-only tool, and there is no way to type commands
Xon the console.
END_OF_FILE
if test 4928 -ne `wc -c <'contool.man'`; then
echo shar: \"'contool.man'\" unpacked with wrong size!
fi
# end of 'contool.man'
fi
if test -f 'misc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'misc.c'\"
else
echo shar: Extracting \"'misc.c'\" \(6517 characters\)
sed "s/^X//" >'misc.c' <<'END_OF_FILE'
X/************************************************************************/
X/* Copyright 1988 by Chuck Musciano and Harris Corporation */
X/* */
X/* Permission to use, copy, modify, and distribute this software */
X/* and its documentation for any purpose and without fee is */
X/* hereby granted, provided that the above copyright notice */
X/* appear in all copies and that both that copyright notice and */
X/* this permission notice appear in supporting documentation, and */
X/* that the name of Chuck Musciano and Harris Corporation not be */
X/* used in advertising or publicity pertaining to distribution */
X/* of the software without specific, written prior permission. */
X/* Chuck Musciano and Harris Corporation make no representations */
X/* about the suitability of this software for any purpose. It is */
X/* provided "as is" without express or implied warranty. */
X/************************************************************************/
X
X
X/************************************************************************/
X/* */
X/* misc: miscellaneous support routines for contool */
X/* */
X/************************************************************************/
X
X#include <stdio.h>
X#include <ctype.h>
X
X/************************************************************************/
X/* */
X/* getline read a line from a stream, removing the newline */
X/* and returning the length of the line. */
X/* */
X/************************************************************************/
X
Xint getline(stream, string, max)
X
XFILE *stream;
Xchar *string;
Xint max;
X
X{ register int i, j;
X
X i = (int) fgets(string, max, stream);
X if (i == NULL)
X return(EOF);
X j = strlen(string);
X if (j > 0 && string[j - 1] == '\n')
X string[--j] = '\0';
X return(j);
X}
X
X/************************************************************************/
X/* */
X/* getopt extract options and their parameters from a */
X/* list of strings (most likely the command line */
X/* arguments. */
X/* */
X/* The 'opts' descriptor is a string of letters, */
X/* indicating which options are valid. If a */
X/* letter is followed by a ':', that option is */
X/* assumed to have a parameter following it. */
X/* Getopt returns the discovered option, NULL when */
X/* an illegal option is found, and EOF when no */
X/* more options are found. Options and their */
X/* parameters are removed from the string list. */
X/* */
X/************************************************************************/
X
Xstatic delarg(argc, argv)
X
Xint *argc;
Xchar **argv;
X
X{ char *p;
X
X while (*argv = *(argv+1))
X argv++;
X (*argc)--;
X}
X
Xchar getopt(argc, argv, opts, parm)
X
Xint *argc;
Xchar **argv;
Xchar *opts;
Xchar **parm;
X
X{ char c, *p, *strcpy(), *index();
X int killed;
X
X *parm = NULL;
X while (*argv && ((**argv != '-') || (*(*argv+1) == '\0')))
X argv++;
X if (*argv == NULL)
X return(EOF);
X c = *(*argv+1);
X *++(*argv) = '-';
X if (killed = (*(*argv+1) == '\0'))
X delarg(argc, argv);
X if ((p = index(opts, c)) == NULL)
X c = '\0';
X else if (*(p+1) == ':') {
X *parm = killed ? *argv : *argv+1;
X delarg(argc, argv);
X }
X return(c);
X}
X
X/************************************************************************/
X/* */
X/* lower convert a string to lower case */
X/* */
X/************************************************************************/
X
Xchar *lower(s)
X
Xchar *s;
X
X{ char *p;
X
X p = s;
X while (*s) {
X if (isupper(*s))
X *s = tolower(*s);
X s++;
X }
X return(p);
X}
X
X/************************************************************************/
X/* */
X/* verify(source, valid) */
X/* */
X/* char *source; */
X/* char *valid; */
X/* */
X/* This routine verifies that every character in source is also in */
X/* valid. */
X/* */
X/************************************************************************/
X
Xverify(source, valid)
X
Xchar *source;
Xchar *valid;
X
X{ register char *s;
X
X for ( ; *source; source++) {
X for (s = valid; *s && *s != *source; s++)
X ;
X if (*s == '\0')
X return(0);
X }
X return(1);
X}
X
X/************************************************************************/
X/* */
X/* saveargs Replicate and return a pointer to the argument */
X/* list passed in. */
X/* */
X/************************************************************************/
X
Xchar **saveargs(argc, argv)
X
Xint argc;
Xchar **argv;
X
X{ int i;
X char **copy;
X
X copy = (char **) malloc((argc + 1) * sizeof(char *));
X for (i = 0; i < argc; i++)
X strcpy(copy[i] = (char *) malloc(strlen(argv[i]) + 1), argv[i]);
X copy[i] = (char *) 0;
X return(copy);
X}
X
X/************************************************************************/
X/* */
X/* tokenize break a line into tokens */
X/* */
X/************************************************************************/
X
Xtokenize(line, argc, argv, max)
X
Xchar *line;
Xint *argc;
Xchar *argv[];
Xint max;
X
X{ char *buf, match;
X
X *argc = 0;
X buf = (char *) malloc(strlen(line) * 2 + 1);
X while (*line && (*argc < (max-1))) {
X while (isspace(*line))
X line++;
X argv[(*argc)++] = buf;
X switch (*line) {
X case '"' :
X case '\'' : match = *line++; /* remove the quote mark */
X while (*line && (*line != match))
X *buf++ = *line++;
X if (*line)
X line++; /* wipe out quote mark */
X break;
X default : while (*line && !isspace(*line) && (*line != '"') && (*line != '\''))
X *buf++ = *line++;
X break;
X }
X *buf++ = '\0';
X }
X *buf = '\0';
X argv[*argc] = (char *) 0;
X}
X
X/************************************************************************/
X/* */
X/* open_psuedo_tty opens the first available psuedo terminal */
X/* */
X/************************************************************************/
X
X#define P_POS 5
X#define L_POS 8
X#define D_POS 9
X
X#define PATH "/dev/ptyp0"
X#define LETTERS "pqr"
X#define DIGITS "0123456789abcdef"
X
Xstatic char path[12];
X
Xchar *open_psuedo_tty(master, m_mode, slave, s_mode)
X
XFILE **master;
Xchar *m_mode;
XFILE **slave;
Xchar *s_mode;
X
X{ char *s, *t;
X
X strcpy(path, PATH);
X for (s = LETTERS; *s && *master == NULL; s++) {
X path[L_POS] = *s;
X for (t = DIGITS; *t && *master == NULL; t++) {
X path[D_POS] = *t;
X *master = fopen(path, m_mode);
X }
X }
X if (*master != NULL) {
X path[P_POS] = 't';
X *slave = fopen(path, s_mode);
X path[P_POS] = 'p';
X }
X return(path);
X}
END_OF_FILE
if test 6517 -ne `wc -c <'misc.c'`; then
echo shar: \"'misc.c'\" unpacked with wrong size!
fi
# end of 'misc.c'
fi
if test -f 'sample.filter' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'sample.filter'\"
else
echo shar: Extracting \"'sample.filter'\" \(480 characters\)
sed "s/^X//" >'sample.filter' <<'END_OF_FILE'
X# quietly retain chuck going su:
XQUIET 'SU: chuck'
X
X# ignore Frame Maker coming up:
XIGNORE 'maker: Starting Frame Maker' TO 'maker: finished loading'
X
X# ignore Frame Writer coming up:
XIGNORE 'writer: Starting Frame Writer' TO 'writer: finished loading'
X
X# ignore window data lock messages
XIGNORE 'Window data lock' TO 'The offending process'
X
X# retain some window messages
XQUIET 'WIN ioctl number'
X
X# retain another crazy window system message
XQUIET 'A tty window' TO 'Its child'
END_OF_FILE
if test 480 -ne `wc -c <'sample.filter'`; then
echo shar: \"'sample.filter'\" unpacked with wrong size!
fi
# end of 'sample.filter'
fi
if test ! -d 'icons' ; then
echo shar: Creating directory \"'icons'\"
mkdir 'icons'
fi
if test -f 'icons/console1.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/console1.icon'\"
else
echo shar: Extracting \"'icons/console1.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/console1.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600,
X 0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0x8000,0x0000,0x2480,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0718,0xA000,0x1440,
X 0x0005,0x0824,0xD000,0x1440,0x0005,0x0824,0x93C0,0x1440,
X 0x0005,0x0824,0x9000,0x1440,0x0005,0x0718,0x9000,0x1440,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X 0x0005,0x0000,0x0180,0x1440,0x0005,0x001C,0x6086,0x1440,
X 0x0005,0x0020,0x9089,0x1440,0x0005,0x0018,0x908E,0x1440,
X 0x0005,0x0004,0x9088,0x1440,0x0005,0x0038,0x6087,0x1440,
X 0x0005,0x0000,0x0000,0x1480,0x0005,0x0000,0x0000,0x1480,
X 0x0005,0x0000,0x0000,0x1500,0x0005,0x0000,0x0000,0x1500,
X 0x001C,0x8000,0x0000,0x2600,0x0064,0x7FFF,0xFFFF,0xC600,
X 0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800,
X 0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000,
X 0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0,
X 0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0,
X 0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040,
X 0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80,
X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X 0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00,
X 0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200,
X 0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400,
X 0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800,
X 0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000,
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
END_OF_FILE
if test 1933 -ne `wc -c <'icons/console1.icon'`; then
echo shar: \"'icons/console1.icon'\" unpacked with wrong size!
fi
# end of 'icons/console1.icon'
fi
if test -f 'icons/console1_bad.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/console1_bad.icon'\"
else
echo shar: Extracting \"'icons/console1_bad.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/console1_bad.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600,
X 0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0x8000,0x0000,0x2480,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x00A1,0x8880,0x1440,
X 0x0005,0x00D2,0x4880,0x1440,0x0005,0x0093,0x8A80,0x1440,
X 0x0005,0x0092,0x0A80,0x1440,0x0005,0x0091,0xC500,0x1440,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0347,0x1C70,0x1440,
X 0x0005,0x02A8,0x2480,0x1440,0x0005,0x02A6,0x2460,0x1440,
X 0x0005,0x02A1,0x1C10,0x1440,0x0005,0x02AE,0x04E0,0x1440,
X 0x0005,0x0000,0x3800,0x1440,0x0005,0x0000,0x0000,0x1440,
X 0x0005,0x0000,0x0000,0x1480,0x0005,0x0000,0x0000,0x1480,
X 0x0005,0x0000,0x0000,0x1500,0x0005,0x0000,0x0000,0x1500,
X 0x001C,0x8000,0x0000,0x2600,0x0064,0x7FFF,0xFFFF,0xC600,
X 0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800,
X 0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000,
X 0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0,
X 0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0,
X 0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040,
X 0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80,
X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X 0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00,
X 0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200,
X 0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400,
X 0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800,
X 0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000,
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
END_OF_FILE
if test 1933 -ne `wc -c <'icons/console1_bad.icon'`; then
echo shar: \"'icons/console1_bad.icon'\" unpacked with wrong size!
fi
# end of 'icons/console1_bad.icon'
fi
if test -f 'icons/console1_flash.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/console1_flash.icon'\"
else
echo shar: Extracting \"'icons/console1_flash.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/console1_flash.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600,
X 0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0xFFFF,0xFFFF,0xE480,
X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440,
X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFF5E,0x777F,0xF440,
X 0x0005,0xFF2D,0xB77F,0xF440,0x0005,0xFF6C,0x757F,0xF440,
X 0x0005,0xFF6D,0xF57F,0xF440,0x0005,0xFF6E,0x3AFF,0xF440,
X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440,
X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFCB8,0xE38F,0xF440,
X 0x0005,0xFD57,0xDB7F,0xF440,0x0005,0xFD59,0xDB9F,0xF440,
X 0x0005,0xFD5E,0xE3EF,0xF440,0x0005,0xFD51,0xFB1F,0xF440,
X 0x0005,0xFFFF,0xC7FF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440,
X 0x0005,0xFFFF,0xFFFF,0xF480,0x0005,0xFFFF,0xFFFF,0xF480,
X 0x0005,0xFFFF,0xFFFF,0xF500,0x0005,0xFFFF,0xFFFF,0xF500,
X 0x001C,0xFFFF,0xFFFF,0xE600,0x0064,0x7FFF,0xFFFF,0xC600,
X 0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800,
X 0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000,
X 0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0,
X 0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0,
X 0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040,
X 0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80,
X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X 0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00,
X 0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200,
X 0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400,
X 0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800,
X 0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000,
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
END_OF_FILE
if test 1933 -ne `wc -c <'icons/console1_flash.icon'`; then
echo shar: \"'icons/console1_flash.icon'\" unpacked with wrong size!
fi
# end of 'icons/console1_flash.icon'
fi
if test -f 'icons/contool.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/contool.icon'\"
else
echo shar: Extracting \"'icons/contool.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/contool.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0001,
X 0x8003,0xFFFF,0xFFFF,0xF801,0x8004,0x0000,0x0000,0x0601,
X 0x8004,0x7FFF,0xFFFF,0xC501,0x8004,0x8000,0x0000,0x2481,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x3E80,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X 0x8005,0x0000,0x0000,0x1481,0x8005,0x0000,0x0000,0x1481,
X 0x8005,0x0000,0x0000,0x1501,0x8005,0x0000,0x0000,0x1501,
X 0x801C,0x8000,0x0000,0x2601,0x8064,0x7FFF,0xFFFF,0xC601,
X 0x8084,0x0000,0x0000,0x0401,0x8103,0xFFFF,0xFFFF,0xF801,
X 0x8200,0x0004,0x0100,0x0001,0x8400,0x0004,0x0100,0x0001,
X 0x880F,0xFFF8,0x00FF,0xFFE1,0x881F,0xFFF8,0x00FF,0xFFE1,
X 0x881F,0xFFFC,0x01FF,0xFFE1,0x883F,0xFFFF,0xFFFF,0xFFE1,
X 0x883F,0xFFFF,0xFFFF,0xFFE1,0x8820,0x0000,0x0000,0x00E1,
X 0x8820,0x0000,0x0000,0x00C1,0x847F,0xFFFF,0xFFFF,0xFFC1,
X 0x8380,0x0000,0x0000,0x0381,0x808A,0xAAAA,0xAAAA,0x8301,
X 0x8100,0x0000,0x0000,0x0501,0x8115,0x5555,0x5554,0x8501,
X 0x8200,0x0000,0x0001,0x0A01,0x820D,0xFFFF,0xFFDB,0x0A01,
X 0x8400,0x0000,0x0000,0x1401,0x87FF,0xFFFF,0xFFFF,0xF401,
X 0x8400,0x0000,0x0000,0x0801,0x87FF,0xFFFF,0xFFFF,0xF801,
X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X 0x8F80,0x0000,0x0001,0xE001,0x98C0,0x0000,0x0000,0x6001,
X 0x98C0,0x0000,0x0000,0x6001,0x9807,0xC5E1,0xF0F8,0x61F1,
X 0x980C,0x6733,0x198C,0x6319,0x980C,0x6633,0x018C,0x6319,
X 0x980C,0x6631,0xF18C,0x63F9,0x98CC,0x6630,0x198C,0x6301,
X 0x98CC,0x6633,0x198C,0x6319,0x8F87,0xC631,0xF0F8,0x61F1,
X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X 0x8000,0x0000,0x0000,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF
END_OF_FILE
if test 1933 -ne `wc -c <'icons/contool.icon'`; then
echo shar: \"'icons/contool.icon'\" unpacked with wrong size!
fi
# end of 'icons/contool.icon'
fi
if test -f 'icons/contool_bad.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/contool_bad.icon'\"
else
echo shar: Extracting \"'icons/contool_bad.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/contool_bad.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0001,
X 0x8003,0xFFFF,0xFFFF,0xF801,0x8004,0x0000,0x0000,0x0601,
X 0x8004,0x7FFF,0xFFFF,0xC501,0x8004,0x8000,0x0000,0x2481,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x417F,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X 0x8005,0x7FFF,0xFFFF,0xD481,0x8005,0x7FFF,0xFFFF,0xD481,
X 0x8005,0x7FFF,0xFFFF,0xD501,0x8005,0x7FFF,0xFFFF,0xD501,
X 0x801C,0x8000,0x0000,0x2601,0x8064,0x7FFF,0xFFFF,0xC601,
X 0x8084,0x0000,0x0000,0x0401,0x8103,0xFFFF,0xFFFF,0xF801,
X 0x8200,0x0004,0x0100,0x0001,0x8400,0x0004,0x0100,0x0001,
X 0x880F,0xFFF8,0x00FF,0xFFE1,0x881F,0xFFF8,0x00FF,0xFFE1,
X 0x881F,0xFFFC,0x01FF,0xFFE1,0x883F,0xFFFF,0xFFFF,0xFFE1,
X 0x883F,0xFFFF,0xFFFF,0xFFE1,0x8820,0x0000,0x0000,0x00E1,
X 0x8820,0x0000,0x0000,0x00C1,0x847F,0xFFFF,0xFFFF,0xFFC1,
X 0x8380,0x0000,0x0000,0x0381,0x808A,0xAAAA,0xAAAA,0x8301,
X 0x8100,0x0000,0x0000,0x0501,0x8115,0x5555,0x5554,0x8501,
X 0x8200,0x0000,0x0001,0x0A01,0x820D,0xFFFF,0xFFDB,0x0A01,
X 0x8400,0x0000,0x0000,0x1401,0x87FF,0xFFFF,0xFFFF,0xF401,
X 0x8400,0x0000,0x0000,0x0801,0x87FF,0xFFFF,0xFFFF,0xF801,
X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X 0x8F80,0x0000,0x0001,0xE001,0x98C0,0x0000,0x0000,0x6001,
X 0x98C0,0x0000,0x0000,0x6001,0x9807,0xC5E1,0xF0F8,0x61F1,
X 0x980C,0x6733,0x198C,0x6319,0x980C,0x6633,0x018C,0x6319,
X 0x980C,0x6631,0xF18C,0x63F9,0x98CC,0x6630,0x198C,0x6301,
X 0x98CC,0x6633,0x198C,0x6319,0x8F87,0xC631,0xF0F8,0x61F1,
X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X 0x8000,0x0000,0x0000,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF
END_OF_FILE
if test 1933 -ne `wc -c <'icons/contool_bad.icon'`; then
echo shar: \"'icons/contool_bad.icon'\" unpacked with wrong size!
fi
# end of 'icons/contool_bad.icon'
fi
if test -f 'icons/stopsign.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/stopsign.icon'\"
else
echo shar: Extracting \"'icons/stopsign.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/stopsign.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x8888,0xBFFF,0xFFFC,0x8888,0x8888,0xC000,0x0002,0x8888,
X 0x2222,0x8000,0x0001,0x2222,0x2223,0x0FFF,0xFFF0,0xA222,
X 0x888A,0x1FFF,0xFFF8,0x4888,0x888C,0x3FFF,0xFFFC,0x2888,
X 0x2228,0x7FFF,0xFFFE,0x1222,0x2230,0xFFFF,0xFFFF,0x0A22,
X 0x88A1,0xFFFF,0xFFFF,0x8488,0x8843,0xFFFF,0xFFFF,0xC288,
X 0x2287,0xFFFF,0xFFFF,0xE122,0x230F,0xFFFF,0xFFFF,0xF0A2,
X 0x8A1F,0xFFFF,0xFFFF,0xF848,0x8C3F,0xFFFF,0xFFFF,0xFC28,
X 0x287F,0xFFFF,0xFFFF,0xFE12,0x30FF,0xFFFF,0xFFFF,0xFF0A,
X 0xA1FF,0xFFFF,0xFFFF,0xFF84,0xC3FF,0xFFFF,0xFFFF,0xFFC2,
X 0x87FF,0xFFFF,0xFFFF,0xFFE1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X 0x8FF0,0x0C00,0xF87C,0x03F1,0x8FE7,0xCDCE,0xF73E,0x79F1,
X 0x8FCF,0xEFCF,0xEF9E,0x7CF1,0x8FCF,0xEFCF,0xEFCE,0x7CF1,
X 0x8FC7,0xFFCF,0xCFCE,0x7CF1,0x8FE1,0xFFCF,0xCFCE,0x79F1,
X 0x8FF0,0xFFCF,0xCFCE,0x03F1,0x8FFC,0x3FCF,0xCFCE,0x7FF1,
X 0x8FFF,0x1FCF,0xCFCE,0x7FF1,0x8FFF,0x8FCF,0xCFCE,0x7FF1,
X 0x8FDF,0xCFCF,0xEFCE,0x7FF1,0x8FDF,0xCFCF,0xE7DE,0x7FF1,
X 0x8FCF,0x9FCF,0xF3BE,0x7FF1,0x8FC0,0x3F03,0xF87C,0x3FF1,
X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x87FF,0xFFFF,0xFFFF,0xFFE1,
X 0x43FF,0xFFFF,0xFFFF,0xFFC2,0x21FF,0xFFFF,0xFFFF,0xFF86,
X 0x90FF,0xFFFF,0xFFFF,0xFF08,0x887F,0xFFFF,0xFFFF,0xFE18,
X 0x243F,0xFFFF,0xFFFF,0xFC22,0x221F,0xFFFF,0xFFFF,0xF862,
X 0x890F,0xFFFF,0xFFFF,0xF088,0x8887,0xFFFF,0xFFFF,0xE188,
X 0x2243,0xFFFF,0xFFFF,0xC222,0x2221,0xFFFF,0xFFFF,0x8622,
X 0x8890,0xFFFF,0xFFFF,0x0888,0x8888,0x7FFF,0xFFFE,0x1888,
X 0x2224,0x3FFF,0xFFFC,0x2222,0x2222,0x1FFF,0xFFF8,0x6222,
X 0x8889,0x0FFF,0xFFF0,0x8888,0x8888,0x8000,0x0001,0x8888,
X 0x2222,0x4000,0x0002,0x2222,0x2222,0x3FFF,0xFFFE,0x2222
END_OF_FILE
if test 1933 -ne `wc -c <'icons/stopsign.icon'`; then
echo shar: \"'icons/stopsign.icon'\" unpacked with wrong size!
fi
# end of 'icons/stopsign.icon'
fi
if test -f 'icons/stopsign_inv.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'icons/stopsign_inv.icon'\"
else
echo shar: Extracting \"'icons/stopsign_inv.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/stopsign_inv.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x8888,0x8888,0x8888,0x8888,0x8888,0xBFFF,0xFFFC,0x8888,
X 0x2222,0x7FFF,0xFFFE,0x2222,0x2222,0xFFFF,0xFFFF,0x2222,
X 0x8889,0xE000,0x0007,0x8888,0x888B,0xC000,0x0003,0xC888,
X 0x2227,0x8000,0x0001,0xE222,0x222F,0x0000,0x0000,0xF222,
X 0x889E,0x0000,0x0000,0x7888,0x88BC,0x0000,0x0000,0x3C88,
X 0x2278,0x0000,0x0000,0x1E22,0x22F0,0x0000,0x0000,0x0F22,
X 0x89E0,0x0000,0x0000,0x0788,0x8BC0,0x0000,0x0000,0x03C8,
X 0x2780,0x0000,0x0000,0x01E2,0x2F00,0x0000,0x0000,0x00F2,
X 0x9E00,0x0000,0x0000,0x0078,0xBC00,0x0000,0x0000,0x003C,
X 0x7800,0x0000,0x0000,0x001E,0x7000,0x0000,0x0000,0x000E,
X 0xF000,0x0000,0x0000,0x000E,0xF000,0x0000,0x0000,0x000E,
X 0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E,
X 0xF00F,0xF3FF,0x0783,0xFC0E,0xF018,0x3231,0x08C1,0x860E,
X 0x7030,0x1030,0x1061,0x830E,0x7030,0x1030,0x1031,0x830E,
X 0xF038,0x0030,0x3031,0x830E,0xF01E,0x0030,0x3031,0x860E,
X 0x700F,0x0030,0x3031,0xFC0E,0x7003,0xC030,0x3031,0x800E,
X 0xF000,0xE030,0x3031,0x800E,0xF000,0x7030,0x3031,0x800E,
X 0x7020,0x3030,0x1031,0x800E,0x7020,0x3030,0x1821,0x800E,
X 0xF030,0x6030,0x0C41,0x800E,0xF03F,0xC0FC,0x0783,0xC00E,
X 0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E,
X 0xF000,0x0000,0x0000,0x000E,0xF000,0x0000,0x0000,0x000E,
X 0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E,
X 0xF000,0x0000,0x0000,0x000E,0xF800,0x0000,0x0000,0x001E,
X 0x3C00,0x0000,0x0000,0x003E,0x3E00,0x0000,0x0000,0x007A,
X 0x8F00,0x0000,0x0000,0x00F8,0x8F80,0x0000,0x0000,0x01E8,
X 0x23C0,0x0000,0x0000,0x03E2,0x23E0,0x0000,0x0000,0x07A2,
X 0x88F0,0x0000,0x0000,0x0F88,0x88F8,0x0000,0x0000,0x1E88,
X 0x223C,0x0000,0x0000,0x3C22,0x223E,0x0000,0x0000,0x7822,
X 0x888F,0x0000,0x0000,0xF888,0x888F,0x8000,0x0001,0xE888,
X 0x2223,0xC000,0x0003,0xE222,0x2223,0xE000,0x0007,0xA222,
X 0x8888,0xFFFF,0xFFFF,0x8888,0x8888,0xFFFF,0xFFFE,0x8888,
X 0x2222,0x3FFF,0xFFFE,0x2222,0x2222,0x2222,0x2222,0x2222
END_OF_FILE
if test 1933 -ne `wc -c <'icons/stopsign_inv.icon'`; then
echo shar: \"'icons/stopsign_inv.icon'\" unpacked with wrong size!
fi
# end of 'icons/stopsign_inv.icon'
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.sources.sun
mailing list