/*
 *   Projekt zum formatierten Drucken
 *   unter Ausnutzung der Preferences-Struktur
 *   und wahlweisen InLine-Optionen
 */


/************************************
*                                   *
* PreProc-Anweisungen               *
* ===================               *
*                                   *
* Autor:    Datum:  Kommertar:      *
* ------    ------  ----------      *
* H.Kindler 23.7.91                 *
* H.Kindler 26.8.93 Neue Protos     *
*                                   *
************************************/
#include <ctype.h>                   /* islower etc.  */
#include <stdlib.h>                  /* exit etc.     */
#include <stdio.h>                   /* printf etc.   */
#include <string.h>                  /* strlen etc.   */
#include <exec/types.h>              /* ULONG etc.    */
#include <exec/memory.h>             /* AvailMem etc. */
#include <clib/exec_protos.h>
#include <intuition/intuition.h>     /* GetPrefs etc. */
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <sys/stat.h>                /* stat etc.     */
#include <sys/time.h>                /* localtime etc.*/
#include <libraries/arpbase.h>       /* FileRequester */

/* Defines */

#define Version     0                    /* Noch keine Version            */
#define Revision    1                    /* erste Revision                */
#define DatumMax    25L                  /* Max. Stringlänge Datum        */
#define DIR_LEN     256                  /* Max. Länge Directory          */
#define EINRUECK    (long) (HLUECKE / 2) /* Horizontal-Abstand der Boxen  */
#define ESC         27                   /* Esacpe-Zeichen                */
#define FNAME_LEN   30                   /* Max. Länge FileName           */
#define HLUECKE     20L                  /* Horizontal-Abstand der Boxen  */
#define LINKS       0L                   /* Linker Rand Boxen im Window   */
#define NUMLEN      6L                   /* Länge Zeilennummer (falls da) */
#define OBEN        0L                   /* oberer Rand Dingsbums         */
#define PRINT       9L                   /* Lg 1.Teil PrtFile (prt:Print) */
#define RECHTS      72L                  /* rechter Rand kleines Gadget   */
#define RECHTS2     (long) (3 * RECHTS + 2 * HLUECKE)   /* GAANZ BREEIIT  */
#define RECHTS3     (long) ((3 * RECHTS + HLUECKE) / 2) /* Halb so breit  */
#define RETURN      13                   /* edoC-NRUTER                   */
#define SIZE sizeof (struct Preferences) /* eine kleine Abkürzung         */
#define SKIP        3L                   /* Zeilen am Seitenende          */
#define SPACE       32L                  /* Die große Taste ganz Unten!   */
#define TAB         8L                   /* Tabulatorgröße                */
#define TITELSKIP   14L                  /* Abstand 1. Box - Fensterrand  */
#define TXTVOFFSET  3L                   /* V-Abstand Box - Text          */
#define UNTEN       13L                  /* unterer Rand                  */
#define VLUECKE     5L                   /* Vertikal-Abstand              */

/* Prototypen */

void  Close_All    (void);                      /* Prototypen */
void  InitPrinter  (void);                      /* der        */
void  DefaultPrefs (struct Gadget dingens[]);   /* einzelnen  */
void  Open_All     (void);                      /* Funktionen */
void  PrintEscape  (void);
short PrintKopf    (void);
short PrintLine    (short lines, short pline);
void  ResetPrinter (void);
void  drucken      (void);
void  Abbruch      (void);

/* Globals */

struct ArpBase      *ArpBase;         /* Basis ARP (FileRequester) */
short               CPL;              /* Chars Per Line            */
char                Datum [DatumMax]; /* Datum-String              */
size_t              DatumLen;         /* Länge des Datum-Strings   */
BOOL                DoNum = FALSE;    /* (Keine) Zeilennummer      */
BOOL                DoNumPrefs = FALSE;  /* (Keine) Zeilennummer   */
BOOL                DoKopf = TRUE;    /* KopfZeile                 */
char                *FileName;        /* Name, wie übergeben       */
FILE                *FP = NULL;       /* FilePointer Eingabe-File  */
UBYTE               fr_fname [FNAME_LEN + 1];  /* Puffer Requester */
UBYTE               fr_dir [DIR_LEN + 1];  /* UndoPufer Requester  */
extern
struct GfxBase      *GfxBase;         /* Gfx öffnen DICE-Special   */
extern
struct InuitionBase *IntuitionBase;   /* Intui öffnen DICE-Spezial */
short               LM;               /* Left Margin               */
short               LPP;              /* Lines Per Page            */
short               LPI;              /* Lines Per Inch            */
short               LLen;             /* LineLength (ohne Ränder)  */
BOOL                NoNum = FALSE;    /* ZN temporär unterdrücken  */
short               NumLen = 0;       /* Länge der ZeilenNummer    */
short               PPL;              /* PaPerLength               */
FILE                *PRT = NULL;      /* FilePointer Drucker       */
struct Preferences  *PrefsBuffer;     /* Prefs-Struktur            */
struct Preferences  *PrefsOrig;       /* Prefs-Struktur Orig-Werte */
short               RM;               /* Right Margin              */
short               Skip;             /* freie Zeilen am Blattende */
/*extern
  UWORD               Unterschrift_data[];*/  /* Image-Daten erklären  */
struct Window       *window;          /* Unser kleines Fensterlein */

/*** IMAGE ***/

