home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / perl / 5337 < prev    next >
Encoding:
Internet Message Format  |  1992-08-16  |  21.9 KB

  1. Path: sparky!uunet!europa.asd.contel.com!gatech!bloom-beacon!eru.mt.luth.se!lunic!sunic!mcsun!uknet!pyrltd!abigale!joel
  2. From: joel@abigale.uucp (Joel Rosi-Schwartz)
  3. Newsgroups: comp.lang.perl
  4. Subject: locsym - A program to locate undefined references
  5. Message-ID: <1992Aug.163742.18050@abigale.uucp>
  6. Date: 16 Aug 92 15:37:42 GMT
  7. Organization: Techne Research, Finchampstead, Berkshire (UK)
  8. Lines: 526
  9.  
  10. This is the firts beta release of locsym, but lets be honest about it,
  11. beta may be a bit optimistic ;-)
  12.  
  13. There is no manual yet and this code is for sure guaranteed *NOT* to
  14. be portable across platforms yet.  It probably could use a bunch of
  15. options (just so we feel good about loving Un*x). Error checking is
  16. minimal, but so far I do not see a real reason to clutter the code,
  17. but I am sure that you will find 100 reasons I'm over optimistic ;-)
  18.  
  19. What it does do is a task I have spent endless hours doing by hand.
  20. Ever go to compile a program off the net and have a bunch of:
  21.  
  22.     undefined               first referenced
  23.      symbol                     in file
  24.     superFunc                    ppp.o
  25.     ld fatal: Symbol referencing errors. No output written to ppp
  26.  
  27. Now don't be macho and lie ;-)
  28.  
  29. Well what I've always done is:
  30.     1. man superFunc
  31.         nope no page for that or the library is not listed ;-(
  32.     2. run for every lib dir
  33.         for lib in lib*.a
  34.         do
  35.             ar t $lib | egrep superFunc
  36.             echo $lib
  37.         done
  38.       
  39. Or some such nonsense. And yeh most of the time I would find what I was
  40. looking for, or firgue out I don't have it.
  41.  
  42. Well finally there is an easier way.  Just run mksymdb which will create
  43. a dbm database on all archives on your machine.  Then whenever you want
  44. to know where something is just say
  45.  
  46.     # locsym superFunc
  47.     superFunc: not found
  48.  
  49. but how about
  50.  
  51.     # locsym getcwd
  52.     getcwd:
  53.             /lib/libc.a
  54.             /usr/lib/libp/libc.a
  55.  
  56. or
  57.  
  58.     # locsym getcwd printf timezone
  59.  
  60.     getcwd:
  61.             /lib/libc.a
  62.             /usr/lib/libp/libc.a
  63.  
  64.     printf:
  65.             /lib/libc.a
  66.             /lib/libc_s.a
  67.             /usr/lib/libp/libc.a
  68.  
  69.     timezone:
  70.             /lib/libc.a
  71.             /usr/lib/libp/libc.a
  72.  
  73. or even
  74.  
  75.     # locsym ^[esf]printf
  76.  
  77.     eprintf:
  78.             /usr/local/lib/libparse.a
  79.  
  80.     sprintf:
  81.             /lib/libc.a
  82.             /lib/libc_s.a
  83.             /usr/lib/libp/libc.a
  84.  
  85.     fprintf:
  86.             /lib/libc.a
  87.             /lib/libc_s.a
  88.             /usr/lib/libp/libc.a
  89.  
  90.  
  91. Pretty nifty huh?
  92.  
  93. Here are the caveats. I built this on SCO Unix 3.2 and after looking
  94. at Larry's library extract code in Configure I figrue this is going
  95. to be real fun to get working on a bunch of platforms.  The hard part
  96. is going to be all of the different flags to "nm" and to handle the
  97. varous outputs from "nm".  Nothing else should be system dependent, but
  98. that is enough ;-(
  99.  
  100. I am will to take responsibility for maintaining this, but I do not
  101. have access to a bunch of different systems.  If you figure out what
  102. is need on your system, please send it back to me.  I will try to figure
  103. out how to put it all into one script that intellegently figures out
  104. what it needs to do.  Any suggestions towards this end and how to
  105. make this faster and more robust are much welcome.
  106.  
  107. I hope this is useful.  Use it in peace and good health.
  108.  
  109. Cheers,
  110. Joel
  111.  
  112.      ==================================================================
  113.      ||               T E C H N E   R E S E A R C H                  ||
  114.      ||  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ||
  115.      ||                     Joel Rosi-Schwartz                       ||
  116.      ||   Hildorien House            +   Email: joel@abigale.UUCP    ||
  117.      ||   12 Waverley Way            +    (pyrltd!abigale.UUCP!joel) ||
  118.      ||   Finchampstead, Wokingham   +   Phone: +44 (734) 730.260    ||
  119.      ||   Berkshire RG11 4YD (UK)    +   Fax:   +44 (734) 730.272    ||
  120.      ==================================================================
  121.  
  122. ---- cut here -----  snip/snip  -------------------------------------------
  123. #! /bin/sh
  124. # This is a shell archive.  Remove anything before this line, then unpack
  125. # it by saving it into a file and typing "sh file".  To overwrite existing
  126. # files, type "sh file -c".  You can also feed this as standard input via
  127. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  128. # will see the following message at the end:
  129. #        "End of archive 1 (of 1)."
  130. # Contents:  INSTALL MANIFEST locsym mksymdb
  131. # Wrapped by joel@abigale on Sun Aug 16 16:26:30 1992
  132. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  133. if test -f 'INSTALL' -a "${1}" != "-c" ; then 
  134.   echo shar: Will not clobber existing file \"'INSTALL'\"
  135. else
  136. echo shar: Extracting \"'INSTALL'\" \(393 characters\)
  137. sed "s/^X//" >'INSTALL' <<'END_OF_FILE'
  138. XNo big deal here.  The two things to look out for are the
  139. Xlocation of the symbols database and the list of directories
  140. Xwhich are parsed for libraries.  Not that the list of dirs is
  141. Xfor the "root" to start the search in, as I use find to pick
  142. Xup all of the libs below these points.  If you change the
  143. Xlocation of the database in "mksymdb" make sure to also change
  144. Xit in "locsym".
  145. X
  146. XCheers,
  147. Xjoel
  148. END_OF_FILE
  149. if test 393 -ne `wc -c <'INSTALL'`; then
  150.     echo shar: \"'INSTALL'\" unpacked with wrong size!
  151. fi
  152. # end of 'INSTALL'
  153. fi
  154. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  155.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  156. else
  157. echo shar: Extracting \"'MANIFEST'\" \(220 characters\)
  158. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  159. X   File Name        Archive #    Description
  160. X-----------------------------------------------------------
  161. X INSTALL                    1    
  162. X MANIFEST                   1    
  163. X locsym                     1    
  164. X mksymdb                    1    
  165. END_OF_FILE
  166. if test 220 -ne `wc -c <'MANIFEST'`; then
  167.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  168. fi
  169. # end of 'MANIFEST'
  170. fi
  171. if test -f 'locsym' -a "${1}" != "-c" ; then 
  172.   echo shar: Will not clobber existing file \"'locsym'\"
  173. else
  174. echo shar: Extracting \"'locsym'\" \(6676 characters\)
  175. sed "s/^X//" >'locsym' <<'END_OF_FILE'
  176. X#!/usr/local/bin/perl
  177. Xeval "exec /usr/local/bin/perl -S $0 $*"
  178. X    if $running_under_some_shell;
  179. X
  180. X  #          $Id: locsym,v 1.1 1992/08/16 14:30:26 joel Exp root $
  181. X  # ======================================================================== #
  182. X  #                                                                          #
  183. X  #  locsym and its sister program mksymdb attemts to handle the common      #
  184. X  #  progamming problem of finding which library or libraries contains       #
  185. X  #  the definition of a given symbol.  mksymdb needs only be run once to    #
  186. X  #  set up the dbm database (or, of course, if you change your libraries).  #
  187. X  #  After that to find a given function or extern definition is a quick     #
  188. X  #  look-up using locdb.                                                    #
  189. X  #                                                                          #
  190. X  #  This code is for sure not portable across systems at this point.  I've  #
  191. X  #  looked at Larry Wall's Configrue program to get an idea of what needs   #
  192. X  #  to be done to make it portable and only understand half of it (maybe;-) #
  193. X  #  Please send me any code towards this end and I will try to maintain     #
  194. X  #  this such that as many systems as possible work without kluges.         #
  195. X  #                                                                          #
  196. X  #  The sole purpose of the copyright is so I don't get sued and my soul ;-)#
  197. X  #  intention is that it should be as helpful and useful to as many folks   #
  198. X  #  as possible, without anyone trying to hoard it or claim it as their     #
  199. X  #  own.  Use it in peace and good health.                                  #
  200. X  #                                                                          #
  201. X  #  Suggestions, advice, bug reports and flames to:                         #
  202. X  #                                                                          #
  203. X  #        Joel Rosi-Schwartz                                                #
  204. X  #        Techne Research                                                   #
  205. X  #        The United Kingdom                                                #
  206. X  #        E-mail: joel@abigale.UUPC                                         #
  207. X  #        Or: uknet.ac.uk!pyrltd.uucp!abigale.uucp!joel                     #
  208. X  #        Phone: +44 734 730.260                                            #
  209. X  #        Fax: +44 734 730.272                                              #
  210. X  #                                                                          #
  211. X  # ======================================================================== #
  212. X
  213. X#
  214. X# How much noise do we want ;-)
  215. X#
  216. X$verbose = 0;
  217. X$quiet = 0;
  218. X$debug = 0;
  219. X
  220. X#
  221. X# Our symbols database.
  222. X#
  223. X$symdb = '/usr/local/etc/symdb';
  224. X%SYMDB = ();
  225. X
  226. X#
  227. X# Open up a existing symbols database.
  228. X#
  229. Xdbmopen (%SYMDB, $symdb, undef());
  230. X
  231. X#
  232. X# Loop over ARGV and find all the requested symbols.
  233. X# If the user hands us a regex, then we do a long
  234. X# search through the whole database, otherwise we
  235. X# do a quick lookup.
  236. X#
  237. X
  238. Xforeach $symbol (@ARGV) {
  239. X    if ( $symbol =~ /[*?+[{\\^]/) {
  240. X        $found = 0;
  241. X
  242. X        while (($key, $val) = each %SYMDB) {
  243. X            if ($key =~ /$symbol/) {
  244. X                @archives = split (' ', $val);
  245. X                if (@archives) {
  246. X                    $found = 1;
  247. X                    print "$key:\n";
  248. X                    foreach $archive (@archives) {
  249. X                        print "        $archive\n";
  250. X                    }
  251. X                    print "\n";
  252. X                }
  253. X            }
  254. X        }
  255. X
  256. X        print "$symbol: not found\n" unless $found;
  257. X    } else {
  258. X        @archives = split (' ', $SYMDB{$symbol});
  259. X        if (@archives) {
  260. X            print "$symbol:\n";
  261. X            foreach $archive (@archives) {
  262. X                print "        $archive\n";
  263. X            }
  264. X            print "\n";
  265. X        }
  266. X        else {
  267. X            print "$symbol: not found\n";
  268. X            print "\n";
  269. X        }
  270. X    }
  271. X}
  272. X
  273. X#
  274. X# And say bye
  275. X#
  276. Xdbmclose (SYMDB);
  277. Xexit 0;
  278. X
  279. X  #############################################################################
  280. X  #                                                                           #
  281. X  #  Copyright (c) 1992 Techne Research                                       #
  282. X  #  Copyright (c) 1992 Joel Rosi-Schwartz                                    #
  283. X  #  All rights reserved.                                                     #
  284. X  #                                                                           #
  285. X  #  Redistribution and use in source and binary forms, with or without       #
  286. X  #  modification, are permitted provided that the following conditions       #
  287. X  #  are met:                                                                 #
  288. X  #  1. Redistributions of source code must retain the above copyright        #
  289. X  #     notice, this list of conditions and the following disclaimer.         #
  290. X  #  2. Redistributions in binary form must reproduce the above copyright     #
  291. X  #     notice, this list of conditions and the following disclaimer in the   #
  292. X  #     documentation and/or other materials provided with the distribution.  #
  293. X  #  3. All advertising materials mentioning features or use of this software #
  294. X  #     must display the following acknowledgement:                           #
  295. X  #       This product includes software developed by the Techne Research     #
  296. X  #  4. The name of Techne Research may not be used to endorse or promote     #
  297. X  #     products derived from this software without specific prior written    #
  298. X  #     permission.                                                           #
  299. X  #                                                                           #
  300. X  #  THIS SOFTWARE IS PROVIDED BY THE TECHNE RESEARCH (UK) ``AS IS'' AND      #
  301. X  #  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE    #
  302. X  #  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR       #
  303. X  #  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL COMDISCO SYSTEMS INC BE       #
  304. X  #  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR      #
  305. X  #  CONSEQUENTIAL #  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT     #
  306. X  #  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR       #
  307. X  #  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,    #
  308. X  #  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE     #
  309. X  #  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,        #
  310. X  #  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                       #
  311. X  #                                                                           #
  312. X  # This copyright notice derived from material copyrighted by the Regents    #
  313. X  # of the University of California.                                          #
  314. X  #                                                                           #
  315. X  #############################################################################
  316. X
  317. X#
  318. END_OF_FILE
  319. if test 6676 -ne `wc -c <'locsym'`; then
  320.     echo shar: \"'locsym'\" unpacked with wrong size!
  321. fi
  322. chmod +x 'locsym'
  323. # end of 'locsym'
  324. fi
  325. if test -f 'mksymdb' -a "${1}" != "-c" ; then 
  326.   echo shar: Will not clobber existing file \"'mksymdb'\"
  327. else
  328. echo shar: Extracting \"'mksymdb'\" \(7997 characters\)
  329. sed "s/^X//" >'mksymdb' <<'END_OF_FILE'
  330. X#!/usr/local/bin/perl
  331. Xeval "exec /usr/local/bin/perl -S $0 $*"
  332. X    if $running_under_some_shell;
  333. X
  334. X  #          $Id: mksymdb,v 1.1 1992/08/16 14:30:26 joel Exp root $
  335. X  # ======================================================================== #
  336. X  #                                                                          #
  337. X  #   Copyright (c)       1992 by Techne Resarch                             #
  338. X  #   Copyright (c)       1992 by Joel Rosi-Schwartz                         #
  339. X  #   All Rights Reserved                                                    #
  340. X  #                                                                          #
  341. X  #   Full Copyright notice at bottom of file.                               #
  342. X  #                                                                          #
  343. X  #  mksymdb and its sister program locsym attemts to handle the common      #
  344. X  #  progamming problem of finding which library or libraries contains       #
  345. X  #  the definition of a given symbol.  mksymdb needs only be run once to    #
  346. X  #  set up the dbm database (or, of course, if you change your libraries).  #
  347. X  #  After that to find a given function or extern definition is a quick     #
  348. X  #  look-up using locdb.                                                    #
  349. X  #                                                                          #
  350. X  #  This code is for sure not portable across systems at this point.  I've  #
  351. X  #  looked at Larry Wall's Configrue program to get an idea of what needs   #
  352. X  #  to be done to make it portable and only understand half of it (maybe;-) #
  353. X  #  Please send me any code towards this end and I will try to maintain     #
  354. X  #  this such that as many systems as possible work without kluges.         #
  355. X  #                                                                          #
  356. X  #  The sole purpose of the copyright is so I don't get sued and my soul ;-)#
  357. X  #  intention is that it should be as helpful and useful to as many folks   #
  358. X  #  as possible, without anyone trying to hoard it or claim it as their     #
  359. X  #  own.  Use it in peace and good health.                                  #
  360. X  #                                                                          #
  361. X  #  Suggestions, advice, bug reports and flames to:                         #
  362. X  #                                                                          #
  363. X  #        Joel Rosi-Schwartz                                                #
  364. X  #        Techne Research                                                   #
  365. X  #        The United Kingdom                                                #
  366. X  #        E-mail: joel@abigale.UUPC                                         #
  367. X  #        Or: uknet.ac.uk!pyrltd.uucp!abigale.uucp!joel                     #
  368. X  #        Phone: +44 734 730.260                                            #
  369. X  #        Fax: +44 734 730.272                                              #
  370. X  #                                                                          #
  371. X  # ======================================================================== #
  372. X
  373. X#
  374. X# How much noise do we want ;-)
  375. X#
  376. X$verbose = 0;
  377. X$quiet = 0;
  378. X$debug = 0;
  379. X
  380. X#
  381. X# The root directories of all archives we will parse.
  382. X#
  383. X@libroots = (
  384. X    '/lib',
  385. X    '/usr/lib',
  386. X    '/usr/local/lib',
  387. X    );
  388. X
  389. X#
  390. X# The "nm" command which will create quickly parseable output.
  391. X#
  392. X$nmcmd = 'nm -p';
  393. X
  394. X#
  395. X# Our symbols database.
  396. X#
  397. X$symdb = '/usr/local/etc/symdb';
  398. X%SYMDB = ();
  399. X
  400. X#
  401. X# Save the sysmdb iff it exists, JIC.
  402. X#
  403. Xif ( -e "${symdb}.pag") {
  404. X    print STDERR "${symdb}.pag exists. Saving in ${symdb}.pag-\n"
  405. X        unless $quiet;
  406. X    rename ("${symdb}.pag", "${symdb}.pag-") ||
  407. X        die "Could not rename ${symdb}.pag: $!\n";
  408. X}
  409. X
  410. Xif ( -e "${symdb}.dir") {
  411. X    print STDERR "${symdb}.dir exists. Saving in ${symdb}.dir-\n"
  412. X        unless $quiet;
  413. X    rename ("${symdb}.dir", "${symdb}.dir-") ||
  414. X        die "Could not rename ${symdb}.dir: $!\n";
  415. X}
  416. X
  417. X#
  418. X# Open up a new one.
  419. X#
  420. Xdbmopen (%SYMDB, $symdb, 0666);
  421. X
  422. X#
  423. X# Gather up all of the ".a" files to parse.
  424. X# Note that the regex in find is "lib*.a", since I explicity
  425. X# want to avoid the Xenix [SML] libs.
  426. X#
  427. Xprint STDERR "Locating all archives, please be patient ..." unless $quiet;
  428. X@archives = `find @libroots -type f -name "lib*.a" -print`;
  429. Xprint STDERR " done\n" unless $quiet;
  430. X
  431. X#
  432. X# Okay, lets take a look.
  433. X# We open each archive in turn and add the archive name to
  434. X# the list for each externally visible symbol.
  435. X#
  436. Xforeach $archive (@archives) {
  437. X    %seen = ();        # to weed out duplicate symbols
  438. X    chop $archive;
  439. X    print STDERR "Processing $archive\n" unless $quiet;
  440. X    open (NMOUT, "$nmcmd $archive|");
  441. X
  442. X    while (<NMOUT>) {
  443. X        $symbol = '';
  444. X        chop;
  445. X        if (/^.*\s+[ATDS]\s+([^_.].*)/o) { $symbol = $1 };
  446. X        next unless $symbol;
  447. X        # weed out file names from shared libs
  448. X        next if $symbol =~ m=^/shlib/=o;
  449. X        # only one per archive, thank you
  450. X        next if $seen{$symbol}++;
  451. X        $SYMDB{$symbol} .= " $archive";
  452. X        print STDERR "$symbol: $SYMDB{$symbol}\n" if $verbose;
  453. X    }
  454. X}
  455. X
  456. X#
  457. X# And say bye
  458. X#
  459. Xdbmclose (SYMDB);
  460. Xprint STDERR "Processing complete\n" unless $quiet;
  461. Xexit 0;
  462. X
  463. X  #############################################################################
  464. X  #                                                                           #
  465. X  #  Copyright (c) 1992 Techne Research                                       #
  466. X  #  Copyright (c) 1992 Joel Rosi-Schwartz                                    #
  467. X  #  All rights reserved.                                                     #
  468. X  #                                                                           #
  469. X  #  Redistribution and use in source and binary forms, with or without       #
  470. X  #  modification, are permitted provided that the following conditions       #
  471. X  #  are met:                                                                 #
  472. X  #  1. Redistributions of source code must retain the above copyright        #
  473. X  #     notice, this list of conditions and the following disclaimer.         #
  474. X  #  2. Redistributions in binary form must reproduce the above copyright     #
  475. X  #     notice, this list of conditions and the following disclaimer in the   #
  476. X  #     documentation and/or other materials provided with the distribution.  #
  477. X  #  3. All advertising materials mentioning features or use of this software #
  478. X  #     must display the following acknowledgement:                           #
  479. X  #       This product includes software developed by the Techne Research     #
  480. X  #  4. The name of Techne Research may not be used to endorse or promote     #
  481. X  #     products derived from this software without specific prior written    #
  482. X  #     permission.                                                           #
  483. X  #                                                                           #
  484. X  #  THIS SOFTWARE IS PROVIDED BY THE TECHNE RESEARCH (UK) ``AS IS'' AND      #
  485. X  #  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE    #
  486. X  #  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR       #
  487. X  #  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL COMDISCO SYSTEMS INC BE       #
  488. X  #  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR      #
  489. X  #  CONSEQUENTIAL #  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT     #
  490. X  #  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR       #
  491. X  #  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,    #
  492. X  #  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE     #
  493. X  #  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,        #
  494. X  #  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                       #
  495. X  #                                                                           #
  496. X  # This copyright notice derived from material copyrighted by the Regents    #
  497. X  # of the University of California.                                          #
  498. X  #                                                                           #
  499. X  #############################################################################
  500. X
  501. X#
  502. END_OF_FILE
  503. if test 7997 -ne `wc -c <'mksymdb'`; then
  504.     echo shar: \"'mksymdb'\" unpacked with wrong size!
  505. fi
  506. chmod +x 'mksymdb'
  507. # end of 'mksymdb'
  508. fi
  509. echo shar: End of archive 1 \(of 1\).
  510. cp /dev/null ark1isdone
  511. MISSING=""
  512. for I in 1 ; do
  513.     if test ! -f ark${I}isdone ; then
  514.     MISSING="${MISSING} ${I}"
  515.     fi
  516. done
  517. if test "${MISSING}" = "" ; then
  518.     echo You have the archive.
  519.     rm -f ark[1-9]isdone
  520. else
  521.     echo You still need to unpack the following archives:
  522.     echo "        " ${MISSING}
  523. fi
  524. ##  End of shell archive.
  525. exit 0
  526. -- 
  527.      ==================================================================
  528.      ||               T E C H N E   R E S E A R C H                  ||
  529.      ||  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ||
  530.      ||                     Joel Rosi-Schwartz                       ||
  531.      ||   Hildorien House            +   Email: joel@abigale.UUCP    ||
  532.      ||   12 Waverley Way            +    (pyrltd!abigale.UUCP!joel) ||
  533.      ||   Finchampstead, Wokingham   +   Phone: +44 (734) 730.260    ||
  534.      ||   Berkshire RG11 4YD (UK)    +   Fax:   +44 (734) 730.272    ||
  535.      ==================================================================
  536.