home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / print / amiga / amprint.c next >
C/C++ Source or Header  |  1994-07-10  |  8KB  |  329 lines

  1. /*
  2. **    This file generated by localize 2.9 (AmigaDOS 2.1) from amprint.c
  3. */
  4. #ifdef AMIGA
  5. /************************************************************************/
  6. /*                                    */
  7. /*    amprint.c               Druckeransteuerung ueber Device.    */
  8. /*                                    */
  9. /*    make_room(void)        schickt aktuellen Puffer an Drucker    */
  10. /*    prnflush()              muss zum Schluss gemacht werden, um    */
  11. /*                              den Puffer auf den Drucker auszugeben    */
  12. /*                                    */
  13. /*    Georg Hessmann          06.07.89 / 11.04.91            */
  14. /*                                    */
  15. /************************************************************************/
  16.  
  17. #include "defines.h"
  18.  
  19. #include <sprof.h>
  20.  
  21. #include <exec/types.h>
  22. #include <exec/execbase.h>
  23. #include <stdio.h>
  24. #include <exec/exec.h>
  25. #include <exec/tasks.h>
  26. #include <exec/ports.h>
  27. #include <dos/dos.h>
  28. #include <dos/dosextens.h>
  29. #include <devices/printer.h>
  30. #include <graphics/rastport.h>
  31.  
  32. #ifdef ANSI
  33. #  include <dos.h>
  34. #  include <string.h>
  35. #  include <stdlib.h>
  36. #endif
  37.  
  38. #ifdef LATTICE
  39. #  include <clib/exec_protos.h>
  40. #  include <clib/dos_protos.h>
  41. #  include <pragmas/exec_pragmas.h>
  42. #  include <pragmas/dos_pragmas.h>
  43. #endif
  44.  
  45. #ifdef AZTEC_C
  46. #  include <functions.h>
  47. #endif
  48.  
  49. #include "globals.h"
  50. #include "amprint.h"
  51. #include "bitmap.h"
  52.  
  53. #include "globals.i"
  54. #include "dviprint.i"
  55. #include "amprint.i"
  56. #include "amprhelp.i"
  57. #include "muiprint.i"
  58.  
  59.  
  60. /*
  61.  * Fuer die locale-Library:
  62.  *
  63.  * Hier duerfen *nur* die MSG_#? Nummern eingebunden werden!
  64.  * Achtung:
  65.  * Es muss/sollte 'multiple-include' erlaubt sein!
  66.  */
  67. #include "local.i"
  68.  
  69. #undef  CATCOMP_ARRAY
  70. #undef  CATCOMP_BLOCK
  71. #undef  CATCOMP_STRINGS
  72. #define CATCOMP_NUMBERS
  73. #include "localstr.h"
  74.  
  75.  
  76.  
  77.  
  78.  
  79. /* Globale Variablen */
  80. /* long bufflen; (schon in dviprint) */
  81. long bufferz;
  82. char *buffer;
  83. char *bufferA, *bufferB;
  84. int  bufferZu_A, bufferZu_B;
  85. int  aktBufNr;
  86.  
  87. int background;
  88.  
  89. #ifdef DEBUG
  90. unsigned long count_print_bytes=0;
  91. #endif
  92.  
  93.  
  94. /* Externe globale Variablen */
  95. extern union printerIO *request;
  96. extern struct MsgPort *printerPort;
  97. extern int  is_printer_started;        /* 0: nein, 1: init ok, 2: print gestartet   */
  98. extern int  is_printing_aborted;    /* 0: nein, 1: ja, also kein prnzero!         */
  99. /*extern long error;*/
  100.  
  101. extern struct ExecBase *SysBase;
  102.  
  103.  
  104. void check_background(void)
  105. {
  106.   struct Process *my_proc;
  107.   struct CommandLineInterface *cli;
  108.  
  109.   background = FALSE;  
  110.   my_proc =(struct Process *)FindTask(NULL);
  111.   if (my_proc != NULL && my_proc->pr_TaskNum != 0) {    /* cli-process */
  112.     cli = (struct CommandLineInterface *)(my_proc->pr_CLI << 2);
  113.     if (cli != NULL) {
  114.       background = (cli->cli_Background != DOSFALSE);
  115.     }
  116.   }
  117.   os_2 = SysBase->LibNode.lib_Version >= 36L;
  118. }
  119.  
  120.  
  121. #ifdef IO_TEST
  122. void prn_string(char *str, int len)
  123. {
  124.   BYTE error;
  125.   (void)Chk_Abort();
  126.   request->iostd.io_Command = PRD_RAWWRITE;
  127.   request->iostd.io_Length = len;
  128.   request->iostd.io_Data = (APTR) str;
  129.   error = DoIO((struct IORequest *)request);
  130.   if (error != 0L) PrinterError(error);
  131. }
  132. #endif
  133.  
  134.  
  135. /*****  make_room() makes the other buffer current ***************/
  136. void make_room()
  137. {
  138.   char *full_buffer=buffer;
  139.   long full_length=bufferz;
  140.  
  141.   if (aktBufNr == BUF_A) {
  142.     buffer = bufferB;
  143.     aktBufNr = BUF_B;
  144.   }
  145.   else {
  146.     buffer = bufferA;
  147.     aktBufNr = BUF_A;
  148.   }
  149.   bufferz = 0L;
  150.  
  151. #if defined(HARDDEB)
  152.     printf("J:make_room(%ld)\n",full_length);
  153. #endif
  154.  
  155.   if (output_file_ptr) {
  156.     /* Ausgabe in ein File, nicht zum Drucker */
  157.     if (fwrite(full_buffer,sizeof(char),full_length,output_file_ptr) != full_length) {
  158.       Fatal(5,MSG_CANT_WRITE_OUTPUT_FILE);    /* Deadlock ?    */
  159.     }
  160.     MUIEvent();        // mal die Oberflaeche antesten...
  161.   }
  162.   else {
  163.     /* Ausgabe auf den Drucker */
  164.     if (aktBufNr==BUF_B) {
  165.       bufferZu_A = BUF_VOLL;        /* buffer A ist voll */
  166.       if (bufferZu_B==BUF_VOLL) {    /* der andere auch */
  167.         WaitForPrinterOK();        /* wartet auch auf ^C und wertet Fehler aus */
  168.         bufferZu_B = BUF_LEER;
  169.       }                                 /* nu is er leer */
  170.     }
  171.     else {
  172.       bufferZu_B = BUF_VOLL;
  173.       if (bufferZu_A==BUF_VOLL) {
  174.         WaitForPrinterOK();        /* wartet auch auf ^C und wertet Fehler aus */
  175.         bufferZu_A = BUF_LEER;
  176.       }                                /* nu is er leer */
  177.     }
  178.     request->iostd.io_Command = PRD_RAWWRITE;
  179.     request->iostd.io_Length = full_length;
  180.     request->iostd.io_Data = (APTR) full_buffer;
  181.     SendIO((struct IORequest *)request);
  182.     is_printer_started = 2;
  183.   }
  184. }
  185.  
  186.  
  187. /*****  prnflush                        ***************/
  188. void prnflush(void)
  189. {
  190. #ifdef DEBUG
  191.   if (DeBug) {
  192.     fprintf(stderr,"flushing printing-buffer! %d bytes printed.\n",
  193.             count_print_bytes);
  194.   }
  195. #endif
  196. #if defined(HARDDEB)
  197.   printf("J:prnflush (%ld)\n",bufferz);
  198. #endif
  199.  
  200.   if (iffprint)    return;
  201.  
  202.   if (bufferz)    make_room();
  203.   /*  bufferz ist nun = 0 */
  204.   if (is_printer_started > 1) {
  205.     WaitForPrinterOK();     /* wartet auch auf ^C und wertet Fehler aus */
  206.     bufferZu_A = BUF_LEER;
  207.     bufferZu_B = BUF_LEER;
  208.   }
  209. #if 0
  210.   aktBufNr = BUF_A;
  211.   buffer = &(bufferA[0]);
  212. #endif
  213. }
  214.  
  215.  
  216. /* macht das selbe wie WaitIO, bricht aber bei CTRL-C sofort ab! */
  217. void WaitForPrinterOK(void)
  218. {
  219.   ULONG io_mask    = 1L<<printerPort->mp_SigBit;        /* 1<<request->iostd.io_Message.mn_ReplyPort->mp_SigBit; */
  220.   ULONG sig_mask;
  221.   BYTE error;
  222.  
  223.   do {
  224.  
  225.     PROFILE_OFF();
  226.     sig_mask = Wait(SIGBREAKF_CTRL_C | io_mask | ((usegui) ? GUIsignals : 0L));
  227.     PROFILE_ON();
  228.  
  229.     if (sig_mask & SIGBREAKF_CTRL_C) CXBRK();    /* mach Schluss Mann, ey */
  230.  
  231.     if (usegui && (sig_mask & GUIsignals)) MUIEvent();
  232.  
  233.   } while (!(sig_mask & io_mask));
  234.  
  235.   /* we must WaitIO() to remove the request from the port */
  236.   PROFILE_OFF();
  237.   WaitIO((struct IORequest *)request);
  238.   PROFILE_ON();
  239.  
  240.   /* the signal bit is not cleared if the request was already finished */
  241.   SetSignal(0L, io_mask);
  242.   error = request->iostd.io_Error;
  243.   is_printer_started = 1;
  244.   if (error != 0) PrinterError(error);
  245.  
  246. }
  247.  
  248.  
  249.  
  250.  
  251. #if 0 /* ARggggggggggggggggggggggggggggggggggggggggggg!!!!!!!!!!!!!!!!! */
  252.  
  253. /* macht das selbe wie WaitIO, bricht aber bei CTRL-C sofort ab! */
  254. void WaitForPrinterOK(void)
  255. {
  256. /*  ULONG ctrlc_mask = SIGBREAKF_CTRL_C;*/
  257.   ULONG io_mask    = 1L<<printerPort->mp_SigBit;
  258.             /* 1<<request->iostd.io_Message.mn_ReplyPort->mp_SigBit; */
  259.   ULONG sig_mask;
  260.   BYTE error;
  261.  
  262. #if defined(HARDDEB)
  263.   printf(">WFPOK(%d)\n",is_printer_started);
  264.   if ((ULONG)(1L<<printerPort->mp_SigBit)&SetSignal(0L,0L))
  265.     printf("Printer signal set\n");
  266. #endif
  267. #if defined(VERSUCH)
  268.   if (CheckIO((struct IORequest *)request) == NULL) {    /* nicht fertig? */
  269.     sig_mask = Wait(ctrlc_mask | io_mask);
  270.     if (sig_mask & io_mask) {
  271. #if defined(HARDDEB)
  272.       printf("WaitIO\n");
  273. #endif
  274.       WaitIO((struct IORequest *)request);
  275.       error = request->iostd.io_Error;
  276.       is_printer_started = 1;
  277.       if (error != 0) PrinterError(error);
  278.     }
  279.     if (sig_mask & ctrlc_mask) {
  280.       CXBRK();    /* mach Schluss Mann, ey */
  281.     }
  282.   }
  283.   else {
  284.     /* hier muss auch noch auf ^C getestet werden, falls     */
  285.     /* der Drucker zu schnell ist                */
  286.     Chk_Abort();
  287.     /* nochmal WaitIO(), um den Auftrag vom Port zu entnehmen    */
  288.     WaitIO((struct IORequest *)request);
  289.     /* We must clear the signal because the request was ready */
  290.     SetSignal(0L, (ULONG)(1L<<printerPort->mp_SigBit));
  291.     is_printer_started = 1;
  292.   }
  293. #else /*VERSUCH*/
  294. #if 0
  295.   if (CheckIO((struct IORequest *)request) == NULL) {    /* nicht fertig? */
  296.     sig_mask = Wait(SIGBREAKF_CTRL_C | io_mask);
  297.   }
  298. #if defined(HARDDEB)
  299.   else printf("request ready\n");
  300. #endif
  301. #else
  302.   sig_mask = Wait(SIGBREAKF_CTRL_C | io_mask);
  303. #endif
  304.   if (sig_mask & SIGBREAKF_CTRL_C) {
  305.       CXBRK();    /* mach Schluss Mann, ey */
  306. #if defined(HARDDEB)
  307.       printf("Rueckkehr aus CXBRK!\n");
  308. #endif
  309.   }
  310.   /*Chk_Abort(); geht nicht richtig */
  311.  /* we must WaitIO() to remove the request from the port */
  312. #if defined(HARDDEB)
  313.   printf("WaitIO\n");
  314. #endif
  315.   WaitIO((struct IORequest *)request);
  316.   /* the signal bit is not cleared if the request was already finished */
  317.   SetSignal(0L, io_mask);
  318.   error = request->iostd.io_Error;
  319.   is_printer_started = 1;
  320.   if (error != 0) PrinterError(error);
  321. #endif /* VERSUCH */
  322. #if defined(HARDDEB)
  323.   printf("<WFPOK\n");
  324. #endif
  325. }
  326.  
  327. #endif
  328. #endif /* ARggggggggggggggggggggggggggggggggggggggggggg!!!!!!!!!!!!!!!!! */
  329.