__chip const
UWORD Unterschrift_data[3 * 113 * 2] =
{
    0,   192,     0,     0,   304,     0,     0,  1600,     0,     0,  3456,
    0,     0,  6912,     0,     0,  7680,     0,     0, 13824,     0,     0,
15360,     0,     0, 15360,     0,     0, 15360,     0,     0, 11264,     0,
    0, 10240,     0,     0, 10240,     0,     0, 14336,     0,     0, 15360,
    0,     0, 15360,     0,     0, 15360,     0,     0,  7168,     0,     0,
 7168,     0,  3840,  7680,     0,  4032,  7680,     0,  2016,  3584,     0,
 1840,  3840,     0,   924,  3840,     0,   462,  1792,     0,   231,  1920,
    0,   113, 34688,     0,    25, 50048,     0,  3854, 26240,     0,  1991,
63360,     0,   481, 64896,     0,   248, 16128,     0,   124,  3584,     0,
   30,  1792,     0,    15, 33664,     0,     3, 50048,     0,     0, 58304,
    0,     0, 16320,     0,     0,  8128,     0,     0,  1536,     0,     0,
 4864,     0,     0,  9600,     0,     0, 14528,     0,     0,  7280,     0,
    0,  3640,     0,     0,   924,     0,     0,   244,     0,     0,    60,
    0,     0,     0,     0,     1, 32800,     0,     1, 24680,     0,     1,
49272,     0,     0, 57400,     0,     0, 12392,     0,     0,   120,     0,
    0,   216,     0,     3,   240,     0,     1, 49584,     0,     0, 58208,
    0,     0, 29632,     0,     0, 14528,     0,  7168,  3072,     0,  1920,
 1536,     0,   496,  1792,     0,    60,   896,     0,     7, 33216,     0,
    0, 61920,     0,     0,  8032,     0,     0,   448,     0,     0,     0,
    0,     0,     0,     0, 57344,     0,     0, 31744,     0,     0,  7936,
    0,     0,  1984,  1024,     0,   496,  3328,     0,   124,  6912,     0,
   15,  7680,     0,     3, 56832,     0,     0, 32256,     0,     0,  7936,
    0,     0,  4032,     0,     0,   752,     0,     0,    16,     0,     0,
  128,     0,     0,    96,     0,     0,    48,     0,     0,    60,     0,
    0,    46,     0,     0,    40,     0,  7936,    56,     0,  4064,    60,
    0,  1852,    60,     0,   487,   252,     0,    57, 49404,     0,    15,
28796,     0,     3, 63544,     0,     0, 32284,     0,     0,  4086,     0,
    0,   252,     0,     0,  6256,     0,     0, 13848,     0,  7996,  7566,
    0,  2047, 34407,     0,   127, 61851, 32768,    15, 57086, 32768,     0,
32767, 32768,     0,  8191, 32768,     0,   991, 49152,     0,   120,     0,
    0,    30,     0,     0,     7, 32768,     0,     0, 49152,     0,     0,
    0,     0,    48,     0,     0,    64,     0,     0,   384,     0,     0,
  768,     0,     0,  1536,     0,     0,  1536,     0,     0,  3072,     0,
    0,  3072,     0,     0,  3072,     0,     0,  3072,     0,     0,  2048,
    0,     0,  2048,     0,     0,  2048,     0,     0,  3072,     0,     0,
 3072,     0,     0,  3072,     0,     0,  3072,     0,     0,  1024,     0,
    0,  1536,     0,   576,  1536,     0,   800,   512,     0,   256,   768,
    0,   132,   768,     0,    66,   256,     0,    33,   384,     0,    16,
33152,     0,     0, 16768,     0,     0,  8320,     0,    64,  4480,     0,
    1,   384,     0,     8, 14080,     0,     4,   512,     0,     0,   256,
    0,     0, 33152,     0,     0, 16512,     0,     0,   192,     0,     0,
  192,     0,     0,  1984,     0,     0,   512,     0,     0,   256,     0,
    0,  1152,     0,     0,  2048,     0,     0,  1040,     0,     0,     8,
    0,     0,    12,     0,     0,     4,     0,     0,    60,     0,     0,
    0,     0,     0,     0,     0,     0, 24584,     0,     0, 16408,     0,
    0,  8216,     0,     0, 12296,     0,     0,    24,     0,     0,    24,
    0,     0,    48,     0,     0, 16432,     0,     0,  8288,     0,     0,
 4288,     0,     0,  2240,     0,     0,  1024,     0,     0,   512,     0,
  256,   256,     0,    32,   128,     0,     4,    64,     0,     0, 32864,
    0,     0,  6240,     0,     0,   448,     0,     0,     0,     0,     0,
    0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
   64,     0,     0,     0,   256,     0,    64,   768,     0,     0,  1536,
    0,     2,  1536,     0,     0,   512,     0,     0,     0,     0,     0,
 1024,     0,     0,   688,     0,     0,    16,     0,     0,     0,     0,
    0,    32,     0,     0,     0,     0,     0,     4,     0,     0,    14,
    0,     0,     8,     0,     0,     8,     0,   768,    12,     0,    32,
   12,     0,   256,    12,     0,     0,    12,     0,     0,  4124,     0,
    2,     8,     0,     0, 16388,     0,     0,  3078,     0,     0,    60,
    0,     0,    16,     0,     0,     0,     0,     0,  1026,     0,  1536,
    1,     0,    64, 32769, 32768,    14,     0, 32768,     0,  1057, 32768,
    0,  4224, 32768,     0,   543, 49152,     0,     0,     0,     0,     0,
    0,     0,     4, 32768,     0,     0, 49152
};

struct Image Unterschrift =
{
 0, 0,                      /* LeftEdge, TopEdge     */
 34, 113, 2,                /* Width, Height, Depth  */
 &Unterschrift_data[0],     /* ImageData             */
 3, 0,                      /* PlanePick, PlaneOnOff */
 NULL                       /* NextImage             */
};

/*** Intui-Texte ***/

struct TextAttr txtattr =           /* Name, Größe, Style, Flags */
{"topaz.font", 8, FS_NORMAL, FPF_ROMFONT | FPF_DESIGNED};

struct IntuiText texte[] =
{ /* FrontPen, BackPen, Mode, Links, Oben, TextAttr, Text, Next */
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 4, TXTVOFFSET,   /*  0 = Pica          */
  &txtattr, "Pica", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 5, TXTVOFFSET,   /*  1 = Elite         */
  &txtattr, "Elite", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 4, TXTVOFFSET,   /*  2 = Fine          */
  &txtattr, "Fine", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 3, TXTVOFFSET,   /*  3 = NLQ           */
  &txtattr, "NLQ", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 5, TXTVOFFSET,   /*  4 = Draft         */
  &txtattr, "Draft", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 1, TXTVOFFSET,   /*  5 = 6 LPI         */
  &txtattr, "6", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 1, TXTVOFFSET,   /*  6 = 8 LPI         */
  &txtattr, "8", NULL},
 {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 13, TXTVOFFSET, /*  7 = Zeilennummern */
  &txtattr, "Zeilennummern", NULL},
 {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 9, TXTVOFFSET,  /*  8 = Kopfzeile     */
  &txtattr, "Kopfzeile", NULL},
 {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 5, TXTVOFFSET,   /*  9 = Laden         */
  &txtattr, "Laden", NULL},
 {1, 0, JAM1, RECHTS2 / 2 + 1 - 4 * 16, TXTVOFFSET, /* 10 = Voreinstellun */
  &txtattr, "Voreinstellungen", NULL},
 {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 7, TXTVOFFSET,  /* 11 = Drucken       */
  &txtattr, "Drucken", NULL},
 {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 7, TXTVOFFSET,  /* 12 = Abbruch      */
  &txtattr, "Abbruch", NULL}
};

