mah@hpuviea.UUCP (Michael Haberler) (01/19/89)
After several requests, here it comes: A dvi-> LaserJet II converter. Works
on MS-DOS, and Unixoids. I'm posting this for a friend who wrote it
(neumann@awiwuw11.bitnet, aka Gustaf Neumann), so mail bugfixes there, please.
It's four parts. Unshar, and 'cat dvilj.c-part? >dvilj.c'; then make.
Enjoy,
Michael
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by Michael Haberler <mah@hpuviea> on Wed Jan 18 17:56:28 1989
#
# This archive contains:
# KIT Makefile README commands.h
# dviprint.csh findfile.h
#
unset LANG
echo x - KIT
sed 's/^@//' >KIT <<'@EOF'
@From tuvie!AWIWUW11.BITNET!NEUMANN Wed May 4 09:41 MES 1988
Received: by hpuviea; Wed, 4 May 88 09:41:01 mes
@From: tuvie!AWIWUW11.BITNET!NEUMANN
Return-Path: <tuvie!AWIWUW11.BITNET!NEUMANN>
Received: from tuvie with uucp; Wed, 4 May 88 08:50:04
Received: by tuvie.uucp; Wed May 4 08:50:04 1988
Received: from mint.cern (mint) by cernvax.uucp (1.2/Ultrix2.0-B)
id AA08277; Wed, 4 May 88 08:46:11 +0200
Received: by mint.cern (cernvax) (4.12/3.14)
id AA25561; Wed, 4 May 88 08:46:03 +0200
Message-Id: <8805040646.AA25561@mint.cern>
Received: by cernvax Wed May 4 08:45:43
from NEUMANN@AWIWUW11.BITNET for mailer@cernvax via rscs.
X-Bitnet-Sender: NEUMANN@AWIWUW11.BITNET
Date: Tue, 03 May 88 20:05:34 WUT
To: hpuviea!mah
Comment: CROSSNET mail via MAILER@CERNVAX
You should receive additionally following files:
Text files:
DVI2XX C
DVI2XX HISTORY
COMMANDS H
FINDFILE H
TESTPAGE TEX
regards
- gustaf
@EOF
chmod 644 KIT
echo x - Makefile
cat >Makefile <<'@EOF'
DEST = /usr/local/bin
EXTHDRS = /usr/include/ctype.h \
/usr/include/signal.h \
/usr/include/stdio.h \
/usr/include/string.h \
/usr/include/string.h
HDRS = commands.h \
findfile.h
CFLAGS = +O1 -DLJ
LDFLAGS =
LIBS =
LINKER = cc
MAKEFILE = Makefile
OBJS = dvilj.o
PRINT = pr
PROGRAM = dvilj
SRCS = dvilj.c
all: $(PROGRAM)
$(PROGRAM): $(OBJS) $(LIBS)
@echo -n "Loading $(PROGRAM) ... "
@$(LINKER) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
@echo "done"
clean:; rm -f $(OBJS) dvilj
depend:; @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST)
index:; @ctags -wx $(HDRS) $(SRCS)
install: $(PROGRAM)
@echo Installing $(PROGRAM) in $(DEST)
cp $(PROGRAM) $(DEST)
cp dp $(DEST)
chmod 755 $(DEST)/$(PROGRAM)
chmod 755 $(DEST)/dp
print:; @$(PRINT) $(HDRS) $(SRCS)
program: $(PROGRAM)
tags: $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS)
update: $(DEST)/$(PROGRAM)
$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) $(HDRS) $(EXTHDRS)
@make -f $(MAKEFILE) DEST=$(DEST) install
###
dvilj.o: commands.h /usr/include/string.h /usr/include/signal.h \
/usr/include/stdio.h /usr/include/ctype.h findfile.h \
/usr/include/string.h
gupk.o: /usr/include/stdio.h
@EOF
chmod 644 Makefile
echo x - README
sed 's/^@//' >README <<'@EOF'
@From tuvie!AWIWUW11.BITNET!NEUMANN Wed May 4 09:41 MES 1988
Received: by hpuviea; Wed, 4 May 88 09:41:34 mes
@From: tuvie!AWIWUW11.BITNET!NEUMANN
Return-Path: <tuvie!AWIWUW11.BITNET!NEUMANN>
Received: from tuvie with uucp; Wed, 4 May 88 08:50:59
Received: by tuvie.uucp; Wed May 4 08:50:59 1988
Received: from mint.cern (mint) by cernvax.uucp (1.2/Ultrix2.0-B)
id AA08368; Wed, 4 May 88 08:48:19 +0200
Received: by mint.cern (cernvax) (4.12/3.14)
id AA25589; Wed, 4 May 88 08:48:11 +0200
Message-Id: <8805040648.AA25589@mint.cern>
Received: by cernvax Wed May 4 08:48:03
from NEUMANN@AWIWUW11.BITNET for mailer@cernvax via rscs.
X-Bitnet-Sender: NEUMANN@AWIWUW11.BITNET
Date: Tue, 03 May 88 20:06:09 WUT
To: hpuviea!mah
Comment: CROSSNET mail via MAILER@CERNVAX
MINIDESCRIPTION FOR DVI2XX
This is a description of a dvi converter (dvi= TeX's device independent
output format) that runs on PCs (XTs, ATs or compatible) under MS/DOS.
DVI2XX is able to produce either device dependent code for the
HP-LaserJet+ or for the IBM3812 (model 1) depending on a preproscessor
switch at compile time. The documentation concerning compile switches
is located in the source.
DVI2XX can be called with the following options:
-aXXX directory to take fonts from
-b take paper for first page from alternate cassette (only 3812)
-eXXX output file: either drive:path\name of outputfile
or device (such as lpt1, nul etc)
(default is drive:path\name of dvi file and extentsion
'.lj' for laserjet and '.pmp' for 3812)
-hXXX headerfile to be copied before translation of dvi-file
(you can send arbitrary commands to the laserprinter)
-fXXX print from begin of page xxx
-tXXX print to end of page xxx
-mXXX magnification
-xXXX global x-offset in mm on output page
-yXXX global y-offset in mm on output page
-r toggle reverse/not reverse order for output
(default reverse=FALSE for 3812, reverse=TRUE for LJ)
-p turn off font preload
-q quiet operation
-w no warnings
If no arguments are specifyed a short help file is displayed.
Two 'special' commands are implemented for the 3812:
\special{file=drive:path/name}
copy specified file to the printer;
either vector- or bitmap-graphics PMP commands
\special{orientation=Value}
set page orientation to 0, 1, 2, 3;
rotate following output to landscape mode etc.
Depending on print direction!
With the file= special TeX command I have faked the signature of
my boss with nice thick ink. It is simply the pmp command for a
polygon drawing and it looks surprisingly natural.
The program part for redirection of the output to the printer without
intermediate spool file was relatively tricky and uses a IOCTL bios-call.
The performance of the program is about 6 to 7 seconds per page on a
AT with 8Mhz in the 3812 mode. It is running on our configuration
via PC-NET.
Currently two font formats are supported: PXL 1001 and PXL 1002.
The program assumes the following pixelfile structure (the characters
under quotes are mandatory):
someroot
...
"pxl"1500
amr10.pxl
cmr10.pxl
...
"pxl"1643
amr10.pxl
cmr10.pxl
...
...
300dpi files can be used with an adequate magnification (-m#1250 option).
The following characters (all of them occur in the program) might be
translated wrongly by the ASCII-EBCDIC-ASCII conversion during uploading
and downloading respectively:
! exclamation point
[ left square bracket
\ left slash (backslash)
] right square bracket
{ left curly bracket
| vertical bar
} right curly bracket
If the characters in the first column do not correspond to their verbal
description fix the C-program adequately.
The program can be compiled with microsoft C Rel.3 or later using the
-AL compiler option. If you have no adequate C-compiler at your site I can
send also the compiled code via e-mail. If you have troubles with downloading
please send me a floppy.
On troubles please read first comments ot the begin of the source
program. Otherwise contact me.
- Gustaf Neumann
Wirtschaftsuniversitaet Wien
Institut fuer Informationsverabeitung und Informationswirtschaft
A-1090 Vienna
Augasse 2-6
Austria (Europe)
EARN/BITNET: NEUMANN at AWIWUW11
ARPA: neumann%awiwuw11.bitnet@wiscvm.ARPA
=========================================================================
Date: 25 August 1987, 16:58:19 WUT
@From: NEUMANN at AWIWUW11
Subject: New release (0.30) of dvi2xx
Hi (potential) dvi2xx-user...
There is a new relase (0.30) of the dvi/3812 and dvi/HPLJ+
converter. The new release features in the following points:
- it accepts the new PK 89 format (Rokicki, Tugboat Vol 6, 1985, No. 3)
that uses much less disk storage (about 1/4th of PXL1001 files),
- it is possible to specify a 'string of paths' to be searched for the
PXL- or PK-files; the paths are separated by semicolons,
- it accepts as file-extension either '.pxl' or '.pk',
- the formats of the pixel-files (PXL-1001, PXL-1002, PK-89)
can be arbitrarily mixed;
eg. CMR10 can be in PXL-1002 format, CMINCH can be in PK-89,
- the amount of storage in the PC is reduced especially when
PK-files are used,
- an unimportant bug from the timing measurements has been removed,
- verbatim mode can be set via commandline option -v, that informs
the user, which fonts are loaded.
We are using the driver here in the following setup.
We have a print-server (IBM PC-AT) that is connected on one side with
the 3812 via 19200/asynchronous port, and on the other side with a bunch
of PC-ATs via IBM PC-Net. We use PC-TeX on the ATs. Historically
all of the PXL-files have been on the print-server in 1002-format
being accessed from the dvi-driver over the network.
In the new setup, each of the PCs has a small set of the most used
PK-fonts. By specifying with the commandline option of dvi2xx
'-aLOCALFONTS;SERVERFONTS' where LOCALFONTS and SERVERFONTS are valid
fontdirectories, each font is searched first in LOCALFONTS
and if it is not found there in SERVERFONTS. Only seldomly used fonts
are accessed via PC-NET. The network load was reduced in this way
drastically, the speed improvement is about 30%.
If you have interest to receive the new version, please send a short
note ....
-gustaf
=========================================================================
Date: 12 November 1987, 12:11:00 WUT
@From: NEUMANN at AWIWUW11
Subject: New release (0.31) of dvi2xx .. supports also new dir-structure
The newer versions of PCTeX (and some TeX-drivers) are distributed with
fonts put into a different directory structure that uses in the
directory names RESOLUTIONS rather than MAGNIFICATIONS.
The old directory structure standard was:
somerootA
...
"pxl"1500
amr10.pxl
cmr10.pxl
cminch.pk
...
"pxl"1643
amr10.pxl
cmr10.pxl
tt10.pk
...
...
The new directory structure looks like:
somerootB
...
"DPI"300
amr10.pxl
cmr10.pxl
cminch.pk
...
"DPI"329
amr10.pxl
cmr10.pxl
tt10.pk
...
...
Rel 0.31 supports both structures, it is possible to specify
a path ('-a' option eg '-asomerootA;somerootB').
The search order in one directory is:
1) look for DPI....\font.pk where '...' is eg 240
2) look for DPI....\font.pxl or 300
3) look for pxl....\font.pk where '...' is eg 1200
4) look for pxl....\font.pxl or 240
=========================================================================
Date: 1 Dezember 1987, 14:11:00 WUT
Rel 0.32 initializes in LJ-mode the printer and resets it after run;
helps when operating with the LJ2
=========================================================================
Date: 18 Dezember 1987, 18:18:00 WUT
Rel 0.33 runs without any modifications under Unix V (HP/UX);
improved messages for missing fonts.
========================================================================
Date: 5 January 1988, 04:04:04 WUT
@From: NEUMANN at AWIWUW11
Subject: New release (0.40) of dvi2xx
Hi everybody!
The holidays are over and there comes a new release (0.40) of DVI2XX.
It has two major improvements over the previous release:
a) It supports 'HUGE' pixel characters;
b) it does a better positioning which is important mainly for the 3812.
c) Page origin is now on the 3812 and on the LJ2 1 inch from the left and
right edge of the paper.
d) Smaller output files (== higher printing speed).
ad a)
The driver knows now about three types of characters:
- Small characters are loaded into the font-storage of
the printer. When a small character occurs in the text,
the character is copied internally in the printer
to the output page. The bitmaps of small characters
are transmitted only once to the printer.
- Large characters are loaded into the memory of the driver
and are transmitted on each occurance in the text as a
raster graphic to the printer.
- Huge characters (characters which raster information has
a size more than 32767 bytes) are read on each occurance from
the disk and are transmitted as raster graphics. They are
not loaded permanently into the memory of the driver.
Why huge Characters?
It is quite easy to include graphics into TeX by packing
bitmap graphics into TeX fonts. I've written some programs
to convert graphics generated from Drawing Gallery, Framework II,
Scanning Gallery etc. into 1001 fonts and adequate TFM files
(if you want to have more info on that send me a note).
The graphics easily reach a size of 100 or 200K each, and so
it is certainly a problem to keep these in memory.
There are essentially 2 common ways to include graphics in TeX.
- Using \special to include printer dependent code.
- Putting the graphics into characters.
Advantages of the latter are:
1) The reproduction of the graphics is not device dependent
(rather resolution dependent). It is possible to see
text and graphics with a good previewer together on
the screen.
2) TeX sizes the graphics as it sizes characters. It is not
necessary to include size infos about the graphics in the
TeX file. When a graphic changes its size or shape, TeX is
able to rearrange the output.
I have scanned some photos and logos and included it in TeX
documents. It really looks great.
Please note that a standard LJ+ has not enough memory to generate
big raster graphics.
ad b) The driver has had some problems with positioning of rules.
In heavy formula djungles very often some lines have been placed
wrong by one pixel. It is not so easy to draw lines exactly where
you want using the 3812 vector drawing facilities... Additionally
the conversion of the internal TeX units into pixels has gotten
more accurate (also for the LJ). The result is a overall better
outlook of the printed pages.
ad c) This is true at least for the European A4 paper trays.
ad d) Output has been reduced by more intelligent positioning (for
both supported printers). Additionally the driver is more clever
now in sending bitmap graphics to the LJ. The 3812-code is
reduced approximately by 25% on a 20 page document.
Caveat: the driver is a little bit slower.
I hope I have not introduced to many new bugs.
=========================================================================
Date: 12 February 1988, 02:39:20 WUT
@From: NEUMANN at AWIWUW11
Subject: New release (0.41) of dvi2xx
Hi everybody!
It's time for a new release of dvi2xx. The newest version (0.41)
features in the following points:
- significantly better performance
- a bunch of new options
Performance:
The following figures are measured on a reasonably standard TeX
document (16 pages long, contains several formulas and tables)
on a PC/AT. The last two colums are also valid on Unix machines.
time to convert dvi file size of output file printing speed
(times faster as 0.40) (index rel to 0.40) (index rel 0.40)
3812: 2.5 0.64 0.70
LJ: 2.7 0.53 0.90
The relative poor performance increase in printing speed for the LJ
is due to the parallel (centronics) connection in the test configura-
tion. It would increase to a similar value as for the 3812 if the
printer is connected by a serial line and communication becomes the
bottleneck.
3 reasons are responsible for the improvements:
- More intelligent positioning commands for setting the characters
on the page.
- Parts of the floating point arithmetic are changed now to integer
arithmetic.
- MSC Rel. 5 is significantly faster as MSC Rel. 4 for the large
memory model.
New options:
-c (copies): specify number of copies to print
-X define X page origin in dots
-Y define Y page origin in dots
HINT: -X and -Y allows you to set the page origin on your
printer exactly to 1in/1in from the left corner. The
provided testfile TESTPAGE.TEX helps you to figure out
where the page origin is currently set to.
(Mostly important for LJs and clones)
-g (go): print without resetting the LJ at begin of file.
Changed options:
-r option (reverse) on LJ: default changed to "print from
first page to last"
-x (set x offset relative to page origin in mm):
accepts now floating point numbers
-y (set y offset relative to page origin in mm):
accepts now floating point numbers
NOTE that options are now case sensitive!
Other changes:
- Warning messages are printed now to stdout instead of stderr.
It is therefore easy now to redirect it.
- A bug in the computation of magnifications for directory names
is removed (the computed value was sometimes wrong by 1).
- Several warning messages has been improved.
Send me a short note if you want to receive 0.41. Please indicate
your favorite flavor (source/compiled, uuencode etc).
-gustaf
@EOF
chmod 644 README
echo x - commands.h
cat >commands.h <<'@EOF'
/* DVI COMMANDS */
#define SETC_000 0 /* typeset character 0 and move right */
#define SETC_127 127 /* typeset character 127 and move right */
#define SET1 128 /* typeset a character and move right */
#define SET2 129 /* ??? */
#define SET3 130 /* ??? */
#define SET4 131 /* ??? */
#define SET_RULE 132 /* typeset a rule and move right */
#define PUT1 133 /* typeset a character */
#define PUT2 134 /* ??? */
#define PUT3 135 /* ??? */
#define PUT4 136 /* ??? */
#define PUT_RULE 137 /* typeset a rule */
#define NOP 138 /* no operation */
#define BOP 139 /* beginning of page */
#define EOP 140 /* ending of page */
#define PUSH 141 /* save the current positions */
#define POP 142 /* restore previous positions */
#define RIGHT1 143 /* move right */
#define RIGHT2 144 /* ??? */
#define RIGHT3 145 /* ??? */
#define RIGHT4 146 /* ??? */
#define W0 147 /* move right by :w: */
#define W1 148 /* move right and set :w: */
#define W2 149 /* ??? */
#define W3 150 /* ??? */
#define W4 151 /* ??? */
#define X0 152 /* move right by :x: */
#define X1 153 /* move right and set :x: */
#define X2 154 /* ??? */
#define X3 155 /* ??? */
#define X4 156 /* ??? */
#define DOWN1 157 /* move down */
#define DOWN2 158 /* ??? */
#define DOWN3 159 /* ??? */
#define DOWN4 160 /* ??? */
#define Y0 161 /* move down by :y: */
#define Y1 162 /* move down and set :y: */
#define Y2 163 /* ??? */
#define Y3 164 /* ??? */
#define Y4 165 /* ??? */
#define Z0 166 /* move down by :z: */
#define Z1 167 /* move down and set :z: */
#define Z2 168 /* ??? */
#define Z3 169 /* ??? */
#define Z4 170 /* ??? */
#define FONT_00 171 /* set current font to 0 */
#define FONT_63 234 /* set current font to 0 */
#define FNT1 235 /* set current font */
#define FNT2 236 /* Same as FNT1, except that arg is 2 bytes */
#define FNT3 237 /* Same as FNT1, except that arg is 3 bytes */
#define FNT4 238 /* Same as FNT1, except that arg is 4 bytes */
#define XXX1 239 /* extension to :.DVI primitives */
#define XXX2 240 /* Like XXX1, but 0<=k<65536 */
#define XXX3 241 /* Like XXX1, but 0<=k<:t$2^:24:$:> */
#define XXX4 242 /* potentially long extension to :.DVI
primitives */
#define FNT_DEF1 243 /* define the meaning of a font number */
#define FNT_DEF2 244 /* ??? */
#define FNT_DEF3 245 /* ??? */
#define FNT_DEF4 246 /* ??? */
#define PRE 247 /* preamble */
#define POST 248 /* postamble beginning */
#define POST_POST 249 /* postamble ending */
/* undefined_commands 250,251,252,253,254,255 */
@EOF
chmod 644 commands.h
echo x - dviprint.csh
cat >dviprint.csh <<'@EOF'
#! /bin/csh -f
# Script to print dvi files on a laserjet.
# M. Haberler 3/9/87
# - adaptded for V0.41 4/88
unset verbose
set unkflag
set file=""
set unquiet=""
set searchpath=""
set startat =""
set headerfile=""
set mag=""
set preload=""
set quiet=""
set reverse=""
set topage=""
set nowarn=""
set xoff=""
set yoff=""
set xorg=""
set yorg=""
set lpdest=""
set lpcopies=""
set lpsilent="-s"
set lpverbose=""
foreach argument ( $* )
while ( 1 )
switch ( $argument )
case "-v":
set unquiet="-v"
set lpsilent=""
set lpverbose="-w"
break
case "-a*":
set searchpath=$argument
break
case "-f*":
set startat=$argument
break
case "-h*":
set headerfile=$argument
break
case "-m*":
set mag=$argument
break
case "-p":
set preload=$argument
break
case "-q*":
set quiet=$argument
break
case "-r":
set reverse=$argument
break
case "-t*":
set topage=$argument
break
case "-w":
set nowarn=$argument
break
case "-X*":
set xorg=$argument
break
case "-Y*":
set yorg=$argument
break
case "-x*":
set xoff=$argument
break
case "-y*":
set yoff=$argument
break
case "-d*":
set lpdest=$argument
break
case "-n*":
set lpcopies=$argument
break
case "-*":
echo Unknown flag: \"$argument\"
set unkflag = "$unkflag $argument"
break
case "*":
set file=$argument
break
endsw
set argument = -`expr "$argument" : '-.\(.*\)'` || break
end
end
dvilj $unquiet $searchpath $startat $headerfile $mag \
$preload $quiet $reverse $topage $nowarn $xoff $yoff \
-e/usr/tmp/dvilj$$ $file
set xxx=$status
if ($xxx == 2) then
echo "\n"
echo bad return status from dvilj, nothing printed
else
if ($xxx == 1) then
echo "\n"
echo Non-Fatal errors during conversion, printing anyway
else
echo "\n"
echo Conversion ok, printing
endif
cat /usr/tmp/dvilj$$ | lp -onb -oraw $lpdest $lpcopies $lpsilent $lpverbose
endif
rm -f /usr/tmp/dvilj$$
#This is the DVI to HP Laserjet+ converter version 0.30 HP-9000/800
#usage: dvilj [OPTIONS] dvifile
#OPTIONS are:
# -aX ..... X= searchpath leading to pixel-files (PK or PXL)
# -eX ..... X= outputfile
# -fX ..... print from begin of page number X
# -hX ..... X= name of headerfile
# -mX ..... magnification X=0;h;1;2;3;4;5;#xxxx
# -p ..... turn off font-preload
# -q ..... quiet operation
# -r ..... don't process pages in reverse order
# -tX ..... print to end of page number X
# -w ..... don't print out warnings
# -v ..... tell user what pixel-files are used
# -xX ..... X= x-offset on printout in mm
# -yX ..... X= y-offset on printout in mm
#
#
# lp options
# -or raw output
# -onb no banner
# -dDEST which printer
# -s silent
# -w write msg to terminal after done
# -nNUMBER make NUMBER copies (1=default)
@EOF
chmod 755 dviprint.csh
echo x - findfile.h
cat >findfile.h <<'@EOF'
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int stat();
bool
findfile(path,n,fontmag,name)
char path[STRSIZE]; /* PIXEL path */
char n[STRSIZE]; /* name of font */
long fontmag; /* magnification */
char name[STRSIZE]; /* full name of PXL file (returned) */
{
char local_path[STRSIZE];
char * pathpt, *pppt;
struct stat s;
int rc;
int resolution;
pathpt = strcpy(local_path,path);
resolution = (int)(fontmag/5.0 +0.5) ;
do {
pppt = strchr(pathpt , ';' );
if (pppt != NULL) {
*pppt = '\0';
pppt++;
}
sprintf(name,"%s/dpi%d/%s.pk",pathpt,resolution,n);
if ((rc = stat(name,&s))!=0) {
sprintf(name,"%s/dpi%d/%s.pxl",pathpt,resolution,n);
if ((rc = stat(name,&s))!=0) {
sprintf(name,"%s/pxl%ld/%s.pk",pathpt,fontmag,n);
if ((rc = stat(name,&s))!=0) {
sprintf(name,"%s/pxl%ld/%s.pxl",pathpt,fontmag,n);
rc = stat(name,&s);
}
}
}
if (rc==0) return(TRUE);
else pathpt = pppt;
} while (pathpt!=NULL);
/* return error messaage */
sprintf(name,"font not found: <%s>/<dpi%d;pxl%ld>/%s.<pk;pxl>",
path,resolution,fontmag,n);
return(FALSE);
}
@EOF
chmod 644 findfile.h
exit 0
--
Michael Haberler mah@hpuviea.uucp
Hewlett-Packard Austria GmbH, ...mcvax!tuvie!hpuviea!mah
Lieblgasse 1 ...hplabs!hpfcla!hpbbn!hpuviea!mah
A-1220 Vienna, Austria Tel: (0043) (222) 2500 x412 (9-18 CET)