home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.sources.x
- From: Steff.Watkins@bristol.ac.uk ("S. Watkins")
- Subject: v21i047: xfsp - X based front-end for the FSP package, Part02/02
- Message-ID: <1993Nov23.165249.15766@sparky.sterling.com>
- X-Md4-Signature: 7879290a4b49101a4b80d049da0989ef
- Sender: chris@sparky.sterling.com (Chris Olson)
- Organization: Sterling Software
- Date: Tue, 23 Nov 1993 16:52:49 GMT
- Approved: chris@sterling.com
-
- Submitted-by: Steff.Watkins@bristol.ac.uk ("S. Watkins")
- Posting-number: Volume 21, Issue 47
- Archive-name: xfsp/part02
- Environment: X11, FSP
-
- The following code is an X based front-end for the FSP package. To use
- this program, you will also have to have the FSP package installed and in
- your search path.
-
- ================ CUT HERE ======================================
- #!/bin/sh
- # to extract, remove the header and type "sh filename"
- if `test ! -s ./Imakefile`
- then
- echo "Writing ./Imakefile"
- cat > ./Imakefile << '\Rogue\Monster\'
- #ifdef BandAidCompiler
- #include BandAidCompiler
- #endif
-
- ####################
- # Imakefile for XFSP
- ####################
-
- INCLUDES = -I$(TOP) -I$(TOP)/X11
- DEPLIBS = $(DEPXTOOLLIB) $(DEPXMULIB) $(DEPXLIB)
- LOCAL_LIBRARIES = $(XLIB)
-
- SRCS = xfsp.c input.c ops.c output.c
- OBJS = xfsp.o input.o ops.o output.o
-
- ComplexProgramTarget(xfsp)
- \Rogue\Monster\
- else
- echo "Will not over-write ./Imakefile"
- fi
- chmod 755 ./Imakefile
- if `test ! -s ./MANIFEST`
- then
- echo "Writing ./MANIFEST"
- cat > ./MANIFEST << '\Rogue\Monster\'
- total 106
- drwxr-xr-x 2 ccsw 512 Oct 25 11:26 ./
- drwxr-xr-x 12 ccsw 512 Oct 18 14:47 ../
- -rwxr-xr-x 1 ccsw 331 Oct 25 11:26 Imakefile
- -rw-r--r-- 1 ccsw 0 Oct 25 11:26 MANIFEST
- -rwxr-xr-x 1 ccsw 292 Oct 25 11:26 Makefile.mk
- -rw-r--r-- 1 ccsw 9073 Oct 25 11:26 README
- -rw-r--r-- 1 ccsw 187 Oct 25 11:26 config.h
- -rw-r--r-- 1 ccsw 275 Oct 25 11:26 down.h
- -rwxr-xr-x 1 ccsw 7963 Oct 25 11:26 input.c
- -rw-r--r-- 1 ccsw 14488 Oct 25 11:26 logo.h
- -rw-r--r-- 1 ccsw 284 Oct 25 11:26 maxdown.h
- -rw-r--r-- 1 ccsw 278 Oct 25 11:26 maxup.h
- -rwxr-xr-x 1 ccsw 3773 Oct 25 11:26 ops.c
- -rwxr-xr-x 1 ccsw 7246 Oct 25 11:26 output.c
- -rw-r--r-- 1 ccsw 44 Oct 25 11:26 patchlevel.h
- -rw-r--r-- 1 ccsw 269 Oct 25 11:26 up.h
- -rwxr-xr-x 1 ccsw 2929 Oct 25 11:26 xfsp.c
- -rw-r--r-- 1 ccsw 205 Oct 25 11:26 xfsp.h
- -rwxr-xr-x 1 ccsw 1343 Oct 25 11:26 xfsp.man
- -rw-r--r-- 1 ccsw 12089 Oct 25 11:26 xfsp.xbm
- \Rogue\Monster\
- else
- echo "Will not over-write ./MANIFEST"
- fi
- chmod 644 ./MANIFEST
- if `test ! -s ./Makefile`
- then
- echo "Writing ./Makefile"
- cat > ./Makefile << '\Rogue\Monster\'
- ####################
- # Makefile for xfile
- ####################
-
- # your C compiler of choice
- CC = cc
- CFLAGS = -O
- LIBS = -lX11
- PRG = xfsp
-
- OBJS = xfsp.o input.o ops.o output.o
-
- .c.o: ; $(CC) -c $(CFLAGS) $*.c
-
- all: $(PRG)
-
- xfsp: $(OBJS)
- $(CC) $(CFLAGS) -o $(PRG) $(OBJS) $(LIBS)
- strip $(PRG)
- \Rogue\Monster\
- else
- echo "Will not over-write ./Makefile"
- fi
- chmod 755 ./Makefile
- if `test ! -s ./Makefile.mk`
- then
- echo "Writing ./Makefile.mk"
- cat > ./Makefile.mk << '\Rogue\Monster\'
- ####################
- # Makefile for xfile
- ####################
-
- # your C compiler of choice
- CC = cc
- CFLAGS = -O
- LIBS = -lX11
- PRG = xfsp
-
- OBJS = xfsp.o input.o ops.o output.o
-
- .c.o: ; $(CC) -c $(CFLAGS) $*.c
-
- all: $(PRG)
-
- xfsp: $(OBJS)
- $(CC) $(CFLAGS) -o $(PRG) $(OBJS) $(LIBS)
- strip $(PRG)
- \Rogue\Monster\
- else
- echo "Will not over-write ./Makefile.mk"
- fi
- chmod 755 ./Makefile.mk
- if `test ! -s ./README`
- then
- echo "Writing ./README"
- cat > ./README << '\Rogue\Monster\'
- X-FSP Version 1.00
- ==================
-
- Release Date :- 11 Oct 93
-
-
- INTRODUCTION
- ============
-
- Hello,
-
- Well, here's my attempt at an FSP front-end. I've only been C/X coding
- for a few months, so before you start on about the aestethics of the
- program, DON'T!!
-
- X-Fsp must be used in conjuction with the FSP package. Before running
- X-Fsp, check that you have "fcdcmd", "fgetcmd", "flscmd" and "fput" in
- your path. The results, otherwise, could be very disappointing.
-
- X-Fsp is an X-Based front-end for the FSP package. The reason I wrote this
- little program was that I was getting annoyed having to constantly type in
- host names, and port numbers before accessing a FSP host. So, I sat down,
- and tried to write a push-and-shoot interface for FSP. Here's the first draft.
-
- X-Fsp has been written and tested SOLELY on a SunOs4 box. I can not
- and will not guarantee that it will compile or execute on any other system
- (at this moment). However, steps will be taken to test and improve the
- code so that it will compile properly on other systems (watch this space!).
-
- VERSIONS
- ========
-
- I'm none too sure how other people use their version numbers, but I'll
- explain how I intend to use mine. The version is specified as
-
- Version X.YY
-
- 'X' will only change if there is a MAJOR change to the operation of X-Fsp
- 'YY' will change as the code is changed to incorporate new systems.
-
- So, if you have a working Version 1.00, you won't need Version 1.01 OK??
-
- COMPILING XFSP
- ==============
-
- Copy file "makefile.mk" to "Makefile". Have a read through "Makefile", and
- make any changes that you feel are necessary. A standard "make" command
- afterwards should compile xfsp.
-
- I have included an "Imakefile". To use this, you must first type "xmkmf".
- This program will generate a makefile which is configured for your system.
- Then issue the "make" command. I have noticed that, as this method
- includes a load of X11 routines, the final xfsp binary is about 120K bytes
- bigger than the one generated by the non-xmkmf'ed Makefile. This may be a
- consideration for you if you have limited file space.
-
- USING XFSP
- ==========
-
- To start xfsp, type "xfsp" and hit return.
-
- In front of you, there should be a window labelled "X-FSP Version: 1.00".
- You should se a large rectangular region in the upper half of the window,
- which will contain the text "No entries available" and have four arrow
- buttons on the right hand side.
-
- In the lower part of the screen, you should see a few string boxes with
- buttons next to them ("host", "port", "r-dir", "rfile" and "lfile"), and a
- line of buttons along the bottom ("hosts", "fls", "fget", "fput", "fcd",
- "about" and "quit").
-
- HOST/PORT BUTTON
- ================
-
- Click on this button. An asterisk ("*") will appear in the text box next
- to the right of the button. You can now enter a host name/number or the
- port number (depending on which box you're using) via the keyboard.
- Keyboard entry is terminated by pressing the "Enter" key.
-
- R-DIR BUTTON
- ============
-
- Click on this button. An asterisk ("*") will appear in the text box next
- to the right of the button. You can now enter the name of the remote
- directory you want to work with via the keyboard. Keyboard entry is
- terminated by pressing the "Enter" key.
-
- RFILE/LFILE BUTTON
- ==================
-
- Click on this button. An asterisk ("*") will appear in the text box next
- to the right of the button. You can now enter the name of the remote or
- local file you want to work with via the keyboard. Keyboard entry is
- terminated by pressing the "Enter" key.
-
- FLS BUTTON
- ==========
-
- Click on this button. XFsp will perform an "flscmd" on the remote
- diretory specified in the "r-dir" box. Be sure that you have an entry
- filled in for the "host" and "port" boxes.
-
- If the "flscmd" is successful, you should get a list of files available
- displayed in the upper rectangle of the window. You can scroll through
- this list using the four "arrow" button on the right hand side of that
- screen. The plain up/down arrows will move you ONE entry through the list
- either upwards or downwards. The capped (ones with lines across the ends)
- arrows will move you one SCREEN through the list.
-
- The list of files displays certain information, such as filename, date of
- entry to the current directory and size of the file. Sub-directories are
- marked with a "/" at the end, to show that they are sub-directories.
-
- If you wish to move to a sub-directory, or select a file from the visible
- list, then click on the file name. The relevant entry ("r-dir" or "rfile")
- will be completed in the text boxes below. Clicking on ".." will move you
- back to the parent directory for the directory you are currently in.
- Clicking on "." does NOTHING.
-
- HOSTS BUTTON
- ============
-
- This is MY main reason for writing XFSP. Clicking on this button will
- cause a window to open, which obscures the file selection window.
-
- This window contains two buttons ("hfile" and "close").
-
- HOSTS=>HFILE BUTTON
- ===================
-
- Click on this button, and an asterisk ("*") will appear in the text box
- next to it. You can alter this string to point at any file which contains
- a valid fsp host list (see later). Text entry is terminated by pressing
- the "Enter" key.
-
- HOSTS=>CLOSE BUTTON
- ===================
-
- Click on this button to close the "hosts" window.
-
- If you click on an entry in your "hosts" window, that entry's host and
- port parameters will be filled in in the "Host" and "Port" text boxes of
- the main window.
-
- You may up and down through your hosts list by clicking on the arrow
- button on the right hand side of the "hosts" window.
-
- ABOUT BUTTON
- ============
-
- Click on this button to get the "about" window. This is just my chance of
- have a pose. The about window contains the version number of the release
- you're using (which should also be visible in the title bar!), and
- contains my E-Mail address for correspondence.
-
- Clicking anywhere in the "about" window will cause it to close.
-
- FGET BUTTON
- ===========
-
- Click on this button to perform an "fgetcmd". XFsp has been set up to
- perform an "fget" on the file "r-dir/rfile" (as visible in the appropriate
- text boxes). The "fget" performed is backgrounded.
-
- FPUT BUTTON
- ===========
-
- Click on this button to perform an "fput". XFsp has been set up to perform
- an "fput" on the file given in the "lfile" text box. The "fput" performed
- is backgrounded.
-
- THAT'S ABOUT IT FOR BUTTONS!!!!
-
- The HOSTS file
- ==============
-
- The hosts file (as given in the "hfile" text box on the "hosts" window)
- has to have a specific format to work. The file must be text, and should
- have the following format.
-
- HHHHHHH PPPP CCCCCCCCCCC*
-
- where:
-
- HHHHHHH is the host name/number
- PPPP is the port number
- CCCCCCC is an optional comment
-
- Each line must be terminated by an asterisk ("*").
-
- EXAMPLE
- =======
-
- fsp.host.one.edu 1234 First FSP site in the list*
- fsp.host.two.edu 2345 Second site*
- fsp.host.three.edu 21*
- 256.256.256.256 256 No comment*
-
-
- As you can see, the comment can be space separated, and does not have to
- be present.
-
- ==================================
- + ALL LINES MUST FINISH WITH A * +
- ==================================
-
- An example "hosts" file is included and is called "fhosts" in this
- distribution.
-
- FOOTNOTES
- =========
-
- This is the first version of XFsp. I know it's not brilliant, but I'm
- hoping it'll go some way towards making life easier for all you FSP'ers
- out there.
-
- Current undocumented features (Bugs?) are
-
- :- Sometimes an "fls" will cause a core dump. It's believed that this is
- due to the permissions set on the FSP directory being listed.
-
- :- Sometimes you can click on a blank entry in the file selection window,
- and get an entry which isn't present.
-
- :- Rarely, a click on ".." will cause an invalid "r-dir" entry.
-
- :- XFsp doesn't trap FSP_TRACE or error messages. These appears in the
- parent window for XFsp. Future generations will hopefully trap and
- handle these messages.
-
- COPYING AND DISTRIBUTION
- ========================
-
- This package may be copied and distributed at will. No charge may be made
- for this package beyond the recovery of costs incurred in distributing
- this file. This package must be distributed in it's entirity.
-
- CREDITS AND STUFF
- =================
-
- Go easy on me. I haven't been coding for long (and it shows, I know!). At
- this point, I have to give the standard disclaimer that I will not accept
- ANY responsibility for ANY damage caused through the use or mis-use of
- this package. You are using XFsp at your own (hopefully minimal) risk.
-
- If you have any comments, hints, tips, ideas, suggestions, code-hacks or
- (constructive) criticisms, then E-Mail them to me at
-
- Steff.Watkins@bristol.ac.uk
-
- Credit will be given where credit is due *8)
-
- I'd also appreciate being kept up to date on current sites, but that's for
- you to decide. Any information volunteered will be confidential and
- gratefully accepted.
-
- You can also contact me interactivly on IRC. I'm usually around (Mon-Fri
- 8am-4pm GMT) on #england. Look for "Pangolin" *8)
-
- I'd like to thank Nick Bruton, and Steve B Hill for helping me to develop
- XFsp this far.
- \Rogue\Monster\
- else
- echo "Will not over-write ./README"
- fi
- chmod 644 ./README
- if `test ! -s ./config.h`
- then
- echo "Writing ./config.h"
- cat > ./config.h << '\Rogue\Monster\'
- /* The only configurable I could find (so far). Find out whether your
- system uses vfork() or fork(). If fork(), then use
-
- #undef VFORK
-
- else use the default which is
-
- */
-
- #define VFORK
-
-
- \Rogue\Monster\
- else
- echo "Will not over-write ./config.h"
- fi
- chmod 644 ./config.h
- if `test ! -s ./down.h`
- then
- echo "Writing ./down.h"
- cat > ./down.h << '\Rogue\Monster\'
- #define down_width 16
- #define down_height 16
- static char down_bits[] = {
- 0xff, 0xff, 0x01, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
- 0x81, 0x81, 0x81, 0x81, 0xfd, 0xbf, 0xf9, 0x9f, 0xf1, 0x8f, 0xe1, 0x87,
- 0xc1, 0x83, 0x81, 0x81, 0x01, 0x80, 0xff, 0xff};
- \Rogue\Monster\
- else
- echo "Will not over-write ./down.h"
- fi
- chmod 644 ./down.h
- if `test ! -s ./input.c`
- then
- echo "Writing ./input.c"
- cat > ./input.c << '\Rogue\Monster\'
- #include "xfsp.h"
- #include <stdio.h>
-
- extern Display *dpy;
- extern Window win, hostwin, aboutwin;
- extern int screen_num;
- extern char hostname[40], portname[6], lfilname[30], rdirname[70];
- extern char rfilname[30], currdir[70], hostf[40];
- extern char dates[256][20], sizes[10], names[30], home[60];
- extern int dirs[256], dirlen, entries, topent, hoston, tophost, numhosts;
- extern XEvent event;
-
- char tempname[L_tmpnam];
- KeySym keysym;
- XComposeStatus compose;
- int litbutton, litstr;
-
- keyhandler()
- {
- int count, i, len, maxlen, buflen = 10;
- char buffer[10], compstr[70];
-
- count = XLookupString(&event, buffer, buflen, &keysym, &compose);
- if (!litstr) XBell(dpy, 100);
- else
- {
- switch (litstr) {
- case 1:
- strcpy(compstr,hostname);
- maxlen = 50;
- break;
- case 2:
- strcpy(compstr,portname);
- maxlen = 9;
- break;
- case 3:
- strcpy(compstr,rdirname);
- maxlen = 70;
- break;
- case 4:
- strcpy(compstr,lfilname);
- maxlen = 30;
- break;
- case 5:
- strcpy(compstr,rfilname);
- maxlen = 30;
- break;
- case 6:
- strcpy(compstr,hostf);
- maxlen = 40;
- break;
- }
- if ((keysym == XK_Linefeed) || (keysym == XK_KP_Enter)
- || (keysym == XK_Return)) {
- if (litstr <= 3) {
- entries = 0;
- showentries();
- }
- if (litstr == 6) {
- readhosts();
- showhosts();
- }
- litstr = 0;
- }
- else if ((keysym >= XK_exclam) && (keysym <= XK_asciitilde)) {
- if ((strlen(compstr) + strlen(buffer)) >= maxlen)
- XBell(dpy, 100);
- else
- strcat(compstr, buffer);
- }
- else if ((keysym == XK_BackSpace) || (keysym == XK_Delete)) {
- if ((len = strlen(compstr)) > 0) {
- compstr[len - 1] = NULL;
- }
- else XBell(dpy, 100);
- }
- switch (litstr) {
- case 1:
- strcpy(hostname, compstr);
- break;
- case 2:
- strcpy(portname, compstr);
- break;
- case 3:
- strcpy(rdirname, compstr);
- break;
- case 4:
- strcpy(lfilname, compstr);
- break;
- case 5:
- strcpy(rfilname, compstr);
- break;
- case 6:
- strcpy(hostf, compstr);
- break;
- }
- showstrings();
- }
- }
-
- buttonhandler(bx, by, bw, lit)
- int bx, by, lit;
- Window bw;
- {
- int status;
- char tempstr[60];
-
- if (bw == aboutwin) {
- XUnmapWindow(dpy, aboutwin);
- mainscr();
- }
- if (bw == win) {
- if (!lit) {
- switch(litbutton) {
- case 1:
- button(10, 290, "host", win, 0);
- break;
- case 2:
- button(380, 290, "port", win, 0);
- break;
- case 3:
- button(10, 310, "r-dir", win,0);
- break;
- case 4:
- button(250, 330, "lfile", win, 0);
- break;
- case 5:
- button(10, 370, "hosts", win,0);
- if (!hoston) hosts();
- break;
- case 6:
- button(60, 370, "fls", win, 0);
- make_env();
- strcpy(tempstr,"flscmd -la > ");
- tmpnam(tempname);
- strcat(tempstr,tempname);
- status = execute(tempstr);
- if (!status) {
- strcpy(currdir, rdirname);
- dirlen = strlen(rdirname);
- flist();
- }
- unlink(tempname);
- break;
- case 7:
- button(110, 370, "fget", win, 0);
- strcpy(tempstr,"fgetcmd ");
- strcat(tempstr,rfilname);
- strcat(tempstr," &");
- status = execute(tempstr);
- break;
- case 8:
- button(160, 370, "fput", win, 0);
- strcpy(tempstr,"fput ");
- strcat(tempstr,lfilname);
- strcat(tempstr," &");
- status = execute(tempstr);
- break;
- case 9:
- button(210, 370, "fcd", win, 0);
- strcpy(tempstr,"fcdcmd ");
- strcat(tempstr,rdirname);
- status = execute(tempstr);
- if (!status) {
- strcpy(currdir,rdirname);
- entries = 0;
- showentries();
- }
- break;
- case 10:
- button(260, 370, "about", win, 0);
- abouts();
- break;
- case 11:
- button(440, 370, "quit", win, 0);
- runend();
- break;
- case 12:
- button(10, 330, "rfile", win, 0);
- break;
- } /* End switch */
- litbutton = 0;
- if (bx >= 475 && bx <=491) {
- if (by >= 247 & by <= 263) {
- if (topent < entries - 16) topent++;
- }
- if (by >= 48 && by <= 64) {
- if (topent > 0) topent = topent - 1;
- }
- if (by >= 30 && by <= 46) {
- if (topent > 16) topent = topent - 16;
- else
- topent = 0;
- }
- if (by >= 265 && by <= 281) {
- if (topent < entries - 32) topent = topent + 16;
- else
- topent = entries - 16;
- }
- if (topent < 0) topent = 0;
- showentries();
- }
- if (topent < 0) topent = 0;
- }
- else
- {
- if ((bx >= 10 && bx <= 460) && (by >= 30 & by <= 280)) selfile(by);
- if ((bx >= 10 && bx <= 50) && (by >= 370 & by <= 385))
- {
- button(10, 370, "hosts", win, lit);
- litbutton = 5;
- litstr = 0;
- }
- if ((bx >= 60 && bx <= 100) && (by >= 370 && by <= 385))
- {
- button(60, 370, "fls", win, lit);
- litbutton = 6;
- litstr = 0;
- }
- if ((bx >= 110 && bx <= 150) && (by >= 370 && by <= 385))
- {
- button(110, 370, "fget", win, lit);
- litbutton = 7;
- litstr = 0;
- }
- if ((bx >= 160 && bx <= 200) && (by >= 370 && by <= 385))
- {
- button(160, 370, "fput", win, lit);
- litbutton = 8;
- litstr = 0;
- }
- if ((bx >= 210 && bx <= 250) && (by >= 370 && by <= 385))
- {
- button(210, 370, "fcd", win, lit);
- litbutton = 9;
- litstr = 0;
- }
- if ((bx >= 260 && bx <= 300) && (by >= 370 && by <= 385))
- {
- button(260, 370, "about", win, lit);
- litbutton = 10;
- litstr = 0;
- }
- if ((bx >= 10 && bx <= 50) && (by >= 290 && by <= 305))
- {
- button(10, 290, "host", win, lit);
- litbutton = 1;
- litstr = 1;
- }
- if ((bx >= 380 && bx <= 420) && (by >= 290 && by <= 305))
- {
- button(380, 290, "port", win, lit);
- litbutton = 2;
- litstr = 2;
- }
- if ((bx >= 10 && bx <= 50) && (by >= 310 && by <= 325))
- {
- button(10, 310, "r-dir", win, lit);
- litbutton = 3;
- litstr = 3;
- }
- if ((bx >= 250 && bx <= 290) && (by >= 330 && by <= 345))
- {
- button(250, 330, "lfile", win, lit);
- litstr = 4;
- litbutton = 4;
- }
- if ((bx >= 10 && bx <= 50) && (by >= 330 && by <= 345))
- {
- button(10, 330, "rfile", win, lit);
- litstr = 5;
- litbutton = 12;
- }
- if ((bx >= 440 && bx <= 480) && (by >= 370 && by <= 385))
- {
- button(440, 370, "quit", win, lit);
- litbutton = 11;
- litstr = 0;
- }
- showstrings();
- }
- }
- if (bw == hostwin)
- {
- if ((bx >= 10 && bx <= 50) && (by >= 250 && by <= 265)) {
- button(10, 250, "hfile", hostwin, lit);
- litbutton = 13;
- litstr = 6;
- }
- if ((bx >= 420 && bx <= 460) && (by >= 250 && by <= 265)) {
- XUnmapWindow(dpy, hostwin);
- hoston = 0;
- mainscr();
- }
- if (!lit) {
- if (litbutton == 13) {
- button(10, 250, "hfile", hostwin, 0);
- litbutton = 0;
- }
- if ((bx >= 0 && bx <= 480) && (by >= 20 && by <= 240)) selhost(by);
- if (bx >= 465 && bx <=481) {
- if (by >= 207 && by <= 223) {
- if (tophost < numhosts - 14) tophost++;
- }
- if (by >= 38 && by <= 54) {
- if (tophost > 0) tophost = tophost - 1;
- }
- if (by >= 20 && by <= 36) {
- if (tophost > 14) tophost = tophost - 14;
- else
- tophost = 0;
- }
- if (by >= 225 && by <= 241) {
- if (tophost < numhosts - 28) tophost = tophost + 14;
- else
- tophost = numhosts - 14;
- }
- if (tophost < 0) tophost = 0;
- showhosts();
- }
- }
- hoststring();
- }
- }
- \Rogue\Monster\
- else
- echo "Will not over-write ./input.c"
- fi
- chmod 755 ./input.c
- echo "Finished archive 2 of 2"
- exit
-
- exit 0 # Just in case...
- --
- // chris@Sterling.COM | Send comp.sources.x submissions to:
- \X/ Amiga - The only way to fly! | sources-x@sterling.com
- "It's intuitively obvious to the |
- most casual observer..." | GCS d+/-- p+ c++ l+ m+ s++/+ g+ w+ t+ r+ x+
-