struct IntuiText texte2 [] =
{ /* FrontPen, BackPen, Mode, Links, Oben, TextAttr, Text, Next */
 {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + UNTEN + VLUECKE,
  &txtattr, "Qualität:", &texte2[1]},
 {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 2 * (UNTEN + VLUECKE),
  &txtattr, "Ränder:", &texte2[2]},
 {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 3 * (UNTEN + VLUECKE),
  &txtattr, "LPI:", &texte2[3]},
 {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 4 * (UNTEN + VLUECKE),
  &txtattr, "Zeilen/Blatt (6 LPI):", &texte2[4]},
 {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 5 * (UNTEN + VLUECKE),
  &txtattr, "Zeilen überspringen:", &texte2[5]},
 {1, 0, JAM1, EINRUECK, TITELSKIP + 2 *TXTVOFFSET + 7 * (UNTEN + VLUECKE),
  &txtattr, "Dateiname:", NULL}
};

/*** Ränder ***/

SHORT randdaten [] [] =
{ /* x1,y1,  x2,y2, ... */
 {LINKS - 1, OBEN - 1,   RECHTS,      OBEN - 1,   RECHTS,  UNTEN,
  LINKS - 1, UNTEN,      LINKS - 1,   OBEN - 1},
 {LINKS - 1, OBEN - 1,   RECHTS2,     OBEN - 1,   RECHTS2, UNTEN,
  LINKS - 1, UNTEN,      LINKS - 1,   OBEN - 1},
 {LINKS - 1, OBEN - 1,   RECHTS3,     OBEN - 1,   RECHTS3, UNTEN,
  LINKS - 1, UNTEN,      LINKS - 1,   OBEN - 1},
 {LINKS + 2, OBEN + 1,   RECHTS3 - 3, OBEN + 1,   RECHTS3 - 3, UNTEN - 2,
  LINKS + 2, UNTEN - 2,  LINKS + 2,   OBEN + 1}
};

struct Border rand [] =
{ /* Links, Oben, FrontPen, BackPen, Mode, Count, XY, Next */
 {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[0], NULL    },
 {LINKS, OBEN - TXTVOFFSET, 1, 0, JAM1, 5, randdaten[0], NULL    },
 {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[1], NULL    },
 {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[2], NULL    },
 {LINKS, OBEN - TXTVOFFSET, 1, 0, JAM1, 5, randdaten[1], NULL    },
 {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[3], &rand[3]}
};

/*** Sting-Gadgets-Stuff ***/

UBYTE strbuf [4] [4];                       /* Puffer StrGads   */
UBYTE strundobuf [4] [4];                   /* UndoPuf StrGads  */
UBYTE fname [DIR_LEN + FNAME_LEN + 1];      /* Puffer FileName  */
UBYTE fnameundo [DIR_LEN + FNAME_LEN + 1];  /* UndoPuf FileName */

