home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume17 / xparty / part04 < prev    next >
Encoding:
Text File  |  1992-03-31  |  17.7 KB  |  585 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!zaphod.mps.ohio-state.edu!mips!msi!dcmartin
  3. From: peebles@mips.com (Andrew Peebles)
  4. Subject: v17i047: Xparty - multi-person conference call (MOTIF), Part04/04
  5. Message-ID: <1992Apr1.144224.4612@msi.com>
  6. Originator: dcmartin@snoopy
  7. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  8. Organization: Molecular Simulations, Inc.
  9. References: <csx-17i044-xparty@uunet.UU.NET>
  10. Date: Wed, 1 Apr 1992 14:42:24 GMT
  11. Approved: dcmartin@msi.com
  12.  
  13. Submitted-by: peebles@mips.com (Andrew Peebles)
  14. Posting-number: Volume 17, Issue 47
  15. Archive-name: xparty/part04
  16.  
  17. # this is part.04 (part 4 of a multipart archive)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file xmsg.icon continued
  20. #
  21. if test ! -r _shar_seq_.tmp; then
  22.     echo 'Please unpack part 1 first!'
  23.     exit 1
  24. fi
  25. (read Scheck
  26.  if test "$Scheck" != 4; then
  27.     echo Please unpack part "$Scheck" next!
  28.     exit 1
  29.  else
  30.     exit 0
  31.  fi
  32. ) < _shar_seq_.tmp || exit 1
  33. if test ! -f _shar_wnt_.tmp; then
  34.     echo 'x - still skipping xmsg.icon'
  35. else
  36. echo 'x - continuing file xmsg.icon'
  37. sed 's/^X//' << 'SHAR_EOF' >> 'xmsg.icon' &&
  38. X   0x30, 0x80, 0x18, 0x00, 0x0c, 0x01, 0x00, 0xd0, 0x40, 0x00, 0x00, 0x00,
  39. X   0x01, 0x00, 0xb0, 0x20, 0xfe, 0xff, 0x07, 0x01, 0x00, 0xe0, 0x22, 0x00,
  40. X   0x00, 0x00, 0x01, 0x00, 0xc0, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40,
  41. X   0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x0f, 0x63, 0x06, 0x33, 0x01,
  42. X   0x00, 0x00, 0x87, 0x73, 0x87, 0x3b, 0x01, 0x00, 0x00, 0x82, 0x31, 0x83,
  43. X   0x19, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x61,
  44. X   0x8c, 0x01, 0x00, 0x07, 0x00, 0x80, 0x70, 0xce, 0x01, 0x00, 0x07, 0x00,
  45. X   0x80, 0x30, 0xc6, 0x00, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
  46. X   0x07, 0x00, 0x20, 0x8c, 0x31, 0x00, 0x00, 0x07, 0x00, 0x20, 0xce, 0x39,
  47. X   0x00, 0x00, 0x07, 0x00, 0x10, 0xc6, 0x18, 0x00, 0x00, 0x07, 0x00, 0x08,
  48. X   0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07,
  49. X   0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xf8, 0xff, 0xff, 0xff,
  50. X   0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xc0, 0xff,
  51. X   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  52. X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  53. X   0x00, 0x00};
  54. SHAR_EOF
  55. echo 'File xmsg.icon is complete' &&
  56. chmod 0644 xmsg.icon ||
  57. echo 'restore of xmsg.icon failed'
  58. Wc_c="`wc -c < 'xmsg.icon'`"
  59. test 2264 -eq "$Wc_c" ||
  60.     echo 'xmsg.icon: original size 2264, current size' "$Wc_c"
  61. rm -f _shar_wnt_.tmp
  62. fi
  63. # ============= xparty.c ==============
  64. if test -f 'xparty.c' -a X"$1" != X"-c"; then
  65.     echo 'x - skipping xparty.c (File already exists)'
  66.     rm -f _shar_wnt_.tmp
  67. else
  68. > _shar_wnt_.tmp
  69. echo 'x - extracting xparty.c (Text)'
  70. sed 's/^X//' << 'SHAR_EOF' > 'xparty.c' &&
  71. #include <stdio.h>
  72. #include <Xm/Xm.h>
  73. #include <X11/cursorfont.h>
  74. X
  75. #include "xphone.h"
  76. #include "xmsg.icon";
  77. #include "list.bg";
  78. X
  79. Party    *parties[MAX_PARTIES];
  80. int    num_parties = 0;
  81. X
  82. PersonPtr    *people;
  83. int    num_people = 0;
  84. X
  85. XXtAppContext    xphone;
  86. X
  87. Boolean    LIST_WIDGETS = False;
  88. X
  89. static void xphone_exit()
  90. {
  91. X    exit(0);
  92. }
  93. X
  94. Display    *o_display;
  95. Widget    o_top, MakeOriginatorDisplay();
  96. Widget    o_toplevel;
  97. char    *progname;
  98. X
  99. /*
  100. X * command line and non-widget resources
  101. X */
  102. static XrmOptionDescRec cmd_options[] = {
  103. X  {"-iconic",    ".iconic",     XrmoptionNoArg,        "True"},
  104. X  {"-response",    ".response",    XrmoptionSepArg,    "yes\nno\nget back to you ..."},
  105. };
  106. X
  107. main(argc,argv)
  108. int    argc;
  109. char    *argv[];
  110. {
  111. X        int i, n;
  112. X    extern void PassToken();
  113. X    char title[128];
  114. X    char *userName = (char*)getenv("USER");
  115. X    char        **margv;
  116. X    int        margc;
  117. X    static XtActionsRec actionsList[] = {
  118. X        { "PassToken", PassToken },
  119. X    };
  120. X    Pixmap    icon_pixmap;
  121. X    XWMHints wmhints;
  122. X    void Errors();
  123. X    Arg args[5];
  124. X
  125. X    progname = argv[0];
  126. X
  127. X    if ((argc == 2) && (strcmp(argv[1],"-l") == 0))
  128. X      LIST_WIDGETS = True;
  129. X
  130. X    margc = argc;
  131. X    margv = (char **) XtMalloc (margc*sizeof(char *));
  132. X    for (n=0; n<margc; n++)
  133. X      margv[n] = strdup (argv[n]);
  134. X
  135. X
  136. X    XtToolkitInitialize();
  137. X    xphone = XtCreateApplicationContext();
  138. X
  139. X    XSetErrorHandler (Errors);
  140. X    
  141. X    XtAppAddActions(xphone, actionsList, XtNumber(actionsList));
  142. X
  143. X    o_display = XtOpenDisplay (xphone,
  144. X                   NULL,
  145. X                   "xparty",
  146. X                   "XParty",
  147. X                   cmd_options, XtNumber(cmd_options),
  148. X                   &argc, argv);
  149. X    if (!o_display) {
  150. X      fprintf (stderr,"Can't open local display.\n");
  151. X      exit (1);
  152. X    }
  153. X
  154. X    CreateAndInstallPixmap (list_bits,
  155. X                list_width,
  156. X                list_height,
  157. X                "list_bg");
  158. X
  159. X    o_top = MakeOriginatorDisplay (o_display);
  160. X
  161. X    num_parties = 1;
  162. X
  163. X    XtPopup (o_top, XtGrabNone); 
  164. X
  165. X    /*
  166. X     * A new one for me, supply a default icon in case the user doesn't
  167. X     */
  168. X    icon_pixmap = XCreateBitmapFromData (XtDisplay(o_top),
  169. X                         XtWindow(o_top),
  170. X                         xmsg_bits, xmsg_width, 
  171. X                         xmsg_height);
  172. X    wmhints.icon_pixmap = icon_pixmap;
  173. X    wmhints.flags = IconPixmapHint;
  174. X
  175. X    XSetWMHints (XtDisplay(o_top), XtWindow(o_top), &wmhints);
  176. X
  177. X
  178. X        while(1) {
  179. X      XEvent  event;
  180. X      XtAppNextEvent(xphone, &event);
  181. X      XtDispatchEvent(&event);
  182. X    }
  183. }
  184. X
  185. X
  186. void
  187. Errors (ctx, name, type, class, ddefault, params, num)
  188. XXtAppContext ctx;
  189. char    *name, *type, *class, *ddefault, **params;
  190. int    *num;
  191. {
  192. X  /*
  193. X   * Although very dangerous and perhaps not very
  194. X   * portable, this routine exists as a sink for
  195. X   * the mouse cursor problem associated w/ bringing
  196. X   * widget trees up on another display.  I tried
  197. X   * to get around it, but I still get a Protocol
  198. X   * Error, Bad Cursor no matter what I tried.
  199. X   */
  200. }
  201. X
  202. #ifndef SYSV
  203. char *strdup (str)
  204. {
  205. X  char    *p;
  206. X
  207. X  if (!str) return NULL;
  208. X
  209. X  p = (char *) malloc (strlen(str) + 1);
  210. X  strcpy (p, str);
  211. X  return p;
  212. }
  213. #endif
  214. SHAR_EOF
  215. chmod 0644 xparty.c ||
  216. echo 'restore of xparty.c failed'
  217. Wc_c="`wc -c < 'xparty.c'`"
  218. test 2811 -eq "$Wc_c" ||
  219.     echo 'xparty.c: original size 2811, current size' "$Wc_c"
  220. rm -f _shar_wnt_.tmp
  221. fi
  222. # ============= xparty.man ==============
  223. if test -f 'xparty.man' -a X"$1" != X"-c"; then
  224.     echo 'x - skipping xparty.man (File already exists)'
  225.     rm -f _shar_wnt_.tmp
  226. else
  227. > _shar_wnt_.tmp
  228. echo 'x - extracting xparty.man (Text)'
  229. sed 's/^X//' << 'SHAR_EOF' > 'xparty.man' &&
  230. .\";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  231. .\"
  232. .\" File:         xparty.1
  233. .\" RCS:          $Header$
  234. .\" Description:  man page for xparty
  235. .\" Author:      Andrew Peebles
  236. .\" Created:      Jan. 24, 1990
  237. .\" Modified:
  238. .\" Language:     Text
  239. .\" Package:      xparty
  240. .\"
  241. .\";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  242. .TH XPHONE 1 "" "Internal Tools"
  243. .ad b
  244. X
  245. .SH NAME
  246. xparty \- multi-user/multi-display communication utility
  247. X
  248. .SH SYNOPSIS
  249. .br
  250. \fBxparty\fP [ \-toolkit options ]
  251. X
  252. .SH DESCRIPTION
  253. \fIxparty\fP is a Motif-based X windows utility that allows multiple
  254. users on different displays to hold a ``conference call''.  It takes
  255. after talk and xtalk, but allows more that two people to hold a
  256. conversation.  It also allows static messages to be sent to remote
  257. displays.
  258. X
  259. When \fIxparty\fP is invoked, the invoking user sees the ``originator''
  260. screen.  When the originator initiates a conversation, users on the remote
  261. displays see the ``party'' screen.  Both screen organizations are described
  262. in this document.
  263. X
  264. .SH Originator Screen
  265. When \fIxparty\fP is invoked, the screen that comes up is the ``originator''
  266. screen.  The originator has responcibility for initiating conversations
  267. and has certain powers over the course of the conversation that remote
  268. users don't have.  The originator can also send static messages (one-way
  269. calls) to remote displays.
  270. X
  271. When \fIxparty\fP comes up, it looks for a file in the calling user's
  272. $HOME directory called ``.xmsg_hosts''.  This file contains the ``phone
  273. directory'', a list of name/display pairs to which messages can be sent
  274. and conversations directed.  If the file does not exist, \fIxparty\fP
  275. will create one and initialize it with the calling user's user name
  276. and display name.  The user name is taken from the $USER environment
  277. variable.  See the \fBPhone List\fP section below for the structure
  278. of this file.
  279. X
  280. The labels contained in the phone list are displayed next to toggle
  281. buttons on the originator display.  Also on this screen is a set of
  282. command buttons for initiating calls, hanging up the phone, sending
  283. messages, and adding to the phone list.  These commands are described
  284. below.
  285. X
  286. There are also two text windows.  The top window displays the text
  287. that remote users are typing during xparty conversations.  The lower window
  288. is the window in which you type your side of the conversation.  The
  289. lower window is also used to compose a static message before sending it
  290. to a remote user.
  291. X
  292. And lastly, there is a buffer that displays people that are ``on the air''
  293. during interactive conversations.
  294. X
  295. .SH Party Screen
  296. When a conversation is initiated, a remote user who is part of the conversation
  297. sees the ``party screen''.  This screen is a sub-set of the originator
  298. screen, and contains only the two text windows for sending and recieving
  299. text.  It also has a button for hanging up the phone, and one for poping
  300. up a window that shows who is on the party line.
  301. X
  302. .SH Making a Call
  303. To initiate a conversation, the originator can click on a set of the
  304. toggle buttons corresponding to people in the phone list.  Each person
  305. who's button was clicked will have a small window displayed on thier
  306. screen that has the message:
  307. .sp
  308. X    "Collect call from <originator>,
  309. .br
  310. X     will you accept the charges?"
  311. .br
  312. X
  313. and an ``OK'' and ``NO'' button.  If the remote user is not at the display,
  314. or pushes the ``NO'' button, the originator is informed that that person
  315. is not answering the phone.  If the remote user pushes the ``OK'' button,
  316. that person is added to the conversation and thier name appears in the
  317. ``on the air'' buffer in the originator screen.  The remote user is
  318. then presented with the party screen and the conversation begins.
  319. X
  320. .SH Carrying on a Conversation
  321. \fIXparty\fP organizes the conversation with the use of a ``token ring''.
  322. One person at a time is assigned the token and can speak.  When that
  323. person is finished speaking, he or she can pass the token to the next
  324. person on the line.  The token is passed by hitting the \fItoken\fP key
  325. on the keyboard.  The \fItoken\fP key is F3 by default, but can be configured
  326. to be any key or key combination in the user's resource file (see below).
  327. The token can be directed at a particular person on the
  328. line by selecting that person's name in the ``on the air'' buffer
  329. before hitting the token key.  Persons on the remote displays also have this capability
  330. using the ``line'' popup on thier screens.  This approach was taken
  331. because of the multi-user capability of xparty.  Any other method would
  332. quickly lead to confusion.  Each display also contains two status lines,
  333. the line at the top of the display shows who is currently speaking.  The
  334. status line at the bottom shows whether or not that person has the token.
  335. When a conversation begins, the originator starts out with the token.
  336. X
  337. .SH Command Buttons
  338. There are command buttons on both the originator and party screens.  Thier
  339. use is described here.
  340. X
  341. .SS Originator Command Buttons
  342. .sp
  343. .B Dial
  344. .sp
  345. X    This button is used to initiate a conversation.  First
  346. X    a set of recipients are selected from the phone list
  347. X    toggle buttons.  Then the \fBDial\fP button is pressed
  348. X    to begin.  Each selected person will get the ``collect
  349. X    call'' screen, and if they answer the phone, the party
  350. X    screen.
  351. .br
  352. .LP
  353. X
  354. .B Hangup
  355. .sp
  356. X    This button is used when a call is initiated and no
  357. X    one answers.  When this happens, the phone is ``off
  358. X    the hook'' and must be placed back on the hook before
  359. X    any other action is taken.  
  360. .br
  361. .LP
  362. X
  363. .B Jerk
  364. .sp
  365. X    Use this button to grab the token.  Only the originator
  366. X    has this capability.  When someone is hogging the token
  367. X    don't hesitate to use the \fBJerk\fP button.  Its only 
  368. X    fair to others on the line.  The button name has some 
  369. X    interesting conotations ...
  370. .br
  371. .LP
  372. X
  373. .B Add R
  374. .sp
  375. X    This button is used to add new people to the phone 
  376. X    list.  A small popup window appears and you are 
  377. X    prompted to enter a name/display pair.  See \fBPhone List\fP 
  378. X    section below for the format of this entry.
  379. .br
  380. .LP
  381. X
  382. .B Quit
  383. .sp
  384. X    Exit \fIxparty\fP.  This button can be pressed during
  385. X    conversations, so don't use it then unless the 
  386. X    conversation is really getting out of hand.  The remote 
  387. X    party windows will die as well as the originator 
  388. X    screen.
  389. .br
  390. .LP
  391. X
  392. .B Clear
  393. .sp
  394. X    This button will clear both the text windows.  Use this
  395. X    button between conversations to clean up.  Gotta be 
  396. X    neat ...
  397. .br
  398. .LP
  399. X
  400. .B One Way
  401. .sp
  402. X    This is a toggle button.  When pressed in, the \fBDial\fP
  403. X    button label is changed to \fBSend\fP and you may compose 
  404. X    a message in the lower text window to send to remote 
  405. X    displays.  When pushed out, xparty is ready for multi-
  406. X    person interactive conversations.
  407. .br
  408. .LP
  409. X
  410. .SS Party Command Buttons
  411. .sp
  412. .B Hangup
  413. .sp
  414. X    Push this button when you're finished with the 
  415. X    conversation.  This will cause the party screen to 
  416. X    disappear and that person withdrawn from the party 
  417. X    line.  Anybody else on the line is not effected, except 
  418. X    they will see you disappear from the ``on the air'' 
  419. X    buffers.  When the last person on the line hangs up, 
  420. X    the originator screen automatically goes off the hook.
  421. .br
  422. .LP
  423. X
  424. .B Line
  425. .sp
  426. X    When this button is pressed, a small window is poped
  427. X    up to display the list of people currently on the line.
  428. X    The token can be directed by selecting a person from
  429. X    this list before hitting the F3 token passing key.
  430. X    When others hang up from the conversation, they
  431. X    are removed from this list.
  432. .br
  433. .LP
  434. X
  435. .SH Phone List
  436. The phone list, or the list of possible recipients for messages
  437. and conversations, is kept in the user's $HOME/.xmsh_hosts file.
  438. This file can be edited with normal text editors or created from
  439. within xparty using the \fBAdd R\fP button.  This file contains
  440. a single line per recipient, with the following format:
  441. .sp
  442. X    <label>@<display>
  443. .br
  444. X
  445. The <label> is arbitrary and is displayed on the originator screen
  446. next to a toggle button for selection.  The <display> is the X display
  447. where this person usually does work.  It is a full X display name
  448. specification:
  449. .sp
  450. X    <host>:0  -or-
  451. .br
  452. X    <host>:0.0
  453. .br
  454. X
  455. For example, for the user's Andrew Peebles and Mike Dove, at displays
  456. ling:0 and phred:0 respectivly:
  457. .sp
  458. X    Andrew@ling:0
  459. .br
  460. X    Mike Dove@phred:0
  461. .br
  462. X
  463. would be the proper lines to have in the phone list file.  This same
  464. format is used when entering a new recipient in the \fBAdd R\fP popup
  465. window.
  466. X
  467. .SH OPTIONS
  468. \fIxparty\fP understands the usual X toolkit options.  As you are 
  469. most likely aware of, Motif applications can contain many widgets,
  470. each with many possible resources to set.  \fIxparty\fP has a 
  471. special option to assist you in building interesting resource files.
  472. If you invoke \fIxparty\fP with a ``-l'' option, it will dump its
  473. internal widget hierarchy to stdout.  Use this information to
  474. build your resource files.  (How's this for a unique punt?).
  475. X
  476. Also, the token key or key combination can be set with the following
  477. resource:
  478. .sp
  479. X    xparty.tokenKey:    \fIkey translation\fP: PassToken()
  480. .br
  481. X
  482. where \fIkey translation\fP is a legal keyboard translation specification.
  483. For example, to use Control-t (the control key and `t' key together)
  484. the resource would look like:
  485. .sp
  486. X    xparty.tokenKey:    Ctrl<Key>t: PassToken()
  487. .br
  488. X
  489. The default is `<Key>F3'.
  490. X
  491. .SH FILES
  492. .nf
  493. .ta \w'/usr/local/bin/prog/config   'u
  494. $HOME/.xmsg_hosts    The phone list file
  495. .fi
  496. X
  497. .SH BUGS
  498. Dynamic resizing due to adding new recipients may not always work the
  499. way you'd like.  If the screen gets wierd, quit and re-invoke xparty
  500. and the screen will again look normal.  Its those *bleep* forms ...
  501. X
  502. .SH AUTHOR
  503. Andrew Peebles, MIPS Computer Systems.
  504. X
  505. SHAR_EOF
  506. chmod 0644 xparty.man ||
  507. echo 'restore of xparty.man failed'
  508. Wc_c="`wc -c < 'xparty.man'`"
  509. test 9608 -eq "$Wc_c" ||
  510.     echo 'xparty.man: original size 9608, current size' "$Wc_c"
  511. rm -f _shar_wnt_.tmp
  512. fi
  513. # ============= xphone.h ==============
  514. if test -f 'xphone.h' -a X"$1" != X"-c"; then
  515.     echo 'x - skipping xphone.h (File already exists)'
  516.     rm -f _shar_wnt_.tmp
  517. else
  518. > _shar_wnt_.tmp
  519. echo 'x - extracting xphone.h (Text)'
  520. sed 's/^X//' << 'SHAR_EOF' > 'xphone.h' &&
  521. /*
  522. X * xphone.h
  523. X *
  524. X * Data structures for the parties on the line
  525. X */
  526. #include "patchlevel.h"
  527. X
  528. #define MAX_PARTIES 10
  529. X
  530. typedef struct _party {
  531. X  Display    *display;    /* the display */
  532. X  char        *hostname;    /* the hostname of the display */
  533. X  char        *username;    /* user name on display */
  534. X  Boolean    token;        /* True if this party has the token */
  535. X  Boolean    dead;        /* True if hung up */
  536. X  Widget    top;        /* popup shell for party */
  537. X  Widget    box;        /* vpaned Widget ID */
  538. X  Widget    talking;    /* shows person currently talking */
  539. X  Widget    status;        /* status line on typing window */
  540. X  Widget    send;        /* Widget ID of this party's send window */
  541. X  Widget    recv;        /* Widget ID of this party's recieve window */
  542. X  Widget    list;        /* Widget ID of list of parties on the air */
  543. X  Boolean    list_posted;    /* true if the list is visible */
  544. } Party;
  545. X
  546. extern Party    *parties[];
  547. extern int    num_parties;
  548. extern XtAppContext xphone;
  549. extern Boolean    LIST_WIDGETS;
  550. X
  551. /*
  552. X * parties[0] will always contain the originator, and will have control
  553. X * over the token first.  When he `passes the token' the next party in
  554. X * the array will be talking, and so on.  When a party hangs up, the
  555. X * token will pass over them.
  556. X */
  557. X
  558. Party *XpCreateParty();
  559. X
  560. typedef struct _person {
  561. X  char    *name;
  562. X  char    *host;
  563. X  Widget btn;
  564. } Person, *PersonPtr;
  565. X
  566. extern    PersonPtr    *people;
  567. extern    int        num_people;
  568. extern    char        *strtok(), *strdup();
  569. SHAR_EOF
  570. chmod 0644 xphone.h ||
  571. echo 'restore of xphone.h failed'
  572. Wc_c="`wc -c < 'xphone.h'`"
  573. test 1373 -eq "$Wc_c" ||
  574.     echo 'xphone.h: original size 1373, current size' "$Wc_c"
  575. rm -f _shar_wnt_.tmp
  576. fi
  577. rm -f _shar_seq_.tmp
  578. echo You have unpacked the last part
  579. exit 0
  580. -- 
  581. --
  582. Molecular Simulations, Inc.            mail: dcmartin@msi.com
  583. 796 N. Pastoria Avenue                uucp: uunet!dcmartin
  584. Sunnyvale, California 94086            at&t: 408/522-9236
  585.