home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / alt / sources / 2598 < prev    next >
Encoding:
Text File  |  1992-11-20  |  15.8 KB  |  690 lines

  1. Newsgroups: alt.sources
  2. Path: sparky!uunet!mcsun!Germany.EU.net!logixwi!jpm
  3. From: jpm@Logix.DE (Jan-Piet Mens)
  4. Subject: genincl - Generate header files from NLS message files
  5. Organization: Logix GmbH, Wiesbaden, Germany
  6. Date: Sat, 21 Nov 1992 13:12:28 GMT
  7. Message-ID: <1992Nov21.131228.17114@Logix.DE>
  8. Lines: 680
  9.  
  10. Submitted-by: jpm@Logix.DE
  11. Archive-name: GENINCL/part01
  12.  
  13.  
  14. genincl is a tool that takes an NLS (Native Language Support) source message
  15. file, and generates an include file for C programs, to access the message
  16. more-or-less readable method. Genincl also builds code for environments in
  17. which the NLS routines do not exist.
  18.  
  19.     -JP
  20.  
  21. ---- Cut Here and feed the following to sh ----
  22. #!/bin/sh
  23. # This is GENINCL, a shell archive (produced by shar 3.49)
  24. # To extract the files from this archive, save it to a file, remove
  25. # everything above the "!/bin/sh" line above, and type "sh file_name".
  26. #
  27. # made 11/21/1992 13:11 UTC by jpm@Logix.DE
  28. # Source directory /home/jpm/src/genincl
  29. #
  30. # existing files will NOT be overwritten unless -c is specified
  31. #
  32. # This shar contains:
  33. # length  mode       name
  34. # ------ ---------- ------------------------------------------
  35. #    777 -rw-r----- README
  36. #    518 -rw-r----- Makefile
  37. #   4891 -rwxr-x--x genincl
  38. #   5267 -rw-r----- genincl.1
  39. #    240 -rw-r----- gt.m
  40. #    396 -rw-r----- gt.c
  41. #
  42. # ============= README ==============
  43. if test -f 'README' -a X"$1" != X"-c"; then
  44.     echo 'x - skipping README (File already exists)'
  45. else
  46. echo 'x - extracting README (Text)'
  47. sed 's/^X//' << 'SHAR_EOF' > 'README' &&
  48. genincl is a tool that takes an NLS (Native Language Support) source message
  49. file, and generates an include file for C programs, to access the message
  50. more-or-less readable method. Genincl also builds code for environments in
  51. which the NLS routines do not exist.
  52. X
  53. This archive contains the GENINCL program, as well as a small test program.
  54. X
  55. Installation:
  56. =============
  57. X    You may have to modify genincl to set the AWK= variable to your
  58. X    favorate awk interpreter.
  59. X    If you don't like the name of the message-macro (nlm), search for
  60. X    "macro=" in genincl and change the word.
  61. X
  62. Testing:
  63. X    Just type make to compile the program.
  64. X
  65. [ Don't forget to set your NLSPATH environment before testing the program ]
  66. X
  67. X    $ NLSPATH=`pwd`/%N.cat
  68. X    $ export NLSPATH
  69. X    $ ./gt
  70. X
  71. X
  72. Jan-Piet Mens
  73. jpm@Logix.DE
  74. SHAR_EOF
  75. chmod 0640 README ||
  76. echo 'restore of README failed'
  77. Wc_c="`wc -c < 'README'`"
  78. test 777 -eq "$Wc_c" ||
  79.     echo 'README: original size 777, current size' "$Wc_c"
  80. fi
  81. # ============= Makefile ==============
  82. if test -f 'Makefile' -a X"$1" != X"-c"; then
  83.     echo 'x - skipping Makefile (File already exists)'
  84. else
  85. echo 'x - extracting Makefile (Text)'
  86. sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
  87. CC=cc
  88. CFLAGS=-O -I.
  89. GENINCL=genincl
  90. X
  91. # Installation Directory
  92. BINDIR=/u/local/bin
  93. X
  94. all: catalogue gt
  95. X
  96. catalogue: gt.cat 
  97. X
  98. gt: gt.o
  99. X    $(CC) $(CFLAGS) -o $@ $?
  100. gt.o: gt.c gt.h
  101. X
  102. gt.h: gt.m
  103. X    $(GENINCL) gt.m
  104. X
  105. gt.cat: gt.m
  106. X    gencat -m gt.cat gt.m
  107. X
  108. clean:
  109. X    rm -f *.o core a.out gt.h gt.cat gt
  110. clobber: clean
  111. X
  112. install: genincl
  113. X    cp genincl $(BINDIR)
  114. X    chmod 555 $(BINDIR)/genincl
  115. X
  116. SHARFILES=README Makefile genincl genincl.1 gt.m gt.c
  117. X
  118. dist: $(SHARFILES)
  119. X    shar49 -n GENINCL -a -s 'jpm@Logix.DE' -o Part -l 50 -c \
  120. X        $(SHARFILES) 
  121. SHAR_EOF
  122. chmod 0640 Makefile ||
  123. echo 'restore of Makefile failed'
  124. Wc_c="`wc -c < 'Makefile'`"
  125. test 518 -eq "$Wc_c" ||
  126.     echo 'Makefile: original size 518, current size' "$Wc_c"
  127. fi
  128. # ============= genincl ==============
  129. if test -f 'genincl' -a X"$1" != X"-c"; then
  130.     echo 'x - skipping genincl (File already exists)'
  131. else
  132. echo 'x - extracting genincl (Text)'
  133. sed 's/^X//' << 'SHAR_EOF' > 'genincl' &&
  134. #!/bin/sh
  135. # @(#)GENINCL Generate .h file from NLS message base. <jpm@Logix.DE>
  136. # Copyright Jan-Piet Mens, Logix GmbH, Wiesbaden, Germany
  137. # All rights reserved.
  138. #
  139. # ------------ CONFIGURATION SECTION -------------------------------------------
  140. X
  141. AWK=nawk    # The name of your ``awk'' interpreter (awk, nawk, gawk, mawk)
  142. MACRO=nlm    # The name of the macro for accessing messages
  143. ext=".m"    # Deflt input-filename extension (Should be left alone)
  144. X
  145. # ------------ END CONFIGURATION SECTION ---------------------------------------
  146. X
  147. tmpfile="/tmp/gen-i.$$"
  148. trap "rm -f ${tmpfile};" 1 2 15
  149. usage() {
  150. X    cat <<! >&2
  151. Usage: $0 [-h] [-f] [-o includefile] [-d dir] msgfile${ext}
  152. X
  153. X    -h        Show this message
  154. X    -o file        Write output into file (default is <msgfile>.h)
  155. X            If file is -, write to stdout
  156. X    -d dir        Output file will be written to <dir>
  157. X    -f        Force. Create output even if unchanged
  158. X    -v        Show version
  159. X    <msgfile>${ext}    Message file (as for gencat(1))
  160. !
  161. X    exit 9
  162. }
  163. X
  164. kopy() {
  165. X    if cp $1 $2 >/dev/null 2>&1 ; then
  166. X        :
  167. X    else
  168. X        echo "$0: Can't create output file [$2]" >&2
  169. X        rm -f ${tmpfile}
  170. X        exit 8
  171. X    fi
  172. }
  173. X
  174. output=""
  175. directory="."
  176. force=""
  177. X
  178. while getopts "fd:vho:" c
  179. do
  180. X    case "$c" in
  181. X        f)    force=TRUE;;
  182. X        d)    directory="$OPTARG";;
  183. X        o)    output="$OPTARG";;
  184. X        h)    usage;;
  185. X        v)    echo "GENINCL 1.2 by Jan-Piet Mens"; exit 0 ;;
  186. X        \?)    usage;;
  187. X    esac
  188. done
  189. shift `expr $OPTIND - 1`
  190. [ $# -ne 1 ] && { usage ; }
  191. X
  192. if [ ! -d "${directory}" ] ; then
  193. X    echo "$0: [${directory}] is not a directory" >&2
  194. X    exit 3
  195. fi
  196. X
  197. msgfile="`basename $1 ${ext}`"
  198. msgfile="${msgfile}${ext}"
  199. if [ ! -f "${msgfile}" ] ; then
  200. X    echo "$0: Can't open file [${msgfile}]" >&2
  201. X    exit 2
  202. fi
  203. if [ -z "${output}" ] ; then
  204. X    output="${directory}/`basename ${msgfile} ${ext}`.h"
  205. fi
  206. X
  207. #
  208. # This is what our message file looks like:
  209. #
  210. #    $set 1 Main_Program
  211. #    $ HelloWorld
  212. #    1 Hello World, how are you ?
  213. #    $ Tilton
  214. #    2 Bye bye Charlene
  215. #    
  216. #    $ comment
  217. #    $ comment
  218. #    $set 2 IO_errors
  219. #    $ Enoent
  220. #    3 File not found
  221. #    $ NoHost
  222. #    4 Can't access host [%s]
  223. #
  224. X
  225. # Output conditional code at the top of the .h file for
  226. # definition of the access-macro to messages. Take into
  227. # account, that the output may not be processed by an
  228. # ANSI compiler
  229. X
  230. cat <<!--end--  > ${tmpfile}
  231. /* This file was generated automagically from ${msgfile}
  232. X * Any modifications made here may disappear
  233. X * Change the source and re-run $0
  234. X */
  235. X
  236. #ifndef NO_NLS
  237. #    ifndef ${MACRO}
  238. #    include <nl_types.h>
  239. X
  240. X    extern char *catgets();
  241. X    extern nl_catd catopen();
  242. #    if defined(__STDC__)
  243. #        define ${MACRO}(set, mno) catgets(cat, (set), (mno), mno##_DFLT)
  244. #    else
  245. #        define ${MACRO}(set, mno) catgets(cat, (set), (mno), mno/**/_DFLT)
  246. #    endif /* __STDC__ */
  247. #    endif /* ${MACRO} */
  248. #else /* NO_NLS */
  249. #    define nl_catd int
  250. #    define catopen(a, b) 0
  251. #    define catclose(a)    /* nothing */
  252. #    if defined(__STDC__)
  253. #        define ${MACRO}(set, mno)    mno##_DFLT
  254. #    else
  255. #        define ${MACRO}(set, mno)    mno/**/_DFLT
  256. #    endif /* __STDC__ */
  257. #endif /* NO_NLS */
  258. !--end--
  259. ${AWK} '
  260. BEGIN    {
  261. X        token="Identifier_missing_in_input_file"
  262. X    }
  263. X
  264. X    # A '$set' at the begin of line specifies a SET. Get the number,
  265. X    # and output a define for it.
  266. X    # All other "$xxx" we ignore ...
  267. X
  268. X    /^\$[^ ]/ {
  269. X        if ($1 == "$set") {
  270. X            if ($3 == "") {
  271. X                printf("#error Set number %d has no name in %s\n", $2, FILENAME);
  272. X            } else {
  273. X                printf("\n#define %sSet    (%d)\n", $3, $2)
  274. X            }
  275. X        }
  276. X        continue;
  277. X    }
  278. X    
  279. X    # If we have a "$ " (dollar-space), it is a comment in the messages
  280. X    # input file. Use the first word after the comment as a define for
  281. X    # the message, whose number appears next.
  282. X
  283. X    /^\$ /        {
  284. X                token=$2
  285. X                next
  286. X            }
  287. X
  288. X    # If we have a number followed by one space, it is a message.
  289. X    # Use the last token we found, and build a #define for it.
  290. X    # Then clear the token, so that we can introduce an error if the
  291. X    # author of the message file forgot to create a "$ token" input
  292. X    # line
  293. X    # For each token we define, we will also define a token_DFLT containing
  294. X    # the default message for catgets(3)
  295. X
  296. X    /^[0-9][0-9]* / {
  297. X                mno=$1
  298. X                $1=""
  299. X                txt=$0
  300. X                sub("^[     ][     ]*", "", txt);
  301. X                printf("#define %s (%d) \n", token, mno);
  302. X                printf("#define %s_DFLT \"%s\"\n", token, txt);
  303. X                token="Identifier_missing_in_input_file"
  304. X            }
  305. X        
  306. ' ${msgfile}  >> ${tmpfile}
  307. X
  308. # Should the output go to standard out ?
  309. X
  310. if [ "${output}" = "-" ] ; then
  311. X    cat ${tmpfile}
  312. X    rm -f ${tmpfile}
  313. X    exit 0
  314. fi
  315. X
  316. # If our temporary output does not differ from the already present .h file,
  317. # then we don't copy. This enables us to use the whole thing in a Makefile.
  318. # This may be overridden by the -f (force) flag
  319. X
  320. if [ "${force}" = "TRUE" ] ; then
  321. X    kopy ${tmpfile} ${output}
  322. else
  323. X    if cmp ${tmpfile} ${output} >/dev/null 2>&1 ; then
  324. X        :
  325. X    else
  326. X        kopy ${tmpfile} ${output}
  327. X    fi
  328. fi
  329. X
  330. # If we are called from make, we must touch the output file. This should
  331. # not be done though, if we call directly from the shell.
  332. X
  333. if [ -n "${MAKE}" -o -n "${MAKEFLAGS}" ] ; then
  334. X    :
  335. else
  336. X    touch ${output}
  337. fi
  338. rm -f ${tmpfile}
  339. X
  340. Xexit 0
  341. SHAR_EOF
  342. chmod 0751 genincl ||
  343. echo 'restore of genincl failed'
  344. Wc_c="`wc -c < 'genincl'`"
  345. test 4891 -eq "$Wc_c" ||
  346.     echo 'genincl: original size 4891, current size' "$Wc_c"
  347. fi
  348. # ============= genincl.1 ==============
  349. if test -f 'genincl.1' -a X"$1" != X"-c"; then
  350.     echo 'x - skipping genincl.1 (File already exists)'
  351. else
  352. echo 'x - extracting genincl.1 (Text)'
  353. sed 's/^X//' << 'SHAR_EOF' > 'genincl.1' &&
  354. .TH GENINCL 1 "Logix GmbH" "Local User Commands"
  355. .SH NAME
  356. genincl \- generate include files from NLS message catalogues
  357. .SH SYNOPSIS
  358. .B genincl
  359. [
  360. .B -h
  361. ] [
  362. .B -v
  363. ] [
  364. .B -f
  365. ] [
  366. .B -o
  367. .I outfile
  368. ] [
  369. .B -d
  370. .I dir
  371. .B msgfile
  372. .SH DESCRIPTION
  373. .I genincl
  374. generates C header files from message an NLS (Native Language Support)
  375. catalogue given in
  376. .BR msgfile .
  377. The name of the message file is implicitly specified as
  378. .IB msgfile .m
  379. and
  380. .I genincl
  381. produces a default output file called
  382. .IB msgfile .h
  383. which may be renamed with the
  384. .B -o
  385. option.
  386. The simplest call to
  387. .I genincl
  388. is then
  389. .PP
  390. .RS
  391. genincl ifile
  392. .RE
  393. .PP
  394. which will generate an "ifile.h" from "ifile.m".
  395. .PP
  396. Generated output files are stored in the directory given with
  397. the 
  398. .B -d
  399. option, or in the current directory if none is specified. If
  400. .I genincl
  401. detects that no changes have occurred in the generated header file
  402. with respect to an existing header file, the output file will not be
  403. written; this allows use of
  404. .I genincl
  405. with
  406. .IR make (1).
  407. .PP
  408. .SH OPERATION
  409. .I genincl
  410. reads through the given
  411. .B msgfile
  412. and produces
  413. .B #defines
  414. according to the following rules:
  415. .in 1i
  416. If a 
  417. .B "$set"
  418. keyword is seen, the set number is used together with the comment behind it
  419. to generate a define for a set.
  420. .sp
  421. For each message in a set, two #defines are produced; the first contains the
  422. message number, whereas the second contains a string which may be used as the
  423. default string to be returned by
  424. .IR catgets (3C).
  425. .PP
  426. The header file that is built, forsees use in a non-ANSI-C environment, as
  427. well as an environment in which the NLS routines do not exist. If the 
  428. program which includes the header file is compiled with
  429. .B "-DNO_NLS"
  430. macros will be generated which insert the default message, whithout calling
  431. the 
  432. .IR catopen (),
  433. .IR catgets (),
  434. and
  435. .IR catclose ()
  436. routines.
  437. .SH EXAMPLE
  438. A sample input file as normally given to
  439. .IR gencat :
  440. .PP
  441. .RS
  442. .nf
  443. $set 1 Main
  444. $ HelloWorld
  445. 1 Hello World, how are you ?
  446. $ Tilton
  447. 2 Bye bye Charlene
  448. X
  449. $ This is a comment
  450. $set 2 IOERRS
  451. $ Enoent
  452. 3 I cannot open your mailbox. Please check $MAIL
  453. $ NoHost
  454. 4 Host [%s] is not responding. Try again ?
  455. .fi
  456. .RE
  457. .PP
  458. When
  459. .I genincl
  460. is run on this input file, it produces the following output:
  461. .PP
  462. .RS
  463. .nf
  464. /* This file was generated automagically from gt.m
  465. X * Any modifications made here may disappear
  466. X * Change the source and re-run ./genincl
  467. X */
  468. X
  469. #ifndef NO_NLS
  470. #    ifndef nlm
  471. #    include <nl_types.h>
  472. X
  473. X    extern char *catgets();
  474. X    extern nl_catd catopen();
  475. #    if defined(__STDC__)
  476. #        define nlm(set, mno) catgets(cat, (set), (mno), mno##_DFLT)
  477. #    else
  478. #        define nlm(set, mno) catgets(cat, (set), (mno), mno/**/_DFLT)
  479. #    endif /* __STDC__ */
  480. #    endif /* nlm */
  481. #else /* NO_NLS */
  482. #    define nl_catd int
  483. #    define catopen(a, b) 0
  484. #    define catclose(a)    /* nothing */
  485. #    if defined(__STDC__)
  486. #        define nlm(set, mno)    mno##_DFLT
  487. #    else
  488. #        define nlm(set, mno)    mno/**/_DFLT
  489. #    endif /* __STDC__ */
  490. #endif /* NO_NLS */
  491. X
  492. #define MainSet    (1)
  493. #define HelloWorld (1) 
  494. #define HelloWorld_DFLT "Hello World, how are you this morning ?"
  495. #define Tilton (2) 
  496. #define Tilton_DFLT "Bye bye Charlene"
  497. X
  498. #define IOERRSSet    (2)
  499. #define Enoent (3) 
  500. #define Enoent_DFLT "I cannot open your mailbox. Please check $MAIL"
  501. #define NoHost (4) 
  502. #define NoHost_DFLT "Host [%s] is not responding. Try again ?"
  503. .fi
  504. .RE
  505. .PP
  506. Our sample application will be
  507. .PP
  508. .RS
  509. .nf
  510. #include <stdio.h>
  511. #include <nl_types.h>
  512. #include <fcntl.h>
  513. #include "gt.h"
  514. X
  515. X
  516. int main(argc, argv)
  517. int argc;
  518. char **argv;
  519. {
  520. X    nl_catd cat;
  521. X    char *msg;
  522. X
  523. X    if ((cat = catopen("gt", O_RDONLY)) == (nl_catd)-1)
  524. X        (fprintf(stderr, "%s: Can't open message-catalogue\en",
  525. X                *argv));
  526. X
  527. X    msg = nlm(MainSet, HelloWorld);
  528. X    puts(msg);
  529. X
  530. X    msg = nlm(IOERRSSet, NoHost);
  531. X    puts(msg);
  532. X
  533. X    catclose(cat);
  534. }
  535. X
  536. .RE
  537. .PP
  538. .fi
  539. A sample
  540. .I makefile
  541. for putting all of the above together would look like this.
  542. .PP
  543. .RS
  544. .nf
  545. CC=cc
  546. CFLAGS=-O -I.
  547. GENINCL=genincl
  548. X
  549. all: prog messages.cat
  550. X
  551. prog: prog.o
  552. X    $(CC) $(CFLAGS) -o $@ $?
  553. prog.o: prog.c message.h
  554. X
  555. # Generate include file for application
  556. message.h: message.m
  557. X    $(GENINCL) message.m
  558. X
  559. # Generate NLS message catalogue
  560. message.cat: message.m
  561. X    gencat -m message.cat message.m
  562. X
  563. clean:
  564. X    rm -f *.o message.h message.cat prog
  565. .fi
  566. .RE
  567. .SH OPTIONS
  568. The following options are recognized:
  569. .IP "\fB-h\fR" 1.5i
  570. Help. Show usage.
  571. .IP "\fB-v\fR" 1.5i
  572. Version. Show version of
  573. .IR genincl .
  574. .IP "\fB-f\fR" 1.5i
  575. Force creation of an output file, even though
  576. .I genincl
  577. has discovered that the target has not changed with regard to the original.
  578. Use of this option is discouraged in makefiles.
  579. .IP "\fB-o\fR \fIoutfile\fR" 1.5i
  580. Output file. Instead of producing a file called
  581. .IB msgfile .h
  582. the output file will be called
  583. .BR outfile .
  584. As a special case, if
  585. .B outfile
  586. consists of a single dash, the output will be written to standard output.
  587. .IP "\fB-d\fR \fIdir\fR" 1.5i
  588. Generated files are stored in the directory
  589. .I dir
  590. or in the current directory if
  591. .I dir
  592. is not given.
  593. .SH FILES
  594. .IP "\fBfile.m\fR" 1i
  595. Input files for
  596. .I genincl
  597. consist of text files which are usually given to
  598. .IR gencat (1).
  599. .IP "\fBfile.h\fR" 1i
  600. .I genincl
  601. generates source code which is written into an include file for C.
  602. .SH AUTHOR
  603. Jan-Piet Mens - <jpm@Logix.DE>
  604. .SH SEE ALSO
  605. .IR gencat (1),
  606. .IR make (1),
  607. .IR catopen (3C),
  608. .IR catgets (3C)
  609. SHAR_EOF
  610. chmod 0640 genincl.1 ||
  611. echo 'restore of genincl.1 failed'
  612. Wc_c="`wc -c < 'genincl.1'`"
  613. test 5267 -eq "$Wc_c" ||
  614.     echo 'genincl.1: original size 5267, current size' "$Wc_c"
  615. fi
  616. # ============= gt.m ==============
  617. if test -f 'gt.m' -a X"$1" != X"-c"; then
  618.     echo 'x - skipping gt.m (File already exists)'
  619. else
  620. echo 'x - extracting gt.m (Text)'
  621. sed 's/^X//' << 'SHAR_EOF' > 'gt.m' &&
  622. $set 1 Main
  623. $ HelloWorld
  624. 1 Hello World, how are you this morning ?
  625. $ Tilton
  626. 2 Bye bye Charlene
  627. X
  628. $ This is a comment
  629. $set 2 IOERRS
  630. $ Enoent
  631. 3 I cannot open your mailbox. Please check $MAIL
  632. $ NoHost
  633. 4 Host [%s] is not responding. Try again ?
  634. SHAR_EOF
  635. chmod 0640 gt.m ||
  636. echo 'restore of gt.m failed'
  637. Wc_c="`wc -c < 'gt.m'`"
  638. test 240 -eq "$Wc_c" ||
  639.     echo 'gt.m: original size 240, current size' "$Wc_c"
  640. fi
  641. # ============= gt.c ==============
  642. if test -f 'gt.c' -a X"$1" != X"-c"; then
  643.     echo 'x - skipping gt.c (File already exists)'
  644. else
  645. echo 'x - extracting gt.c (Text)'
  646. sed 's/^X//' << 'SHAR_EOF' > 'gt.c' &&
  647. #include <stdio.h>
  648. #include <nl_types.h>
  649. #include <fcntl.h>
  650. X
  651. #include "gt.h"
  652. X
  653. X
  654. int main(argc, argv)
  655. int argc;
  656. char **argv;
  657. {
  658. X    nl_catd cat;
  659. X    int mno;
  660. X    char *msg;
  661. X
  662. X    if ((cat = catopen("gt", O_RDONLY)) == (nl_catd)-1)
  663. X        (fprintf(stderr, "%s: Can't open message-catalogue\n",
  664. X                *argv));
  665. X
  666. X    msg = nlm(MainSet, HelloWorld);
  667. X    puts(msg);
  668. X
  669. X    msg = nlm(IOERRSSet, NoHost);
  670. X    puts(msg);
  671. X
  672. X    catclose(cat);
  673. }
  674. X
  675. X
  676. SHAR_EOF
  677. chmod 0640 gt.c ||
  678. echo 'restore of gt.c failed'
  679. Wc_c="`wc -c < 'gt.c'`"
  680. test 396 -eq "$Wc_c" ||
  681.     echo 'gt.c: original size 396, current size' "$Wc_c"
  682. fi
  683. exit 0
  684. -- 
  685.     __  _____   __  __ 
  686.    |  ||  _  \ |  \/  |    Logix GmbH                             jpm@Logix.DE
  687.  __|  ||  ___/ |      |    Moritzstrasse 50, +49-611-309797   jpm@logixwi.UUCP
  688. |_____||__|    |__||__|    D-6200 Wiesbaden  ...!uunet!mcsun!unido!logixwi!jpm
  689.