home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / print / kprint.lha / KPrint.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-26  |  60.9 KB  |  1,257 lines

  1. /*
  2.  *   Projekt zum formatierten Drucken
  3.  *   unter Ausnutzung der Preferences-Struktur
  4.  *   und wahlweisen InLine-Optionen
  5.  */
  6.  
  7.  
  8. /************************************
  9. *                                   *
  10. * PreProc-Anweisungen               *
  11. * ===================               *
  12. *                                   *
  13. * Autor:    Datum:  Kommertar:      *
  14. * ------    ------  ----------      *
  15. * H.Kindler 23.7.91                 *
  16. * H.Kindler 26.8.93 Neue Protos     *
  17. *                                   *
  18. ************************************/
  19. #include <ctype.h>                   /* islower etc.  */
  20. #include <stdlib.h>                  /* exit etc.     */
  21. #include <stdio.h>                   /* printf etc.   */
  22. #include <string.h>                  /* strlen etc.   */
  23. #include <exec/types.h>              /* ULONG etc.    */
  24. #include <exec/memory.h>             /* AvailMem etc. */
  25. #include <clib/exec_protos.h>
  26. #include <intuition/intuition.h>     /* GetPrefs etc. */
  27. #include <clib/intuition_protos.h>
  28. #include <clib/graphics_protos.h>
  29. #include <sys/stat.h>                /* stat etc.     */
  30. #include <sys/time.h>                /* localtime etc.*/
  31. #include <libraries/arpbase.h>       /* FileRequester */
  32.  
  33. /* Defines */
  34.  
  35. #define Version     0                    /* Noch keine Version            */
  36. #define Revision    1                    /* erste Revision                */
  37. #define DatumMax    25L                  /* Max. Stringlänge Datum        */
  38. #define DIR_LEN     256                  /* Max. Länge Directory          */
  39. #define EINRUECK    (long) (HLUECKE / 2) /* Horizontal-Abstand der Boxen  */
  40. #define ESC         27                   /* Esacpe-Zeichen                */
  41. #define FNAME_LEN   30                   /* Max. Länge FileName           */
  42. #define HLUECKE     20L                  /* Horizontal-Abstand der Boxen  */
  43. #define LINKS       0L                   /* Linker Rand Boxen im Window   */
  44. #define NUMLEN      6L                   /* Länge Zeilennummer (falls da) */
  45. #define OBEN        0L                   /* oberer Rand Dingsbums         */
  46. #define PRINT       9L                   /* Lg 1.Teil PrtFile (prt:Print) */
  47. #define RECHTS      72L                  /* rechter Rand kleines Gadget   */
  48. #define RECHTS2     (long) (3 * RECHTS + 2 * HLUECKE)   /* GAANZ BREEIIT  */
  49. #define RECHTS3     (long) ((3 * RECHTS + HLUECKE) / 2) /* Halb so breit  */
  50. #define RETURN      13                   /* edoC-NRUTER                   */
  51. #define SIZE sizeof (struct Preferences) /* eine kleine Abkürzung         */
  52. #define SKIP        3L                   /* Zeilen am Seitenende          */
  53. #define SPACE       32L                  /* Die große Taste ganz Unten!   */
  54. #define TAB         8L                   /* Tabulatorgröße                */
  55. #define TITELSKIP   14L                  /* Abstand 1. Box - Fensterrand  */
  56. #define TXTVOFFSET  3L                   /* V-Abstand Box - Text          */
  57. #define UNTEN       13L                  /* unterer Rand                  */
  58. #define VLUECKE     5L                   /* Vertikal-Abstand              */
  59.  
  60. /* Prototypen */
  61.  
  62. void  Close_All    (void);                      /* Prototypen */
  63. void  InitPrinter  (void);                      /* der        */
  64. void  DefaultPrefs (struct Gadget dingens[]);   /* einzelnen  */
  65. void  Open_All     (void);                      /* Funktionen */
  66. void  PrintEscape  (void);
  67. short PrintKopf    (void);
  68. short PrintLine    (short lines, short pline);
  69. void  ResetPrinter (void);
  70. void  drucken      (void);
  71. void  Abbruch      (void);
  72.  
  73. /* Globals */
  74.  
  75. struct ArpBase      *ArpBase;         /* Basis ARP (FileRequester) */
  76. short               CPL;              /* Chars Per Line            */
  77. char                Datum [DatumMax]; /* Datum-String              */
  78. size_t              DatumLen;         /* Länge des Datum-Strings   */
  79. BOOL                DoNum = FALSE;    /* (Keine) Zeilennummer      */
  80. BOOL                DoNumPrefs = FALSE;  /* (Keine) Zeilennummer   */
  81. BOOL                DoKopf = TRUE;    /* KopfZeile                 */
  82. char                *FileName;        /* Name, wie übergeben       */
  83. FILE                *FP = NULL;       /* FilePointer Eingabe-File  */
  84. UBYTE               fr_fname [FNAME_LEN + 1];  /* Puffer Requester */
  85. UBYTE               fr_dir [DIR_LEN + 1];  /* UndoPufer Requester  */
  86. extern
  87. struct GfxBase      *GfxBase;         /* Gfx öffnen DICE-Special   */
  88. extern
  89. struct InuitionBase *IntuitionBase;   /* Intui öffnen DICE-Spezial */
  90. short               LM;               /* Left Margin               */
  91. short               LPP;              /* Lines Per Page            */
  92. short               LPI;              /* Lines Per Inch            */
  93. short               LLen;             /* LineLength (ohne Ränder)  */
  94. BOOL                NoNum = FALSE;    /* ZN temporär unterdrücken  */
  95. short               NumLen = 0;       /* Länge der ZeilenNummer    */
  96. short               PPL;              /* PaPerLength               */
  97. FILE                *PRT = NULL;      /* FilePointer Drucker       */
  98. struct Preferences  *PrefsBuffer;     /* Prefs-Struktur            */
  99. struct Preferences  *PrefsOrig;       /* Prefs-Struktur Orig-Werte */
  100. short               RM;               /* Right Margin              */
  101. short               Skip;             /* freie Zeilen am Blattende */
  102. /*extern
  103.   UWORD               Unterschrift_data[];*/  /* Image-Daten erklären  */
  104. struct Window       *window;          /* Unser kleines Fensterlein */
  105.  
  106. /*** IMAGE ***/
  107.  
  108. __chip const
  109. UWORD Unterschrift_data[3 * 113 * 2] =
  110. {
  111.     0,   192,     0,     0,   304,     0,     0,  1600,     0,     0,  3456,
  112.     0,     0,  6912,     0,     0,  7680,     0,     0, 13824,     0,     0,
  113. 15360,     0,     0, 15360,     0,     0, 15360,     0,     0, 11264,     0,
  114.     0, 10240,     0,     0, 10240,     0,     0, 14336,     0,     0, 15360,
  115.     0,     0, 15360,     0,     0, 15360,     0,     0,  7168,     0,     0,
  116.  7168,     0,  3840,  7680,     0,  4032,  7680,     0,  2016,  3584,     0,
  117.  1840,  3840,     0,   924,  3840,     0,   462,  1792,     0,   231,  1920,
  118.     0,   113, 34688,     0,    25, 50048,     0,  3854, 26240,     0,  1991,
  119. 63360,     0,   481, 64896,     0,   248, 16128,     0,   124,  3584,     0,
  120.    30,  1792,     0,    15, 33664,     0,     3, 50048,     0,     0, 58304,
  121.     0,     0, 16320,     0,     0,  8128,     0,     0,  1536,     0,     0,
  122.  4864,     0,     0,  9600,     0,     0, 14528,     0,     0,  7280,     0,
  123.     0,  3640,     0,     0,   924,     0,     0,   244,     0,     0,    60,
  124.     0,     0,     0,     0,     1, 32800,     0,     1, 24680,     0,     1,
  125. 49272,     0,     0, 57400,     0,     0, 12392,     0,     0,   120,     0,
  126.     0,   216,     0,     3,   240,     0,     1, 49584,     0,     0, 58208,
  127.     0,     0, 29632,     0,     0, 14528,     0,  7168,  3072,     0,  1920,
  128.  1536,     0,   496,  1792,     0,    60,   896,     0,     7, 33216,     0,
  129.     0, 61920,     0,     0,  8032,     0,     0,   448,     0,     0,     0,
  130.     0,     0,     0,     0, 57344,     0,     0, 31744,     0,     0,  7936,
  131.     0,     0,  1984,  1024,     0,   496,  3328,     0,   124,  6912,     0,
  132.    15,  7680,     0,     3, 56832,     0,     0, 32256,     0,     0,  7936,
  133.     0,     0,  4032,     0,     0,   752,     0,     0,    16,     0,     0,
  134.   128,     0,     0,    96,     0,     0,    48,     0,     0,    60,     0,
  135.     0,    46,     0,     0,    40,     0,  7936,    56,     0,  4064,    60,
  136.     0,  1852,    60,     0,   487,   252,     0,    57, 49404,     0,    15,
  137. 28796,     0,     3, 63544,     0,     0, 32284,     0,     0,  4086,     0,
  138.     0,   252,     0,     0,  6256,     0,     0, 13848,     0,  7996,  7566,
  139.     0,  2047, 34407,     0,   127, 61851, 32768,    15, 57086, 32768,     0,
  140. 32767, 32768,     0,  8191, 32768,     0,   991, 49152,     0,   120,     0,
  141.     0,    30,     0,     0,     7, 32768,     0,     0, 49152,     0,     0,
  142.     0,     0,    48,     0,     0,    64,     0,     0,   384,     0,     0,
  143.   768,     0,     0,  1536,     0,     0,  1536,     0,     0,  3072,     0,
  144.     0,  3072,     0,     0,  3072,     0,     0,  3072,     0,     0,  2048,
  145.     0,     0,  2048,     0,     0,  2048,     0,     0,  3072,     0,     0,
  146.  3072,     0,     0,  3072,     0,     0,  3072,     0,     0,  1024,     0,
  147.     0,  1536,     0,   576,  1536,     0,   800,   512,     0,   256,   768,
  148.     0,   132,   768,     0,    66,   256,     0,    33,   384,     0,    16,
  149. 33152,     0,     0, 16768,     0,     0,  8320,     0,    64,  4480,     0,
  150.     1,   384,     0,     8, 14080,     0,     4,   512,     0,     0,   256,
  151.     0,     0, 33152,     0,     0, 16512,     0,     0,   192,     0,     0,
  152.   192,     0,     0,  1984,     0,     0,   512,     0,     0,   256,     0,
  153.     0,  1152,     0,     0,  2048,     0,     0,  1040,     0,     0,     8,
  154.     0,     0,    12,     0,     0,     4,     0,     0,    60,     0,     0,
  155.     0,     0,     0,     0,     0,     0, 24584,     0,     0, 16408,     0,
  156.     0,  8216,     0,     0, 12296,     0,     0,    24,     0,     0,    24,
  157.     0,     0,    48,     0,     0, 16432,     0,     0,  8288,     0,     0,
  158.  4288,     0,     0,  2240,     0,     0,  1024,     0,     0,   512,     0,
  159.   256,   256,     0,    32,   128,     0,     4,    64,     0,     0, 32864,
  160.     0,     0,  6240,     0,     0,   448,     0,     0,     0,     0,     0,
  161.     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  162.    64,     0,     0,     0,   256,     0,    64,   768,     0,     0,  1536,
  163.     0,     2,  1536,     0,     0,   512,     0,     0,     0,     0,     0,
  164.  1024,     0,     0,   688,     0,     0,    16,     0,     0,     0,     0,
  165.     0,    32,     0,     0,     0,     0,     0,     4,     0,     0,    14,
  166.     0,     0,     8,     0,     0,     8,     0,   768,    12,     0,    32,
  167.    12,     0,   256,    12,     0,     0,    12,     0,     0,  4124,     0,
  168.     2,     8,     0,     0, 16388,     0,     0,  3078,     0,     0,    60,
  169.     0,     0,    16,     0,     0,     0,     0,     0,  1026,     0,  1536,
  170.     1,     0,    64, 32769, 32768,    14,     0, 32768,     0,  1057, 32768,
  171.     0,  4224, 32768,     0,   543, 49152,     0,     0,     0,     0,     0,
  172.     0,     0,     4, 32768,     0,     0, 49152
  173. };
  174.  
  175. struct Image Unterschrift =
  176. {
  177.  0, 0,                      /* LeftEdge, TopEdge     */
  178.  34, 113, 2,                /* Width, Height, Depth  */
  179.  &Unterschrift_data[0],     /* ImageData             */
  180.  3, 0,                      /* PlanePick, PlaneOnOff */
  181.  NULL                       /* NextImage             */
  182. };
  183.  
  184. /*** Intui-Texte ***/
  185.  
  186. struct TextAttr txtattr =           /* Name, Größe, Style, Flags */
  187. {"topaz.font", 8, FS_NORMAL, FPF_ROMFONT | FPF_DESIGNED};
  188.  
  189. struct IntuiText texte[] =
  190. { /* FrontPen, BackPen, Mode, Links, Oben, TextAttr, Text, Next */
  191.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 4, TXTVOFFSET,   /*  0 = Pica          */
  192.   &txtattr, "Pica", NULL},
  193.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 5, TXTVOFFSET,   /*  1 = Elite         */
  194.   &txtattr, "Elite", NULL},
  195.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 4, TXTVOFFSET,   /*  2 = Fine          */
  196.   &txtattr, "Fine", NULL},
  197.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 3, TXTVOFFSET,   /*  3 = NLQ           */
  198.   &txtattr, "NLQ", NULL},
  199.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 5, TXTVOFFSET,   /*  4 = Draft         */
  200.   &txtattr, "Draft", NULL},
  201.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 1, TXTVOFFSET,   /*  5 = 6 LPI         */
  202.   &txtattr, "6", NULL},
  203.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 1, TXTVOFFSET,   /*  6 = 8 LPI         */
  204.   &txtattr, "8", NULL},
  205.  {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 13, TXTVOFFSET, /*  7 = Zeilennummern */
  206.   &txtattr, "Zeilennummern", NULL},
  207.  {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 9, TXTVOFFSET,  /*  8 = Kopfzeile     */
  208.   &txtattr, "Kopfzeile", NULL},
  209.  {1, 0, JAM1, RECHTS / 2 + 1 - 4 * 5, TXTVOFFSET,   /*  9 = Laden         */
  210.   &txtattr, "Laden", NULL},
  211.  {1, 0, JAM1, RECHTS2 / 2 + 1 - 4 * 16, TXTVOFFSET, /* 10 = Voreinstellun */
  212.   &txtattr, "Voreinstellungen", NULL},
  213.  {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 7, TXTVOFFSET,  /* 11 = Drucken       */
  214.   &txtattr, "Drucken", NULL},
  215.  {1, 0, JAM1, RECHTS3 / 2 + 1 - 4 * 7, TXTVOFFSET,  /* 12 = Abbruch      */
  216.   &txtattr, "Abbruch", NULL}
  217. };
  218.  
  219. struct IntuiText texte2 [] =
  220. { /* FrontPen, BackPen, Mode, Links, Oben, TextAttr, Text, Next */
  221.  {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + UNTEN + VLUECKE,
  222.   &txtattr, "Qualität:", &texte2[1]},
  223.  {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 2 * (UNTEN + VLUECKE),
  224.   &txtattr, "Ränder:", &texte2[2]},
  225.  {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 3 * (UNTEN + VLUECKE),
  226.   &txtattr, "LPI:", &texte2[3]},
  227.  {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 4 * (UNTEN + VLUECKE),
  228.   &txtattr, "Zeilen/Blatt (6 LPI):", &texte2[4]},
  229.  {1, 0, JAM1, EINRUECK, TITELSKIP + TXTVOFFSET + 5 * (UNTEN + VLUECKE),
  230.   &txtattr, "Zeilen überspringen:", &texte2[5]},
  231.  {1, 0, JAM1, EINRUECK, TITELSKIP + 2 *TXTVOFFSET + 7 * (UNTEN + VLUECKE),
  232.   &txtattr, "Dateiname:", NULL}
  233. };
  234.  
  235. /*** Ränder ***/
  236.  
  237. SHORT randdaten [] [] =
  238. { /* x1,y1,  x2,y2, ... */
  239.  {LINKS - 1, OBEN - 1,   RECHTS,      OBEN - 1,   RECHTS,  UNTEN,
  240.   LINKS - 1, UNTEN,      LINKS - 1,   OBEN - 1},
  241.  {LINKS - 1, OBEN - 1,   RECHTS2,     OBEN - 1,   RECHTS2, UNTEN,
  242.   LINKS - 1, UNTEN,      LINKS - 1,   OBEN - 1},
  243.  {LINKS - 1, OBEN - 1,   RECHTS3,     OBEN - 1,   RECHTS3, UNTEN,
  244.   LINKS - 1, UNTEN,      LINKS - 1,   OBEN - 1},
  245.  {LINKS + 2, OBEN + 1,   RECHTS3 - 3, OBEN + 1,   RECHTS3 - 3, UNTEN - 2,
  246.   LINKS + 2, UNTEN - 2,  LINKS + 2,   OBEN + 1}
  247. };
  248.  
  249. struct Border rand [] =
  250. { /* Links, Oben, FrontPen, BackPen, Mode, Count, XY, Next */
  251.  {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[0], NULL    },
  252.  {LINKS, OBEN - TXTVOFFSET, 1, 0, JAM1, 5, randdaten[0], NULL    },
  253.  {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[1], NULL    },
  254.  {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[2], NULL    },
  255.  {LINKS, OBEN - TXTVOFFSET, 1, 0, JAM1, 5, randdaten[1], NULL    },
  256.  {LINKS, OBEN,              1, 0, JAM1, 5, randdaten[3], &rand[3]}
  257. };
  258.  
  259. /*** Sting-Gadgets-Stuff ***/
  260.  
  261. UBYTE strbuf [4] [4];                       /* Puffer StrGads   */
  262. UBYTE strundobuf [4] [4];                   /* UndoPuf StrGads  */
  263. UBYTE fname [DIR_LEN + FNAME_LEN + 1];      /* Puffer FileName  */
  264. UBYTE fnameundo [DIR_LEN + FNAME_LEN + 1];  /* UndoPuf FileName */
  265.  
  266. struct StringInfo strinfo [] =
  267. { /* Buffer, UndoBuffer, BufferPos, MaxChars, DispPos, UndoPos,     *
  268.    * NumChars, DispCount, CLeft, CTop, LayerPtr, LongInt, AltKeyMap */
  269.  {strbuf[0], strundobuf[0], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
  270.  {strbuf[1], strundobuf[1], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
  271.  {strbuf[2], strundobuf[2], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
  272.  {strbuf[3], strundobuf[3], 0, 4, 0, 0, 0, 0, 0, 0, NULL, 0, NULL},
  273.  {fname, fnameundo, 0, DIR_LEN + FNAME_LEN, 0, 0, 0, 0, 0, 0, NULL, 0, NULL}
  274. };
  275.  
  276. /*** Gadgets ***/
  277.  
  278. struct Gadget dingens[] =
  279. { /* Next, Links, Oben, Breite, Höhe, Flags, Activation, Typ,  *
  280.    * Rand, SelRand, Text, MutualExclude, SpecialInfo, ID, User */
  281.  {                       /* Pica */
  282.   &dingens[1],              /* Next                       */
  283.   EINRUECK, TITELSKIP,      /* Left, Top                  */
  284.   RECHTS, UNTEN,            /* Width, Height              */
  285.   GADGHCOMP,                /* Flags                      */
  286.   RELVERIFY,                /* Activation                 */
  287.   BOOLGADGET,               /* GadgetType                 */
  288.   &rand[0], NULL,           /* GadgetRender, SelectRender */
  289.   &texte[0], NULL,          /* GadgetText, MutualExclude  */
  290.   NULL, 0,                  /* SpecialInfo, GadgetID      */
  291.   NULL                      /* UserData                   */
  292.  },
  293.  {                      /* Elite */
  294.   &dingens[2],                  /* Next                       */
  295.   EINRUECK + HLUECKE + RECHTS,  /* Left                       */
  296.   TITELSKIP,                    /* Top                        */
  297.   RECHTS, UNTEN,                /* Width, Height              */
  298.   GADGHCOMP,                    /* Flags                      */
  299.   RELVERIFY,                    /* Activation                 */
  300.   BOOLGADGET,                   /* GadgetType                 */
  301.   &rand[0], NULL,               /* GadgetRender, SelectRender */
  302.   &texte[1], NULL,              /* GadgetText, MutualExclude  */
  303.   NULL, 1,                      /* SpecialInfo, GadgetID      */
  304.   NULL                          /* UserData                   */
  305.  },
  306.  {                      /* Fine */
  307.   &dingens[3],                          /* Next                       */
  308.   EINRUECK + 2 * (HLUECKE + RECHTS),    /* Left                       */
  309.   TITELSKIP,                            /* Top                        */
  310.   RECHTS, UNTEN,                        /* Width, Height              */
  311.   GADGHCOMP,                            /* Flags                      */
  312.   RELVERIFY,                            /* Activation                 */
  313.   BOOLGADGET,                           /* GadgetType                 */
  314.   &rand[0], NULL,                       /* GadgetRender, SelectRender */
  315.   &texte[2], NULL,                      /* GadgetText, MutualExclude  */
  316.   NULL, 2,                              /* SpecialInfo, GadgetID      */
  317.   NULL                                  /* UserData                   */
  318.  },
  319.  {                      /* NLQ */
  320.   &dingens[4],                          /* Next                       */
  321.   EINRUECK + 1 * (HLUECKE + RECHTS),    /* Left                       */
  322.   TITELSKIP + UNTEN + VLUECKE,          /* Top                        */
  323.   RECHTS, UNTEN,                        /* Width, Height              */
  324.   GADGHCOMP,                            /* Flags                      */
  325.   RELVERIFY,                            /* Activation                 */
  326.   BOOLGADGET,                           /* GadgetType                 */
  327.   &rand[0], NULL,                       /* GadgetRender, SelectRender */
  328.   &texte[3], NULL,                      /* GadgetText, MutualExclude  */
  329.   NULL, 3,                              /* SpecialInfo, GadgetID      */
  330.   NULL                                  /* UserData                   */
  331.  },
  332.  {                      /* Draft */
  333.   &dingens[5],                          /* Next                       */
  334.   EINRUECK + 2 * (HLUECKE + RECHTS),    /* Left                       */
  335.   TITELSKIP + UNTEN + VLUECKE,          /* Top                        */
  336.   RECHTS, UNTEN,                        /* Width, Height              */
  337.   GADGHCOMP,                            /* Flags                      */
  338.   RELVERIFY,                            /* Activation                 */
  339.   BOOLGADGET,                           /* GadgetType                 */
  340.   &rand[0], NULL,                       /* GadgetRender, SelectRender */
  341.   &texte[4], NULL,                      /* GadgetText, MutualExclude  */
  342.   NULL, 4,                              /* SpecialInfo, GadgetID      */
  343.   NULL                                  /* UserData                   */
  344.  },
  345.  {                      /* 6 LPI */
  346.   &dingens[6],                          /* Next                       */
  347.   EINRUECK + 1 * (HLUECKE + RECHTS),    /* Left                       */
  348.   TITELSKIP + 3 * (UNTEN + VLUECKE),    /* Top                        */
  349.   RECHTS, UNTEN,                        /* Width, Height              */
  350.   GADGHCOMP,                            /* Flags                      */
  351.   RELVERIFY,                            /* Activation                 */
  352.   BOOLGADGET,                           /* GadgetType                 */
  353.   &rand[0], NULL,                       /* GadgetRender, SelectRender */
  354.   &texte[5], NULL,                      /* GadgetText, MutualExclude  */
  355.   NULL, 5,                              /* SpecialInfo, GadgetID      */
  356.   NULL                                  /* UserData                   */
  357.  },
  358.  {                      /* 8 LPI */
  359.   &dingens[7],                          /* Next                       */
  360.   EINRUECK + 2 * (HLUECKE + RECHTS),    /* Left                       */
  361.   TITELSKIP + 3 * (UNTEN + VLUECKE),    /* Top                        */
  362.   RECHTS, UNTEN,                        /* Width, Height              */
  363.   GADGHCOMP,                            /* Flags                      */
  364.   RELVERIFY,                            /* Activation                 */
  365.   BOOLGADGET,                           /* GadgetType                 */
  366.   &rand[0], NULL,                       /* GadgetRender, SelectRender */
  367.   &texte[6], NULL,                      /* GadgetText, MutualExclude  */
  368.   NULL, 6,                              /* SpecialInfo, GadgetID      */
  369.   NULL                                  /* UserData                   */
  370.  },
  371.  {                      /* Linker Rand */
  372.   &dingens[8],                          /* Next                       */
  373.   EINRUECK + 1 * (HLUECKE + RECHTS),    /* Left                       */
  374.   TITELSKIP + 2 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top            */
  375.   RECHTS, UNTEN,                        /* Width, Height              */
  376.   GADGHCOMP,                            /* Flags                      */
  377.   RELVERIFY | STRINGRIGHT | LONGINT,    /* Activation                 */
  378.   STRGADGET,                            /* GadgetType                 */
  379.   &rand[1], NULL,                       /* GadgetRender, SelectRender */
  380.   NULL, NULL,                           /* GadgetText, MutualExclude  */
  381.   &strinfo[0], 7,                       /* SpecialInfo, GadgetID      */
  382.   NULL                                  /* UserData                   */
  383.  },
  384.  {                      /* Rechter Rand */
  385.   &dingens[9],                              /* Next                       */
  386.   EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  387.   TITELSKIP + 2 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  388.   RECHTS, UNTEN,                            /* Width, Height              */
  389.   GADGHCOMP,                                /* Flags                      */
  390.   RELVERIFY | STRINGRIGHT | LONGINT,        /* Activation                 */
  391.   STRGADGET,                                /* GadgetType                 */
  392.   &rand[1], NULL,                           /* GadgetRender, SelectRender */
  393.   NULL, NULL,                               /* GadgetText, MutualExclude  */
  394.   &strinfo[1], 8,                           /* SpecialInfo, GadgetID      */
  395.   NULL                                      /* UserData                   */
  396.  },
  397.  {                      /* Blattlänge */
  398.   &dingens[10],                             /* Next                       */
  399.   EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  400.   TITELSKIP + 4 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  401.   RECHTS, UNTEN,                            /* Width, Height              */
  402.   GADGHCOMP,                                /* Flags                      */
  403.   RELVERIFY | STRINGRIGHT | LONGINT,        /* Activation                 */
  404.   STRGADGET,                                /* GadgetType                 */
  405.   &rand[1], NULL,                           /* GadgetRender, SelectRender */
  406.   NULL, NULL,                               /* GadgetText, MutualExclude  */
  407.   &strinfo[2], 9,                           /* SpecialInfo, GadgetID      */
  408.   NULL                                      /* UserData                   */
  409.  },
  410.  {                      /* Freie Zeilen */
  411.   &dingens[11],                             /* Next                       */
  412.   EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  413.   TITELSKIP + 5 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  414.   RECHTS, UNTEN,                            /* Width, Height              */
  415.   GADGHCOMP,                                /* Flags                      */
  416.   RELVERIFY | STRINGRIGHT | LONGINT,        /* Activation                 */
  417.   STRGADGET,                                /* GadgetType                 */
  418.   &rand[1], NULL,                           /* GadgetRender, SelectRender */
  419.   NULL, NULL,                               /* GadgetText, MutualExclude  */
  420.   &strinfo[3], 10,                          /* SpecialInfo, GadgetID      */
  421.   NULL                                      /* UserData                   */
  422.  },
  423.  {                      /* Zeilennummer */
  424.   &dingens[12],                         /* Next                       */
  425.   EINRUECK,                             /* Left                       */
  426.   TITELSKIP + 6 * (UNTEN + VLUECKE),    /* Top                        */
  427.   RECHTS3, UNTEN,                       /* Width, Height              */
  428.   GADGHCOMP,                            /* Flags                      */
  429.   RELVERIFY | TOGGLESELECT,             /* Activation                 */
  430.   BOOLGADGET,                           /* GadgetType                 */
  431.   &rand[3], NULL,                       /* GadgetRender, SelectRender */
  432.   &texte[7], NULL,                      /* GadgetText, MutualExclude  */
  433.   NULL, 11,                             /* SpecialInfo, GadgetID      */
  434.   NULL                                  /* UserData                   */
  435.  },
  436.  {                      /* Kopfzeile */
  437.   &dingens[13],                         /* Next                       */
  438.   EINRUECK + HLUECKE + RECHTS3,         /* Left                       */
  439.   TITELSKIP + 6 * (UNTEN + VLUECKE),    /* Top                        */
  440.   RECHTS3, UNTEN,                       /* Width, Height              */
  441.   GADGHCOMP,                            /* Flags                      */
  442.   RELVERIFY | TOGGLESELECT,             /* Activation                 */
  443.   BOOLGADGET,                           /* GadgetType                 */
  444.   &rand[3], NULL,                       /* GadgetRender, SelectRender */
  445.   &texte[8], NULL,                      /* GadgetText, MutualExclude  */
  446.   NULL, 12,                             /* SpecialInfo, GadgetID      */
  447.   NULL                                  /* UserData                   */
  448.  },
  449.  {                      /* Laden */
  450.   &dingens[14],                             /* Next                       */
  451.   EINRUECK + 2 * (HLUECKE + RECHTS),        /* Left                       */
  452.   TITELSKIP + 7 * (UNTEN + VLUECKE) + TXTVOFFSET,   /* Top                */
  453.   RECHTS, UNTEN,                            /* Width, Height              */
  454.   GADGHCOMP,                                /* Flags                      */
  455.   RELVERIFY,                                /* Activation                 */
  456.   BOOLGADGET,                               /* GadgetType                 */
  457.   &rand[0], NULL,                           /* GadgetRender, SelectRender */
  458.   &texte[9], NULL,                          /* GadgetText, MutualExclude  */
  459.   NULL, 13,                                 /* SpecialInfo, GadgetID      */
  460.   NULL                                      /* UserData                   */
  461.  },
  462.  {                      /* Dateiname */
  463.   &dingens[15],                             /* Next                       */
  464.   EINRUECK,                                 /* Left                       */
  465.   TITELSKIP + 8 * (UNTEN + VLUECKE) + TXTVOFFSET + 1,   /* Top            */
  466.   RECHTS2, UNTEN,                           /* Width, Height              */
  467.   GADGHCOMP,                                /* Flags                      */
  468.   RELVERIFY,                                /* Activation                 */
  469.   STRGADGET,                                /* GadgetType                 */
  470.   &rand[4], NULL,                           /* GadgetRender, SelectRender */
  471.   NULL, NULL,                               /* GadgetText, MutualExclude  */
  472.   &strinfo[4], 14,                          /* SpecialInfo, GadgetID      */
  473.   NULL                                      /* UserData                   */
  474.  },
  475.  {                      /* Voreinstellungen */
  476.   &dingens[16],                             /* Next                       */
  477.   EINRUECK,                                 /* Left                       */
  478.   TITELSKIP + 9 * (UNTEN + VLUECKE) + TXTVOFFSET + 1,   /* Top            */
  479.   RECHTS2, UNTEN,                           /* Width, Height              */
  480.   GADGHCOMP,                                /* Flags                      */
  481.   RELVERIFY,                                /* Activation                 */
  482.   BOOLGADGET,                               /* GadgetType                 */
  483.   &rand[2], NULL,                           /* GadgetRender, SelectRender */
  484.   &texte[10], NULL,                         /* GadgetText, MutualExclude  */
  485.   NULL, 15,                                 /* SpecialInfo, GadgetID      */
  486.   NULL                                      /* UserData                   */
  487.  },
  488.  {                      /* Drucken */
  489.   &dingens[17],                             /* Next                       */
  490.   EINRUECK,                                 /* Left                       */
  491.   TITELSKIP + 10 * (UNTEN + VLUECKE) + 2 * TXTVOFFSET + 1,   /* Top       */
  492.   RECHTS3, UNTEN,                           /* Width, Height              */
  493.   GADGHCOMP,                                /* Flags                      */
  494.   RELVERIFY,                                /* Activation                 */
  495.   BOOLGADGET,                               /* GadgetType                 */
  496.   &rand[5], NULL,                           /* GadgetRender, SelectRender */
  497.   &texte[11], NULL,                         /* GadgetText, MutualExclude  */
  498.   NULL, 16,                                 /* SpecialInfo, GadgetID      */
  499.   NULL                                      /* UserData                   */
  500.  },
  501.  {                      /* Abbruch */
  502.   NULL,                                     /* Next                       */
  503.   EINRUECK + HLUECKE + RECHTS3,             /* Left                       */
  504.   TITELSKIP + 10 * (UNTEN + VLUECKE) + 2 * TXTVOFFSET + 1,   /* Top       */
  505.   RECHTS3, UNTEN,                           /* Width, Height              */
  506.   GADGHCOMP,                                /* Flags                      */
  507.   RELVERIFY,                                /* Activation                 */
  508.   BOOLGADGET,                               /* GadgetType                 */
  509.   &rand[5], NULL,                           /* GadgetRender, SelectRender */
  510.   &texte[12], NULL,                         /* GadgetText, MutualExclude  */
  511.   NULL, 17,                                 /* SpecialInfo, GadgetID      */
  512.   NULL                                      /* UserData                   */
  513.  }
  514. };
  515.  
  516. /*** FileRequester ***/
  517.  
  518. struct FileRequester freq;
  519. /*
  520.  *  struct FileRequester freq =
  521.  *  {
  522.  *   "Bitte Datei auswählen! ",
  523.  *   fr_fname, fr_dir,
  524.  *   window,
  525.  *   0, FR2F_LongPath,
  526.  *   NULL,
  527.  *   0L
  528.  *  };
  529.  */
  530.  
  531. /*******************************************
  532. *                                          *
  533. * Programm: Formatiertes Drucken von Files *
  534. * ======================================== *
  535. *                                          *
  536. * Autor:    Datum:  Kommertar:             *
  537. * ------    ------  ----------             *
  538. * H.Kindler 23.7.91 CLI-Start              *
  539. *                                          *
  540. *******************************************/
  541. void main (int argc, char **argv)
  542. {
  543.     short  i;           /* Zählvariable */
  544.  
  545. /*
  546.  *    printf ("argc: %d\n",argc);
  547.  *    for (i = 0; i < argc; ++i)
  548.  *        printf ("argv[%d]: %s\n", i, argv[i]);
  549.  */
  550.     if ((argc == 2) && (*argv[1] == '?'))       /* Eine kleine Hilfe */
  551.     {
  552.         printf ("\33[33mAufruf:\33[31m\t\%s PrintFile [NUM]\n\n", argv[0]);
  553.         puts ("Print druckt PrintFile (Wahlweise mit Zeilen-Nummerierung.)");
  554.         puts ("Es werden zur Seitenformatierung automatisch die Werte");
  555.         puts ("von Preferences benutzt.");
  556.         puts ("\nMomentan kann statt NUM als dritter Wert etwas beliebiges");
  557.         puts ("übergeben werden (\"Stinker\" tuts auch)!");
  558.         exit (RETURN_OK);
  559.     }
  560.     if (argc == 3)   /* Momentan tut alles! */
  561.         DoNumPrefs = TRUE;       /* Nummerierung einschalten  */
  562.     FileName = argv[1];
  563.     drucken ();
  564. }
  565.  
  566.  
  567. /*******************************************
  568. *                                          *
  569. * Programm: Formatiertes Drucken von Files *
  570. * ======================================== *
  571. *                                          *
  572. * Autor:    Datum:  Kommertar:             *
  573. * ------    ------  ----------             *
  574. * H.Kindler 23.7.91 WB-Start               *
  575. *                                          *
  576. *******************************************/
  577. void wbmain (struct WBStartup *wbs)
  578. {
  579.     drucken ();
  580. }
  581.  
  582. /************************************************************
  583. *                                                           *
  584. * Programm: Formatiertes Drucken von Files                  *
  585. * ========================================                  *
  586. *                                                           *
  587. * Autor:    Datum:  Kommertar:                              *
  588. * ------    ------  ----------                              *
  589. * H.Kindler 10.8.91                                         *
  590. * H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
  591. *                                                           *
  592. ************************************************************/
  593. void drucken (void)
  594. {
  595.     short  c;                             /* var für fgetc              */
  596.     short  i;                             /* Zählvariable               */
  597.     short  anz   = 0;                     /* Zeichenzahl aktuelle Zeile */
  598.     short  lines = 1;                     /* Zeilenzahl                 */
  599.     short  pline = 0;                     /* Zeilen aktuelle Seite      */
  600.     struct stat statbuf;                  /* Infos übers File           */
  601.     time_t ftime;                         /* Datum des Files            */
  602.     struct tm *tp;                        /* Time-Struct von ftime      */
  603.  
  604.     Open_All ();
  605.     InitPrinter();
  606.     if (stat (FileName, &statbuf))          /* Infos übers File */
  607.     {
  608.         puts ("Error bei 'stat'");
  609.         Close_All ();
  610.         exit (RETURN_ERROR);
  611.     }
  612.     ftime = (time_t) statbuf.st_ctime;      /* Datum des Files */
  613.     tp = localtime (&ftime);                /* Aufbereiten     */
  614.     DatumLen = strftime (Datum, DatumMax, "%a %d.%b %Y  %H:%M:%S", tp);
  615.     if ((FP = fopen (FileName, "r")) == NULL)
  616.     {
  617.         printf ("Kann %s nicht öffnen!", FileName);
  618.         Close_All ();
  619.         exit (RETURN_ERROR);
  620.     }
  621.     pline = LPP;                     /* Trick: Kopf 1.Seite und Anfang   */
  622.     pline = PrintLine(lines, pline); /* 1. Zeile werden korrekt gedruckt */
  623.     while ((c = fgetc (FP)) != EOF)
  624.     {
  625.         switch (c)
  626.         {
  627.             case '\n':                              /* NewLine           */
  628.                 lines++;                            /* neue Zeilennummer */
  629.                 pline = PrintLine (lines, pline);   /* neue Zeile        */
  630.                 anz = 0;                            /* ZeichenZähler = 0 */
  631.                 break;
  632.             case '\f':                              /* FormFeed          */
  633.                 pline = PrintKopf ();               /* neue Seite        */
  634.                 anz = 0;                            /* ZeichenZähler = 0 */
  635.                 break;
  636.             case '\t':                              /* Tabulator         */
  637.                 for (i = 0; i <= anz % TAB; i++)    /* Zeichen zum TAB   */
  638.                     if (fputc (' ', PRT) == EOF)    /* mit ' ' füllen    */
  639.                         Abbruch();
  640.                 anz += anz % TAB;                   /* Zähler stellen    */
  641.                 break;
  642.             case '\33':                    /* wird eigentlich nur ge-    */
  643.                 if (fputc (c, PRT) == EOF) /* braucht um anz bei ESC-    */
  644.                     Abbruch();             /* Sequenzen nicht hochzu-    */
  645.                 PrintEscape ();            /* zuzählen (die Zeilen       */
  646.                 break;                     /* würden sonst zu kurz!)     */
  647.             default:
  648.                 if (anz++ == CPL)                     /* Falls Zeilenende */
  649.                 {
  650.                     NoNum = TRUE;                     /* Zeilennummer aus */
  651.                     pline = PrintLine (lines, pline); /* neue Zeile       */
  652.                     NoNum = FALSE;                    /* Zeilennummer ein */
  653.                     anz = 0;                          /* ZeichenZähler =0 */
  654.                 }
  655.                 if (fputc (c, PRT))                /* einfach nur drucken */
  656.                     Abbruch();
  657.         }
  658.     }
  659.     ResetPrinter ();
  660.     Close_All ();
  661.     exit (RETURN_OK);
  662. }
  663.  
  664.  
  665. /***********************************************
  666. *                                              *
  667. * Funktion: Alles Öffnen & Speicher            *
  668. * =================================            *
  669. *                                              *
  670. * Autor:    Datum:  Kommertar:                 *
  671. * ------    ------  ----------                 *
  672. * H.Kindler 23.7.91 Nur Puffer für Perferences *
  673. *                                              *
  674. *                                              *
  675. ***********************************************/
  676. void Open_All (void)
  677. {
  678.     PrefsBuffer = (struct Preferences *) AllocMem ((ULONG) SIZE, MEMF_CLEAR);     /*  Das gibt eine schöne, lange Zeile !!!!!! */
  679.     if (!PrefsBuffer)
  680.     {
  681.         puts ("Kein Speicher frei!");
  682.         Close_All ();
  683.         exit (RETURN_ERROR);
  684.     }
  685.     PrefsOrig = (struct Preferences *) AllocMem ((ULONG) SIZE, MEMF_CLEAR);     /*  Das gibt eine schöne, lange Zeile !!!!!! */
  686.     if (!PrefsOrig)
  687.     {
  688.         puts ("Kein Speicher frei!");
  689.         Close_All ();
  690.         exit (RETURN_ERROR);
  691.     }
  692.     ArpBase = (struct ArpBase *) OpenLibrary ("arp.library", 39L);
  693. }
  694.  
  695.  
  696. /***********************************************
  697. *                                              *
  698. * Funktion: Alles wieder schließen             *
  699. * ================================             *
  700. *                                              *
  701. * Autor:    Datum:  Kommertar:                 *
  702. * ------    ------  ----------                 *
  703. * H.Kindler 23.7.91 Preferences, File, Drucker *
  704. *                                              *
  705. ***********************************************/
  706. void Close_All (void)
  707. {
  708.     if (ArpBase) CloseLibrary ((struct Library *) ArpBase);
  709.     if (PrefsBuffer) FreeMem ((ULONG *) PrefsBuffer, (ULONG) SIZE);
  710.     if (PrefsOrig) FreeMem ((ULONG *) PrefsOrig, (ULONG) SIZE);
  711.     if (FP)  fclose (FP);
  712.     if (PRT) fclose (PRT);
  713. }
  714.  
  715.  
  716. /************************************************************
  717. *                                                           *
  718. * Funktion: Kopf drucken                                    *
  719. * =====================                                     *
  720. *                                                           *
  721. * Autor:    Datum:  Kommentar:                              *
  722. * ------    ------  ----------                              *
  723. * H.Kindler 24.7.91                                         *
  724. * H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
  725. *                                                           *
  726. ************************************************************/
  727. short PrintKopf ()
  728. {
  729.     static short len;           /* Länge der Teile der Kopfzeile   */
  730.     static short fill;          /* das fehlt noch zur vollen Zeile */
  731.     static short filla;         /* zwischen Datum und FileName     */
  732.     static short fillb;         /* zwischen FileName und Seiten    */
  733.     static short page = 0;      /* Seitenzahl                      */
  734.     short i;                    /* Zähler                          */
  735.     short anz;                  /* Gedruckte Zeilenzahl            */
  736.  
  737.     if (page)                                    /* Falls ! 1.Seite  */
  738.     {
  739.         if (fputc ('\n\f', PRT) == EOF)          /* FormFeed         */
  740.             Abbruch();
  741.     }
  742.     else                                         /* sonst            */
  743.     {                                            /* SPACE berechnen  */
  744.         len = DatumLen + strlen (FileName) + 10; /*   Chars für Kopf */
  745.         fill = LLen - len;                       /*   restliche Char */
  746.         filla = fill / 2;                        /*   die Hälfte     */
  747.         fillb = fill - filla;                    /*   und der Rest   */
  748.     }
  749.     page++;                                      /* eine Seite mehr  */
  750.     if (DoKopf)
  751.     {
  752.         if (fprintf (PRT, "%s", Datum) < 0)      /* Datum            */
  753.             Abbruch();
  754.         for ( i = 1; i <= filla; i++)            /* Zwischenraum     */
  755.             if (fputc (' ', PRT) == EOF)
  756.                 Abbruch();
  757.         if (fprintf (PRT, "%s", FileName) < 0)   /* FileName         */
  758.             Abbruch();
  759.         for ( i = 1; i <= fillb; i++)            /* Zwischenraum     */
  760.             if (fputc (' ', PRT) ==EOF)
  761.                 Abbruch();
  762.         if (fprintf (PRT, "Page: %4d\n\n\n", page) < 0) /* Seitennummer */
  763.             Abbruch();
  764.         anz = 3;                                 /* so viele Zeilen  */
  765.     }
  766.     else
  767.         anz = 0;
  768.     return (anz);
  769. }
  770.  
  771.  
  772. /************************************************************
  773. *                                                           *
  774. * Funktion: Zeilenvorschub drucken                          *
  775. * ================================                          *
  776. *                                                           *
  777. * Autor:    Datum:  Kommentar:                              *
  778. * ------    ------  ----------                              *
  779. * H.Kindler 24.7.91 am Blattende: Kopf                      *
  780. * H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
  781. *                                                           *
  782. ************************************************************/
  783. short PrintLine (short lines,      /*  Anzahl der '\n' im File         */
  784.                  short pline)      /*  Auf dieser Seite gedruckte '\n' */
  785. {
  786.     if (pline++ < LPP)                      /* Falls Seite nicht voll */
  787.         if (fputc ('\n', PRT) == EOF)       /* neue Zeile             */
  788.             Abbruch();
  789.     else                                    /* sonst                  */
  790.         pline = PrintKopf ();               /* neue Seite             */
  791.     if (DoNum)                              /* Falls Zeilennummern    */
  792.         if (NoNum)                          /* Falls unterdrücken     */
  793.             if (fputs ("      ", PRT) == EOF)  /* Space drucken       */
  794.                 Abbruch();
  795.         else                                /* sonst                  */
  796.             if (fprintf (PRT, "%04d: ", lines) < 0) /* Zeilennummer   */
  797.                 Abbruch();                  /*              drucken   */
  798.     return (pline);                         /* so viele Zeilen        */
  799. }
  800.  
  801.  
  802. /************************************************************
  803. *                                                           *
  804. * Funktion: ESC-Sequence drucken                            *
  805. * ==============================                            *
  806. *                                                           *
  807. * Autor:    Datum:  Kommentar:                              *
  808. * ------    ------  ----------                              *
  809. * H.Kindler 26.7.91                                         *
  810. * H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
  811. *                                                           *
  812. ************************************************************/
  813. void PrintEscape (void)
  814. {
  815.     short c;
  816.  
  817.     c = fgetc (FP);           /* Ein Zeichen folgt immer */
  818.     if (fputc (c, PRT) == EOF)
  819.         Abbruch();
  820.     switch (c)
  821.     {
  822.         case '#':             /* hier folgt jeweils noch */
  823.         case '(':             /* ein Zeichen             */
  824.             c = fgetc (FP);
  825.             if (fputc (c, PRT) == EOF)
  826.                 Abbruch();
  827.             break;
  828.         case '[':             /* begrenzt durch E,F,g,m,p,q,r,s,v,w,x,z */
  829.             while (!((islower (c = fgetc (FP)) || (c == 'E') || (c == 'F'))))
  830.             {
  831.                 if (fputc (c, PRT) == EOF)
  832.                     Abbruch();
  833.             }
  834.             if (fputc (c, PRT) == EOF)
  835.                 Abbruch();
  836.     }
  837.     return ();
  838. }
  839.  
  840.  
  841. /********************************
  842. *                               *
  843. * Funktion: Neue Prefs holen    *
  844. * ==========================    *
  845. *                               *
  846. * Autor:    Datum:  Kommentar:  *
  847. * ------    ------  ----------  *
  848. * H.Kindler 31.7.91             *
  849. *                               *
  850. ********************************/
  851. void DefaultPrefs (struct Gadget dingens[])
  852. {
  853.     GetPrefs (PrefsBuffer, (short) SIZE);
  854.     switch (PrefsBuffer->PrintPitch)     /* Zeilenlänge festlegen */
  855.     {
  856.         case PICA:
  857.             LLen = 80;
  858.             dingens[0].Flags |= SELECTED;
  859.             dingens[1].Flags &= ~SELECTED;
  860.             dingens[2].Flags &= ~SELECTED;
  861.             break;
  862.         case ELITE:
  863.             LLen = 96;
  864.             dingens[0].Flags &= ~SELECTED;
  865.             dingens[1].Flags |= SELECTED;
  866.             dingens[2].Flags &= ~SELECTED;
  867.             break;
  868.         case FINE:
  869.             LLen = 136;
  870.             dingens[0].Flags &= ~SELECTED;
  871.             dingens[1].Flags &= ~SELECTED;
  872.             dingens[2].Flags |= SELECTED;
  873.             break;
  874.     }
  875.     switch (PrefsBuffer->PrintQuality)  /* Druck-Qualität */
  876.     {
  877.         case LETTER:
  878.             dingens[3].Flags |= SELECTED;
  879.             dingens[4].Flags &= ~SELECTED;
  880.             break;
  881.         case DRAFT:
  882.             dingens[3].Flags &= ~SELECTED;
  883.             dingens[4].Flags |= SELECTED;
  884.             break;
  885.     }
  886.     switch (PrefsBuffer->PrintSpacing)  /* Zeilen pro Zoll */
  887.     {
  888.         case SIX_LPI:
  889.             LPI = 6;
  890.             dingens[5].Flags |= SELECTED;
  891.             dingens[6].Flags &= ~SELECTED;
  892.             break;
  893.         case EIGHT_LPI:
  894.             LPI = 8;
  895.             dingens[5].Flags &= ~SELECTED;
  896.             dingens[6].Flags |= SELECTED;
  897.             break;
  898.     }
  899.     LM = PrefsBuffer->PrintLeftMargin;
  900.     ((struct StringInfo *) (dingens[7].SpecialInfo))->LongInt = LM;
  901.     sprintf (((struct StringInfo *) (dingens[7].SpecialInfo))->Buffer, "%d", LM);
  902.     RM = PrefsBuffer->PrintRightMargin;
  903.     ((struct StringInfo *) (dingens[8].SpecialInfo))->LongInt = RM;
  904.     sprintf (((struct StringInfo *) (dingens[8].SpecialInfo))->Buffer, "%d", RM);
  905.     PPL = PrefsBuffer->PaperLength;
  906.     ((struct StringInfo *) (dingens[9].SpecialInfo))->LongInt = PPL;
  907.     sprintf (((struct StringInfo *) (dingens[9].SpecialInfo))->Buffer, "%d", PPL);
  908.     Skip = SKIP;
  909.     ((struct StringInfo *) (dingens[10].SpecialInfo))->LongInt = Skip;
  910.     sprintf (((struct StringInfo *) (dingens[10].SpecialInfo))->Buffer, "%d", SKIP);
  911.     if (DoNumPrefs)
  912.     {
  913.         DoNum = TRUE;
  914.         dingens[11].Flags |= SELECTED;
  915.     }
  916.     else
  917.     {
  918.         DoNum = FALSE;
  919.         dingens[11].Flags &= ~SELECTED;
  920.     }
  921.     dingens[12].Flags |= SELECTED;
  922.     return();
  923. }
  924.  
  925.  
  926. /************************************************************
  927. *                                                           *
  928. * Funktion: Drucker verlassen                               *
  929. * ===========================                               *
  930. *                                                           *
  931. * Autor:    Datum:  Kommentar:                              *
  932. * ------    ------  ----------                              *
  933. * H.Kindler 25.7.91                                         *
  934. * H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
  935. *                                                           *
  936. ************************************************************/
  937. void ResetPrinter (void)
  938. {
  939.     if (fputs ("\f\33c", PRT) == EOF)     /* FF, RESET */
  940.         Abbruch();
  941.     SetPrefs (PrefsOrig, SIZE, TRUE);
  942.     return ();
  943. }
  944.  
  945.  
  946. /************************************************************
  947. *                                                           *
  948. * Funktion: Drucker vorbereiten                             *
  949. * =============================                             *
  950. *                                                           *
  951. * Autor:    Datum:  Kommentar:                              *
  952. * ------    ------  ----------                              *
  953. * H.Kindler 25.7.91 Werte von Preferences                   *
  954. * H.Kindler 26.8.93 Fehler beim Drucken werden abgefangen   *
  955. *                                                           *
  956. ************************************************************/
  957. void InitPrinter (void)
  958. {
  959.     struct NewWindow     nw;                            /* Fenster           */
  960.     struct IntuiMessage  *msg;                          /* Nachrichten       */
  961.     short                i;                             /* Zähler            */
  962.     char                 tmpnambuf [L_tmpnam];          /* Puffer PrtFile-tmpnam */
  963.     char                 *prtname = "prt:Print";        /* Name für PrtFile      */
  964.     char                 prtfile [L_tmpnam + PRINT -2]; /* Fertiger Name         */
  965.     BOOL                 ende = FALSE;                  /* Keine weiteren msg    */
  966.     BOOL                 drucken = FALSE;               /* To print or not to print, thats the Question */
  967.     UBYTE                titel[25];                     /* Fenster-Titel         */
  968.  
  969.     sprintf (titel, "KPrint V%d.%d by H.Kindler", Version, Revision);
  970.     GetPrefs (PrefsOrig, (short) SIZE);
  971.  
  972.     strcpy (fname, FileName);
  973.     strcpy (fnameundo, fname);
  974.  
  975.     nw.LeftEdge    = 25;          /* Window - Definitionen */
  976.     nw.TopEdge     = 12;          /* (18 Werte!!)          */
  977.     nw.Width       = 3 * RECHTS + 2 * HLUECKE +
  978.                      2 * EINRUECK + Unterschrift.Width;
  979.     nw.Height      = 219;
  980.     nw.DetailPen   = 0;
  981.     nw.BlockPen    = 1;
  982.     nw.IDCMPFlags  = GADGETUP | CLOSEWINDOW | NEWPREFS | VANILLAKEY;
  983.     nw.Flags       = WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE |
  984.                      ACTIVATE | SMART_REFRESH;
  985.     nw.FirstGadget = NULL;
  986.     nw.CheckMark   = NULL;
  987.     nw.Title       = titel;
  988.     nw.Screen      = NULL;
  989.     nw.BitMap      = NULL,
  990.     nw.MinWidth    = nw.Width;
  991.     nw.MinHeight   = nw.Height;
  992.     nw.MaxWidth    = nw.Width;
  993.     nw.MaxHeight   = nw.Height;
  994.     nw.Type        = WBENCHSCREEN;
  995.  
  996.     if (!(window = OpenWindow (&nw)))
  997.     {
  998.         puts ("Leider kein Fenster!");
  999.         /* Close_All (); */
  1000.         exit (RETURN_ERROR);
  1001.     }
  1002.     freq.fr_Hail      = "Bitte Datei auswählen! ";
  1003.     freq.fr_File      = fr_fname;             /* Struct für FileRequester */
  1004.     freq.fr_Dir       = fr_dir;
  1005.     freq.fr_Window    = window;
  1006.     freq.fr_FuncFlags = NULL;
  1007.     freq.fr_Flags2    = FR2F_LongPath;
  1008.     freq.fr_Function  = NULL;
  1009.     freq.fr_LeftEdge  = NULL;
  1010.     freq.fr_TopEdge   = NULL;
  1011.  
  1012.     PrintIText (window->RPort, &texte2[0], 0, 0);
  1013.     DefaultPrefs (dingens);
  1014.     SetAPen (window->RPort, 0);
  1015.     DrawImage (window->RPort, &Unterschrift,
  1016.                window->Width - EINRUECK / 2 - Unterschrift.Width,
  1017.                window->Height - VLUECKE - Unterschrift.Height);
  1018.     AddGList (window, &dingens[0], -1, 18, NULL);
  1019.     RefreshGadgets (&dingens[0], window, NULL);
  1020.     do
  1021.     {
  1022.         WaitPort (window->UserPort);                  /* auf Msg warten */
  1023.         if (msg = (struct IntuiMessage *) GetMsg (window->UserPort))
  1024.         {
  1025.             switch (msg->Class)
  1026.             {
  1027.                 case NEWPREFS:
  1028.                     GetPrefs (PrefsOrig, (short) SIZE);
  1029.                     break;
  1030.                 case CLOSEWINDOW:
  1031.                     ende = TRUE;
  1032.                     break;
  1033.                 case VANILLAKEY:
  1034.                     switch (msg->Code)
  1035.                     {
  1036.                         case RETURN:
  1037.                         case SPACE:
  1038.                             ende = TRUE;
  1039.                             drucken = TRUE;
  1040.                             break;
  1041.                         case ESC:
  1042.                         case 'q':
  1043.                             ende = TRUE;
  1044.                             break;
  1045.                     }
  1046.                     break;
  1047.                 case GADGETUP:
  1048.                     switch (((struct Gadget *) (msg->IAddress))->GadgetID)
  1049.                     {
  1050.                         case 0:         /* PICA */
  1051.                             LLen = 80;
  1052.                             PrefsBuffer->PrintPitch = PICA;
  1053.                             RectFill (window->RPort, EINRUECK, TITELSKIP,
  1054.                                       EINRUECK + RECHTS2, TITELSKIP + UNTEN);
  1055.                             dingens[0].Flags |= SELECTED;
  1056.                             dingens[1].Flags &= ~SELECTED;
  1057.                             dingens[2].Flags &= ~SELECTED;
  1058.                             RefreshGList (&dingens[0], window, NULL, 3);
  1059.                             break;
  1060.                         case 1:         /* ELITE */
  1061.                             LLen = 96;
  1062.                             PrefsBuffer->PrintPitch = ELITE;
  1063.                             RectFill (window->RPort, EINRUECK, TITELSKIP,
  1064.                                       EINRUECK + RECHTS2, TITELSKIP + UNTEN);
  1065.                             dingens[0].Flags &= ~SELECTED;
  1066.                             dingens[1].Flags |= SELECTED;
  1067.                             dingens[2].Flags &= ~SELECTED;
  1068.                             RefreshGList (&dingens[0], window, NULL, 3);
  1069.                             break;
  1070.                         case 2:         /* FINE */
  1071.                             LLen = 136;
  1072.                             PrefsBuffer->PrintPitch = FINE;
  1073.                             RectFill (window->RPort, EINRUECK, TITELSKIP,
  1074.                                       EINRUECK + RECHTS2, TITELSKIP + UNTEN);
  1075.                             dingens[0].Flags &= ~SELECTED;
  1076.                             dingens[1].Flags &= ~SELECTED;
  1077.                             dingens[2].Flags |= SELECTED;
  1078.                             RefreshGList (&dingens[0], window, NULL, 3);
  1079.                             break;
  1080.                         case 3:         /* NLQ */
  1081.                             PrefsBuffer->PrintQuality = LETTER;
  1082.                             RectFill (window->RPort,
  1083.                                       EINRUECK + HLUECKE + RECHTS,
  1084.                                       TITELSKIP + UNTEN + VLUECKE,
  1085.                                       EINRUECK + 3 * RECHTS + 2 * HLUECKE,
  1086.                                       TITELSKIP + 2 * UNTEN + VLUECKE);
  1087.                             dingens[3].Flags |= SELECTED;
  1088.                             dingens[4].Flags &= ~SELECTED;
  1089.                             RefreshGList (&dingens[3], window, NULL, 2);
  1090.                             break;
  1091.                         case 4:         /* Draft */
  1092.                             PrefsBuffer->PrintQuality = DRAFT;
  1093.                             RectFill (window->RPort,
  1094.                                       EINRUECK + HLUECKE + RECHTS,
  1095.                                       TITELSKIP + UNTEN + VLUECKE,
  1096.                                       EINRUECK + 3 * RECHTS + 2 * HLUECKE,
  1097.                                       TITELSKIP + 2 * UNTEN + VLUECKE);
  1098.                             dingens[3].Flags &= ~SELECTED;
  1099.                             dingens[4].Flags |= SELECTED;
  1100.                             RefreshGList (&dingens[3], window, NULL, 2);
  1101.                             break;
  1102.                         case 5:         /* 6 LPI */
  1103.                             PrefsBuffer->PrintSpacing = SIX_LPI;
  1104.                             LPI = 6;
  1105.                             RectFill (window->RPort,
  1106.                                       EINRUECK + HLUECKE + RECHTS,
  1107.                                       TITELSKIP + 3 * (UNTEN + VLUECKE),
  1108.                                       EINRUECK + 3 * RECHTS + 2 * HLUECKE,
  1109.                                       TITELSKIP + 4 * UNTEN + 3 * VLUECKE);
  1110.                             dingens[5].Flags |= SELECTED;
  1111.                             dingens[6].Flags &= ~SELECTED;
  1112.                             RefreshGList (&dingens[5], window, NULL, 2);
  1113.                             break;
  1114.                         case 6:         /* 8 LPI */
  1115.                             PrefsBuffer->PrintSpacing = EIGHT_LPI;
  1116.                             LPI = 8;
  1117.                             RectFill (window->RPort,
  1118.                                       EINRUECK + HLUECKE + RECHTS,
  1119.                                       TITELSKIP + 3 * (UNTEN + VLUECKE),
  1120.                                       EINRUECK + 3 * RECHTS + 2 * HLUECKE,
  1121.                                       TITELSKIP + 4 * UNTEN + 3 * VLUECKE);
  1122.                             dingens[5].Flags &= ~SELECTED;
  1123.                             dingens[6].Flags |= SELECTED;
  1124.                             RefreshGList (&dingens[5], window, NULL, 2);
  1125.                             break;
  1126.                         case 7:         /* Linker Rand */
  1127.                             LM = strinfo[0].LongInt;
  1128.                             if (LM > RM)
  1129.                             {
  1130.                                 LM = RM;
  1131.                                 strinfo[0].LongInt = LM;
  1132.                                 sprintf (strinfo[0].Buffer, "%d", LM);
  1133.                                 RefreshGList (&dingens[7], window, NULL, 1);
  1134.                             }
  1135.                             PrefsBuffer->PrintLeftMargin = LM;
  1136.                             break;
  1137.                         case 8:         /* Rechter Rand */
  1138.                             RM = strinfo[1].LongInt;
  1139.                             if (RM > LLen)
  1140.                             {
  1141.                                 RM = LLen;
  1142.                                 strinfo[1].LongInt = RM;
  1143.                                 sprintf (strinfo[1].Buffer, "%d", RM);
  1144.                                 RefreshGList (&dingens[8], window, NULL, 1);
  1145.                             }
  1146.                             PrefsBuffer->PrintRightMargin = RM;
  1147.                             break;
  1148.                         case 9:         /* Blattlänge */
  1149.                             PPL = strinfo[2].LongInt;
  1150.                             PrefsBuffer->PaperLength = PPL;
  1151.                             break;
  1152.                         case 10:        /* freie Zeilen */
  1153.                             Skip = strinfo[3].LongInt;
  1154.                             if (Skip > PPL)
  1155.                             {
  1156.                                 Skip = PPL;
  1157.                                 sprintf (strinfo[3].Buffer, "%d", PPL);
  1158.                                 RefreshGList (&dingens[10], window, NULL, 1);
  1159.                             }
  1160.                             break;
  1161.                         case 11:        /* ZeilenNummer */
  1162.                             DoNum = (dingens[11].Flags & SELECTED) ? TRUE : FALSE;
  1163.                             /* TRUE falls SELECTED, sonst FALSE (0) */
  1164.                             break;
  1165.                         case 12:        /* Kopfzeile */
  1166.                             DoKopf = (dingens[12].Flags & SELECTED) ? TRUE : FALSE;
  1167.                             /* TRUE falls SELECTED, sonst FALSE (0) */
  1168.                             break;
  1169.                         case 13:        /* Laden */
  1170.                             if (ArpBase)
  1171.                                 if (FileRequest (&freq))
  1172.                                 {
  1173.                                     strcpy (strinfo[4].Buffer, freq.fr_Dir);
  1174.                                     TackOn (strinfo[4].Buffer, freq.fr_File);
  1175.                                     RefreshGList (&dingens[14], window, NULL, 1);
  1176.                                 }
  1177.                         case 14:        /* Dateiname */
  1178.                             /*  Es gibt nichts zu tun, da FileName nacher
  1179.                              *  eh auf strinfo[4].Buffer zeigt!
  1180.                              */
  1181.                             break;
  1182.                         case 15:        /* Voreinstellungen */
  1183.                             RemoveGList (window, &dingens[0], -1);
  1184.                             DefaultPrefs (dingens);
  1185.                             RectFill (window->RPort, 2, 11,
  1186.                                       window->Width - EINRUECK -
  1187.                                                 Unterschrift.Width,
  1188.                                       dingens[12].TopEdge + UNTEN + 1);
  1189.                             AddGList (window, &dingens[0], -1, 18, NULL);
  1190.                             RefreshGadgets (&dingens[0], window, NULL);
  1191.                             PrintIText (window->RPort, &texte2[0], 0, 0);
  1192.                             break;
  1193.                         case 16:        /* Drucken */
  1194.                             ende = TRUE;
  1195.                             drucken = TRUE;
  1196.                             break;
  1197.                         case 17:        /* Abbruch */
  1198.                             ende = TRUE;
  1199.                             break;
  1200.                     }
  1201.                     break;
  1202.             }
  1203.             ReplyMsg ((struct Message *) msg);
  1204.         }
  1205.     } while (!ende);
  1206.     Forbid();
  1207.     do
  1208.         if (msg = (struct IntuiMessage *) GetMsg (window->UserPort))
  1209.             ReplyMsg ((struct Message *) msg);
  1210.     while (msg);
  1211.     ModifyIDCMP (window, 0);
  1212.     Permit();
  1213.     RemoveGList (window, &dingens[0], -1);
  1214.     CloseWindow (window);
  1215.     if (!drucken)
  1216.     {
  1217.         Close_All ();
  1218.         exit (RETURN_OK);
  1219.     }
  1220.     FileName = strinfo[4].Buffer;
  1221.     SetPrefs (PrefsBuffer, SIZE, TRUE);
  1222.     if (DoNum) NumLen = NUMLEN;
  1223.     LPP = (PPL - Skip) * LPI / 6;           /* so viel bedrucken    */
  1224.     LLen = RM - LM + 1 - NumLen;            /* Platz zw. Rändern    */
  1225.     CPL  = LLen - NumLen;                   /* weniger Nummernlänge */
  1226.     strcpy (prtfile, prtname);              /* DruckName zusammenstellen */
  1227.     tmpnam (tmpnambuf);
  1228.     strcpy (prtfile + PRINT, tmpnambuf + 2);
  1229.     if ((PRT = fopen (prtfile, "w")) == NULL)
  1230.     {
  1231.         puts ("Kann Drucker nicht ansprechen!");
  1232.         Close_All ();
  1233.         exit (RETURN_ERROR);
  1234.     }
  1235.     if (fputs ("\33#1", PRT) == EOF) /* Drucker vom System initialisieren */
  1236.         Abbruch();
  1237.     if (fprintf(PRT, "\33[%dt", PPL) < 0) /* Seitenlänge (Sys machts net) */
  1238.         Abbruch();
  1239.     return;
  1240. }
  1241.  
  1242. /******************************************
  1243. *                                         *
  1244. * Funktion: Abbruch bei Fehler            *
  1245. * ============================            *
  1246. *                                         *
  1247. * Autor:    Datum:  Kommentar:            *
  1248. * ------    ------  ----------            *
  1249. * H.Kindler 26.8.93                       *
  1250. *                                         *
  1251. ******************************************/
  1252. void Abbruch(void)
  1253. {
  1254.     Close_All();
  1255.     exit (RETURN_ERROR);
  1256. }
  1257.