v06i015: tif2ps -- convert TIFF to PostScript (part 1 of 2)
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Mon Jan 30 06:26:03 AEST 1989
Posting-number: Volume 6, Issue 15
Submitted-by: andy at coma.UUCP (Andreas Lampen)
Archive-name: tif2ps/part01
This is part 1 (of 2) of "tif2ps", a program that converts TIFF
(Tag Image File Format - a format for scanned images) to PostScript.
If works on UNIX machines and on PCs.
Enjoy it,
Andy
---- Cut here ---- Cut here ---- Cut here ---- Cut here ---- Cut here ----
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# README
# Makefile
# defs.h
# tif.h
# tif2ps.c
# genps.c
# andy.tif.Z.btoa
# This archive created: Thu Dec 29 20:42:57 1988
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'README'" '(2862 characters)'
if test -f 'README'
then
echo shar: "will not over-write existing file 'README'"
else
cat << \SHAR_EOF > 'README'
This is version 1.0 of tif2ps/tifdump, a program that converts
TIFF-files to PostScript (*).
It is written by: Andreas Lampen
Tech. Univ. Berlin, FR 5-6
Franklinstr. 28/29
D-1000 Berlin 10, West Germany
Tel: +49-30-314-73496
E-mail: andy at coma.uucp (from US: pyramid!tub!coma!andy) or
andy at db0tui62.bitnet
-------------------------------------------------------------------
Copyright (C) 1988 by the author.
Permission is granted to copy and distribute this program
without charge, provided this copyright notice is included
in the copy.
This Software is distributed on an as-is basis. There will be
ABSOLUTELY NO WARRANTY for any part of this software to work
correct. In no case will the author be liable to you for damages
caused by the usage of this software.
-------------------------------------------------------------------
This Distribution contains the files
README -- The file you are actually reading.
Makefile -- The Makefile for building and installing
the programs "tif2ps" and "tifdump"
Makefile.PC -- The MSDOS (Microsoft "make") Makefile
Shapefile -- The Shapefile for building and installing
"tif2ps" and "tifdump".
You can use this together with the "shape"
configuration management toolkit, which
will appear in the net soon.
defs.h -- general definitions
tif.h -- TIFF specific definitions
tif2ps.c -- The source file containing the main program.
scantif.c -- The front end of the converter.
genps.c -- The back end of the converter.
getopt.c -- A public domain getopt implementation.
Only needed for the PC version.
version.c -- A source file containing a routine that returns
the actual version number.
andy.tif.Z.btoa
-- A compressed TIFF file (a small picture of
the author). Use "atob" and "uncompress"
to reconstruct the file.
tif2ps.1 -- The manual page for "tif2ps" and "tifdump"
The program has been tested only with TIFF-files generated by a
HP Scanjet up to now.
It was developed on a
microVAX II running BSD 4.3
and it also runs on
Sun3 with SunOS 4.0 and on
IBM PC/AT with MS-DOS 3.20/Microsoft C 5.00.
It should be easy portable to other machines.
For installing "tif2ps" on a UNIX system, you find the installation
instructions in the Makefile. On a PC just type "MAKE MAKEFILE.PC"
(this works with Microsoft "make").
The PC version does only support TIFF files that contain at most
45000 bytes of image data. I assume this is because all image data
are read into main memory with one fread call. Up to now, I was too
lazy to fix that.
Feel free to do any modifications or improvements to the code.
If you do so, please send me your patches. I will try to introduce
your patches into further releases.
Have fun,
Andy
---------
(*) PostScript is a trademark of Adobe Systems Incorporated.
SHAR_EOF
if test 2862 -ne "`wc -c < 'README'`"
then
echo shar: "error transmitting 'README'" '(should have been 2862 characters)'
fi
fi
echo shar: "extracting 'Makefile'" '(1056 characters)'
if test -f 'Makefile'
then
echo shar: "will not over-write existing file 'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
#
# Makefile for tif2ps
#
# The installation procedure for tif2ps is faily simple.
#
# Where and by whom shall tif2ps and it's manual be installed ?
# (change the following 4 macro definitions if necessary)
INSTALDIR = /usr/local
MANINSTALDIR = /usr/localman/man1
INSTALNAME = bin
INSTALGROUP = bin
#
# If you are on a Motorola 68k based machine (eg. Sun3), replace the
# "CFLAGS" definition by:
#
# CFLAGS = -O -DUNIX -DMOTOROLA
CFLAGS = -O -DUNIX
LDFLAGS = -s
#
# Ready!
# Now save the Makefile and type "make" to build the system and
# or "make install" to build and install it.
#
SOURCE = tif2ps.c scantif.c genps.c
INCLUDE = tif.h defs.h
VERSION = version
OBJECTS = tif2ps.o scantif.o genps.o $(VERSION).o
tif2ps: $(OBJECTS)
$(CC) -o tif2ps $(LDFLAGS) $(OBJECTS) -lm
rm -f tifdump
ln tif2ps tifdump
install:
install -c -o bin -g bin -m 644 tif2ps.1 $(MANINSTALDIR)
install -c -o bin -g bin -m 755 tif2ps $(INSTALDIR)
rm -f $(INSTALDIR)/tifdump
ln $(INSTALDIR)/tif2ps $(INSTALDIR)/tifdump
$(OBJECTS): $(INCLUDE)
clean :
rm $(OBJECTS)
SHAR_EOF
if test 1056 -ne "`wc -c < 'Makefile'`"
then
echo shar: "error transmitting 'Makefile'" '(should have been 1056 characters)'
fi
fi
echo shar: "extracting 'defs.h'" '(1056 characters)'
if test -f 'defs.h'
then
echo shar: "will not over-write existing file 'defs.h'"
else
cat << \SHAR_EOF > 'defs.h'
/*
* tif2ps/tifdump -- convert TIFF to PostScript
*
* written by:
* Andreas Lampen, TU-Berlin (andy at coma.UUCP)
* (andy at db0tui62.BITNET)
*
* Copyright (C) 1988 by the author.
* Permission is granted to copy and distribute this program
* without charge, provided this copyright notice is included
* in the copy.
* This Software is distributed on an as-is basis. There will be
* ABSOLUTELY NO WARRANTY for any part of this software to work
* correct. In no case will the author be liable to you for damages
* caused by the usage of this software.
*/
/*
* defs.h -- general type and constant definitions
*
* $Header: defs.h[1.0] Thu Dec 29 20:10:13 1988 andy at coma published $
*/
typedef char CHAR;
typedef int INT;
typedef unsigned int UINT;
typedef short SHORT;
typedef unsigned short USHORT;
typedef long LONG;
typedef unsigned long ULONG;
typedef double DOUBLE;
#define ERROR -1
#define OK 0
#define VOID void
#define LOCAL static
#define STATIC static
#define EXPORT
SHAR_EOF
if test 1056 -ne "`wc -c < 'defs.h'`"
then
echo shar: "error transmitting 'defs.h'" '(should have been 1056 characters)'
fi
fi
echo shar: "extracting 'tif.h'" '(5243 characters)'
if test -f 'tif.h'
then
echo shar: "will not over-write existing file 'tif.h'"
else
cat << \SHAR_EOF > 'tif.h'
/*
* tif2ps/tifdump -- convert TIFF to PostScript
*
* written by:
* Andreas Lampen, TU-Berlin (andy at coma.UUCP)
* (andy at db0tui62.BITNET)
*
* Copyright (C) 1988 by the author.
* Permission is granted to copy and distribute this program
* without charge, provided this copyright notice is included
* in the copy.
* This Software is distributed on an as-is basis. There will be
* ABSOLUTELY NO WARRANTY for any part of this software to work
* correct. In no case will the author be liable to you for damages
* caused by the usage of this software.
*/
/*
* tif.h -- type and constant definitions
*
* $Header: tif.h[1.0] Thu Dec 29 20:10:15 1988 andy at coma published $
*/
/*
* installation dependent definitions
*/
#define MAXIFDS 16
#define MAXVAL 128
/*===========================
* General Types
*===========================*/
/* Input file descriptor */
typedef struct {
FILE *fdes;
USHORT order; /* Byte order */
} DATAFILE;
/*===========================
* Picture Data Types
*===========================*/
/* strips */
typedef struct {
ULONG byteCount;
CHAR *data;
} STRIP;
/* general image data */
typedef struct {
USHORT subfileType;
USHORT imWidth;
USHORT imLength;
ULONG rowsPerStrip; /* may be SHORT -- not implemented */
USHORT stripsPerImage; /* number of strips */
STRIP *strips; /* List of pointers to Strips */
USHORT samplesPerPixel; /* always 1 -- handle only monochrome picts. */
USHORT bitsPerSample; /* should be capable to hold multiple values */
/* for color pictures */
USHORT planConf; /* Planar Configuration */
USHORT compression; /* should be capable to hold multiple values */
/* for color pictures */
ULONG gr3Options;
ULONG gr4Options;
USHORT fillOrder;
USHORT threshholding;
USHORT cellWidth;
USHORT cellLength;
} IMAGE;
}/* photometrics */
typedef struct {
USHORT minSampleValue;
USHORT maxSampleValue;
USHORT photometInterpr; /* Photometric Interpretation */
USHORT grayResponseUnit;
USHORT *grayResponseCurve; /* Array of grayvalues */
} PHMETRIC;
/* correspondence to the physical world */
typedef struct {
DOUBLE xRes; /* XResolution */
DOUBLE yRes; /* YResolution */
USHORT resUnit; /* ResolutionUnit */
USHORT orientation;
} PHYS;
/* document context */
typedef struct {
CHAR *docName;
CHAR *pageName;
DOUBLE xPos; /* XPosition -- lower left corner */
DOUBLE yPos; /* YPosition -- lower left corner */
DOUBLE xMax; /* XMaximum -- upper right corner */
DOUBLE yMax; /* YMaximum -- upper right corner */
USHORT pageNo; /* page number */
USHORT noOfPages; /* total number of pages */
} CONTEXT;
/* a whole picture */
typedef struct {
IMAGE image;
PHMETRIC photoMetric;
PHYS physWorld;
CONTEXT context;
} PICTURE;
/*===========================
* TIFF Types
*===========================*/
/* IFD Entry */
typedef struct {
USHORT tag; /* entry Tag */
USHORT type; /* entry type */
ULONG length; /* entry length */
ULONG valoffset; /* value or value offset */
CHAR *value; /* pointer to value */
} ENTRY;
/* Image File Directory (IFD) */
typedef struct {
USHORT entrycount; /* number of entries in IFD */
ENTRY *entrylist; /* list of IFD entries */
ULONG nextifd; /* Offset of next IFD */
} IFD;
/* TIF-file Header */
typedef struct {
USHORT byteorder; /* Byte order "II" or "MM" */
USHORT version; /* TIFF Version (current 42) */
ULONG offset; /* offset of first IFD */
} HEADER;
/* general structure */
typedef struct {
HEADER header; /* Header of TIF-file */
IFD ifdlist[MAXIFDS]; /* List of IFDs */
} TIFF;
/*==============================
* constants
*==============================*/
#define TIFFBYTE 1
#define TIFFASCII 2
#define TIFFSHORT 3
#define TIFFLONG 4
#define TIFFRATIONAL 5
#define INTELTIFF 0x4949
#define MOTOROLATIFF 0x4d4d
/*** Fields ***/
#define SUBFILETYPE 255
#define IMAGEWIDTH 256
#define IMAGELENGTH 257
#define BITSPERSAMPLE 258
#define COMPRESSION 259
#define PHOTOMETRICINTERPR 262
#define THRESHHOLDING 263
#define CELLWIDTH 264
#define CELLLENGTH 265
#define FILLORDER 266
#define DOCUMENTNAME 269
#define IMAGEDESCRIPTION 270
#define MAKE 271
#define MODEL 272
#define STRIPOFFSETS 273
#define ORIENTATION 274
#define SAMPLESPERPIXEL 277
#define ROWSPERSTRIP 278
#define STRIPBYTECOUNTS 279
#define MINSAMPLEVALUE 280
#define MAXSAMPLEVALUE 281
#define XRESOLUTION 282
#define YRESOLUTION 283
#define PLANARCONFIGURATION 284
#define PAGENAME 285
#define XPOSITION 286
#define YPOSITION 287
#define FREEOFFSETS 288
#define FREEBYTECOUNTS 289
#define GRAYRESPONSEUNIT 290
#define GRAYRESPONSECURVE 291
#define GROUP3OPTIONS 292
#define GROUP4OPTIONS 293
#define RESOLUTIONUNIT 296
#define PAGENUMBER 297
#define COLORRESPONSEUNIT 300
#define COLORRESPONSECURVES 301
SHAR_EOF
if test 5243 -ne "`wc -c < 'tif.h'`"
then
echo shar: "error transmitting 'tif.h'" '(should have been 5243 characters)'
fi
fi
echo shar: "extracting 'tif2ps.c'" '(5124 characters)'
if test -f 'tif2ps.c'
then
echo shar: "will not over-write existing file 'tif2ps.c'"
else
cat << \SHAR_EOF > 'tif2ps.c'
/*
* tif2ps/tifdump -- convert TIFF to PostScript
*
* written by:
* Andreas Lampen, TU-Berlin (andy at coma.UUCP)
* (andy at db0tui62.BITNET)
*
* Copyright (C) 1988 by the author.
* Permission is granted to copy and distribute this program
* without charge, provided this copyright notice is included
* in the copy.
* This Software is distributed on an as-is basis. There will be
* ABSOLUTELY NO WARRANTY for any part of this software to work
* correct. In no case will the author be liable to you for damages
* caused by the usage of this software.
*/
/*
* tif2ps.c -- main program
*
* $Header: tif2ps.c[1.0] Thu Dec 29 20:11:01 1988 andy at coma published $
*/
#include <stdio.h>
#ifdef MSDOS
#include <string.h>
#include <time.h>
#else
#include <strings.h>
#include <sys/time.h>
#endif
#include <setjmp.h>
#include <signal.h>
#include "defs.h"
#include "tif.h"
extern CHAR *optarg;
extern INT optind;
CHAR *progname, *version();
main (ac, av)
INT ac;
CHAR **av;
{
INT getopt(), c, nfiles, i, cleanup();
VOID usage(), logerr(), dodump(), genps();
DOUBLE xoffset = 0., yoffset= 0., scalefactor = 1., height = 0.;
DOUBLE xresfactor, yresfactor, atof();
PICTURE picts[8]; /* maximal 8 pictures */
TIFF tiff;
jmp_buf env;
#ifdef MSDOS
if (!strrchr (av[0], '\\')) progname = av[0];
else progname = strrchr (av[0], '\\') + 1;
#else
if (!rindex (av[0], '/')) progname = av[0];
else progname = rindex (av[0], '/') + 1;
#endif
if (ac < 2)
{
usage ();
exit (-1);
}
while ((c = getopt (ac, av, "h:s:vx:y:")) != EOF)
{
switch (c)
{
case 'h': /* picture height */
if (scalefactor != 1.)
logerr (progname, "only one of 'h' or 's' can be given");
else
height = atof (optarg) * 72;
break;
case 's': /* scale factor */
if (height != 0.)
logerr (progname, "only one of 'h' or 's' can be given");
else
scalefactor = atof (optarg);
break;
case 'v': /* print current version of this program */
printf ("This is %s version %s.\n", av[0], version());
exit (0);
case 'x': /* xposition (in inches) */
xoffset = atof (optarg) * 72;
break;
case 'y': /* yposition (in inches) */
yoffset = atof (optarg) * 72;
break;
default:
usage ();
exit (-1);
}
} /* end of command line parsing */
(VOID) signal (SIGINT, cleanup);
nfiles = ac - optind;
for (i = 0; i < nfiles; i++)
{
/* (VOID) setjmp (env); --- not used */
if (scantif (av[i+optind], picts, &tiff) == ERROR)
{ logerr (progname, "cannot read file"); exit (-1); }
if (!strcmp (progname, "tifdump"))
{
printf ("This is %s version %s.\n\n", progname, version());
dodump (av[i+optind], &tiff);
continue;
}
/* else do initializations */
/* a loop through all pictures should be inserted here */
/* adjust bytecount ???? perhaps not correct */
/* manages only single strip pictures */
if (picts[0].image.strips[0].byteCount == 0)
picts[0].image.strips[0].byteCount =
(picts[0].image.imWidth * picts[0].image.imLength) /
(8 / picts[i].image.bitsPerSample);
switch (picts[0].physWorld.resUnit)
{
case 1: /* special */
xresfactor = 1. / picts[0].physWorld.xRes;
yresfactor = 1. / picts[0].physWorld.yRes;
break;
case 2: /* inches */
xresfactor = 72. / picts[0].physWorld.xRes;
yresfactor = 72. / picts[0].physWorld.yRes;
break;
case 3: /* centimetres */
xresfactor = 28.3465 / picts[0].physWorld.xRes;
yresfactor = 28.3465 / picts[0].physWorld.yRes;
break;
}
if (height != 0.)
scalefactor = (height / (picts[0].image.imLength * yresfactor));
if (xoffset != 0.)
picts[0].context.xPos = xoffset;
if (yoffset != 0.)
picts[0].context.yPos = yoffset;
picts[0].context.xMax =
(picts[0].image.imWidth * xresfactor * scalefactor) +
picts[0].context.xPos;
picts[0].context.yMax =
(picts[0].image.imLength * yresfactor * scalefactor) +
picts[0].context.yPos;
genps (av[i+optind], picts);
}
} /* end of main */
LOCAL INT cleanup ()
{
#ifdef MSDOS
cprintf ("cleanup...\n");
#else
fprintf (stderr, "cleanup...\n");
#endif
exit (-1);
}
LOCAL VOID usage ()
{
printf ("usage: %s [-h <height>] [-s <scalefactor>]\n", progname);
printf ("\t\t[-v] [-x <x-offset>] [-y <y-offset>] file1 ...\n");
}
EXPORT VOID logerr (routine, msg)
CHAR *routine, *msg;
{
#ifdef MSDOS
cprintf ("%s(%s): %s\n", progname, routine, msg);
#else
fprintf (stderr, "%s(%s): %s\n", progname, routine, msg);
#endif
}
EXPORT CHAR *date()
{
LONG seconds, time();
#ifndef MSDOS
CHAR *asctime();
#endif
#ifdef MSDOS
time (&seconds);
return (ctime (&seconds));
#else
seconds = time ((LONG *) 0);
return (asctime (localtime (&seconds)));
#endif
}
EXPORT CHAR *caller()
{
STATIC CHAR name[128];
#ifdef MSDOS
strcpy (name, ""); /* cannot get hostname and login name */
#else
CHAR *getlogin (), host[128];
(VOID) gethostname (host, 128);
(VOID) sprintf (name, "%s@%s\0", getlogin(), host);
#endif
return (name);
}
SHAR_EOF
if test 5124 -ne "`wc -c < 'tif2ps.c'`"
then
echo shar: "error transmitting 'tif2ps.c'" '(should have been 5124 characters)'
fi
fi
echo shar: "extracting 'genps.c'" '(3878 characters)'
if test -f 'genps.c'
then
echo shar: "will not over-write existing file 'genps.c'"
else
cat << \SHAR_EOF > 'genps.c'
/*
* tif2ps/tifdump -- convert TIFF to PostScript
*
* written by:
* Andreas Lampen, TU-Berlin (andy at coma.UUCP)
* (andy at db0tui62.BITNET)
*
* Copyright (C) 1988 by the author.
* Permission is granted to copy and distribute this program
* without charge, provided this copyright notice is included
* in the copy.
* This Software is distributed on an as-is basis. There will be
* ABSOLUTELY NO WARRANTY for any part of this software to work
* correct. In no case will the author be liable to you for damages
* caused by the usage of this software.
*/
/*
* genps.c -- generate PostScript output
*
* $Header: genps.c[1.0] Thu Dec 29 20:10:57 1988 andy at coma published $
*/
#include <stdio.h>
#include <math.h>
#include "defs.h"
#include "tif.h"
extern CHAR *progname;
extern USHORT pages;
EXPORT VOID genps (filename, picts)
CHAR *filename;
PICTURE *picts;
{
USHORT xsamples, ysamples, c1, c2, noOfGrayVals;
LONG i;
CHAR *version(), *date(), *caller();
VOID logerr();
/* a loop through all pictures should be inserted here */
printf ("%%!PS-Adobe-2.0\n");
printf ("%%%%Title: %s\n",
picts[0].context.docName[0] ? picts[0].context.docName : filename);
printf ("%%%%Creator: %s %s\n", progname, version());
printf ("%%%%CreationDate: %s", date());
printf ("%%%%For: %s\n", caller());
printf ("%%%%Page: %d of %d\n",
picts[0].context.pageNo, picts[0].context.noOfPages);
printf ("%%%%BoundingBox: %.2f %.2f %.2f %.2f\n",
picts[0].context.xPos, picts[0].context.yPos,
picts[0].context.xMax, picts[0].context.yMax);
printf ("%%%%EndComments\n");
/* the calculation of a reasonable number of rows should be inserted here */
printf ("/DataString 2 string def\n");
printf ("%%%%EndProlog\n");
printf ("/vmstat save def\n");
printf ("initgraphics\n");
printf ("( :: %s/TIFF->PostScript - job starts ::\\n) print flush\n", caller ());
printf ("( :: printing %s ::\\n) print flush\n", filename);
/* Image */
printf ("gsave\n");
if (picts[0].image.bitsPerSample > 1)
{
/* define new grayscale */
noOfGrayVals = (SHORT) pow ((DOUBLE)2,
(DOUBLE)picts[0].image.bitsPerSample);
printf ("{ %d mul round cvi\n[ ", noOfGrayVals-1);
for (i = 0 ; i < noOfGrayVals; i++)
printf ("%d ", picts[0].photoMetric.grayResponseCurve[i]);
printf ("]\nexch get %d div 1.0 exch sub } settransfer\n",
picts[0].photoMetric.grayResponseCurve[0]);
}
printf ("%.2f %.2f translate\n",
picts[0].context.xPos, picts[0].context.yPos);
printf ("%.2f %.2f scale\n",
picts[0].context.xMax - picts[0].context.xPos,
picts[0].context.yMax - picts[0].context.yPos);
/* adjust transformation matrix */
/* do image data */
xsamples = (picts[0].image.strips[0].byteCount / picts[0].image.imLength) *
(8 / picts[0].image.bitsPerSample);
ysamples = picts[0].image.imLength;
printf ("%d %d %d ",
xsamples, ysamples, picts[0].image.bitsPerSample);
switch (picts[0].physWorld.orientation)
{
case 1:
printf ("[ %d 0 0 %d 0 %d ]\n", xsamples, -ysamples, ysamples);
break;
case 4:
printf ("[ %d 0 0 %d 0 0 ]\n", xsamples, ysamples);
break;
default:
logerr ("genps", "invalid orientation");
return;
}
printf ("{ currentfile DataString readhexstring pop } image \n");
for (i=0; i < picts[0].image.strips[0].byteCount; i++)
{
c1 = (picts[0].image.strips[0].data[i] & 0360) >> 4; /* upper 4 bits */
c2 = (picts[0].image.strips[0].data[i] & 017); /* lower 4 bits */
printf ("%c%c", (c1 <= 9) ? (c1+'0') : (c1+'W'),
(c2 <= 9) ? (c2+'0') : (c2+'W'));
}
printf ("\ngrestore\n");
printf ("showpage\n");
printf ("vmstat restore\n");
printf ("%%%%Trailer\n");
printf ("( :: Job finished ::\\n) print flush\n");
}
SHAR_EOF
if test 3878 -ne "`wc -c < 'genps.c'`"
then
echo shar: "error transmitting 'genps.c'" '(should have been 3878 characters)'
fi
fi
echo shar: "extracting 'andy.tif.Z.btoa'" '(8835 characters)'
if test -f 'andy.tif.Z.btoa'
then
echo shar: "will not over-write existing file 'andy.tif.Z.btoa'"
else
cat << \SHAR_EOF > 'andy.tif.Z.btoa'
xbtoa Begin
+.\KbP,JA2!.[?E!<*!9!$Hg.L(>4YFD+J[`;foc5$T5GTR_t4%8pF:Eo]an,p/.0OOE/V"YE(CL_,
)e9Igf'`#Mogk<fV7ATBVP+m;IF>mt1u))6ciK)l>#1dZ1L<1-K0Ed.ok#p>3[%4:m#F/0GS,<HfKJ
l^u#- at fomN7]DYb_T!oc&E"e8R%=)%C3M=E%k[P\Mij/V0I!_`K5<*b*3/D+MO0M-:j at LPN#9/6]95
(\[:U,R1Q?(c'l''aGhR.SkU02jhSA<FUl*s258]]+[:^_3#<psJIs")NEUMm`hstm16+KdDpPgY7m
EQfGA at 2/<[WJOI$=0gZOp3XNF;Ko7$q"F-LH&,-;9cX8%cPBrMIU,RHBo`qF/o*BBP8_SS>)eoGrJe
WKr?jUnJTnF8-Kkf7BZqQ<J[_"__'lq.XNhEopp<h/MF,L.d at MU57ZXO`fh0CG;@DTkU-%Qm-4aR:r
7?TuEp5 at P*mh?]I.P2r0\(0rA'9M_/Y9L']u1+EKBNQlcC12>IfNLpZC'QDk24(QjufQC)3f.1)]:!
:5I&Rr:n7>a9 at K,\CF\damMh[ik_WR16G,^i))686^gj)O+fHn at 9DWFHAt,-Z-a%[htul(:\(C>oK+
ZNn(O]R\Llm3[SL4mFGm at jMf]JR`bja)Nm3DG,p_8f%+DVXVm!GH]0FG>CWCOl"Yma@=lV&1hQ#&OU
<^Sj0Jqu.pA:rh6q!k&`oop at fS.9CoB[0>Np*Q'"<e,Y&['JIAP=q&?a^6Ll6#',!tF'!:,uQ at hk$D
/>_,?Ghme_+bJFGjcS3"K>I[<S7G@"Mk%K<DYL>\L&/eAR1i1NftuW%I.<RhWYSqo_nl6&XntR+/10
*$]WneQr`\7*g20>tK\ihdk`dUD`j3X,G*Y[HWU1!F at q%ca*2gb]SV`_#(FWs=h;r;;D$:lkULX\_(
A>'>:)i)<_S,@%U`ifBGCar/ol/;'M at 8:N-L6HXCMhBen&pVa%3HoS6M;V`IOc85Q]t!nD05f<WEcr
0J'R8=O(M_/j*:ibMs7G-4n2uHB-&UjVS2aNU:q(#oXR-5ei2Bt71Qqa>#u2Y^=@p=Hsf?_?=H41+0
2)QfK"rFn#f9]>'+39S3>3B,oO=Gb6KB]nWD3<Y2JUXlsG7p8(u[gd)@+"\,Yj+9:pqOjLqFnMp17D
[_CiDLh3p7;?'r,-HC,P at 00A&q)/pPa8i>?@H,l)U>r>1H)F&Yit.YqZ_,aOmoc`Kgglq?-.HI=Jpc
8%`['TGnaPdVFP>Ye-AMT?r*gcF1YKR^PdB\70MUAt:NmS163j)/8BZk6C6W5$s*^u#_ZN.*)?WBAX
_'f4dp_XnPHnQniu^!kNKL/q)1qf]@A(_<$R,,2pcS"ueOcHj(6]gZc4E4LkmS]Ak+:0nVN3q=`@pM
BLdOlAO3&j3Be7`N`LQH?B)K]^;NnDKiUB6C!mR#pK?,&7/-1FPRVn.ma'Ic(Q+k*G.T(78Ju$OPGn
NkaTX0]-S8fX7q:?s>\VXKn0d9`T+!>Bea\-A('=\n*)2"<bLLfP,ho`n<4_5^?<"`uqP>@)fp<?o4
o8q+!:Ecp]0eG;\RFBpp/f(^MIfM2cT@=kWkZB3*3]!B'fRu&g(S5XZ"In^$#WGD?935.M2t at j6A[Z
9@??2)_Dj)G6-OQDo!jS*,grF=_Z^t]"aIiK+ko%P%36M`Y5lIF;(1FbEcK$cpgT+Vh9V]Zt6H5q8?
n!@p76:P<F;Kg6ks'g3M5dIqTCPs@&!a0CcZi>q6[I%+,XnQsfOfLug0T\<Vo=Pe&r=.bWt`D(3mru
;+9A4:1XR\SofUH_AO<D%Q\q64cA?kG;34KM32fq/9q8%'CFabS=J/]/E=U^I%cP!dV!_6H/drJr?o
bNl?M9QZJED&0p7/sBFZ[TO.fg6u:3f_q1*A`\D!.SI:u5ij!2,B+05FE8Ym5ZHQ)\.Tqb,%Y;*F&^
)JBfuUm)T0@?=bHDTU at +9O>$&q9gfn=8,F6;AH-;qj9hVGV8IUf!kilj._q$1mudV7`Ga7$?]Ot[-m
XSp9\N0rZjt.QLhHZ*FNolpob!lGH\^XfBl*Z.#[3\\M]94\E7Cl>t1^&f>XOqjnVg0N0g.N7I#I($
.Q7t%B:&p`/*L^9Q@$JS':.nB&6`Dq*q_Jl3T1U at XI"=VCuc%@urbgF'f^3<G4I`Ui(o[gg?N&3g>6
VN$0`@)d>d]I&p8)P1nOtccaI]^p5Ju/E.COf;J/L,"X."75HH:*t$;Q$/aC\K2HomMoq*J014A4bB
C>kr>:4]S6IVCQ+(&[n":Q:-o\2K+*KIhiSZ1(o=0k(^=(_Lpme-4,F(Q`Y&JaEl0*BO3?j[R%$R/C
YF?^lS!V-:k;9R/;4I7)JMU0*JHJe<a-Y?c;Y@%SgM3ZYH+g-3:7?`>RR7CnZ=VV<W?3>3c+N1oE]'
U9N>lUP9=E?q1sW<(V]bo!M8gOR?L7f[=!INDg:C>5Tr;!fWr<ll^Fi@@g8*^TgJcmq.B+^Ydmu0T)
8aSJpVspZW+Gu#N8+'kZjdYYY9b=1_bR1eYLdXNXE$g*#%j\(1RiuG$/PDT[h>mr5NU5s["/.\Y#fL
-Jt^9,(6gMQ9k11;':4FepRV%Xok>>TRP0l@=.5E;n7GjI_^!c/dc6VT2D'3ni12h-Sk(^P-Gn1*Ic
uVUo,k%pDGc-XmEneeUA.,2Jr3.!I\ih-[L:\XEIY?!9uu[n;GAm:2)F&aI2SqcL/AgtVO+>_F'?&o
1+=Hq1AcJk!DQ&L at Ql67c:-_^g#dKSCj/i7nHlbPkONE7D0i->*P;bn>)kC:a*fg+j'k>0^-"1D0F2
uZT'o!.'. at P59g(.e*B-dT-?J>'lJbV*MohG/V,eJ+q"2,L#?;5$qCXe-FWEG*/__DcFSrpnVa#%pG
3+R7]Bq,]1]_I-F8nh5!nu1=o*d9sQCH\bSZV at uJICT`0Ge at C@jF)<Osn@=D)3Gfs"Z19&20=38J$M
2R1UpH&Q&9W;Ya-ls7Ci;;1G[p8B:f;p]jO9_cdN"I&+#`$cGHq<ugkkJA2*jJT,&75s#tD;RqL4EU
jKo+WIun<9m%9Bi6Y]LO>rg$h7jKM1A`VAP)*N6N"/C$F:$Kk]Kdd01D(:"pY, at p,W46-*]ckBuP<t
UE0W+,oF.4o#*B?'N,2\*:\R\&s at q1[tH7;)9`mMY_,5uYUrqNHJ5V1e"T&Wj*B)d1BDPn)!Deo1F8
mV6]PRr?,qDULPL7#*0F?+AeZ*opDDW&HBiJi-<Nsl_&]/68SHXJOF[p8efW64)k6=IQ2sLc:a)$9+
7`qnD.7Hqnqd&rFUQV7\=`gK3&R(2E473RHBKJV"c>Rp(pI\*B`s0hL`@<-C!>atH?G#6e0`G-*9r*
5X[FtLOVeG69FsQHfr0SgQu!Kq8/!a6iUMqR=<Gum*S:O4hR6t*:`4fqN2\dn*E[6F2dAR8=&\^5q+
qs!JWHH,!!nep\L<M]di_cF+ at d5.k(/ZgYrs>\*icVj)tT3kUfM-<P&+&Spu$<j<KQITC;-KFqk.f:
=!^P]8Q]XYjAU*087f4A<<>NcWCS*-LhRMYP)DS+g5(u3U2>pu@@r>o5ZemejHT-N3TbIJp;Dgp\W]
oK5VSQU0m4YCe64^2GhQedlX;Z0Yu$.nQ3-)M7p-r4JU>@i<d\UY.Z"ONB:%=3+rTR/?J0W(E-YfG%
g"*s;hK,5VL?(,$?$e0.&iG!M+UqhK6S9!fB%iRV/8Xk)2PKsK"7-cj'=p'?V89qAb$4fW?X,sC!Zu
U+:0_ at 0P3)^M'/4(Lle*q\VUaf- at NCe7@%<P![=P1O--2WonJPHB,dK4$X242k@'3=,+!jj)?7N*X4
!Kl##kTOSSor"PW)<t!EA3h(iAgO&h0=Z"eGAJ:\*aD/qaMu3 at ElgBuVl&g*nE)\Hq%P,"^3d4Q[JM
!`$@1*f"?)O.fodR9C6pSiath_H1![Q#Y7U1&:&m-)**l.3R%^EU"-8hDnUZBj$f,E3rT4(7J2qG[X
7AQn>nBQ0:n*Pt???SO5qCr^TCrFF,38M:#`u!?b<b)(u'D/#Rrg5c:%HZ'K<A?_oKL4$%c?a'n(DT
c&S_&''(fYm>="0jnIMc/N!#Z6BK$+I8,iJqtCl15<CXT6_6$pot*CML:a(Q1CZEH3-n:M5PN<IV*\
c=5&NM#9o8,-m$6tLDV\9&qm<[*XaZ;eZj^!$6,;,P4$=;!3cKi$E#;`M\u;`F1!9J=HY$,U6t%n(o
gKnAr2CS-r0B4Pu]W5[jVQ\NU2n/WG/3Hd>quS7o?if\PsQ5LG,eiXI at 5#jmb]<qPktjDN at bK[WSH!
Gopc.9+=c:*j\3W(g(^N?fZ3;>,80&f;g'^,)MGGqGUX:[oH9tTGr'Je#8^ALM,5M>Z`s,kM][O&NF
BtDgN1_fbtuiaE,NLAkD_6U7k,O,pK):X>]o(4r##j)HR3t at __M(Q8fqj6?^?pQhdL%;qHk_EN@%AH
cpK97%1Dt,D0T.ZL9`/Ms#k&b&P&b./lgXJXD7mUNMCOL:]]HHD at H\9!_DcZpnh%gS&)E,p\fYXe:K
DdKje%ng=]#/YmG+Gr^#Z.Q213$VcP"SJ"!l885u/5DHOLS4Xm;FX!O-['0S505$n7nj=/e&0r)0iB
\a5 at RIPJN\#fh)kpJ^l:3rMRLBp_nsZu:iC>cc7hNjRNT-CBU04B[:H-BA*ef5nX&)u8VN0=H*g3)"
Z'"r/?XkUsSWS((\j at I,8$+jHfii;DM'n@"&/$=9N\M]le597m at 4Ut4'RL^JJ2anK#dFss$,Tq,KP.
P<MMQ5(7#HfD<AR/K\]@'"#+-=-Zq)]lSI![l'H83K<FE>kDn4%2MH%5u!a28()p9!>cBU)S"hcqe2
A/>4DF]hN@:0LD\am,.#Z-]_9728O$b_8+q%^.pVk:X1O=>9CRF%4jO]7Zk."&H_d,S$'nY('CO)u'
Y@`Q69'Z,K5Jek.kRH.;@-[#d^+fpf1iHLugKr1A[J`gcL1=I/+QPac;FVYt6XPq!5<(dfX9Cn<%qU
HUpE^K])IHm'u_I6ia,oJb6?HSsJ\7'c!K<UGIT?I=(q-YMY,B2LZ_=Mr!3'&+^=Fn"m*TPQnho&*j
EA/UN2>E:Y9It'ZfMhq5Xa[Rmg;Q5]nAkJ$9Et4)+e3u-LE#X5)FTO&0:.K]FN3&/5nK8VhrGb8AS4
kQ,$9+7&#!J8LH]%O+^M`<-,[28U,#/Y<aN/JALbg\,#'n'_/$DA?o1hPS$:0]77,22\hcmj)+8)C_
?TTX!=&m)S"B-QRVbA&piLWDo9s$$V4^h0fplA=(O;.397*0r[cBG:#@!^U?I7^s?0oP]UcSh35c-9
\p'$h;_JZ.AbMMc3<BHhtKR2P2+R\tYC\hA4/0l5?*ls8:$aPeA_U+%Md)N`?%fMn^7?fu]c210orO
dfu"AaJ(d.ihT4bRk;B/hpCc<t[^j>(g.^![JO)f*#pl>.a(nV&(/)@Q2^_Y\!KrBY.5.&qGo:IZ]G
4jb)qIY6*X:;+ksB$0+AB,ans!7O/s`,6/-ea$-Oe-0$B,_A<f_]QdVeP[gXN6YtN`0"16=S9u-grd
(t=%E1\(;u=\,;:EB_oAuGM^sLqe4ag>ek+?(LbM>0K2mhm[KU-]n8WlLAoeA4d=lDX)`#rK)l":=]
NDS`$<SjiC`ENSB_"[GO_c$>6XqaIfK/%W#p:f\`Z9!rf)#NpE.&rDK$WO>]YlQXI;LS?V'FY5Lm50
hlaIe3Ym at 4d*!$$ns-[fZ#=B, at K=T(?ACJSAEnF([e1^qK,C"J7&oe0q8D4M,j:]S^,9E3'(sZhFS@
%(m at 7QFXLM)eNdLA?rS;U$`h'WgWp.[tr*S8kn:DSeQ>f>A7EkmKm!<L*c\:&VYJZ#o4;T2(P2Do,5
N?#-]Q"de_*:,/0>i;$@X*'"9NAT%K?.n;6)A8XpQ;tY`p2LXm/EtCt&q3UH8UG$3)PT+?)Qk%&G`F
bSh8pV+)M6iS^b\:%*F9"+$/ePQ*ReN(+8E2Ki0,]eqJ49*+4*ua^'r,cYm at OA6[`Vnj$>OIrT/U8!
7WfMPDDU65&VRX_TM6`f$.$BZm6DIh'gRm[GBGmn at I^-XEe^ChDF7Mma8+eP!R3;p"+N)OlkVS*,OI
LoJRfN;CRB1j<"Ir?+^3rK*edlF:,E$W+8OU*Rf^o.%hV;j-8Ieic$>[g8b76!L\/!A`hA:FbEKR`T
QA;Y#':p!4pk9jYB at Gn1_Z'-_.'sA(Kfk%O$86!Uaq[R%?\h4<Y\<l`9O^@-c0\7N^4U$b_Q>akduC
1NJdV8];/jrWB1D($+8A?4;HYD]RF0/j]K7)Y!_Jhe*la-Ar at XkZD[Wlf7B at _QS#m6fPPA5&Tf!)!e
^'-0n;;Y,+!%K"V%7 at ijGrPVV`&D,$<j0G+pO)j#lTJMQ5ZC=u at QMuD=1IIQb3FT#Gaisptb%e90A1
tU]?bA#D%X;iUK3!op`/?af2`R:@<5Gqu]B5I2+e#:590oW*`%Hek7eJb'Q<W_(q8i5u8nF1u`oSc>
$0gcLSBHl4@#e>dO.dYdn@`2F#e/@^&9n/5&+bT_eoZLc7LB8gB at SM:<*Ml81^;2,66H!?Z(N#d6qn
)H5hsRI!jTO!)4lUYRS at rW'm&gKCm2RsuNV@=OiJm[OLK at 9$0/2.Pdi>L_XkFaXa+*<Lpc1S4JH[bk
-QZo-8Jj,OaIMuVBe%A;7sXc*a;`M/].\q at 8Zr0;S:O>3QO'F#/qt#6[<1oAn$j/8*/ST'M]WP.fcc
th7h=X6MD7ElSX[3k.m;p9'U<!Wa<'<f6bjt"D6koQ59;!P*boB2AeQeN:HE#6!$NN0#gW<ZPj\6bP
4[*?gsQ*dC+k:4i/-CPH%:pE>91q(X6#*3[g7MGr?DgR/,H4^Dk]>oSDPH:g!<b$#8=to%U_1fJBkt
uTVGP/NGJlu1MP"J1ee2SeRu<t]Q+VON3PeW1*Nu_KCT$q7Y3J`"+1)3Ph9$;EJS!7r.BV9=;i"*HV
OOU"faSs@%&8\$Z(9O9)&E.UrLdFa[Mq)FK!n"(Vun>aFj\THd?:ZW'NE:&%p"H1M-L.`_F;%n8&.6
e>%Y"E73^"0"CM3LtA&*1FP_;3X!e5iuVU=*co[F\ML&_8m'k$3+E]_d\.s0@=@,FA,70j,f85u!&<
J2f6oD.=g7Vi"jQ*o=:]H<3Vh\>@YSAO93C'.Bm=@1\I=R`;$dc&,%5a):_(c:`^$)BP%!qk:ZrSt#
Th$2LgFC:4b9iA"bm#m(gNbiE,WV^298,Xd)Ban.'Yt.BDU+!Vo75PhcaMPbbFG$Sp'0qQ6>aM&GrN
#@1pLK)$5M-&mVDTTG8a'PP]#1EgnF at O*FKkrQucPNZ'G^A;e?95^>ipZ4H,>(D+\O5U>qD"`6bK]+
Rq:@R./EaEh+4igM6-6l#9H!S$_R""_ at n>nHu1&*)XjH;5Wb8#AioI#6pg!<pIe!A=,_80C3E,CoK=
9[%2hnA2Me+!Oig#jWoPE"!PISpqjq,=69oL#;7 at V*nhVqb0n_)Li!S1h<Vta!A<%5uA&[-!#[fdUW
G!K/3Ueems3-(fQeBBG#AjMG<UaCk,]2LV=X?peABY-fPJ;1)C<lOn]m,DL^`E0a#b]hdX2+rrFg1#
+V%oC!lpa?(#,.1^UR7$*tELM)+`,5D;LR8El at C?0l=h%ld:Fj(AS"ip')NJA<`$#6b/ln5M77(:"!
Bn<$M.ASTt1$l?):6<m!co0Y at 08E#N;iCI7\8VRX6N+h8fDJI!.7>N\?`o(hNJuP]/1^bTW/VMW3!'
C90-t^0gJP[?8idsm\T_/.O"BZ\%8Ocs,Y2qW at 7EeS%*`Ih"Ac(jUC+4m^\8]>@TcVkGq.ZE:d/ijT
^fhGN%6$`ioO.(O@%#Z+jRL9]7uTg7!hu-.D:443,n#89'5=2uZB#>fEE#GB at Ci1@?8NUaZ!;[_Iut
bs8&&JP5U7sOK]=c5keff.OD5:7h8d8iJlLb>&hrilBG@'"q#&R$ku&6+VBH;c_m^U%A#&jZ:FI.,Y
uIFCC7\gbOYPkTb`9U(,$*\]>`J+o[;j%mR4MZt8Et:-Y4[45P%3F3MC5)m.ajsu2oPb?gsX/D at H(,
X&IO9T-8ilSO;/C;+qb6u=!n_Oa'0Vh;55\RIOGX7LXkp at m6khH%coAn%\HnjL3<Y[#)klN*G<_V]/
V*mT8?.q(U?FE;.=P&c\E[]0mLj:RshY5B'p77`8h(Z6:Ga,<'?CpH-%tp.WIj7gPqA+"GP"`nCjgO
]7WBYK2G)U$Fi=SR=1hM6u?(CSq:u6-&m*n5@)N[Um3XC.g6A.du#iR=]17[0K)t.(,;'mY$9nL6_Q
)cjD*A4Y!E*&,-P'"]@U,(N11+UYRUYp!>G_LA0^Z.'%2V`iCUgP^.]SUDP3]&G9Z:%,F0Gep>]:(Y
5i#/k2e&h%tGn*6,t09fIg?>jE at M82?=;,W@$V2r@!Vg&#jhJaO#b0R"_>Y/]+)eb`(3h63`HlR'-Z
S9TJ.G+"q0F`*"_pn0n\lp^U#&McbQ]1LVc:.L at n4+jNJu7o!LXPlA^1!p!I)BS1/57LDqZ0Y%@r,S
.qV at hsk#^p`B9,>o2JXaiqN*"t0,VPhe0*E,?W(l)gZe7Kl!'4LK5P"hoI-h)l=.[jp;E^2Lj#p.`f
K7P35B;!YSJsds2j^Q/tP`Mr?X3?^=MSm)?(icm_OV_2V-sT3A5b)$f8lSN&;2uL5!jWc-F+*tRZ=u
4R't:CI
xbtoa End N 6931 1b13 E a8 S cff7c R 33ef638d
SHAR_EOF
if test 8835 -ne "`wc -c < 'andy.tif.Z.btoa'`"
then
echo shar: "error transmitting 'andy.tif.Z.btoa'" '(should have been 8835 characters)'
fi
fi
exit 0
# End of shell archive
--
Andreas Lampen, TU Berlin
UUCP: andy at coma (unido!coma!andy)
BITNET: andy at db0tui62
More information about the Comp.sources.misc
mailing list