Suntools alarmer
black at unc.UUCP
black at unc.UUCP
Thu Jan 23 03:34:13 AEST 1986
Here's a neat little program I recently came up with for
all you Sun users out there.
#---------------------- CUT HERE ----------------------
#! /bin/sh
#
# This is a shell archive. Use /bin/sh to unpack.
#
echo "extracting README (210 bytes)"
sed 's/^X //' << '***FUBAR***' > README
X This archive contains the following files:
X
X README
X Makefile
X alarm.c source code
X alarm.l unformatted man entry
X alarm.man formatted man entry
X alarm_off icon file
X alarm_on icon file
X alarm_on2 icon file
X
***FUBAR***
echo "extracting Makefile (197 bytes)"
sed 's/^X //' << '***FUBAR***' > Makefile
X #
X # Makefile for suntools alarmer
X #
X BIN = alarm
X SRC = $(BIN).c
X CC = cc
X COPTS =
X ICON = -DICON_DIR="/usr/local/lib/icons"
X STRIP = strip
X
X $(BIN) : $(SRC)
X cc -o $@ $(ICON) $(CFLAGS) $?
X $(STRIP) $@
***FUBAR***
echo "extracting alarm.L (3038 bytes)"
sed 's/^X //' << '***FUBAR***' > alarm.L
X .TH ALARM L "21 January 1986"
X .SH NAME
X alarm \- a periodic alarmer for suntools
X .SH SYNOPSIS
X \f3alarm\fP [\f3-h\fP \f2min\fP] [\f3alarmdb\fP]
X .SH DESCRIPTION
X .LP
X \f2alarm\fP reads an alarm database and signals the user whenever
X one of the alarms becomes active. If \f3alarmdb\fP is not
X specified, ~/.alarm will be used.
X .LP
X The format of the lines in the alarm database is as follows:
X .LP
X .RS
X date time message
X .RE
X .LP
X Lines starting with a # and blank lines are ignored. `date' can be any of
X the following. Minimum abbreviations are in caps, and case is insignificant:
X .LP
X .RS
X .nf
X Sundays Mondays Tuesdays Wednesdays
X THursdays Fridays SAturdays
X .fi
X .LP
X Daily Any
X .LP
X month/day
X .RE
X .LP
X Specifying `month/day' creates a "one-shot" alarm; the others are periodic.
X `time' is in the form hour:minute (based on a 24-hour clock; 0:00 - 23:59).
X `message' is anything you want. The program will read in this file, and
X when an alarm is to go off, it will do one of the following:
X .RS
X .TP
X 1)
X if the window is closed (iconic), the icon will
X flash to indicate an alarm. Open the window to
X acknowledge the alarm. Now, since the window is
X open,
X .TP
X 2)
X if the window is open, the entire line will be written out.
X .RE
X .LP
X If you change your alarm database (~/.alarm or `alarmdb'), you have to tell
X the program to re-read the file (if you wish). To do this, run ~/.alarmreset,
X which the alarm program creates when it starts up.
X .SH OPTIONS
X .LP
X There is only one option:
X .TP
X \f3-h\fP \f2min\fP
X Specify the initial history value, in minutes. \f2alarm\fP will
X signal alarms in the last \f2min\fP minutes when initially starting
X up. The default time is 60 minutes.
X .SH ENVIRONMENT
X .LP
X \f2alarm\fP looks at the environment variable ICONDIR for the directory
X containing the icons. The default directory is defined in the Makefile.
X .SH "SAMPLE \f3~/.alarm\fP FILE"
X .nf
X #
X # alarm database for /usr/local/bin/alarm
X #
X # copyright 1986 Exploding Penguin Software
X #
X .sp
X #
X # Weekly alarms
X #
X mon 10:50 GRIP meeting at 11:00
X wed 12:20 Tech meeting at 12:30.
X fri 11:50 Faculty meeting at 12:00
X .sp
X #
X # Daily alarms
X #
X daily 16:50 Time to go home!
X daily 17:00 What are you still doing here?
X .sp
X #
X # One-time alarms
X #
X 1/22 15:50 Bentley seminar at 4:00.
X 1/24 15:20 Seminar at 3:30.
X .fi
X .SH BUGS
X .LP
X Invalid dates and time are accepted (4/38 = 5/8; 5:80 = 6:20). Error checking
X is only done on the format of the input, not on the values contained therein.
X .LP
X The program may or may not work correctly when Daylight Savings Time goes into
X effect. It also may or may not work in different time zones. These cases
X have not been tested. If you have any problems, please contact the author.
X .SH FILES
X .LP
X .ta 2.8i
X .nf
X /usr/local/bin/alarm The program
X $ICONDIR/alarm_off Icon for quiescent state
X $ICONDIR/alarm_on Icons for active state
X $ICONDIR/alarm_on2 (toggles between these two)
X ~/.alarm Alarm database
X ~/.alarmreset Alarm signaller
X .fi
X .SH AUTHOR
X .LP
X Samuel Black (black at unc)
***FUBAR***
echo "extracting alarm.c (9756 bytes)"
sed 's/^X //' << '***FUBAR***' > alarm.c
X #include <stdio.h>
X #include <pwd.h>
X #include <sgtty.h>
X #include <ctype.h>
X #include <signal.h>
X #include <setjmp.h>
X #include <sys/file.h>
X #include <sys/time.h>
X #include <sys/types.h>
X #include <sys/timeb.h>
X
X #ifdef DEBUG
X # define DEB(x) fprintf/**/x
X #else
X # define DEB(x)
X #endif DEBUG
X
X #define when break; case
X #define otherwise break; default
X #define nitems(x) (sizeof(x) / sizeof(x[0]))
X
X #define IOCTL(op, par) \
X if (ioctl(0, op, par) < 0) \
X { \
X perror("tty"); \
X exit(-1); \
X }
X
X #define NEW(t) (t *) malloc(sizeof(t))
X #define FREENODE \
X { \
X TIMES *tmp = alarms; \
X \
X alarms = alarms->next; \
X free(tmp); \
X }
X
X #define CONFIG_FILE ".alarm"
X #define RESET_FILE ".alarmreset"
X #define RESET "kill -%d %ld"
X #define SIGREAD SIGEMT
X
X #define QUERY "\033[11t"
X #define RESPONSE "\033[%dt"
X #define ICONIC 2
X
X #define SIGNAL(x) printf(alarm_/**/x)
X #define ICON_DIR "/unc/black/icons"
X #define IMAGE "\033]I%s/alarm_%s\033\134"
X #define IHEADER "\033]L\033\134"
X
X /*
X ** Time constants
X */
X #define SPM 60 /* seconds per minute */
X #define SPH (60 * SPM) /* seconds per hour */
X #define SPD (24 * SPH) /* seconds per day */
X #define LOOK (SPD >> 1)
X #define JAN_86 504921600L /* 1 January, 1986 */
X
X /*
X ** Types
X */
X #define STRLEN 80
X typedef char STRING[STRLEN];
X
X typedef struct TIMES /* the TIMES structure */
X {
X int time; /* how many seconds into the epoch */
X STRING message;
X struct TIMES *next;
X } TIMES;
X
X static TIMES *read_alarm_file();
X static TIMES *insert();
X static long gettime();
X static int iconic();
X static void usage();
X static void setup_term();
X static void lowercase();
X static long date_to_time();
X int reset_term();
X int reset_alarm();
X long time();
X
X jmp_buf env;
X char *pname;
X
X /*
X ** This program is a SUN alarmer. It reads an alarm database,
X ** then flashes the alarm bell whenever the appropriate time
X ** occurs.
X */
X
X main(argc, argv)
X int argc;
X char *argv[];
X {
X STRING alarm_on, /* alarm on icon (normal) */
X alarm_inv, /* alarm on icon (inverted) */
X alarm_off; /* alarm off icon */
X STRING alarmdb; /* alarm file name */
X STRING reset; /* reset file name */
X int rfile;
X TIMES *alarms; /* alarm structure */
X long getpid();
X char *getenv();
X struct passwd *getpwuid();
X struct passwd *p_entry;
X int history = -SPH;
X int i;
X char *icon_dir;
X
X pname = *argv;
X
X if ( (p_entry = getpwuid(getuid())) )
X {
X sprintf(alarmdb, "%s/%s", p_entry->pw_dir, CONFIG_FILE);
X sprintf(reset, "%s/%s", p_entry->pw_dir, RESET_FILE);
X }
X else
X {
X perror("getuid");
X exit(-1);
X }
X
X /*
X ** Take the arguments. The only legal one now is an
X ** optional database file. If one is not given, use
X ** the default.
X */
X while (--argc)
X if (**++argv == '-')
X switch ((*argv)[1])
X {
X when 'h': i = atoi(*++argv);
X if ((i >= 0) && (i <= SPM))
X history = -60 * i;
X --argc;
X otherwise: usage(pname);
X }
X else
X strcpy(alarmdb, *argv);
X
X
X /*
X ** Enable the user to signal this process
X */
X if ((rfile = open(reset, O_TRUNC | O_WRONLY | O_CREAT, 0700)) == -1)
X {
X perror("open");
X exit(-1);
X }
X else
X {
X sprintf(reset, RESET, SIGREAD, getpid());
X write(rfile, reset, strlen(reset));
X close(rfile);
X }
X
X /*
X ** Set up the icons
X */
X if (!(icon_dir = getenv("ICONDIR")))
X icon_dir = ICON_DIR;
X sprintf(alarm_on, IMAGE, icon_dir, "on");
X sprintf(alarm_inv, IMAGE, icon_dir, "on2");
X sprintf(alarm_off, IMAGE, icon_dir, "off");
X
X /*
X ** Read in the alarm file.
X */
X DEB((stderr, "About to read alarm file\n"));
X alarms = read_alarm_file(alarmdb, history);
X
X /*
X ** Set up the icon and the tty driver.
X */
X setup_term();
X printf(IHEADER);
X SIGNAL(off);
X fflush(stdout);
X
X /*
X ** Set up signal trapping.
X */
X for (i = SIGHUP; i <= SIGPROF; ++i)
X signal(i, reset_term);
X
X signal(SIGREAD, reset_alarm);
X
X /*
X ** Trap SIGREAD.
X */
X if (setjmp(env))
X {
X while (alarms)
X FREENODE;
X alarms = read_alarm_file(alarmdb, 0);
X signal(SIGREAD, reset_alarm);
X }
X
X /*
X ** Repeat ad nauseum.
X */
X for (;;)
X {
X /*
X ** Sleep until the next alarm.
X */
X if (alarms->time > time(0))
X {
X DEB((stderr, "Sleeping for %ld seconds.\n",
X alarms->time - time(0)));
X sleep((int) (alarms->time - time(0)));
X }
X else
X DEB((stderr, "Not sleeping.\n"));
X
X /*
X ** Check to see if we need to re-read the file.
X */
X if (!alarms->next)
X {
X FREENODE;
X alarms = read_alarm_file(alarmdb, 0);
X }
X else
X {
X /*
X ** Indicate the alarm, and wait for the user
X ** to open the window.
X */
X while (iconic())
X {
X SIGNAL(on);
X SIGNAL(inv);
X }
X
X /*
X ** Dump ALL current alarm messages.
X */
X putchar('\n');
X do
X {
X puts(alarms->message);
X FREENODE;
X } while (alarms->next && (alarms->time <= time(0)));
X
X /*
X ** Turn the clock off.
X */
X SIGNAL(off);
X fflush(stdout);
X }
X }
X }
X
X struct sgttyb save_tty;
X
X static void
X setup_term()
X {
X struct sgttyb tty;
X
X IOCTL(TIOCGETP, &tty);
X save_tty = tty;
X
X tty.sg_flags &= ~ECHO;
X tty.sg_flags |= CBREAK;
X
X IOCTL(TIOCSETP, &tty);
X }
X
X int
X reset_term(sig)
X int sig;
X {
X IOCTL(TIOCSETP, &save_tty);
X exit(sig);
X }
X
X int
X reset_alarm()
X {
X longjmp(env);
X }
X
X int daily;
X int cwday, /* day of week */
X cday, /* day of month */
X cmonth, /* month of year */
X cyear; /* year */
X int TZ; /* difference to GMT */
X
X static TIMES *
X read_alarm_file(fname, history)
X STRING fname;
X int history;
X {
X FILE *fopen();
X struct tm *localtime();
X FILE *alarmdb;
X TIMES *alarms, *cur;
X char input[160];
X long ctime; /* current time-of-day */
X long itime; /* alarm entry time-of-day */
X long rtime; /* relative to current time-of-day */
X struct tm *ltime;
X struct timeb tp;
X
X /*
X ** Open the alarm database
X */
X if (!(alarmdb = fopen(fname, "r")))
X {
X perror(fname);
X usage(pname);
X }
X
X /*
X ** Calculate the current time of day.
X */
X ftime(&tp);
X ctime = tp.time;
X TZ = tp.timezone * SPM;
X ltime = localtime(&ctime);
X DEB((stderr, "Current time = %ld\n", ctime));
X cmonth = ltime->tm_mon + 1;
X cday = ltime->tm_mday;
X cyear = ltime->tm_year;
X cwday = ltime->tm_wday - 7;
X DEB((stderr, "cmonth = %d, cday = %d, cyear = %d, cwday = %d\n",
X cmonth, cday, cyear, cwday));
X
X /*
X ** Read the alarms file and put each alarm
X ** in the structure, sorted by time. Only
X ** alarms in the next 12 hours are entered.
X */
X alarms = NEW(TIMES);
X alarms->time = ctime + LOOK;
X strcpy(alarms->message, "12 hour timer interrupt");
X alarms->next = NULL;
X
X while (fgets(input, sizeof(input), alarmdb))
X {
X input[strlen(input) - 1] = '\0';
X rtime = (itime = gettime(input)) - ctime;
X
X if (daily)
X {
X if (rtime > LOOK)
X {
X rtime -= SPD;
X itime -= SPD;
X }
X else if (rtime < -LOOK)
X {
X rtime += SPD;
X itime += SPD;
X }
X }
X
X if ((rtime < LOOK) && (rtime >= history))
X {
X cur = NEW(TIMES);
X cur->time = itime;
X strcpy(cur->message, input);
X
X alarms = insert(alarms, cur);
X }
X }
X
X fclose(alarmdb);
X traverse(alarms);
X return(alarms);
X }
X
X #define ISDAY(s) !strncmp(dow, s, strlen(dow))
X
X static long
X gettime(input)
X char *input;
X {
X int date[5];
X STRING dow; /* for weekly or daily alarms */
X static STRING days[] =
X {
X "sundays",
X "mondays",
X "tuesdays",
X "wednesdays",
X "thursdays",
X "fridays",
X "saturdays"
X };
X
X daily = 0;
X if ((sscanf(input, "%s", dow) != 1) || (*dow == '#'))
X return(0L);
X if (isdigit(*dow))
X sscanf(input, "%d/%d %d:%d %[^\n]",
X &date[0], &date[1], &date[3], &date[4]);
X else
X {
X register int i;
X
X sscanf(input, "%s %d:%d %[^\n]", dow, &date[3], &date[4]);
X lowercase(dow);
X *date = cmonth;
X
X if (ISDAY("any") || ISDAY("daily"))
X {
X date[1] = cday;
X daily = 1;
X }
X else
X {
X for (i = 0; i < nitems(days); ++i)
X if (ISDAY(days[i]))
X {
X date[1] = cday + ((i - cwday) % 7);
X break;
X }
X if (i == nitems(days))
X {
X fprintf(stderr,
X "'%s' is an invalid alarm entry.\n",
X input);
X return(0L);
X }
X }
X
X DEB((stderr, "periodic reminder: %s becomes %d/%d\n",
X dow, date[0], date[1]));
X }
X
X if ((date[0] > cmonth) || ((date[0] == cmonth) && (date[1] >= cday)))
X date[2] = cyear;
X else
X date[2] = cyear + 1;
X
X return(date_to_time(date));
X }
X
X static void
X lowercase(str)
X char *str;
X {
X for ( ; *str; ++str)
X if (isupper(*str))
X *str = tolower(*str);
X }
X
X /*
X ** Take an array of [month day year hour minute]
X ** and return the number of seconds since the epoch.
X */
X static long
X date_to_time(date)
X int *date;
X {
X static int corr[] =
X {
X 0, 1, -1, 0, 0, 1, 1, 2, 3, 3, 4, 4
X };
X int month = *date - 1;
X int day = *++date - 1;
X int year = *++date;
X int hour = *++date;
X int min = *++date;
X int leap = ((month > 1) && (dysize(year) == 366));
X register int ydisp = (30 * month + day + corr[month]) * SPD;
X register int i;
X
X if (leap)
X ydisp += SPD;
X
X for (i = 86; i < year; ++i)
X ydisp += (SPD + dysize(i));
X
X DEB((stderr, "Time for %d/%d, %d at %d:%2d = %ld\n",
X month+1, day+1, year, hour, min,
X JAN_86 + TZ + ydisp + (hour * SPH) + (min * SPM)));
X
X return(JAN_86 + TZ + ydisp + (hour * SPH) + (min * SPM));
X }
X
X /*
X ** Perform an insertion sort.
X */
X static TIMES *
X insert(node, el)
X TIMES *node, *el;
X {
X TIMES *last = NULL;
X TIMES *root = node;
X
X DEB((stderr, "Inserting node. time = %ld, msg = '%s'\n",
X el->time, el->message));
X while (node->next && (node->time < el->time))
X {
X last = node;
X node = node->next;
X }
X
X el->next = node;
X if (last)
X last->next = el;
X else
X root = el;
X
X return(root);
X }
X
X traverse(alarms)
X TIMES *alarms;
X {
X #ifdef DEBUG
X putc('\n', stderr);
X for ( ; alarms; alarms = alarms->next)
X fprintf(stderr, "alarm at time = %ld; msg = %s\n",
X alarms->time, alarms->message);
X #endif DEBUG
X }
X
X static int
X iconic()
X {
X int ans;
X
X IOCTL(TIOCFLUSH, 0);
X printf(QUERY);
X scanf(RESPONSE, &ans);
X
X return(ans == ICONIC);
X }
X
X static void
X usage(pname)
X char *pname;
X {
X printf("usage: %s [-h history] [alarmfile]\n", pname);
X exit(-1);
X }
***FUBAR***
echo "extracting alarm.man (3702 bytes)"
sed 's/^X //' << '***FUBAR***' > alarm.man
X
X
X
X ALARM(L) UNKNOWN SECTION OF THE MANUAL ALARM(L)
X
X
X
X NAME
X alarm - a periodic alarmer for suntools
X
X SYNOPSIS
X alarm [-h _m_i_n] [alarmdb]
X
X DESCRIPTION
X _a_l_a_r_m reads an alarm database and signals the user whenever
X one of the alarms becomes active. If alarmdb is not speci-
X fied, ~/.alarm will be used.
X
X The format of the lines in the alarm database is as follows:
X
X date time message
X
X Lines starting with a # and blank lines are ignored. `date'
X can be any of the following. Minimum abbreviations are in
X caps, and case is insignificant:
X
X Sundays Mondays Tuesdays Wednesdays
X THursdays Fridays SAturdays
X
X Daily Any
X
X month/day
X
X Specifying `month/day' creates a "one-shot" alarm; the oth-
X ers are periodic. `time' is in the form hour:minute (based
X on a 24-hour clock; 0:00 - 23:59). `message' is anything
X you want. The program will read in this file, and when an
X alarm is to go off, it will do one of the following:
X
X 1) if the window is closed (iconic), the icon will
X flash to indicate an alarm. Open the window to
X acknowledge the alarm. Now, since the window is
X open,
X
X 2) if the window is open, the entire line will be
X written out.
X
X If you change your alarm database (~/.alarm or `alarmdb'),
X you have to tell the program to re-read the file (if you
X wish). To do this, run ~/.alarmreset, which the alarm pro-
X gram creates when it starts up.
X
X OPTIONS
X There is only one option:
X
X -h _m_i_n
X Specify the initial history value, in minutes. _a_l_a_r_m
X will signal alarms in the last _m_i_n minutes when ini-
X tially starting up. The default time is 60 minutes.
X
X
X
X ITC Release 1.0 21 January 1986 1
X
X
X
X
X
X
X ALARM(L) UNKNOWN SECTION OF THE MANUAL ALARM(L)
X
X
X
X ENVIRONMENT
X _a_l_a_r_m looks at the environment variable ICONDIR for the
X directory containing the icons. The default directory is
X defined in the Makefile.
X
X SAMPLE ~/.alarm FILE
X #
X # alarm database for /usr/local/bin/alarm
X #
X # copyright 1986 Exploding Penguin Software
X #
X
X #
X # Weekly alarms
X #
X mon 10:50 GRIP meeting at 11:00
X wed 12:20 Tech meeting at 12:30.
X fri 11:50 Faculty meeting at 12:00
X
X #
X # Daily alarms
X #
X daily 16:50 Time to go home!
X daily 17:00 What are you still doing here?
X
X #
X # One-time alarms
X #
X 1/22 15:50 Bentley seminar at 4:00.
X 1/24 15:20 Seminar at 3:30.
X
X BUGS
X Invalid dates and time are accepted (4/38 = 5/8; 5:80 =
X 6:20). Error checking is only done on the format of the
X input, not on the values contained therein.
X
X The program may or may not work correctly when Daylight Sav-
X ings Time goes into effect. It also may or may not work in
X different time zones. These cases have not been tested. If
X you have any problems, please contact the author.
X
X FILES
X /usr/local/bin/alarm The program
X $ICONDIR/alarm_off Icon for quiescent state
X $ICONDIR/alarm_on Icons for active state
X $ICONDIR/alarm_on2 (toggles between these two)
X ~/.alarm Alarm database
X ~/.alarmreset Alarm signaller
X
X AUTHOR
X Samuel Black (black at unc)
X
X
X
X
X ITC Release 1.0 21 January 1986 2
X
X
X
***FUBAR***
echo "extracting alarm_off (1933 bytes)"
sed 's/^X //' << '***FUBAR***' > alarm_off
X /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,
X 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0xFFA2,0x2222,
X 0x8888,0x8887,0xFFF8,0x8888,0x8888,0x889F,0xFFFC,0x8888,
X 0x2222,0x227F,0xFFFF,0x2222,0x2222,0x22FF,0xFFFF,0xA222,
X 0x8888,0x89FF,0xFFFF,0xC888,0x8888,0x8BFF,0xFFFF,0xE888,
X 0x2222,0x2FE0,0x0FFF,0xF222,0x2222,0x3F00,0x01FF,0xFA22,
X 0x8888,0xFC04,0x307F,0xFC88,0x8888,0xF80C,0x483F,0xFC88,
X 0x2223,0xE004,0x080F,0xFE22,0x2223,0xC004,0x3007,0xFE22,
X 0x888B,0x8004,0x4003,0xFE88,0x888F,0x800E,0x7803,0xFF88,
X 0x2227,0x0000,0x0001,0xFF22,0x222E,0x0000,0x0000,0xFFA2,
X 0x888E,0x0001,0x8000,0xFF88,0x889C,0x0001,0x8000,0x7F88,
X 0x223C,0x0001,0x8000,0x7FA2,0x223C,0x6001,0x800C,0x7FA2,
X 0x88B8,0x9001,0x8012,0x3F88,0x88B8,0x9001,0x8004,0x3F88,
X 0x2238,0x7001,0x8002,0x3FA2,0x2238,0x1001,0x8012,0x3FA2,
X 0x88B8,0x6000,0xE00C,0x3F88,0x88B8,0x0000,0x3000,0x3F88,
X 0x2238,0x0000,0x1C00,0x3F22,0x2238,0x0000,0x0700,0x3E22,
X 0x88B8,0x0000,0x0380,0x3E88,0x889C,0x0000,0x00E0,0x7C88,
X 0x223C,0x0000,0x0070,0x7E22,0x223C,0x0000,0x0010,0x7A22,
X 0x888E,0x0000,0x0000,0xF888,0x888E,0x0000,0x0000,0xE888,
X 0x2227,0x0001,0x8001,0xE222,0x2227,0x8002,0x0003,0xE222,
X 0x888B,0x8003,0x8003,0x8888,0x8889,0xC002,0x4007,0x8888,
X 0x2223,0xE002,0x400F,0x2222,0x2222,0xF801,0x803F,0x2222,
X 0x8888,0xFC00,0x007F,0x8888,0x8888,0xBF00,0x01F1,0x8888,
X 0x2222,0x7FE0,0x0FE1,0xE222,0x2222,0x63FF,0xFF80,0xE222,
X 0x8888,0xE0FF,0xFE00,0xE888,0x8888,0xC01F,0xF000,0x6888,
X 0x2223,0xC000,0x0000,0x7222,0x2223,0xC000,0x0000,0x7222,
X 0x888F,0xFFFF,0xFFFF,0xFE88,0x888F,0xFFFF,0xFFFF,0xFE88,
X 0x222F,0x0000,0x0000,0x1E22,0x222F,0xFFFF,0xFFFF,0xFE22,
X 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222
***FUBAR***
echo "extracting alarm_on (1933 bytes)"
sed 's/^X //' << '***FUBAR***' > alarm_on
X /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x8888,0x8887,0xF088,0x8888,0x8888,0x88BF,0xFE88,0x8888,
X 0x2222,0x22F8,0x0FA2,0x2222,0x2222,0x23C0,0x01E2,0x2222,
X 0x8888,0x8F00,0x0078,0x8888,0x8888,0x8E00,0x0038,0x8888,
X 0x2222,0x2C00,0x001A,0x2222,0x2222,0x3800,0x000E,0x2222,
X 0x8888,0xB004,0x0006,0x8888,0x8888,0xB000,0x5006,0x8888,
X 0x2222,0x600C,0x6803,0x2222,0x2222,0x6004,0x4803,0x2222,
X 0x8888,0xE004,0x4803,0x8888,0x8888,0xC004,0x4801,0x8888,
X 0x2222,0xC000,0x0001,0xA222,0x2222,0xC000,0x0001,0xA222,
X 0x8888,0xC480,0x1001,0x8888,0x8888,0xC494,0x0111,0x8888,
X 0x2222,0xC49A,0x30A1,0xA222,0x2222,0xC492,0x1041,0xA222,
X 0x8888,0xC492,0x10A1,0x8888,0x8888,0xC312,0x1111,0x8888,
X 0x2222,0xC000,0x0001,0xA222,0x2222,0xC000,0x0001,0xA222,
X 0x8888,0xC000,0x0001,0x8888,0x8888,0xC008,0x9801,0x8888,
X 0x2222,0xC008,0xA401,0xA222,0x2222,0xC00A,0xB801,0xA222,
X 0x8888,0xC00A,0xA001,0x8888,0x8888,0xC005,0x1C01,0x8888,
X 0x2222,0xC000,0x0001,0xA222,0x2223,0x8000,0x0000,0xE222,
X 0x8889,0x8800,0x0008,0xC888,0x888B,0x1E51,0x239E,0x6888,
X 0x2227,0x0869,0x2408,0x7222,0x223E,0x0841,0x2308,0x3E22,
X 0x88B8,0x0841,0x6088,0x0E88,0x88E0,0x0640,0xA706,0x0388,
X 0x23C0,0x0000,0x0000,0x01E2,0x23C0,0x0000,0x0000,0x01E2,
X 0x89FF,0xFFFF,0xFFFF,0xFFC8,0x8980,0x0000,0x0000,0x00C8,
X 0x2380,0x0000,0x0000,0x00E2,0x2380,0x0000,0x0000,0x00E2,
X 0x8980,0x0000,0x0000,0x00C8,0x89FF,0xFFFF,0xFFFF,0xFFC8,
X 0x2380,0x0000,0x0000,0x00E2,0x23FF,0xFFFF,0xFFFF,0xFFE2,
X 0x888E,0x0388,0x8888,0x8888,0x888C,0x0188,0x8888,0x8888,
X 0x2238,0x00E2,0x2222,0x2222,0x2238,0x00E2,0x2222,0x2222,
X 0x8898,0x00C8,0x8888,0x8888,0x8898,0x00C8,0x8888,0x8888,
X 0x2238,0x00E2,0x2222,0x2222,0x222C,0x01A2,0x2222,0x2222,
X 0x888E,0x0388,0x8888,0x8888,0x888F,0x0788,0x8888,0x8888,
X 0x2223,0xFE22,0x2222,0x2222,0x2222,0xFA22,0x2222,0x2222,
X 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222
***FUBAR***
echo "extracting alarm_on2 (1933 bytes)"
sed 's/^X //' << '***FUBAR***' > alarm_on2
X /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2227,0xF222,0x2222,0x2222,0x223F,0xFE22,0x2222,
X 0x8888,0x88FF,0xFF88,0x8888,0x8888,0x89FF,0xFFC8,0x8888,
X 0x2222,0x23FF,0xFFE2,0x2222,0x2222,0x27FF,0xFFF2,0x2222,
X 0x8888,0x8FFB,0xFFF8,0x8888,0x8888,0x8FFF,0xAFF8,0x8888,
X 0x2222,0x1FF3,0x97FC,0x2222,0x2222,0x1FFB,0xB7FC,0x2222,
X 0x8888,0x9FFB,0xB7FC,0x8888,0x8888,0xBFFB,0xB7FE,0x8888,
X 0x2222,0x3FFF,0xFFFE,0x2222,0x2222,0x3FFF,0xFFFE,0x2222,
X 0x8888,0xBB7F,0xEFFE,0x8888,0x8888,0xBB6B,0xFEEE,0x8888,
X 0x2222,0x3B65,0xCF5E,0x2222,0x2222,0x3B6D,0xEFBE,0x2222,
X 0x8888,0xBB6D,0xEF5E,0x8888,0x8888,0xBCED,0xEEEE,0x8888,
X 0x2222,0x3FFF,0xFFFE,0x2222,0x2222,0x3FFF,0xFFFE,0x2222,
X 0x8888,0xBFFF,0xFFFE,0x8888,0x8888,0xBFF7,0x67FE,0x8888,
X 0x2222,0x3FF7,0x5BFE,0x2222,0x2222,0x3FF5,0x47FE,0x2222,
X 0x8888,0xBFF5,0x5FFE,0x8888,0x8888,0xBFFA,0xE3FE,0x8888,
X 0x2222,0x3FFF,0xFFFE,0x2222,0x2222,0x7FFF,0xFFFF,0x2222,
X 0x8888,0x77FF,0xFFF7,0x8888,0x8888,0xE1AE,0xDC61,0x8888,
X 0x2222,0xF796,0xDBF7,0xA222,0x2223,0xF7BE,0xDCF7,0xE222,
X 0x888F,0xF7BE,0x9F77,0xF888,0x889F,0xF9BF,0x58F9,0xFC88,
X 0x223F,0xFFFF,0xFFFF,0xFE22,0x223F,0xFFFF,0xFFFF,0xFE22,
X 0x8880,0x0000,0x0000,0x0088,0x88FF,0xFFFF,0xFFFF,0xFF88,
X 0x227F,0xFFFF,0xFFFF,0xFF22,0x227F,0xFFFF,0xFFFF,0xFF22,
X 0x88FF,0xFFFF,0xFFFF,0xFF88,0x8880,0x0000,0x0000,0x0088,
X 0x227F,0xFFFF,0xFFFF,0xFF22,0x2222,0x2222,0x27FF,0x2222,
X 0x8888,0x8888,0x8FFF,0x8888,0x8888,0x8888,0x8FFF,0x8888,
X 0x2222,0x2222,0x2FFF,0xA222,0x2222,0x2222,0x2FFF,0xA222,
X 0x8888,0x8888,0x8FFF,0x8888,0x8888,0x8888,0x8FFF,0x8888,
X 0x2222,0x2222,0x23FE,0x2222,0x2222,0x2222,0x23FE,0x2222,
X 0x8888,0x8888,0x88F8,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,
X 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,
X 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x2222
***FUBAR***
echo "end of shar file"
exit
More information about the Comp.sources.unix
mailing list