home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / gnuplot.patch / part01 next >
Text File  |  1990-08-21  |  16KB  |  651 lines

  1. Path: uunet!lll-winken!sun-barr!newstop!sun!hpmtlx.HP.COM
  2. From: thompson_r@hpmtlx.HP.COM ($Robert_Thompson)
  3. Newsgroups: comp.sources.x
  4. Subject: v08i090: Gnuplot 2.0 X11 drivers, Part01/01
  5. Message-ID: <141101@sun.Eng.Sun.COM>
  6. Date: 22 Aug 90 01:55:04 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 640
  9. Approved: argv@sun.com
  10.  
  11. Submitted-by: thompson_r@hpmtlx.HP.COM ($Robert_Thompson)
  12. Posting-number: Volume 8, Issue 90
  13. Archive-name: gnuplot.patch/part01
  14.  
  15.  
  16. This is a set of diffs and terminal drivers for X11.  With this addition to
  17. the gnuplot terminal family, you can display a graph on your X11 screen.
  18. The plot is scaled according to the window size (without affecting the
  19. 'size' parameter).  You can also view more than one plot at a time by
  20. simply specifying the terminal type after you have a plot.  For example:
  21.  
  22.     gnuplot> set term x11
  23.     gnuplot> plot sin(x)
  24.     gnuplot> set term x11
  25.     gnuplot> plot cos(x)
  26.  
  27. This will create two windows having the sin and cosine plots, respectively.
  28. You cannot, at this time, remove the first plot from the screen without
  29. closing the window (from mwm for example).  
  30.  
  31.     The terminal drivers have been written for color and monochrome
  32. displays.  You can install one or the other as is (installing both could be
  33. done as well, with some mods).
  34.  
  35.     
  36. <--------------------------- CUT HERE --------------------------------->
  37. # This is a shell archive.  Remove anything before this line,
  38. # then unpack it by saving it in a file and typing "sh file".
  39. #
  40. # Wrapped by  <thompson_r@hpmtlrt> on Fri Jul 13 13:43:20 1990
  41. #
  42. # This archive contains:
  43. #    makefile.diff    term.c.diff    X11.trm.color    X11.trm.mono    
  44. #
  45.  
  46. LANG=""; export LANG
  47. PATH=/bin:/usr/bin:$PATH; export PATH
  48.  
  49. echo x - makefile.diff
  50. cat >makefile.diff <<'@EOF'
  51. *** makefile.old    Fri Jul 13 13:27:48 1990
  52. --- makefile    Fri Jul 13 13:27:39 1990
  53. ***************
  54. *** 10,14
  55.   
  56.   # directory where to install executables on 'make install'
  57. ! DEST=
  58.   # directory for installing man page on 'make man_install'
  59.   MANDEST=
  60.  
  61. --- 10,14 -----
  62.   
  63.   # directory where to install executables on 'make install'
  64. ! DEST=/usr/contrib/bin
  65.   # directory for installing man page on 'make man_install'
  66.   MANDEST=.
  67. ***************
  68. *** 12,16
  69.   DEST=
  70.   # directory for installing man page on 'make man_install'
  71. ! MANDEST=
  72.   # where to install help file gnuplot.gih
  73.   HELPDEST= 
  74.  
  75. --- 12,16 -----
  76.   DEST=/usr/contrib/bin
  77.   # directory for installing man page on 'make man_install'
  78. ! MANDEST=.
  79.   # where to install help file gnuplot.gih
  80.   HELPDEST= /usr/contrib/lib/gnuplot.gih
  81. ***************
  82. *** 14,18
  83.   MANDEST=
  84.   # where to install help file gnuplot.gih
  85. ! HELPDEST= 
  86.   
  87.   # -DVFORK if you have vfork()
  88.  
  89. --- 14,18 -----
  90.   MANDEST=.
  91.   # where to install help file gnuplot.gih
  92. ! HELPDEST= /usr/contrib/lib/gnuplot.gih
  93.   
  94.   # -DVFORK if you have vfork()
  95. ***************
  96. *** 38,41
  97.   # -DHP75        HP7580, and probably other HPs
  98.   # -DHPGL                HP7475 and (hopefully) lots of others
  99.   # -DHPLJET              HP Laserjet
  100.   # -DIMAGEN      Imagen laser printers (300dpi) (requires -Iterm also)
  101.  
  102. --- 38,42 -----
  103.   # -DHP75        HP7580, and probably other HPs
  104.   # -DHPGL                HP7475 and (hopefully) lots of others
  105. + # -DX11        X11 support
  106.   # -DHPLJET              HP Laserjet
  107.   # -DIMAGEN      Imagen laser printers (300dpi) (requires -Iterm also)
  108. ***************
  109. *** 59,62
  110.       -DUNIXPLOT -DV384
  111.   
  112.   OBJS = command.o eval.o graphics.o help.o internal.o misc.o parse.o\
  113.       plot.o scanner.o setshow.o standard.o term.o util.o
  114.  
  115. --- 60,66 -----
  116.       -DUNIXPLOT -DV384
  117.   
  118. + TERMFLAGS =  -Iterm -DHPGL -DHPLJET -DPOSTSCRIPT -DTEK -DHP2648 \
  119. +     -DHP26 -DX11
  120.   OBJS = command.o eval.o graphics.o help.o internal.o misc.o parse.o\
  121.       plot.o scanner.o setshow.o standard.o term.o util.o
  122. ***************
  123. *** 72,76
  124.   CSOURCE6 = term/post.trm term/pc.trm term/qms.trm term/regis.trm \
  125.       term/tek.trm term/unixpc.trm term/unixplot.trm term/v384.trm \
  126. !     term/imPcodes.h term/imagen.trm term/object.h term/fig.trm
  127.   # not C code, but still needed
  128.   ETC = README README.gnutex makefile.unx makefile.vms linkopt.vms \
  129.  
  130. --- 76,81 -----
  131.   CSOURCE6 = term/post.trm term/pc.trm term/qms.trm term/regis.trm \
  132.       term/tek.trm term/unixpc.trm term/unixplot.trm term/v384.trm \
  133. !     term/imPcodes.h term/imagen.trm term/object.h term/fig.trm \
  134. !     term/X11.trm
  135.   # not C code, but still needed
  136.   ETC = README README.gnutex makefile.unx makefile.vms linkopt.vms \
  137. ***************
  138. *** 101,104
  139.   
  140.   # -lplot iff you have -DUNIXPLOT
  141.   # -lsuntool -lsunwindow -lpixrect  iff you have -DSUN
  142.   # -lgl_s if IRIS4D
  143.  
  144. --- 106,110 -----
  145.   
  146.   # -lplot iff you have -DUNIXPLOT
  147. + # -lX11 if you have -DX11
  148.   # -lsuntool -lsunwindow -lpixrect  iff you have -DSUN
  149.   # -lgl_s if IRIS4D
  150. ***************
  151. *** 103,107
  152.   # -lsuntool -lsunwindow -lpixrect  iff you have -DSUN
  153.   # -lgl_s if IRIS4D
  154. ! LIBS = -lm 
  155.   
  156.   gnuplot: $(OBJS) version.o
  157.  
  158. --- 109,113 -----
  159.   # -lsuntool -lsunwindow -lpixrect  iff you have -DSUN
  160.   # -lgl_s if IRIS4D
  161. ! LIBS = -lm -lX11 
  162.   
  163.   gnuplot: $(OBJS) version.o
  164. @EOF
  165.  
  166. chmod 666 makefile.diff
  167.  
  168. echo x - term.c.diff
  169. cat >term.c.diff <<'@EOF'
  170. *** term.c.old    Fri Jul 13 13:28:38 1990
  171. --- term.c    Fri Jul 13 13:27:57 1990
  172. ***************
  173. *** 376,379
  174.   #endif /* UNIXPLOT */
  175.   
  176.   /* Dummy functions for unavailable features */
  177.   
  178.  
  179. --- 376,383 -----
  180.   #endif /* UNIXPLOT */
  181.   
  182. + #ifdef X11
  183. + #include "term/X11.trm"
  184. + #endif /* X11 */
  185.   /* Dummy functions for unavailable features */
  186.   
  187. ***************
  188. *** 610,613
  189.          HPGL_text, null_scale, HPGL_graphics, HPGL_move, HPGL_vector,
  190.          HPGL_linetype, HPGL_put_text, HPGL_text_angle, 
  191.          null_justify_text, do_point, do_arrow}
  192.   #endif
  193.  
  194. --- 614,626 -----
  195.          HPGL_text, null_scale, HPGL_graphics, HPGL_move, HPGL_vector,
  196.          HPGL_linetype, HPGL_put_text, HPGL_text_angle, 
  197. +        null_justify_text, do_point, do_arrow}
  198. + #endif
  199. + #ifdef X11
  200. +     ,{"x11", "X Windows Support (V11R3)",
  201. +        X11_XMAX, X11_YMAX, X11_VCHAR, X11_HCHAR,
  202. +        X11_VTIC, X11_HTIC, X11_init, X11_reset,
  203. +        X11_text, null_scale, X11_graphics, X11_move, X11_vector,
  204. +        X11_linetype, X11_put_text, X11_text_angle, 
  205.          null_justify_text, do_point, do_arrow}
  206.   #endif
  207. @EOF
  208.  
  209. chmod 666 term.c.diff
  210.  
  211. echo x - X11.trm.color
  212. cat >X11.trm.color <<'@EOF'
  213. /* GNUPLOT - X11.trm */
  214. /*
  215.  * Copyright (C) 1990   
  216.  *
  217.  * Permission to use, copy, and distribute this software and its
  218.  * documentation for any purpose with or without fee is hereby granted, 
  219.  * provided that the above copyright notice appear in all copies and 
  220.  * that both that copyright notice and this permission notice appear 
  221.  * in supporting documentation.
  222.  *
  223.  * Permission to modify the software is granted, but not the right to
  224.  * distribute the modified code.  Modifications are to be distributed 
  225.  * as patches to released version.
  226.  *  
  227.  * This software  is provided "as is" without express or implied warranty.
  228.  * 
  229.  * This file is included by ../term.c.
  230.  *
  231.  * This terminal driver supports:
  232.  *  X Windows Version 11, revision 3
  233.  *
  234.  * AUTHOR
  235.  *  Robert Thompson
  236.  *  Hewlett Packard - Manufacturing Test Division, Loveland Colorado
  237.  * 
  238.  * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
  239.  * 
  240.  */
  241.  
  242. /********************************************************************
  243.  *
  244.  *  THIS IS FOR COLOR WORKSTATIONS ONLY.  
  245.  *
  246.  ********************************************************************/
  247.  
  248. #include <X11/Xlib.h>
  249. #include <X11/X.h>
  250. #include <X11/cursorfont.h>
  251.  
  252. #define X11_FONT     "vtsingle"    /* Font Name to use        */
  253. #define X11_CURSOR    XC_hand2
  254.  
  255. #define X11_XMAX 900
  256. #define X11_YMAX 850
  257.  
  258. #define X11_XLAST (1)
  259. #define X11_YLAST (1)
  260.  
  261. #define X11_VCHAR    13        /* Don't forget to change this     */
  262. #define X11_HCHAR    8        /* with the font        */
  263. #define X11_VTIC    (X11_YMAX/85)        
  264. #define X11_HTIC    (X11_XMAX/90)        
  265.  
  266. int X11_ang = 0;
  267.  
  268. extern float    xsize, ysize;
  269. int        changed_by_X11trm;
  270.  
  271. static char    X11_FOREGROUND[][20] = {
  272.         "green",        /* pen 1    */
  273.         "cyan",            /* pen 2    */
  274.         "blue",            /* pen 3    */
  275.         "magenta",        /* pen 4    */
  276.         "yellow",        /* pen 5    */
  277.         "red",            /* pen 6    */
  278.         "white",        /* pen 7    */
  279.         "orchid",        /* pen 8    */
  280.         "orange",        /* pen 9    */
  281.         "pink",            /* pen 10    */
  282.         "SkyBlue",        /* pen 11    */
  283.         "LimeGreen",        /* pen 12    */
  284.         "LightSteelBlue",    /* pen 13    */
  285.         "aquamarine"        /* pen 14    */
  286.         };
  287.  
  288. #define NUMCOLORS    14
  289. #define X11_BACKGROUND    "DarkSlateGray"    /* choose a neutral bg    */
  290.  
  291. Window        win;    /* The window that we will be using    */
  292. Display        *dis;    /* And the display            */
  293. GC        gc;    /* The graphics context            */
  294. XFontStruct    *font;    /* The font structure to use        */
  295. Colormap    cmap;    /* The colormap                */
  296. XColor         fgc[NUMCOLORS],        /* An array of colors    */
  297.         bgc,    /* And the background color        */
  298.         dummy;    /* Duh                    */
  299.  
  300. int        lastx, lasty, lastw, lasth;
  301. unsigned int    width, height;
  302.  
  303. X11_init()
  304. {
  305.     char            *getenv();
  306.     register int        cn;
  307.     XSetWindowAttributes    attr;
  308.     unsigned int        x, y, bw, d;
  309.     Window            root;
  310.  
  311.     dis         = XOpenDisplay(getenv("DISPLAY"));
  312.     font        = XLoadQueryFont(dis,X11_FONT);
  313.     attr.cursor     = XCreateFontCursor(dis,X11_CURSOR);
  314.     attr.backing_store = Always;
  315.     attr.backing_planes = AllPlanes;
  316.  
  317.     win         = XCreateSimpleWindow(dis,
  318.                 RootWindow(dis,DefaultScreen(dis)),
  319.                 0,
  320.                 0,
  321.                 X11_XMAX+10,
  322.                 X11_YMAX+10,
  323.                 2,
  324.                 WhitePixel(dis,DefaultScreen(dis)),
  325.                 BlackPixel(dis,DefaultScreen(dis)));
  326.                 
  327.     gc        = DefaultGC(dis,DefaultScreen(dis));
  328.     cmap        = DefaultColormap(dis,DefaultScreen(dis));
  329.  
  330.     if (XAllocNamedColor(dis,cmap,X11_BACKGROUND,&bgc,&dummy)
  331.     ==BadColor)
  332.         {
  333.         printf ("Could not allocate color %s\n",X11_BACKGROUND);
  334.         exit(0);
  335.         }
  336.  
  337.     for (cn = 0;cn < NUMCOLORS;cn++)
  338.         {
  339.         if (XAllocNamedColor(dis,cmap,X11_FOREGROUND[cn],
  340.         &fgc[cn],&dummy)==BadColor) {
  341.         printf ("Could not allocate color %s\n",X11_FOREGROUND[cn]);
  342.         }
  343.     }
  344.  
  345.     XChangeWindowAttributes(dis,win,
  346.             CWCursor|CWBackingStore|CWBackingPlanes,&attr);
  347.     XSetWindowBackground(dis,win,bgc);
  348.  
  349.     XSetFont(dis,gc,font->fid);
  350.     XSetForeground(dis,gc,fgc[1].pixel);
  351.  
  352.     XSetIconName(dis,win,"Gnuplot");
  353.     XStoreName(dis,win,"Gnuplot Plotting Surface");
  354.  
  355.     XMapWindow(dis,win);
  356.     XFlush(dis);
  357.  
  358.     XGetGeometry(dis,win,&root,&x,&y,&width,&height,&bw,&d);
  359.  
  360.     lastw = width;
  361.     lasth = height;
  362. }
  363.  
  364. X11_graphics()
  365. {
  366.         register struct termentry *t = &term_tbl[term];
  367.     unsigned int            x, y, bw, d;
  368.     Window                root;
  369.  
  370.     XGetGeometry(dis,win,&root,&x,&y,&width,&height,&bw,&d);
  371.  
  372.     if (lastw != width || lasth != height)
  373.         {
  374.         register struct termentry *t = &term_tbl[term];
  375.  
  376.         t->xmax = (unsigned int)(width);
  377.         t->ymax = (unsigned int)(height);
  378.         }
  379.  
  380.     XClearWindow(dis,win);
  381.     XSetForeground(dis,gc,BlackPixel(dis,DefaultScreen(dis)));
  382.     XDrawImageString(dis,win,gc,
  383.         width-X11_HCHAR*14,X11_VCHAR+2," Plotting ",10);
  384.     XFlush(dis);
  385.     X11_ang = 0;
  386. }
  387.  
  388. X11_text()
  389. {
  390.     XClearArea(dis,win, 
  391.         width-X11_HCHAR*14,2,
  392.         X11_HCHAR*10,X11_VCHAR+4,True);
  393.     XFlush(dis);
  394. }
  395.  
  396.  
  397. X11_linetype(linetype)
  398. int linetype;
  399. {
  400.     if (linetype < 0)
  401.         XSetForeground(dis,gc,WhitePixel(dis,DefaultScreen(dis)));
  402.     else
  403.         XSetForeground(dis,gc,fgc[linetype%NUMCOLORS].pixel);
  404. }
  405.  
  406. X11_move(x,y)
  407. int x,y;
  408. {
  409.     lastx = x;
  410.     lasty = height-y;
  411. }
  412.  
  413.  
  414. X11_vector(x,y)
  415. int x,y;
  416. {
  417.     XDrawLine(dis,win,gc, lastx, lasty, x, height -y );
  418.     XFlush(dis);
  419.  
  420.     lastx = x;
  421.     lasty = height-y;
  422. }
  423.  
  424.  
  425. X11_put_text(x,y,str)
  426. int x, y;
  427. char *str;
  428. {
  429.     XDrawString(dis,win,gc,x,height-y,str,strlen(str));
  430.     XFlush(dis);
  431. }
  432.  
  433. int X11_text_angle(ang)
  434. int ang;
  435. {
  436.     return FALSE;
  437. }
  438.  
  439. X11_reset()
  440. {
  441.     XDestroyWindow(dis,win);
  442.     XFreeColormap(dis,cmap);
  443. }
  444.  
  445. @EOF
  446.  
  447. chmod 666 X11.trm.color
  448.  
  449. echo x - X11.trm.mono
  450. cat >X11.trm.mono <<'@EOF'
  451. /* GNUPLOT - X11.trm */
  452. /*
  453.  * Copyright (C) 1990   
  454.  *
  455.  * Permission to use, copy, and distribute this software and its
  456.  * documentation for any purpose with or without fee is hereby granted, 
  457.  * provided that the above copyright notice appear in all copies and 
  458.  * that both that copyright notice and this permission notice appear 
  459.  * in supporting documentation.
  460.  *
  461.  * Permission to modify the software is granted, but not the right to
  462.  * distribute the modified code.  Modifications are to be distributed 
  463.  * as patches to released version.
  464.  *  
  465.  * This software  is provided "as is" without express or implied warranty.
  466.  * 
  467.  * This file is included by ../term.c.
  468.  *
  469.  * This terminal driver supports:
  470.  *  X Windows Version 11, revision 3
  471.  *
  472.  * AUTHOR
  473.  *  Robert Thompson
  474.  *  Hewlett Packard - Manufacturing Test Division, Loveland Colorado
  475.  * 
  476.  * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
  477.  * 
  478.  */
  479.  
  480. /********************************************************************
  481.  *
  482.  *  THIS IS FOR MONOCHROME WORKSTATIONS ONLY.  
  483.  *
  484.  ********************************************************************/
  485.  
  486. #include <X11/Xlib.h>
  487. #include <X11/X.h>
  488. #include <X11/cursorfont.h>
  489.  
  490. #define X11_FONT     "vtsingle"    /* Font Name to use        */
  491. #define X11_CURSOR    XC_hand2
  492.  
  493. #define X11_XMAX 900
  494. #define X11_YMAX 850
  495.  
  496. #define X11_XLAST (1)
  497. #define X11_YLAST (1)
  498.  
  499. #define X11_VCHAR    13        /* Don't forget to change this     */
  500. #define X11_HCHAR    8        /* with the font        */
  501. #define X11_VTIC    (X11_YMAX/85)        
  502. #define X11_HTIC    (X11_XMAX/90)        
  503.  
  504. int X11_ang = 0;
  505.  
  506. extern float    xsize, ysize;
  507. int        changed_by_X11trm;
  508.  
  509. Window        win;    /* The window that we will be using    */
  510. Display        *dis;    /* And the display            */
  511. GC        gc;    /* The graphics context            */
  512. XFontStruct    *font;    /* The font structure to use        */
  513.  
  514. int        lastx, lasty, lastw, lasth;
  515. unsigned int    width, height;
  516.  
  517. X11_init()
  518. {
  519.     char            *getenv();
  520.     register int        cn;
  521.     XSetWindowAttributes    attr;
  522.     unsigned int        x, y, bw, d;
  523.     Window            root;
  524.  
  525.     dis         = XOpenDisplay(getenv("DISPLAY"));
  526.     font        = XLoadQueryFont(dis,X11_FONT);
  527.     attr.cursor     = XCreateFontCursor(dis,X11_CURSOR);
  528.     attr.backing_store = Always;
  529.     attr.backing_planes = AllPlanes;
  530.  
  531.     win         = XCreateSimpleWindow(dis,
  532.                 RootWindow(dis,DefaultScreen(dis)),
  533.                 0,
  534.                 0,
  535.                 X11_XMAX+10,
  536.                 X11_YMAX+10,
  537.                 2,
  538.                 WhitePixel(dis,DefaultScreen(dis)),
  539.                 BlackPixel(dis,DefaultScreen(dis)));
  540.                 
  541.     gc        = DefaultGC(dis,DefaultScreen(dis));
  542.  
  543.     XChangeWindowAttributes(dis,win,
  544.             CWCursor|CWBackingStore|CWBackingPlanes,&attr);
  545.  
  546.     XSetFont(dis,gc,font->fid);
  547.     XSetForeground(dis,gc,WhitePixel(dis,DefaultScreen(dis));
  548.  
  549.     XSetIconName(dis,win,"Gnuplot");
  550.     XStoreName(dis,win,"Gnuplot Plotting Surface");
  551.  
  552.     XMapWindow(dis,win);
  553.     XFlush(dis);
  554.  
  555.     XGetGeometry(dis,win,&root,&x,&y,&width,&height,&bw,&d);
  556.  
  557.     lastw = width;
  558.     lasth = height;
  559. }
  560.  
  561. X11_graphics()
  562. {
  563.         register struct termentry *t = &term_tbl[term];
  564.     unsigned int            x, y, bw, d;
  565.     Window                root;
  566.  
  567.     XGetGeometry(dis,win,&root,&x,&y,&width,&height,&bw,&d);
  568.  
  569.     if (lastw != width || lasth != height)
  570.         {
  571.         register struct termentry *t = &term_tbl[term];
  572.  
  573.         t->xmax = (unsigned int)(width);
  574.         t->ymax = (unsigned int)(height);
  575.         }
  576.  
  577.     XClearWindow(dis,win);
  578.     XSetForeground(dis,gc,BlackPixel(dis,DefaultScreen(dis)));
  579.     XDrawImageString(dis,win,gc,
  580.         width-X11_HCHAR*14,X11_VCHAR+2," Plotting ",10);
  581.     XFlush(dis);
  582.     X11_ang = 0;
  583. }
  584.  
  585. X11_text()
  586. {
  587.     XClearArea(dis,win, 
  588.         width-X11_HCHAR*14,2,
  589.         X11_HCHAR*10,X11_VCHAR+4,True);
  590.     XFlush(dis);
  591. }
  592.  
  593.  
  594. X11_linetype(linetype)
  595. int linetype;
  596. {
  597.         XSetForeground(dis,gc,WhitePixel(dis,DefaultScreen(dis)));
  598. }
  599.  
  600. X11_move(x,y)
  601. int x,y;
  602. {
  603.     lastx = x;
  604.     lasty = height-y;
  605. }
  606.  
  607.  
  608. X11_vector(x,y)
  609. int x,y;
  610. {
  611.     XDrawLine(dis,win,gc, lastx, lasty, x, height -y );
  612.     XFlush(dis);
  613.  
  614.     lastx = x;
  615.     lasty = height-y;
  616. }
  617.  
  618.  
  619. X11_put_text(x,y,str)
  620. int x, y;
  621. char *str;
  622. {
  623.     XDrawString(dis,win,gc,x,height-y,str,strlen(str));
  624.     XFlush(dis);
  625. }
  626.  
  627. int X11_text_angle(ang)
  628. int ang;
  629. {
  630.     return FALSE;
  631. }
  632.  
  633. X11_reset()
  634. {
  635.     XDestroyWindow(dis,win);
  636. }
  637.  
  638. @EOF
  639.  
  640. chmod 666 X11.trm.mono
  641.  
  642. exit 0
  643.  
  644. dan
  645. ----------------------------------------------------
  646. O'Reilly && Associates   argv@sun.com / argv@ora.com
  647. Opinions expressed reflect those of the author only.
  648.