struct StringInfo strinfo [] =
{ /* Buffer, UndoBuffer, BufferPos, MaxChars, DispPos, UndoPos,     *
   * NumChars, DispCount, CLeft, CTop, LayerPtr, LongInt, AltKeyMap */
 {strbuf[0], strundobuf[0], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
 {strbuf[1], strundobuf[1], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
 {strbuf[2], strundobuf[2], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
 {strbuf[3], strundobuf[3], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
 {fname, fnameundo, 0, DIR_LEN + FNAME_LEN, 0, 0, 0, 0, 0, 0, NULL, 0, NULL}
};

/*** Gadgets ***/

struct Gadget dingens[] =
{ /* Next, Links, Oben, Breite, Höhe, Flags, Activation, Typ,  *
   * Rand, SelRand, Text, MutualExclude, SpecialInfo, ID, User */
 {                       /* Pica */
  &dingens[1],              /* Next                       */
  EINRUECK, TITELSKIP,      /* Left, Top                  */
  RECHTS, UNTEN,            /* Width, Height              */
  GADGHCOMP,                /* Flags                      */
  RELVERIFY,                /* Activation                 */
  BOOLGADGET,               /* GadgetType                 */
  &rand[0], NULL,           /* GadgetRender, SelectRender */
  &texte[0], NULL,          /* GadgetText, MutualExclude  */
  NULL, 0,                  /* SpecialInfo, GadgetID      */
  NULL                      /* UserData                   */
 },
 {                      /* Elite */
  &dingens[2],                  /* Next                       */
  EINRUECK + HLUECKE + RECHTS,  /* Left                       */
  TITELSKIP,                    /* Top                        */
  RECHTS, UNTEN,                /* Width, Height              */
  GADGHCOMP,                    /* Flags                      */
  RELVERIFY,                    /* Activation                 */
  BOOLGADGET,                   /* GadgetType                 */
  &rand[0], NULL,               /* GadgetRender, SelectRender */
  &texte[1], NULL,              /* GadgetText, MutualExclude  */
  NULL, 1,                      /* SpecialInfo, GadgetID      */
  NULL                          /* UserData                   */
 },
 {                      /* Fine */
  &dingens[3],                          /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),    /* Left                       */
  TITELSKIP,                            /* Top                        */
  RECHTS, UNTEN,                        /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY,                            /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[0], NULL,                       /* GadgetRender, SelectRender */
  &texte[2], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 2,                              /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* NLQ */
  &dingens[4],                          /* Next                       */
  EINRUECK + 1 * (HLUECKE + RECHTS),    /* Left                       */
  TITELSKIP + UNTEN + VLUECKE,          /* Top                        */
  RECHTS, UNTEN,                        /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY,                            /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[0], NULL,                       /* GadgetRender, SelectRender */
  &texte[3], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 3,                              /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* Draft */
  &dingens[5],                          /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),    /* Left                       */
  TITELSKIP + UNTEN + VLUECKE,          /* Top                        */
  RECHTS, UNTEN,                        /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY,                            /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[0], NULL,                       /* GadgetRender, SelectRender */
  &texte[4], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 4,                              /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* 6 LPI */
  &dingens[6],                          /* Next                       */
  EINRUECK + 1 * (HLUECKE + RECHTS),    /* Left                       */
  TITELSKIP + 3 * (UNTEN + VLUECKE),    /* Top                        */
  RECHTS, UNTEN,                        /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY,                            /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[0], NULL,                       /* GadgetRender, SelectRender */
  &texte[5], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 5,                              /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* 8 LPI */
  &dingens[7],                          /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),    /* Left                       */
  TITELSKIP + 3 * (UNTEN + VLUECKE),    /* Top                        */
  RECHTS, UNTEN,                        /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY,                            /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[0], NULL,                       /* GadgetRender, SelectRender */
  &texte[6], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 6,                              /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* Linker Rand */
  &dingens[8],                          /* Next                       */
  EINRUECK + 1 * (HLUECKE + RECHTS),    /* Left                       */
  TITELSKIP + 2 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top            */
  RECHTS, UNTEN,                        /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY | STRINGRIGHT | LONGINT,    /* Activation                 */
  STRGADGET,                            /* GadgetType                 */
  &rand[1], NULL,                       /* GadgetRender, SelectRender */
  NULL, NULL,                           /* GadgetText, MutualExclude  */
  &strinfo[0], 7,                       /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* Rechter Rand */
  &dingens[9],                              /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  TITELSKIP + 2 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  RECHTS, UNTEN,                            /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY | STRINGRIGHT | LONGINT,        /* Activation                 */
  STRGADGET,                                /* GadgetType                 */
  &rand[1], NULL,                           /* GadgetRender, SelectRender */
  NULL, NULL,                               /* GadgetText, MutualExclude  */
  &strinfo[1], 8,                           /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Blattlänge */
  &dingens[10],                             /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  TITELSKIP + 4 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  RECHTS, UNTEN,                            /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY | STRINGRIGHT | LONGINT,        /* Activation                 */
  STRGADGET,                                /* GadgetType                 */
  &rand[1], NULL,                           /* GadgetRender, SelectRender */
  NULL, NULL,                               /* GadgetText, MutualExclude  */
  &strinfo[2], 9,                           /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Freie Zeilen */
  &dingens[11],                             /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  TITELSKIP + 5 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  RECHTS, UNTEN,                            /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY | STRINGRIGHT | LONGINT,        /* Activation                 */
  STRGADGET,                                /* GadgetType                 */
  &rand[1], NULL,                           /* GadgetRender, SelectRender */
  NULL, NULL,                               /* GadgetText, MutualExclude  */
  &strinfo[3], 10,                          /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Zeilennummer */
  &dingens[12],                         /* Next                       */
  EINRUECK,                             /* Left                       */
  TITELSKIP + 6 * (UNTEN + VLUECKE),    /* Top                        */
  RECHTS3, UNTEN,                       /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY | TOGGLESELECT,             /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[3], NULL,                       /* GadgetRender, SelectRender */
  &texte[7], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 11,                             /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* Kopfzeile */
  &dingens[13],                         /* Next                       */
  EINRUECK + HLUECKE + RECHTS3,         /* Left                       */
  TITELSKIP + 6 * (UNTEN + VLUECKE),    /* Top                        */
  RECHTS3, UNTEN,                       /* Width, Height              */
  GADGHCOMP,                            /* Flags                      */
  RELVERIFY | TOGGLESELECT,             /* Activation                 */
  BOOLGADGET,                           /* GadgetType                 */
  &rand[3], NULL,                       /* GadgetRender, SelectRender */
  &texte[8], NULL,                      /* GadgetText, MutualExclude  */
  NULL, 12,                             /* SpecialInfo, GadgetID      */
  NULL                                  /* UserData                   */
 },
 {                      /* Laden */
  &dingens[14],                             /* Next                       */
  EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  TITELSKIP + 7 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  RECHTS, UNTEN,                            /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY,                                /* Activation                 */
  BOOLGADGET,                               /* GadgetType                 */
  &rand[0], NULL,                           /* GadgetRender, SelectRender */
  &texte[9], NULL,                          /* GadgetText, MutualExclude  */
  NULL, 13,                                 /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Dateiname */
  &dingens[15],                             /* Next                       */
  EINRUECK,                                 /* Left                       */
  TITELSKIP + 8 * (UNTEN + VLUECKE) + TXTVOFFSET + 1,   /* Top            */
  RECHTS2, UNTEN,                           /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY,                                /* Activation                 */
  STRGADGET,                                /* GadgetType                 */
  &rand[4], NULL,                           /* GadgetRender, SelectRender */
  NULL, NULL,                               /* GadgetText, MutualExclude  */
  &strinfo[4], 14,                          /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Voreinstellungen */
  &dingens[16],                             /* Next                       */
  EINRUECK,                                 /* Left                       */
  TITELSKIP + 9 * (UNTEN + VLUECKE) + TXTVOFFSET + 1,   /* Top            */
  RECHTS2, UNTEN,                           /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY,                                /* Activation                 */
  BOOLGADGET,                               /* GadgetType                 */
  &rand[2], NULL,                           /* GadgetRender, SelectRender */
  &texte[10], NULL,                         /* GadgetText, MutualExclude  */
  NULL, 15,                                 /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Drucken */
  &dingens[17],                             /* Next                       */
  EINRUECK,                                 /* Left                       */
  TITELSKIP + 10 * (UNTEN + VLUECKE) + 2 * TXTVOFFSET + 1,   /* Top       */
  RECHTS3, UNTEN,                           /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY,                                /* Activation                 */
  BOOLGADGET,                               /* GadgetType                 */
  &rand[5], NULL,                           /* GadgetRender, SelectRender */
  &texte[11], NULL,                         /* GadgetText, MutualExclude  */
  NULL, 16,                                 /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 },
 {                      /* Abbruch */
  NULL,                                     /* Next                       */
  EINRUECK + HLUECKE + RECHTS3,             /* Left                       */
  TITELSKIP + 10 * (UNTEN + VLUECKE) + 2 * TXTVOFFSET + 1,   /* Top       */
  RECHTS3, UNTEN,                           /* Width, Height              */
  GADGHCOMP,                                /* Flags                      */
  RELVERIFY,                                /* Activation                 */
  BOOLGADGET,                               /* GadgetType                 */
  &rand[5], NULL,                           /* GadgetRender, SelectRender */
  &texte[12], NULL,                         /* GadgetText, MutualExclude  */
  NULL, 17,                                 /* SpecialInfo, GadgetID      */
  NULL                                      /* UserData                   */
 }
};

/*** FileRequester ***/

struct FileRequester freq;
/*
 *  struct FileRequester freq =
 *  {
 *   "Bitte Datei auswählen! ",
 *   fr_fname, fr_dir,
 *   window,
 *   0, FR2F_LongPath,
 *   NULL,
 *   0L
 *  };
 */

/*******************************************
*                                          *
* Programm: Formatiertes Drucken von Files *
* ======================================== *
*                                          *
* Autor:    Datum:  Kommertar:             *
* ------    ------  ----------             *
* H.Kindler 23.7.91 CLI-Start              *
*                                          *
*******************************************/
void main (int argc, char **argv)
{
    short  i;           /* Zählvariable */

/*
 *    printf ("argc: %d\n",argc);
 *    for (i = 0; i < argc; ++i)
 *        printf ("argv[%d]: %s\n", i, argv[i]);
 */
    if ((argc == 2) && (*argv[1] == '?'))       /* Eine kleine Hilfe */
    {
        printf ("\33[33mAufruf:\33[31m\t\%s PrintFile [NUM]\n\n", argv[0]);
        puts ("Print druckt PrintFile (Wahlweise mit Zeilen-Nummerierung.)");
        puts ("Es werden zur Seitenformatierung automatisch die Werte");
        puts ("von Preferences benutzt.");
        puts ("\nMomentan kann statt NUM als dritter Wert etwas beliebiges");
        puts ("übergeben werden (\"Stinker\" tuts auch)!");
        exit (RETURN_OK);
    }
    if (argc == 3)   /* Momentan tut alles! */
        DoNumPrefs = TRUE;       /* Nummerierung einschalten  */
    FileName = argv[1];
    drucken ();
}


/*******************************************
*                                          *
* Programm: Formatiertes Drucken von Files *
* ======================================== *
*                                          *
* Autor:    Datum:  Kommertar:             *
* ------    ------  ----------             *
* H.Kindler 23.7.91 WB-Start               *
*                                          *
*******************************************/
void wbmain (struct WBStartup *wbs)
{
    drucken ();
}

/************************************************************
*                                                           *
* Programm: Formatiertes Drucken von Files                  *
* ========================================                  *
*                                                           *
* Autor:    Datum:  Kommertar:                              *
* ------    ------  ----------                              *
* H.Kindler 10.8.91                                         *
* H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
*                                                           *
************************************************************/
void drucken (void)
{
    short  c;                             /* var für fgetc              */
    short  i;                             /* Zählvariable               */
    short  anz   = 0;                     /* Zeichenzahl aktuelle Zeile */
    short  lines = 1;                     /* Zeilenzahl                 */
    short  pline = 0;                     /* Zeilen aktuelle Seite      */
    struct stat statbuf;                  /* Infos übers File           */
    time_t ftime;                         /* Datum des Files            */
    struct tm *tp;                        /* Time-Struct von ftime      */

    Open_All ();
    InitPrinter();
    if (stat (FileName, &statbuf))          /* Infos übers File */
    {
        puts ("Error bei 'stat'");
        Close_All ();
        exit (RETURN_ERROR);
    }
    ftime = (time_t) statbuf.st_ctime;      /* Datum des Files */
    tp = localtime (&ftime);                /* Aufbereiten     */
    DatumLen = strftime (Datum, DatumMax, "%a %d.%b %Y  %H:%M:%S", tp);
    if ((FP = fopen (FileName, "r")) == NULL)
    {
        printf ("Kann %s nicht öffnen!", FileName);
        Close_All ();
        exit (RETURN_ERROR);
    }
    pline = LPP;                     /* Trick: Kopf 1.Seite und Anfang   */
    pline = PrintLine(lines, pline); /* 1. Zeile werden korrekt gedruckt */
    while ((c = fgetc (FP)) != EOF)
    {
        switch (c)
        {
            case '\n':                              /* NewLine           */
                lines++;                            /* neue Zeilennummer */
                pline = PrintLine (lines, pline);   /* neue Zeile        */
                anz = 0;                            /* ZeichenZähler = 0 */
                break;
            case '\f':                              /* FormFeed          */
                pline = PrintKopf ();               /* neue Seite        */
                anz = 0;                            /* ZeichenZähler = 0 */
                break;
            case '\t':                              /* Tabulator         */
                for (i = 0; i <= anz % TAB; i++)    /* Zeichen zum TAB   */
                    if (fputc (' ', PRT) == EOF)    /* mit ' ' füllen    */
                        Abbruch();
                anz += anz % TAB;                   /* Zähler stellen    */
                break;
            case '\33':                    /* wird eigentlich nur ge-    */
                if (fputc (c, PRT) == EOF) /* braucht um anz bei ESC-    */
                    Abbruch();             /* Sequenzen nicht hochzu-    */
                PrintEscape ();            /* zuzählen (die Zeilen       */
                break;                     /* würden sonst zu kurz!)     */
            default:
                if (anz++ == CPL)                     /* Falls Zeilenende */
                {
                    NoNum = TRUE;                     /* Zeilennummer aus */
                    pline = PrintLine (lines, pline); /* neue Zeile       */
                    NoNum = FALSE;                    /* Zeilennummer ein */
                    anz = 0;                          /* ZeichenZähler =0 */
                }
                if (fputc (c, PRT))                /* einfach nur drucken */
                    Abbruch();
        }
    }
    ResetPrinter ();
    Close_All ();
    exit (RETURN_OK);
}


/***********************************************
*                                              *
* Funktion: Alles Öffnen & Speicher            *
* =================================            *
*                                              *
* Autor:    Datum:  Kommertar:                 *
* ------    ------  ----------                 *
* H.Kindler 23.7.91 Nur Puffer für Perferences *
*                                              *
*                                              *
***********************************************/
void Open_All (void)
{
    PrefsBuffer = (struct Preferences *) AllocMem ((ULONG) SIZE, MEMF_CLEAR);     /*  Das gibt eine schöne, lange Zeile !!!!!! */
    if (!PrefsBuffer)
    {
        puts ("Kein Speicher frei!");
        Close_All ();
        exit (RETURN_ERROR);
    }
    PrefsOrig = (struct Preferences *) AllocMem ((ULONG) SIZE, MEMF_CLEAR);     /*  Das gibt eine schöne, lange Zeile !!!!!! */
    if (!PrefsOrig)
    {
        puts ("Kein Speicher frei!");
        Close_All ();
        exit (RETURN_ERROR);
    }
    ArpBase = (struct ArpBase *) OpenLibrary ("arp.library", 39L);
}


/***********************************************
*                                              *
* Funktion: Alles wieder schließen             *
* ================================             *
*                                              *
* Autor:    Datum:  Kommertar:                 *
* ------    ------  ----------                 *
* H.Kindler 23.7.91 Preferences, File, Drucker *
*                                              *
***********************************************/
void Close_All (void)
{
    if (ArpBase) CloseLibrary ((struct Library *) ArpBase);
    if (PrefsBuffer) FreeMem ((ULONG *) PrefsBuffer, (ULONG) SIZE);
    if (PrefsOrig) FreeMem ((ULONG *) PrefsOrig, (ULONG) SIZE);
    if (FP)  fclose (FP);
    if (PRT) fclose (PRT);
}


/************************************************************
*                                                           *
* Funktion: Kopf drucken                                    *
* =====================                                     *
*                                                           *
* Autor:    Datum:  Kommentar:                              *
* ------    ------  ----------                              *
* H.Kindler 24.7.91                                         *
* H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
*                                                           *
************************************************************/
short PrintKopf ()
{
    static short len;           /* Länge der Teile der Kopfzeile   */
    static short fill;          /* das fehlt noch zur vollen Zeile */
    static short filla;         /* zwischen Datum und FileName     */
    static short fillb;         /* zwischen FileName und Seiten    */
    static short page = 0;      /* Seitenzahl                      */
    short i;                    /* Zähler                          */
    short anz;                  /* Gedruckte Zeilenzahl            */

    if (page)                                    /* Falls ! 1.Seite  */
    {
        if (fputc ('\n\f', PRT) == EOF)          /* FormFeed         */
            Abbruch();
    }
    else                                         /* sonst            */
    {                                            /* SPACE berechnen  */
        len = DatumLen + strlen (FileName) + 10; /*   Chars für Kopf */
        fill = LLen - len;                       /*   restliche Char */
        filla = fill / 2;                        /*   die Hälfte     */
        fillb = fill - filla;                    /*   und der Rest   */
    }
    page++;                                      /* eine Seite mehr  */
    if (DoKopf)
    {
        if (fprintf (PRT, "%s", Datum) < 0)      /* Datum            */
            Abbruch();
        for ( i = 1; i <= filla; i++)            /* Zwischenraum     */
            if (fputc (' ', PRT) == EOF)
                Abbruch();
        if (fprintf (PRT, "%s", FileName) < 0)   /* FileName         */
            Abbruch();
        for ( i = 1; i <= fillb; i++)            /* Zwischenraum     */
            if (fputc (' ', PRT) ==EOF)
                Abbruch();
        if (fprintf (PRT, "Page: %4d\n\n\n", page) < 0) /* Seitennummer */
            Abbruch();
        anz = 3;                                 /* so viele Zeilen  */
    }
    else
        anz = 0;
    return (anz);
}


/************************************************************
*                                                           *
* Funktion: Zeilenvorschub drucken                          *
* ================================                          *
*                                                           *
* Autor:    Datum:  Kommentar:                              *
* ------    ------  ----------                              *
* H.Kindler 24.7.91 am Blattende: Kopf                      *
* H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
*                                                           *
************************************************************/
short PrintLine (short lines,      /*  Anzahl der '\n' im File         */
                 short pline)      /*  Auf dieser Seite gedruckte '\n' */
{
    if (pline++ < LPP)                      /* Falls Seite nicht voll */
        if (fputc ('\n', PRT) == EOF)       /* neue Zeile             */
            Abbruch();
    else                                    /* sonst                  */
        pline = PrintKopf ();               /* neue Seite             */
    if (DoNum)                              /* Falls Zeilennummern    */
        if (NoNum)                          /* Falls unterdrücken     */
            if (fputs ("      ", PRT) == EOF)  /* Space drucken       */
                Abbruch();
        else                                /* sonst                  */
            if (fprintf (PRT, "%04d: ", lines) < 0) /* Zeilennummer   */
                Abbruch();                  /*              drucken   */
    return (pline);                         /* so viele Zeilen        */
}


/************************************************************
*                                                           *
* Funktion: ESC-Sequence drucken                            *
* ==============================                            *
*                                                           *
* Autor:    Datum:  Kommentar:                              *
* ------    ------  ----------                              *
* H.Kindler 26.7.91                                         *
* H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
*                                                           *
************************************************************/
void PrintEscape (void)
{
    short c;

    c = fgetc (FP);           /* Ein Zeichen folgt immer */
    if (fputc (c, PRT) == EOF)
        Abbruch();
    switch (c)
    {
        case '#':             /* hier folgt jeweils noch */
        case '(':             /* ein Zeichen             */
            c = fgetc (FP);
            if (fputc (c, PRT) == EOF)
                Abbruch();
            break;
        case '[':             /* begrenzt durch E,F,g,m,p,q,r,s,v,w,x,z */
            while (!((islower (c = fgetc (FP)) || (c == 'E') || (c == 'F'))))
            {
                if (fputc (c, PRT) == EOF)
                    Abbruch();
            }
            if (fputc (c, PRT) == EOF)
                Abbruch();
    }
    return ();
}


/********************************
*                               *
* Funktion: Neue Prefs holen    *
* ==========================    *
*                               *
* Autor:    Datum:  Kommentar:  *
* ------    ------  ----------  *
* H.Kindler 31.7.91             *
*                               *
********************************/
void DefaultPrefs (struct Gadget dingens[])
{
    GetPrefs (PrefsBuffer, (short) SIZE);
    switch (PrefsBuffer->PrintPitch)     /* Zeilenlänge festlegen */
    {
        case PICA:
            LLen = 80;
            dingens[0].Flags |= SELECTED;
            dingens[1].Flags &= ~SELECTED;
            dingens[2].Flags &= ~SELECTED;
            break;
        case ELITE:
            LLen = 96;
            dingens[0].Flags &= ~SELECTED;
            dingens[1].Flags |= SELECTED;
            dingens[2].Flags &= ~SELECTED;
            break;
        case FINE:
            LLen = 136;
            dingens[0].Flags &= ~SELECTED;
            dingens[1].Flags &= ~SELECTED;
            dingens[2].Flags |= SELECTED;
            break;
    }
    switch (PrefsBuffer->PrintQuality)  /* Druck-Qualität */
    {
        case LETTER:
            dingens[3].Flags |= SELECTED;
            dingens[4].Flags &= ~SELECTED;
            break;
        case DRAFT:
            dingens[3].Flags &= ~SELECTED;
            dingens[4].Flags |= SELECTED;
            break;
    }
    switch (PrefsBuffer->PrintSpacing)  /* Zeilen pro Zoll */
    {
        case SIX_LPI:
            LPI = 6;
            dingens[5].Flags |= SELECTED;
            dingens[6].Flags &= ~SELECTED;
            break;
        case EIGHT_LPI:
            LPI = 8;
            dingens[5].Flags &= ~SELECTED;
            dingens[6].Flags |= SELECTED;
            break;
    }
    LM = PrefsBuffer->PrintLeftMargin;
    ((struct StringInfo *) (dingens[7].SpecialInfo))->LongInt = LM;
    sprintf (((struct StringInfo *) (dingens[7].SpecialInfo))->Buffer, "%d", LM);
    RM = PrefsBuffer->PrintRightMargin;
    ((struct StringInfo *) (dingens[8].SpecialInfo))->LongInt = RM;
    sprintf (((struct StringInfo *) (dingens[8].SpecialInfo))->Buffer, "%d", RM);
    PPL = PrefsBuffer->PaperLength;
    ((struct StringInfo *) (dingens[9].SpecialInfo))->LongInt = PPL;
    sprintf (((struct StringInfo *) (dingens[9].SpecialInfo))->Buffer, "%d", PPL);
    Skip = SKIP;
    ((struct StringInfo *) (dingens[10].SpecialInfo))->LongInt = Skip;
    sprintf (((struct StringInfo *) (dingens[10].SpecialInfo))->Buffer, "%d", SKIP);
    if (DoNumPrefs)
    {
        DoNum = TRUE;
        dingens[11].Flags |= SELECTED;
    }
    else
    {
        DoNum = FALSE;
        dingens[11].Flags &= ~SELECTED;
    }
    dingens[12].Flags |= SELECTED;
    return();
}


/************************************************************
*                                                           *
* Funktion: Drucker verlassen                               *
* ===========================                               *
*                                                           *
* Autor:    Datum:  Kommentar:                              *
* ------    ------  ----------                              *
* H.Kindler 25.7.91                                         *
* H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
*                                                           *
************************************************************/
void ResetPrinter (void)
{
    if (fputs ("\f\33c", PRT) == EOF)     /* FF, RESET */
        Abbruch();
    SetPrefs (PrefsOrig, SIZE, TRUE);
    return ();
}


/************************************************************
*                                                           *
* Funktion: Drucker vorbereiten                             *
* =============================                             *
*                                                           *
* Autor:    Datum:  Kommentar:                              *
* ------    ------  ----------                              *
* H.Kindler 25.7.91 Werte von Preferences                   *
* H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
*                                                           *
************************************************************/
void InitPrinter (void)
{
    struct NewWindow     nw;                            /* Fenster           */
    struct IntuiMessage  *msg;                          /* Nachrichten       */
    short                i;                             /* Zähler            */
    char                 tmpnambuf [L_tmpnam];          /* Puffer PrtFile-tmpnam */
    char                 *prtname = "prt:Print";        /* Name für PrtFile      */
    char                 prtfile [L_tmpnam + PRINT -2]; /* Fertiger Name         */
    BOOL                 ende = FALSE;                  /* Keine weiteren msg    */
    BOOL                 drucken = FALSE;               /* To print or not to print, thats the Question */
    UBYTE                titel[25];                     /* Fenster-Titel         */

    sprintf (titel, "KPrint V%d.%d by H.Kindler", Version, Revision);
    GetPrefs (PrefsOrig, (short) SIZE);

    strcpy (fname, FileName);
    strcpy (fnameundo, fname);

    nw.LeftEdge    = 25;          /* Window - Definitionen */
    nw.TopEdge     = 12;          /* (18 Werte!!)          */
    nw.Width       = 3 * RECHTS + 2 * HLUECKE +
                     2 * EINRUECK + Unterschrift.Width;
    nw.Height      = 219;
    nw.DetailPen   = 0;
    nw.BlockPen    = 1;
    nw.IDCMPFlags  = GADGETUP | CLOSEWINDOW | NEWPREFS | VANILLAKEY;
    nw.Flags       = WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE |
                     ACTIVATE | SMART_REFRESH;
    nw.FirstGadget = NULL;
    nw.CheckMark   = NULL;
    nw.Title       = titel;
    nw.Screen      = NULL;
    nw.BitMap      = NULL,
    nw.MinWidth    = nw.Width;
    nw.MinHeight   = nw.Height;
    nw.MaxWidth    = nw.Width;
    nw.MaxHeight   = nw.Height;
    nw.Type        = WBENCHSCREEN;

    if (!(window = OpenWindow (&nw)))
    {
        puts ("Leider kein Fenster!");
        /* Close_All (); */
        exit (RETURN_ERROR);
    }
    freq.fr_Hail      = "Bitte Datei auswählen! ";
    freq.fr_File      = fr_fname;             /* Struct für FileRequester */
    freq.fr_Dir       = fr_dir;
    freq.fr_Window    = window;
    freq.fr_FuncFlags = NULL;
    freq.fr_Flags2    = FR2F_LongPath;
    freq.fr_Function  = NULL;
    freq.fr_LeftEdge  = NULL;
    freq.fr_TopEdge   = NULL;

    PrintIText (window->RPort, &texte2[0], 0, 0);
    DefaultPrefs (dingens);
    SetAPen (window->RPort, 0);
    DrawImage (window->RPort, &Unterschrift,
               window->Width - EINRUECK / 2 - Unterschrift.Width,
               window->Height - VLUECKE - Unterschrift.Height);
    AddGList (window, &dingens[0], -1, 18, NULL);
    RefreshGadgets (&dingens[0], window, NULL);
    do
    {
        WaitPort (window->UserPort);                  /* auf Msg warten */
        if (msg = (struct IntuiMessage *) GetMsg (window->UserPort))
        {
            switch (msg->Class)
            {
                case NEWPREFS:
                    GetPrefs (PrefsOrig, (short) SIZE);
                    break;
                case CLOSEWINDOW:
                    ende = TRUE;
                    break;
                case VANILLAKEY:
                    switch (msg->Code)
                    {
                        case RETURN:
                        case SPACE:
                            ende = TRUE;
                            drucken = TRUE;
                            break;
                        case ESC:
                        case 'q':
                            ende = TRUE;
                            break;
                    }
                    break;
                case GADGETUP:
                    switch (((struct Gadget *) (msg->IAddress))->GadgetID)
                    {
                        case 0:         /* PICA */
                            LLen = 80;
                            PrefsBuffer->PrintPitch = PICA;
                            RectFill (window->RPort, EINRUECK, TITELSKIP,
                                      EINRUECK + RECHTS2, TITELSKIP + UNTEN);
                            dingens[0].Flags |= SELECTED;
                            dingens[1].Flags &= ~SELECTED;
                            dingens[2].Flags &= ~SELECTED;
                            RefreshGList (&dingens[0], window, NULL, 3);
                            break;
                        case 1:         /* ELITE */
                            LLen = 96;
                            PrefsBuffer->PrintPitch = ELITE;
                            RectFill (window->RPort, EINRUECK, TITELSKIP,
                                      EINRUECK + RECHTS2, TITELSKIP + UNTEN);
                            dingens[0].Flags &= ~SELECTED;
                            dingens[1].Flags |= SELECTED;
                            dingens[2].Flags &= ~SELECTED;
                            RefreshGList (&dingens[0], window, NULL, 3);
                            break;
                        case 2:         /* FINE */
                            LLen = 136;
                            PrefsBuffer->PrintPitch = FINE;
                            RectFill (window->RPort, EINRUECK, TITELSKIP,
                                      EINRUECK + RECHTS2, TITELSKIP + UNTEN);
                            dingens[0].Flags &= ~SELECTED;
                            dingens[1].Flags &= ~SELECTED;
                            dingens[2].Flags |= SELECTED;
                            RefreshGList (&dingens[0], window, NULL, 3);
                            break;
                        case 3:         /* NLQ */
                            PrefsBuffer->PrintQuality = LETTER;
                            RectFill (window->RPort,
                                      EINRUECK + HLUECKE + RECHTS,
                                      TITELSKIP + UNTEN + VLUECKE,
                                      EINRUECK + 3 * RECHTS + 2 * HLUECKE,
                                      TITELSKIP + 2 * UNTEN + VLUECKE);
                            dingens[3].Flags |= SELECTED;
                            dingens[4].Flags &= ~SELECTED;
                            RefreshGList (&dingens[3], window, NULL, 2);
                            break;
                        case 4:         /* Draft */
                            PrefsBuffer->PrintQuality = DRAFT;
                            RectFill (window->RPort,
                                      EINRUECK + HLUECKE + RECHTS,
                                      TITELSKIP + UNTEN + VLUECKE,
                                      EINRUECK + 3 * RECHTS + 2 * HLUECKE,
                                      TITELSKIP + 2 * UNTEN + VLUECKE);
                            dingens[3].Flags &= ~SELECTED;
                            dingens[4].Flags |= SELECTED;
                            RefreshGList (&dingens[3], window, NULL, 2);
                            break;
                        case 5:         /* 6 LPI */
                            PrefsBuffer->PrintSpacing = SIX_LPI;
                            LPI = 6;
                            RectFill (window->RPort,
                                      EINRUECK + HLUECKE + RECHTS,
                                      TITELSKIP + 3 * (UNTEN + VLUECKE),
                                      EINRUECK + 3 * RECHTS + 2 * HLUECKE,
                                      TITELSKIP + 4 * UNTEN + 3 * VLUECKE);
                            dingens[5].Flags |= SELECTED;
                            dingens[6].Flags &= ~SELECTED;
                            RefreshGList (&dingens[5], window, NULL, 2);
                            break;
                        case 6:         /* 8 LPI */
                            PrefsBuffer->PrintSpacing = EIGHT_LPI;
                            LPI = 8;
                            RectFill (window->RPort,
                                      EINRUECK + HLUECKE + RECHTS,
                                      TITELSKIP + 3 * (UNTEN + VLUECKE),
                                      EINRUECK + 3 * RECHTS + 2 * HLUECKE,
                                      TITELSKIP + 4 * UNTEN + 3 * VLUECKE);
                            dingens[5].Flags &= ~SELECTED;
                            dingens[6].Flags |= SELECTED;
                            RefreshGList (&dingens[5], window, NULL, 2);
                            break;
                        case 7:         /* Linker Rand */
                            LM = strinfo[0].LongInt;
                            if (LM > RM)
                            {
                                LM = RM;
                                strinfo[0].LongInt = LM;
                                sprintf (strinfo[0].Buffer, "%d", LM);
                                RefreshGList (&dingens[7], window, NULL, 1);
                            }
                            PrefsBuffer->PrintLeftMargin = LM;
                            break;
                        case 8:         /* Rechter Rand */
                            RM = strinfo[1].LongInt;
                            if (RM > LLen)
                            {
                                RM = LLen;
                                strinfo[1].LongInt = RM;
                                sprintf (strinfo[1].Buffer, "%d", RM);
                                RefreshGList (&dingens[8], window, NULL, 1);
                            }
                            PrefsBuffer->PrintRightMargin = RM;
                            break;
                        case 9:         /* Blattlänge */
                            PPL = strinfo[2].LongInt;
                            PrefsBuffer->PaperLength = PPL;
                            break;
                        case 10:        /* freie Zeilen */
                            Skip = strinfo[3].LongInt;
                            if (Skip > PPL)
                            {
                                Skip = PPL;
                                sprintf (strinfo[3].Buffer, "%d", PPL);
                                RefreshGList (&dingens[10], window, NULL, 1);
                            }
                            break;
                        case 11:        /* ZeilenNummer */
                            DoNum = (dingens[11].Flags & SELECTED) ? TRUE : FALSE;
                            /* TRUE falls SELECTED, sonst FALSE (0) */
                            break;
                        case 12:        /* Kopfzeile */
                            DoKopf = (dingens[12].Flags & SELECTED) ? TRUE : FALSE;
                            /* TRUE falls SELECTED, sonst FALSE (0) */
                            break;
                        case 13:        /* Laden */
                            if (ArpBase)
                                if (FileRequest (&freq))
                                {
                                    strcpy (strinfo[4].Buffer, freq.fr_Dir);
                                    TackOn (strinfo[4].Buffer, freq.fr_File);
                                    RefreshGList (&dingens[14], window, NULL, 1);
                                }
                        case 14:        /* Dateiname */
                            /*  Es gibt nichts zu tun, da FileName nacher
                             *  eh auf strinfo[4].Buffer zeigt!
                             */
                            break;
                        case 15:        /* Voreinstellungen */
                            RemoveGList (window, &dingens[0], -1);
                            DefaultPrefs (dingens);
                            RectFill (window->RPort, 2, 11,
                                      window->Width - EINRUECK -
                                                Unterschrift.Width,
                                      dingens[12].TopEdge + UNTEN + 1);
                            AddGList (window, &dingens[0], -1, 18, NULL);
                            RefreshGadgets (&dingens[0], window, NULL);
                            PrintIText (window->RPort, &texte2[0], 0, 0);
                            break;
                        case 16:        /* Drucken */
                            ende = TRUE;
                            drucken = TRUE;
                            break;
                        case 17:        /* Abbruch */
                            ende = TRUE;
                            break;
                    }
                    break;
            }
            ReplyMsg ((struct Message *) msg);
        }
    } while (!ende);
    Forbid();
    do
        if (msg = (struct IntuiMessage *) GetMsg (window->UserPort))
            ReplyMsg ((struct Message *) msg);
    while (msg);
    ModifyIDCMP (window, 0);
    Permit();
    RemoveGList (window, &dingens[0], -1);
    CloseWindow (window);
    if (!drucken)
    {
        Close_All ();
        exit (RETURN_OK);
    }
    FileName = strinfo[4].Buffer;
    SetPrefs (PrefsBuffer, SIZE, TRUE);
    if (DoNum) NumLen = NUMLEN;
    LPP = (PPL - Skip) * LPI / 6;           /* so viel bedrucken    */
    LLen = RM - LM + 1 - NumLen;            /* Platz zw. Rändern    */
    CPL  = LLen - NumLen;                   /* weniger Nummernlänge */
    strcpy (prtfile, prtname);              /* DruckName zusammenstellen */
    tmpnam (tmpnambuf);
    strcpy (prtfile + PRINT, tmpnambuf + 2);
    if ((PRT = fopen (prtfile, "w")) == NULL)
    {
        puts ("Kann Drucker nicht ansprechen!");
        Close_All ();
        exit (RETURN_ERROR);
    }
    if (fputs ("\33#1", PRT) == EOF) /* Drucker vom System initialisieren */
        Abbruch();
    if (fprintf(PRT, "\33[%dt", PPL) < 0) /* Seitenlänge (Sys machts net) */
        Abbruch();
    return;
}

/******************************************
*                                         *
* Funktion: Abbruch bei Fehler            *
* ============================            *
*                                         *
* Autor:    Datum:  Kommentar:            *
* ------    ------  ----------            *
* H.Kindler 26.8.93                       *
*                                         *
******************************************/
void Abbruch(void)
{
    Close_All();
    exit (RETURN_ERROR);
}
