hardie@sask.UUCP (Peter Hardie ) (02/18/86)
Here's the C (Lattice 3.02) source for a program that prints files.
It's better than using the copy command but it does not work under
Workbench. It's not a spooler but at least you can start it up in
a CLI and forget about it until it's done.
Pete
ihnp4!sask!hardie
/************************** CUT HERE *********************************/
/* print ....   print files to the printer.device.
   print [-r | -nN] file [file [ file .....]  ]
   The -r option causes print to write the files using raw I/O which
   means that all characters go through exactly as in the file.
   (i.e. escape sequences are not translated etc.)
   If -r is not specified then the normal device is used and any escape
   sequences are assumed to be the standard ISO ones used by the driver
   (see include/devices/printer.h for a list of codes)
   The program adds a formfeed at the end of each file.
   If the -nN option is used then only one file should be specified
   and that file will be printed N times without the formfeed between each one. 
   This is useful for printing an address label umpty times.
BUGS: Yep. It does not look for a cancel signal so once started it goes
	until it's done or until a reboot, whichever occurs first.
	PUBLIC DOMAIN FREEBIE ..... just don't sell it turkey!
	Peter Hardie 
	ihnp4!sask!hardie
	Saskatoon, Sask, Canada.
*/
#include <libraries/dos.h>
#include <exec/io.h>
#include <devices/printer.h>
#include <devices/inputevent.h>
#include <lattice/fcntl.h>
struct IOStdReq *iorb,iob;
struct InputEvent *event,ev;
char buf[512];
char formfeed = '\014';
main(argc,argv)
char *argv[];
int argc;
{
   int ifd,rawwrite;
   int num;
   int repeat, count;
   event = &ev;
   iorb = &iob;
   OpenDevice("printer.device",1,iorb,0);
   if(iorb->io_Error) {
      printf("can't open printer.device\n");
      exit();
   }
   iorb->io_Message.mn_ReplyPort = CreatePort("printer_reply",0L);
   if(iorb->io_Message.mn_ReplyPort == NULL) {
      CloseDevice(iorb);
      printf("can't get a reply port\n");
      exit();
   }
   rawwrite = CMD_WRITE;
   repeat = 1;
   if(argc > 1) {
      while(argv[1][0] == '-') {
         argv++;
         argc--;
         switch(argv[0][1]) {
         case 'r':
            rawwrite = PRD_RAWWRITE;
            break;
         case 'n':
            repeat = atoi(&argv[0][2]);
            break;
         default:
            printf("unknown argument '%s'\n",argv[0]);
            usage();
            goto finish;
         }
      }
   }
   if((repeat > 1) && (argc != 2)) {
      printf("arg count: only one file can be repeated\n");
      goto finish;
   }
   while(argc > 1) {
      if((ifd = open(argv[1],O_RDONLY)) == 0) {
         printf("can't open %s\n",argv[1]);
         argc--;
         argv++;
         continue;
      }
      for(count = 0; count < repeat; count++) {
        while((num = read(ifd,&buf[0],512)) > 0) {
            iorb->io_Command = rawwrite;
            iorb->io_Length = num;
            iorb->io_Data = &buf[0];
            DoIO(iorb);
         }
         if(repeat > 1)lseek(ifd,0L,0);
      }
      iorb->io_Command = rawwrite;
      iorb->io_Length = 1;
      iorb->io_Data = &formfeed;
      DoIO(iorb);
      close(ifd);
      argc--;
      argv++;
   }
finish:
   CloseDevice(iorb);
}
usage()
{
   printf("Usage: print [-r | -nN] file [file .....]\n");
   printf("If -nN is specified then only one file should be given\n");
}andy@amiga.UUCP (Andy Finkel) (02/19/86)
In article <332@sask.UUCP> hardie@sask.UUCP (Peter Hardie ) writes: >Here's the C (Lattice 3.02) source for a program that prints files. >It's better than using the copy command but it does not work under >Workbench. It's not a spooler but at least you can start it up in >a CLI and forget about it until it's done. >Pete >ihnp4!sask!hardie Not to take anything away from Pete, since its useful to try these things, but here's another way to to it: (from a CLI window) run copy filename1 to prt: + copy filename2 to prt: + . . . copy filenamen to prt: ---------------------------- If you want formfeeds between files, put in an echo statement between files, like: echo > prt: "^L" (control L is the formfeed) to get the full, raw effect, copy to par: instead of prt: You could also make it into a DOS execute file, with parameters. andy finkel Commodore(Amiga)
bruceb@amiga.UUCP (Bruce Barrett) (02/20/86)
In article <707@amiga.amiga.UUCP> andy@skipper.UUCP (Andy Finkel) writes: >In article <332@sask.UUCP> hardie@sask.UUCP (Peter Hardie ) writes: >>Here's the C (Lattice 3.02) source for a program that prints files. >>It's better than using the copy command... >>Pete >>ihnp4!sask!hardie > >Not to take anything away from Pete, since its useful to try these things, >but here's another way to to it: > >(from a CLI window) > >run copy filename1 to prt: + >copy filename2 to prt: + > : >copy filenamen to prt: optional: >echo > prt: "^L" >(control L is the formfeed) > >to get the full, raw effect, copy to par: instead of prt: > >You could also make it into a DOS execute file, with parameters. > > andy finkel > Commodore(Amiga) Or........ even better(???) [different, at least] than Andy's solution... You can use the "Join" command. This makes handling multiple files even easier (for the batch file). Something like: 1) echo > :t/ff "^L" run join file1 :t/ff file2 :t/ff ... filen as prt: delete :t/ff or 2) run join file1 file2 ... filen as prt: or 3) and 4) use par: (or ser:) instead for "RawWrite". ==========PROBLEMS============= You will please note the following problems with both Andy and my "solutions": 1) No provision for the -nN option is made 2) We assume (*Very* foolish us) that your printer is parallel. OK so you can copy to SER: instead but this would require knowlege on the part of the person running/installing the execute file. Not user friendly if you have 2 systems with 2 different types of printers (like I do). 3) Join will only handle 10 files (in this case that might be 5 files and 5 form-feeds) a definite limitation. 4) Do NOT try using: run copy .... par: run copy .... par: run copy .... par: as the 2nd and third copies may try to print before the first frees the printer. They will just give up on the PRT: open error. All and all I think Peter's program (although I have yet to use it) is quite useful in some cases. Thanks Peter. --Bruce Barrett (Commodore-Amiga)
hardie@sask.UUCP (Peter Hardie ) (02/22/86)
> In article <707@amiga.amiga.UUCP> andy@skipper.UUCP (Andy Finkel) writes: a way of printing with CLI commands. And Bruce Barrett shows another way and adds: > All and all I think Peter's program (although I have yet to use it) is > quite useful in some cases. Thanks Peter. > --Bruce Barrett (Commodore-Amiga) Thanks guys. As I commented to another Commodore-Amiga person, by mail, the program isn't exactly a spooler and you can certainly do the same thing with lots of command lines. But in my startup-sequence I open a newcli with newcli con:400/10/240/50/cli that hangs up in the top right corner of my screen. If I want to print something I open that window and type, for example, print mand.h mand.c mand1.c mand2.c mand3.c mand4.c and then go back to the previous window wherein I am typing a reply to some mail or reading this news over the phone line with my hacked up version of the amigaterm program that was posted a while ago. And I can forget about the printer until it's done. Actually, the program started as an exercise in opening, using and closing a device and then evolved to the print program. It'll probably get worse as time goes by and I try to fiddle with the text justification and plotting features on my printer. Ciao Pete Hardie ihnp4!sask!hardie